Created by: 银晗 张
Created time: May 29, 2023 8:12 AM
要讲扩散模型,不得不提VAE。VAE和GAN一样,都是从隐变量Z生成目标数据X。
它们假设隐变量服从某种常见的概率分布(比如正态分布),然后希望训练一个模型
X = g ( Z ) X=g(Z) X=g(Z),这个模型将原来的概率分布映射到训练集的概率分布,也就是分布的变换。
是不是听上去很work?
但是这种方法本质上是难以work的,因为尽量接近并没有一个确定的关于 X X X和 X ˉ \bar{X} Xˉ的相似度的评判标准。
换句话说,这种方法的难度就在于,必须去猜测“它们的分布相等吗”这个问题,而缺少真正interpretable的价值判断。
有聪明的同学会问,KL散度不就够了吗?不行,因为KL散度是针对两个已知的概率分布求相似度的,而 X ˉ 和 X \bar{X}和X Xˉ和X的概率分布目前都是未知。
它本质上就是在我们常规的自编码器的基础上,对 encoder 的结果(在VAE中对应着计算均值的网络)加上了“高斯噪声”,使得结果 decoder 能够对噪声有鲁棒性;而那个额外的 KL loss(目的是让均值为 0,方差为 1),事实上就是相当于对 encoder 的一个正则项,希望 encoder 出来的东西均有零均值。
为了使模型具有生成能力,VAE 要求每个 p(Z_X) 都向正态分布看齐。
那怎么让所有的 p(Z|X) 都向 N(0,I) 看齐呢?如果没有外部知识的话,其实最直接的方法应该是在重构误差的基础上中加入额外的 loss:
因为它们分别代表了均值 μ k μ_k μk 和方差的对数 l o g σ 2 logσ^2 logσ2,达到 ∗ N ( 0 , I ) ∗ *N(0,I)* ∗N(0,I)∗ 就是希望二者尽量接近于 0 了。不过,这又会面临着这两个损失的比例要怎么选取的问题,选取得不好,生成的图像会比较模糊。
这里的 d 是隐变量 Z 的维度,而 μ ( i ) μ(i) μ(i) 和 σ ( i ) 2 σ_{(i)}^{2} σ(i)2 分别代表一般正态分布的均值向量和方差向量的第 i 个分量。直接用这个式子做补充 loss,就不用考虑均值损失和方差损失的相对比例问题了。
其实很简单,就是我们要从 ∗ p ( Z ∣ X k ) ∗ *p(Z|X_k)* ∗p(Z∣Xk)∗ 中采样一个 Z k Z_k Zk 出来,尽管我们知道了 ∗ p ( Z ∣ X k ) ∗ *p(Z|X_k)* ∗p(Z∣Xk)∗ 是正态分布,但是均值方差都是靠模型算出来的,我们要靠这个过程反过来优化均值方差的模型,但是“采样”这个操作是不可导的,而采样的结果是可导的,于是我们利用了一个事实:
所以,我们将从 N ( μ , σ 2 ) N(μ,σ^2) N(μ,σ2) 采样变成了从 ∗ N ( 0 , σ 2 ) ∗ *N(0,σ^2)* ∗N(0,σ2)∗ 中采样,然后通过参数变换得到从 ∗ N ( μ , σ 2 ) ∗ *N(μ,σ^2)* ∗N(μ,σ2)∗ 中采样的结果。
这样一来,“采样”这个操作就不用参与梯度下降了,改为采样的结果参与,使得整个模型可训练了。
那反过来,我想要设计一种方法A,使得A用一种简单的“变分后验”将数据样本映射到标准高斯(自己定义的),并且使得A的生成器,将标准高斯映射到数据样本(学出来的)。
所以,A学的是样本到标准高斯分布 N ( μ , σ 2 ) N(\mu,\sigma^2) N(μ,σ2)的的映射关系 f f f,如何学?马尔可夫链
马尔可夫链:
一个概率分布如果随时间变化,那么在马尔可夫链的作用下,它一定会趋于某种平稳分布(例如高斯分布)。只要终止时间足够长,概率分布就会趋近于这个平稳分布。
这个逐渐逼近的过程被作者称为前向过程(forward process)。**注意,这个过程的本质还是加噪声!**试想一下为什么……其实和VAE非常相似,都是在随机采样!马尔可夫链每一步的转移概率,本质上都是在加噪声。这就是扩散模型中“扩散”的由来:噪声在马尔可夫链演化的过程中,逐渐进入diffusion体系。
**物理扩散过程:**随着时间的推移,加入的噪声(加入的溶质)越来越少,而体系中的噪声(这个时刻前的所有溶质)逐渐在diffussion体系中扩散,直至均匀。
前向过程通过马尔可夫链的转移概率不断加入噪音,从右边的采样数据到左边的标准高斯;
反向过程通过SDE来“抄袭”对应正向过程的那一个epoch的行为(其实每一步都不过是一个高斯分布),从而逐渐学习到对抗噪声的能力。高斯分布是一种很简单的分布,运算量小,这一点是diffusion快的最重要原因。
前向过程:
DDPM的每一步的推断可以总结为: