— order: 4 —1 DDIM原论文 Denoising Diffusion Implicit Models时间:2020.10.6参考1.一文读懂 DDIM 凭什么可以加速 DDPM 的采样效率2.生成扩散模型漫谈(四):DDIM = 高观点 DDPM By 苏剑林1.1 Key Insights先回顾 DDPM 的推导路线𝑝(𝒙𝑡|𝒙𝑡1)推导𝑝(𝒙𝑡|𝒙0)推导𝑝(𝒙𝑡1|𝒙𝑡,𝒙0)近似𝑝(𝒙𝑡1|𝒙𝑡)然而实质上我们只用到损失函数只依赖于𝑝(𝒙𝑡|𝒙0)采样过程只依赖于𝑝(𝒙𝑡1|𝒙𝑡)能否只依赖边缘分布𝑝(𝒙𝑡|𝒙0)进行推导得到𝑝(𝒙𝑡1|𝒙𝑡,𝒙0)从贝叶斯定理的角度,似乎无法做到𝑝(𝒙𝑡1|𝒙𝑡,𝒙0)=𝑝(𝒙𝑡|𝒙𝑡1)𝑝(𝒙𝑡1|𝒙0)𝑝(𝒙𝑡|𝒙0)但既然它是个边际分布,就可以列出新的方程,用原论文中的数学归纳法也好,用待定系数法求也罢,推出𝑝(𝒙𝑡1|𝒙𝑡,𝒙0)𝑝(𝒙𝑡1|𝒙𝑡,𝒙0)𝑝(𝒙𝑡|𝒙0)d𝒙𝑡=𝑝(𝒙𝑡1|𝒙0)具体推导过程,可以看 DDIM = 高观点 DDPM By 苏剑林摈弃𝑝(𝒙𝑡|𝒙𝑡1)有什么用?实质上是抛开了马尔可夫链的假设,构造了实向量𝝈𝑇0索引的推断分布族𝒬下的分布𝑞𝝈(𝒙𝑡1|𝒙𝑡,𝒙0)=𝒩(𝒙𝑡1;𝛼𝑡1𝒙0+1𝛼𝑡1𝜎2𝑡𝒙𝑡𝛼𝑡𝒙01𝛼𝑡,𝜎2𝑡𝑰)𝒙𝑡1=𝛼𝑡1𝒙0+1𝛼𝑡1𝜎2𝑡𝒙𝑡𝛼𝑡𝒙01𝛼𝑡+𝜎𝑡𝜀人话讲就是我们手动构造了一个分布,且这一分布有𝑇个自由参数𝜎1,𝜎2,,𝜎𝑇,这些参数控制了条件分布𝑞𝝈(𝒙𝑡1|𝒙𝑡,𝒙0)的方差,从而影响了逆过程的随机性用苏剑林的比喻,就是我们知道楼会被拆成什么样𝑝(𝒙𝑡|𝒙0)𝑝(𝒙𝑡1|𝒙0),但是不知道每一步怎么拆𝑝(𝒙𝑡|𝒙𝑡1),然后推导出在知道楼长什么样前提下每一步怎么建(以𝝈为指导)𝑞𝝈(𝒙𝑡1|𝒙𝑡,𝒙0),希望能够从中学会每一步怎么建𝑝(𝒙𝑡1|𝒙𝑡),甚至更进一步能够跳步(见后面 小节 1.3 后面的步骤就和 DDPM 几乎一致了𝑓𝜃(𝒙𝑡,𝑡)表示对𝒙0的预测,从𝑞𝝈(𝒙𝑡1|𝒙𝑡,𝒙0)预测替换𝒙0得到𝑝𝝈,𝜃(𝒙𝑡1|𝒙𝑡)𝑝𝝈,𝜃(𝒙𝑡1|𝒙𝑡)={𝒩(𝒙0;𝑓𝜃(𝒙𝑡,𝑡),𝜎2𝑡𝑰)if𝑡=1𝑞𝝈(𝒙𝑡1|𝒙𝑡,𝑓𝜃(𝒙𝑡,𝑡))otherwise𝑝𝝈,𝜃(𝒙𝑡1|𝒙𝑡)=𝒩(𝒙𝑡1;𝛼𝑡1𝒙𝑡1𝛼𝑡𝜀𝜃(𝒙𝑡)𝛼𝑡+1𝛼𝑡1𝜎2𝑡𝜀𝜃(𝒙𝑡),𝜎2𝑡𝑰)𝒙𝑡1=𝛼𝑡1𝒙𝑡1𝛼𝑡𝜀𝜃(𝒙𝑡)𝛼𝑡𝒙0的预测+1𝛼𝑡1𝜎2𝑡𝜀𝜃(𝒙𝑡)指向𝒙𝑡的方向+𝜎𝑡𝜀随机噪声带入 VLB 各项得到优化目标(符号表示略去跟𝜀𝜃无关的常数)𝑡1𝔼𝒙0𝑞(𝒙0),𝜀𝒩(0,1)[12𝜎2𝑡̃𝜇(𝒙𝑡,𝒙𝑡)𝜇prev𝑖(𝒙𝑡,𝑡)22]=𝔼𝒙0𝑞(𝒙0),𝜀𝒩(0,1)[[[[(𝛼𝑡11𝛼𝑡1𝜎2𝑡𝛼𝑡1𝛼𝑡)22𝜎2𝑡𝒙0𝑓𝜃(𝑡,𝑡)22]]]]=𝔼𝒙0𝑞(𝒙0),𝜀𝒩(0,1)[[[[(𝛼𝑡11𝛼𝑡1𝜎2𝑡𝛼𝑡1𝛼𝑡)2(1𝛼𝑡)2𝜎2𝑡𝛼𝑡𝜀𝜀𝜃(𝒙𝑡,𝑡)22]]]]0𝔼𝒙0𝑞(𝒙0),𝜀𝒩(0,1)[log𝑝𝜃(𝒙0|𝒙1)]=𝔼𝒙0𝑞(𝒙0),𝜀𝒩(0,1)[𝑑log12𝜋𝜎21+12𝜎21𝒙0𝑓𝜃(𝒙1,1)22]𝔼𝒙0𝑞(𝒙0),𝜀𝒩(0,1)[12𝜎21𝒙0𝑓𝜃(𝒙1,1)22]=𝔼𝒙0𝑞(𝒙0),𝜀𝒩(0,1)[1𝛼𝑡2𝜎21𝛼𝑡𝜀𝜀𝜃(𝒙1,1)22]好像没法像原论文那样整合到一个𝒥𝝈里去。但原论文这里的推导感觉很奇怪,反正我推不出来,感觉是为了凑到一个形式改了系数?但网上没看到有人说,是我犯傻了吗?回忆 DDPM 的损失函数DDPM𝑡1=𝔼𝑞(𝒙𝑡|𝒙0)[(1𝛼𝑡)22̃𝜎2𝑡𝛼𝑡(1𝛼𝑡)𝜀𝜃(𝒙𝑡,𝑡)𝜀𝑡22]但总之,通过控制系数里面的𝜎𝑡,我们可以推出 DDIM DDPM 在某个𝝈设置下的共同性。小节 1.2 将验证这一点𝛾𝑡(𝛼𝑡11𝛼𝑡1𝜎2𝑡𝛼𝑡1𝛼𝑡)2(1𝛼𝑡)2𝜎2𝑡𝛼𝑡=(1𝛼𝑡)22̃𝜎2𝑡𝛼𝑡(1𝛼𝑡)𝛾𝑡𝑡1=DDPM𝑡1+𝐶1.2 方差选取前面说到,这个方差其实是可以随便控制的,我们来看两种特殊的例子𝜎𝑡=1𝛼𝑡11𝛼𝑡𝛽𝑡=1𝛼𝑡11𝛼𝑡(1𝛼𝑡)𝜎𝑡=0第一个例子DDPM 采取方差̃𝜎𝑡=1𝛼𝑡11𝛼𝑡𝛽𝑡版本(也就是 DDIM 用跟 DDPM 同方差,能推出二者的一致性),那么目标就是𝛾𝑡=1𝛼𝑡2𝛼𝑡(1𝛼𝑡1)我们将 DDIM 上述方差带入式子,首先来看较难化简的1𝛼𝑡1𝜎2𝑡1𝛼𝑡1𝜎2𝑡=1𝛼𝑡1𝛼𝑡1𝛼𝑡11𝛼𝑡11𝛼𝑡(1𝛼𝑡)=(1𝛼𝑡)(1𝛼𝑡1)(11𝛼𝑡1𝛼𝑡)1𝛼𝑡=(1𝛼𝑡1)(1𝛼𝑡(1𝛼𝑡))1𝛼𝑡=(1𝛼𝑡1)𝛼𝑡1𝛼𝑡于是𝛾𝑡=(𝛼𝑡1(1𝛼𝑡1)𝛼𝑡𝛼𝑡1𝛼𝑡)2(1𝛼𝑡)2𝛼𝑡1𝛼𝑡11𝛼𝑡(1𝛼𝑡)=(𝛼𝑡1(1𝛼𝑡)(1𝛼𝑡1)𝛼𝑡𝛼𝑡)22𝛼𝑡(1𝛼𝑡1)(1𝛼𝑡)=𝛼𝑡1((1𝛼𝑡)𝛼𝑡(1𝛼𝑡1))22𝛼𝑡(1𝛼𝑡1)(1𝛼𝑡)=(1𝛼𝑡)22𝛼𝑡(1𝛼𝑡1)(1𝛼𝑡)=1𝛼𝑡2𝛼𝑡(1𝛼𝑡1)以上我们从损失函数出发,推导出在这种方差设置下 DDIM DDPM 的一致性(实际上,因为方差是已知相等的,直接用均值相等来推导会更快)论文作者实际上对𝜎𝑡=𝜂1𝛼𝑡11𝛼𝑡𝛽𝑡,𝜂[0,1]做了对比实验第二个例子方差为零,则𝒙𝑡𝒙𝑡1是一个确定性变换,从𝒙𝑇=𝒛出发得到𝒙0是不带随机性的𝒙𝑡1=𝛼𝑡1𝒙𝑡1𝛼𝑡𝜀𝜃(𝒙𝑡)𝛼𝑡+1𝛼𝑡1𝜎2𝑡𝜀𝜃(𝒙𝑡)这才是论文 DDIM Implicit 含义,变成一个 deterministic 的隐式分布。因此 DDIM 其实并不是一个模型,只是一个特殊的采样方我们可以认为此时的𝑥𝑇就是一个 high-level 的图像编码向量,里面可能蕴涵了大量的信息特征,也许可以用于其他下游任务最后,作者论述了当𝜂=0时,上式可以写成常微分方程的形式,因此可以理解为模型是在用欧拉法近似从𝑥0𝑥𝑇的编码函数此外,这种确定性变换已经跟 GAN 几乎一致了,与 GAN 类似,我们可以对噪声向量进行插值,然后观察对应的生成效果 DDPM DDIM 对噪声分布都比较敏感,所以我们不能用线性插值而要用球面插值。因为如果𝒛1,𝒛2𝒩(𝟎,𝑰),叠加的𝜆𝒛1+(1𝜆)𝒛2一般就不服从𝒩(𝟎,𝑰),要改为𝒛=𝒛1cos𝜆𝜋2+𝒛2sin𝜆𝜋2,𝜆[0,1]1.3 加速采样DDIM 的推导不依赖马尔可夫性质,抛开马尔可夫性质可以改写成𝑞𝝈,𝜃(𝑥prev|𝑥next)=𝒩(𝑥prev;𝛼prev𝑥next1𝛼next𝜀𝜃(𝑥next)𝛼next+1𝛼prev𝜎2next𝜀𝜃(𝑥next),𝜎2next𝑰)𝑥prev=𝛼prev𝑥next1𝛼next𝜀𝜃(𝑥next)𝛼next+1𝛼prev𝜎2next𝜀𝜃(𝑥next)+𝜎next𝜀于是就可以从时间序列{0,,𝑇}中随机取一个长度为𝑙的升序子序列,通过上式迭代采样𝑙次最终得到我们想要的𝑥0复用 DDPM注意到 DDPM 的训练结果实质上包含了它的任意子序列参数的训练结果,并且 DDIM 训练过程中𝝈的设置不影响边界分布𝑥𝑇=𝛼𝑇𝒙0+1𝛼𝑇𝜀因此二者的训练实际上是共通的!训练好的 DDPM 可以直接拿来通过 DDIM 的采样方法进行采样,不需要再去训练一次为什么干脆不直接训练一个𝑙步的扩散模型,而是要先训练𝑇>𝑙步然后去做子序列采样?按苏剑林的说法,一方面从𝑙步生成来说,训练更多步数的模型也许能增强泛化能力;另一方面,通过子序列进行加速只是其中一种加速手段,训练更充分的𝑇步允许我们尝试更多的其他加速手段,但并不会显著增加训练成本1.4 总结DDIM DDPM 的高观点回顾,完全摈弃了单步加噪𝑞(𝒙𝑡|𝒙𝑡1)的方式,从而不再限制扩散过程必须是一个马尔可夫链。从这个角度利用边缘分布𝑞(𝒙𝑡|𝒙0)推导出比 DDPM 更一般的式子,并顺便解决 DDPM 推理慢的问题,用小采样步数加速生成过程近两年论文其实用的并不多2 IDDPM原论文 Improved Denoising Diffusion Probabilistic Models时间:2021.2.182.1 Motivation & Insights虽然 DDPM 在生成任务上取得了不错的效果,但如果使用一些 metric DDPM 进行评价,就会发现其虽然在 FID IS 指标上效果不错,但在负对数似然 (Negative Log-likelihoodNLL) 上表现不够好根据 VQ-VAE2 文章中的观点,NLL 体现的是模型捕捉数据整体分布的能力,迫使生成模型拟合数据分布的所有模式。有工作表明即使在 NLL 指标上仅有微小的提升,就会在生成效果和特征表征能力上有很大的提升Improved DDPM 主要是针对 DDPM 的训练过程进行改进,主要从两个方面:1.固定方差改为可学习方差;2.改进加噪过程,使用余弦形式的 Scheduler而不是线性 Scheduler2.2 可学习的方差首先我们知道 DDPM 中采用跟𝑡有关的固定方差,可以是̃𝛽𝑡=1𝛼𝑡11𝛼𝑡𝛽𝑡或者𝛽𝑡,效果区别不大这两种方差的设置刚好是假设数据集分布为狄拉克函数和标准正态分布的两种极端情况这里首先分析了为什么会出现这种情况:因为随着𝑡的增大,̃𝛽𝑡𝛽𝑡趋近于1,在大部分采样时刻二者近似相等;并且总步数越大,这个差异越不明显。如下左图这么看来方差的设置不太重要?尤其是在采样步数增大以后,基本完全取决于均值𝜇𝜃(𝒙𝑡,𝑡)而非方差Σ𝜃(𝒙𝑡,𝑡),至少两种固定方差对最终结果影响不大但我们换一种视角,从对 NLL 的数值贡献上来看,如上右图,最初的几步扩散对 VLB 的影响是最大的。换句话说,对 NLL 的增大而言,Σ𝜃(𝒙𝑡,𝑡)依然有一定作用。于是作者做了如下设置Σ𝜃(𝒙𝑡,𝑡)=exp(𝑣log𝛽𝑡+(1𝑣)log̃𝛽𝑡)𝑰其中𝑣是可学习参数,也就是在对数层面进行𝛽𝑡,̃𝛽𝑡的插值之所以用插值的形式,是因为如前所述𝛽𝑡,̃𝛽𝑡的差异(变化范围)非常小,从数值精度上就不适合神经网络学习;同时,插值的形式也符合对两个极端的认识这里我们没有对𝑣的范围进行限制,所以理论上模型可以学习到任意范围的方差值,但在实验中并未观察到模型学习到超出插值范围的方差的情况DDPM 的损失函数𝐿simpleΣ𝜃(𝒙𝑡,𝑡)无关,所以肯定要做修改,这部分留到后面介绍2.3 余弦调度器DDPM 使用线性的𝛽𝑡超参规划,对于高分辨率图像效果还行,但对低分辨率的图像表现不佳为什么?因为 DDPM 前向加噪时,𝛽𝑡是从一个较小值逐渐增大,如果最开始的时候加入很大的噪声,会严重破坏图像信息,不利于图像的学习。对于低分辨率图像尤其严重,因为包含的信息本身就不多,加噪太快使得细节丢失太快回忆原本的超参设置,𝑇=1000𝛽𝑡𝛽1=104𝛽𝑇=0.02线性变化,大致上可以表示为𝛼𝑡=1𝛽𝑡=10.02𝑡𝑇,𝛼𝑡=𝑡𝑖=1𝛼𝑖现在我们设置如下𝛼𝑡=𝑓(𝑡)𝑓(0),𝑓(𝑡)=cos(𝑡/𝑇+𝑠1+𝑠𝜋2)2除此之外设计这个 schedule 的时候作者也有一些比较细节的考虑,比如选取一个比较小的偏移量𝑠=8×103,防止𝛽𝑡𝑡=0附近过小,并且将𝛽𝑡裁剪到0.999来防止𝑡=𝑇附近出现奇异点𝑠的数值来自希望使𝛽0略小于像素区间大小1/127.5这个 schedule 𝑡=0𝑡=𝑇附近都变化比较小,而在中间有一个接近于线性的下降过程,同时可以发现 cosine schedule 使图片能够在中间地带还能保持一个比较好的图片细节,最终 FID 指标也有所上升2.4 训练过程最终训练使用的损失是两项损失的加权hybrid=simple+𝜆VLBsimple DDPM 简化 (reweight) 后的损失函数,VLB是推导中用的标准变分下界前者与Σ𝜃(𝒙𝑡,𝑡)无关,后者用𝜆=1×103权重避免喧宾夺主,且对VLB中的均值项𝜇𝜃(𝒙𝑡,𝑡)进行 stop-gradient只影响方差)随后作者发现直接的VLB很难优化resample作者分析认为这是因为不同时间步的 VLB 损失大小不一(也就是上边那个损失曲线),导致VLB的梯度比较 noisy回忆 DDPM simple,虽然方差和均值的设置不一样,但损失贡献不一致的问题是一样的,对此 DDPM 采用 reweight 解决,同时也时损失函数更加简单作者这里采用了不同的方法,称为重要性采样VLB=𝔼𝑡𝑝𝑡[𝐿𝑡𝑝𝑡],where𝑝𝔼[𝐿2𝑡]and𝑝𝑡=1根据𝑡在之前采出的 loss 值的平方𝐿2𝑡(会随着每次采样计算出的 loss 值而动态更新)确定采样分布具体方法是先对每个𝑡都采样10次,选用平均值作为𝐿𝑡,然后作为权重进行重要性采样,每次采样后都用计算出的 loss 去更新对应平均值3 Analytic-DPM & Extended-Analytic-DPM其实 IDDPM 的做法算比较简单的,后续还有一些对方差的改进,比如1.Analytic-DPM: an Analytic Estimate of the Optimal Reverse Variance in Diffusion Probabilistic Models (2022.1.17)2.Estimating the Optimal Covariance with Imperfect Mean in Diffusion Probabilistic Models (2022.6.15)还是看苏剑林的博客吧 生成扩散模型漫谈(七):最优扩散方差估计(上) 生成扩散模型漫谈(八):最优扩散方差估计(下)