Diffusion模型打响了AIGC的第一枪,我之前一直是做GAN这一块的图像生成,但是奈何Diffuison模型效果好的离谱,也趁着空闲时间抱着学习的态度看看到底是他是靠着什么"吊打"GAN的,但是在推Diffusion公式的时候,牵扯到很多比较细碎的小知识点,有一些因为不常用也都忘记了,这里正好补充在这里,方便后续快速查询。 关于Diffusion相关的论文推导后面会单独开一个新的文章进行介绍,如果有时间和精力应该还会补充代码的实践~
马尔科夫链
总体思想: 过去的所有信息都被保存在了现在的状态中,只使用现在状态就能预测到之后的状态,换句话说就是某个时刻的状态转移概率只依赖于它的前一个状态。
公式化表达:
举例:
股市涨跌:当前股市的涨、跌、平的状态概率分别为[0.3,0.4,0.3],且转移概率矩阵为:
比如第二行第三列的0.05表示今天跌,明天平的概率。 根绝上面的状态转移方程和今天的故事概率,可以依次得到后面每一轮涨、跌、平的概率:
并且轮数在尽可能大的时候(60轮),那么状态概率就一直保持在
,这也是马尔科夫链的状态转移稳定性。放回袋中的取球问题:当前取球颜色的概率只与上次取完后的结果有关。
高斯分布的可加性
两个独立高斯分布相加仍然是高斯分布,且相加后的高斯分布均值为原两个高斯分布均值之和,方差为原方差之和:
AE和VAE
AE(AutoEncoder)
- 基本概念:输入的图片数据X经过Encoder后会得到一个比较确切的latent code Z(对这个latent code无其他约束),这个Z通过Decoder重建出图像X’,损失函数就是X和X’的重建MSE损失值。
- 用处:数据去噪、数据降维(配合适当的维度和稀疏约束,自编码器可以学习到比PCA等技术更有意思的数据投影)
VAE(Variational AutoEncoder)
区别于AE:相比于AE,VAE更倾向于数据生成。只要训练好了Decoder,我们就可以从latent space的某一个标准正态分布采样latent code作为解码器Decoder的输入,来生成类似的、但是但不完全相同于训练数据的新数据,也许是我们从来没见过的数据,作用类似GAN
重点: 在训练过程中,就像AE一样输入数据x被输入到Encoder输入通过一系列层(由超参数控制)来减少其维度,以获得压缩的latent code z。但是Encoder并不是直接输出latent code z,而是输出每个潜在变量的平均值和标准差,注意这里说的是每个!即对于每一个输入样本x我们都期望其经过encoder得到的latent code也是一个正态分布中采样得到的,那么对于k个样本x就有k个正态分布,然后就有k个分别从这k个正态分布中采样得到的latent code用于输入到decoder中重建原输入x。而为了得到这k个正太分布我们就需要有k组均值和方差。
Latent code的方差不能为 0,因为我们还想要给模型一些训练难度。如果方差为 0,模型永远只需要学习高斯分布的均值,这样就丢失了随机性,VAE就变成AE了……这就是为什么VAE要在AE前面加一个Variational:我们希望方差能够持续存在,从而带来噪声!那如何解决这个问题呢?不仅需要保证有方差,还要让所有
趋于标准正态分布 。损失函数: 除了和AE中的重构MSE损失之外,VAE还有一个相似度损失,即latent space与标准高斯(零均值和单位方差)之间的KL散度
参考:
重参数技巧
如果我们需要从某个随机分布(如高斯噪声)中采样一个样本,这个过程是不可微的也无法进行反向传播,此时我们可以通过重采参数技巧使其可微。比如我们想要从一个普通高斯分布
积分、求和、期望的关系
- 离散随机变量的期望:将该离散随机变量的每个观测值
乘以各自的出现的概率 ,最后求和就得到期望:, 且 概 率 总 和
举一个掷骰子的例子,6个面每个面的向上的概率是
- 一个连续随机变量将它的概率密度
和观测值 的相乘,再把这个随机变量所有取值都算上后做定积分,就能得到这个随机变量的期望值:, 且 概 率 密 度 总 积 分
条件概率、边缘概率、联合概率
- 联合概率:多个条件同时成立的概率,记作
- 边缘概率:与联合概率相对应,记作P(A)或P(B),在不考虑其他白能量取值的情况下其中某个单个随机变量有关的概率。
- 条件概率:在事件B发生的前提下事件A发生的概率,记作
- 全概率:某一个单独事件发生概率等于这个事件在其他完备事件的条件概率之和:
其实就是公式(7)的 利用公式(8)进行展开
贝叶斯公式
贝叶斯公式由条件概率公式可以进一步推导得到:
此外针对公式10-2有一些衍生的公式如下:
此外对于公式(11)的第一步的分子分母同时除以
最大似然估计(MLE)
最大似然估计是被使用最为广泛一种参数估计方法,其核心思想就是:那么既然事情已经发生了,为什么不让这个出现的结果的可能性最大呢?。在深度学习中通俗来讲就是利用已知的样本信息(比如我们的训练数据集),去反推最有可能“完美”生成这批样本的模型的参数值,其满足的一个前提就是样本独立同分布。
这个参考文献中举了一个“袋中摸球”的例子,很形象讲的很精彩,此外再完全引用其中的一段话
" 对于函数
在深度学习中我们通常是样本
所以最大似然估计的函数表达式也很简单,就是最大化下面的函数:
对于深度学习中的分类问题,假定
拓展:最大后验概率估计(MAP)
相比较于最大似然估计,最大后验概率估计是最大化
最大似然估计(MLE)和最大后验概率估计(MAP)的区别在于:MAP就是多个作为因子的先验概率
变分下限(VLB)
变分下限(Variational Lower Bound)也叫evidence lower bound (ELBO).
在最大似然估计中,有时候难以直接计算并最大化似然函数
琴生不等式:
全 概 率 公 式 积 分 求 和 变 期 望 琴 生 不 等 式 熵 的 公 式 KL散度:
琴生不等式
凸函数
换句话说就是:函数值的加权和
KL散度
KL散度又称相对熵,用于描述两个概率分布
一般分布的KL散度求解:
可以看到最终KL散度其实可以转化成交叉熵 和熵 的差,且KL散度有两个重要性质:- 非对称性:
- 非负性:
,仅在 时取0
- 非对称性:
拓展: JS散度
正是由于KL散度的不对称性问题使得在某些训练过程中可能存在一些问题,为了解决这个问题则在KL散度基础上引入了JS散度,假定
证明P、Q不重叠时JS散度其实也很简单,就是因为不重叠,所以任意一个x,
思考:为什么会出现两个分部没有重叠的现象? 真实数据的分布其实是高维空间下的一个低维流行(可以类比想象成立体3维空间里的一个2维平面,而真实情况下可能空间维度),我们的数据没有"撑满"整个空间,这就导致很难重合。原始GAN的损失函数的最终优化目标就是优化真实数据分布和生成数据分布的JS散度,所以GAN有时候可能会出现训练崩塌的情况。
高斯分布的KL散度的快速求解
对于特殊的分布-高斯分布,我们可以直接通过其均值和方差快速求解KL散度:
上面分别表示一元高斯分布和多元高斯分布的KL散度直接求解,其中
重积分下的Fubini定理
富比尼定理提供了逐次积分的方法计算双重积分的条件。不但可以用逐次积分计算双重积分,而且在交换逐次积分的顺序时,保证了积分结果不会变
如 果 , 则