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:我们希望方差能够持续存在,从而带来噪声!那如何解决这个问题呢?不仅需要保证有方差,还要让所有 趋于标准正态分布

      原图来自HeptaAI.zhihu
    • 损失函数: 除了和AE中的重构MSE损失之外,VAE还有一个相似度损失,即latent space与标准高斯(零均值和单位方差)之间的KL散度

      原图来自数据派THU

参考:

重参数技巧

如果我们需要从某个随机分布(如高斯噪声)中采样一个样本,这个过程是不可微的也无法进行反向传播,此时我们可以通过重采参数技巧使其可微。比如我们想要从一个普通高斯分布中采样一个,那么我们就可以额外引入一个服从于标准高斯分布的独立随机变量,然后对这个随机变量缩放或偏移以接近原始待采样的分布,这个缩放和偏移的过程就是重参数的主要公式: 即对一个标准高斯分布按照指定的标准差和均值进行缩放、偏移,就能获得符合原高斯分布的采样结果。

积分、求和、期望的关系

  • 离散随机变量的期望:将该离散随机变量的每个观测值乘以各自的出现的概率,最后求和就得到期望:

​ 举一个掷骰子的例子,6个面每个面的向上的概率是,那么其向上的点数值的期望就是:

  • 一个连续随机变量将它的概率密度和观测值的相乘,再把这个随机变量所有取值都算上后做定积分,就能得到这个随机变量的期望值:

条件概率、边缘概率、联合概率

  • 联合概率:多个条件同时成立的概率,记作
  • 边缘概率:与联合概率相对应,记作P(A)或P(B),在不考虑其他白能量取值的情况下其中某个单个随机变量有关的概率。
  • 条件概率:在事件B发生的前提下事件A发生的概率,记作

  • 全概率:某一个单独事件发生概率等于这个事件在其他完备事件的条件概率之和: 其实就是公式(7)的利用公式(8)进行展开

贝叶斯公式

贝叶斯公式由条件概率公式可以进一步推导得到: 其中表示在时间B和C同发生时,事件A发生的概率。

此外针对公式10-2有一些衍生的公式如下:

此外对于公式(11)的第一步的分子分母同时除以有: 其中表示在事件C发生时,事件A和事件B同时发生发生的概率。

最大似然估计(MLE)

最大似然估计是被使用最为广泛一种参数估计方法,其核心思想就是:那么既然事情已经发生了,为什么不让这个出现的结果的可能性最大呢?。在深度学习中通俗来讲就是利用已知的样本信息(比如我们的训练数据集),去反推最有可能“完美”生成这批样本的模型的参数值,其满足的一个前提就是样本独立同分布。 这个参考文献中举了一个“袋中摸球”的例子,很形象讲的很精彩,此外再完全引用其中的一段话 " 对于函数输入有两个:表示某一个具体的数据/样本;表示模型的参数。 - 如果是已知确定的,是变量,这个函数叫做概率函数(probability function),它描述在模型时对于不同的样本点x,其出现概率是多少。 - 如果是已知确定的,是变量,这个函数叫做似然函数(likelihood function), 它描述对于不同的模型参数,出现x这个样本点的概率是多少。"

在深度学习中我们通常是样本已知去计算未知的模型参数,即变成了一个似然函数,最大似然估计就是要求得参数使得该似然函数的值最大。

所以最大似然估计的函数表达式也很简单,就是最大化下面的函数: 再举一个平时我自己用的一个例子:

对于深度学习中的分类问题,假定即样本x经过参数为的网络后输出的类别概率分布为,如果类别数是n,则y是一个长度为n的概率分布,其中元素表示预测为第j类的概率,样本的GT我们规定为是一个长度为n的one-hot向量,那么我们最好的网络肯定是希望预测的概率和真实的标签是近乎相同的(),那么可以将这种相似性写成如下形式: 通俗点理解就是希望在中为1的位置也为1;在中为0的位置也为0,对上式左右取log得: 可以发现上面其实就是计算两个离散分布的交叉熵的负数,最大化上面的结果就等于最小化这两个分布的交叉熵。而交叉熵其实这也就是分类任务中普遍常用的损失函数。

拓展:最大后验概率估计(MAP)

相比较于最大似然估计,最大后验概率估计是最大化,即最合适的不仅仅让似然函数最大,也要让尽量大,因为根据贝叶斯公式有:,因为是真实数据分布,所以最大后验估计优化的上式分子最大值,其实也就是整体的最大,即后验证概率,这也就是"最大后验概率估计"的名字由来。 参考文献讲的很好。

最大似然估计(MLE)和最大后验概率估计(MAP)的区别在于:MAP就是多个作为因子的先验概率。或者也可以反过来认为MLE是把先验概率认为等于1,即认为是均匀分布。

变分下限(VLB)

变分下限(Variational Lower Bound)也叫evidence lower bound (ELBO).

在最大似然估计中,有时候难以直接计算并最大化似然函数--也可以写成那么如果我们可以知道他的一个下界,那么最大化他的一个下界,也就可以保证原始的似然函数尽可能大。这里我们要引入另一个分布,我们可以理解为分别是VAE中的观测值(原始数据)和隐变量,两者的关系为我们将隐变量输入到一个decoder中得到结果,其中隐变量一般我们可以规定其从高斯分布中采样而来,即可以假定为一个高斯分布,现在我们从两个角度求原似然函数的下界,其中均简写为

  • 琴生不等式:

  • KL散度:

琴生不等式

凸函数满足对于任意点集有: 而凸函数的定义也很简单,其实就是向下凸的函数,常见的凸函数有

换句话说就是:函数值的加权和加权和的函数值

KL散度

KL散度又称相对熵,用于描述两个概率分布的差异性

  • 一般分布的KL散度求解: 可以看到最终KL散度其实可以转化成交叉熵和熵的差,且KL散度有两个重要性质:

    • 非对称性:
    • 非负性:,仅在时取0

拓展: JS散度

正是由于KL散度的不对称性问题使得在某些训练过程中可能存在一些问题,为了解决这个问题则在KL散度基础上引入了JS散度,假定,则JS散度可以表示为: 参考文献中的一段内容: JS散度是对称的,其取值是 0 到 1 之间。如果两个分布 P和Q 离得很远,完全没有重叠的时候,那么KL散度值是没有意义的,而公式(11)中JS散度值两个是0,所以总体JS散度是一个常数(log2),这在学习算法中是比较致命的,这就意味这这一点的梯度为 0,梯度消失了。

证明P、Q不重叠时JS散度其实也很简单,就是因为不重叠,所以任意一个x,中至少有一个为0,再计算公式(11)就很容易得到两个都是0,最后JS散度就变成了常数log2.

思考:为什么会出现两个分部没有重叠的现象? 真实数据的分布其实是高维空间下的一个低维流行(可以类比想象成立体3维空间里的一个2维平面,而真实情况下可能空间维度),我们的数据没有"撑满"整个空间,这就导致很难重合。原始GAN的损失函数的最终优化目标就是优化真实数据分布和生成数据分布的JS散度,所以GAN有时候可能会出现训练崩塌的情况。

高斯分布的KL散度的快速求解

对于特殊的分布-高斯分布,我们可以直接通过其均值和方差快速求解KL散度:

上面分别表示一元高斯分布和多元高斯分布的KL散度直接求解,其中分别表示矩阵的模和迹。 参考链接

重积分下的Fubini定理

富比尼定理提供了逐次积分的方法计算双重积分的条件。不但可以用逐次积分计算双重积分,而且在交换逐次积分的顺序时,保证了积分结果不会变