生成扩散模型漫谈(四):DDIM = 高观点DDPM

相信很多读者都听说过甚至读过克莱因的《高观点下的初等数学》这套书,顾名思义,这是在学到了更深入、更完备的数学知识后,从更高的视角重新审视过往学过的初等数学,以得到更全面的认知,甚至达到温故而知新的效果。类似的书籍还有很多,比如《重温微积分》《复分析:可视化方法》等。

回到扩散模型,目前我们已经通过三篇文章从不同视角去解读了DDPM,那么它是否也存在一个更高的理解视角,让我们能从中得到新的收获呢?当然有,《Denoising Diffusion Implicit Models》介绍的DDIM模型就是经典的案例,本文一起来欣赏它。

思路分析 #

《生成扩散模型漫谈(三):DDPM = 贝叶斯 + 去噪》中,我们提到过该文章所介绍的推导跟DDIM紧密相关。具体来说,文章的推导路线可以简单归纳如下:
(1)p(xt|xt1)推导p(xt|x0)推导p(xt1|xt,x0)近似p(xt1|xt)
这个过程是一步步递进的。然而,我们发现最终结果有着两个特点:

1、损失函数只依赖于p(xt|x0)

2、采样过程只依赖于p(xt1|xt)

也就是说,尽管整个过程是以p(xt|xt1)为出发点一步步往前推的,但是从结果上来看,压根儿就没p(xt|xt1)的事。那么,我们大胆地“异想天开”一下:

高观点1: 既然结果跟p(xt|xt1)无关,可不可以干脆“过河拆桥”,将p(xt|xt1)从整个推导过程中去掉?

DDIM正是这个“异想天开”的产物!

待定系数 #

可能有读者会想,根据上一篇文章所用的贝叶斯定理
(2)p(xt1|xt,x0)=p(xt|xt1)p(xt1|x0)p(xt|x0)
没有给定p(xt|xt1)怎么能得到p(xt1|xt,x0)?这其实是思维过于定式了,理论上在没有给定p(xt|xt1)的情况下,p(xt1|xt,x0)的解空间更大,某种意义上来说是更加容易推导,此时它只需要满足边际分布条件:
(3)p(xt1|xt,x0)p(xt|x0)dxt=p(xt1|x0)
我们用待定系数法来求解这个方程。在上一篇文章中,所解出的p(xt1|xt,x0)是一个正态分布,所以这一次我们可以更一般地设
(4)p(xt1|xt,x0)=N(xt1;κtxt+λtx0,σt2I)
其中κt,λt,σt都是待定系数,而为了不重新训练模型,我们不改变p(xt1|x0)p(xt|x0),于是我们可以列出
记号含义采样p(xt1|x0)N(xt1;α¯t1x0,β¯t12I)xt1=α¯t1x0+β¯t1εp(xt|x0)N(xt;α¯tx0,β¯t2I)xt=α¯tx0+β¯tε1p(xt1|xt,x0)N(xt1;κtxt+λtx0,σt2I)xt1=κtxt+λtx0+σtε2p(xt1|xt,x0)p(xt|x0)dxtxt1=κtxt+λtx0+σtε2=κt(α¯tx0+β¯tε1)+λtx0+σtε2=(κtα¯t+λt)x0+(κtβ¯tε1+σtε2)
其中ε,ε1,ε2N(0,I),并且由正态分布的叠加性我们知道κtβ¯tε1+σtε2κt2β¯t2+σt2ε。对比xt1的两个采样形式,我们发现要想(3)成立,只需要满足两个方程
(5)α¯t1=κtα¯t+λt,β¯t1=κt2β¯t2+σt2
可以看到有三个未知数,但只有两个方程,这就是为什么说没有给定p(xt|xt1)时解空间反而更大了。将σt视为可变参数,可以解出
(6)κt=β¯t12σt2β¯t,λt=α¯t1α¯tβ¯t12σt2β¯t
或者写成
(7)p(xt1|xt,x0)=N(xt1;β¯t12σt2β¯txt+(α¯t1α¯tβ¯t12σt2β¯t)x0,σt2I)
方便起见,我们约定α¯0=1,β¯0=0。特别地,这个结果并不需要限定α¯t2+β¯t2=1,不过为了简化参数设置,同时也为了跟以往的结果对齐,这里还是约定α¯t2+β¯t2=1

一如既往 #

现在我们在只给定p(xt|x0)p(xt1|x0)的情况下,通过待定系数法求解了p(xt1|xt,x0)的一簇解,它带有一个自由参数σt。用《生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼》中的“拆楼-建楼”类比来说,就是我们知道楼会被拆成什么样【p(xt|x0)p(xt1|x0)】,但是不知道每一步怎么拆【p(xt|xt1)】,然后希望能够从中学会每一步怎么建【p(xt1|xt)】。当然,如果我们想看看每一步怎么拆的话,也可以反过来用贝叶斯公式
(8)p(xt|xt1,x0)=p(xt1|xt,x0)p(xt|x0)p(xt1|x0)

接下来的事情,就跟上一篇文章一模一样了:我们最终想要p(xt1|xt)而不是p(xt1|xt,x0),所以我们希望用
(9)μ¯(xt)=1α¯t(xtβ¯tϵθ(xt,t))
来估计x0,由于没有改动p(xt|x0),所以训练所用的目标函数依然是εϵθ(α¯tx0+β¯tε,t)2(除去权重系数),也就是说训练过程没有改变,我们可以用回DDPM训练好的模型。而用μ¯(xt)替换掉式(7)中的x0后,得到
(10)p(xt1|xt)p(xt1|xt,x0=μ¯(xt))=N(xt1;1αt(xt(β¯tαtβ¯t12σt2)ϵθ(xt,t)),σt2I)
这就求出了生成过程所需要的p(xt1|xt),其中αt=α¯tα¯t1。它的特点是训练过程没有变化(也就是说最终保存下来的模型没有变化),但生成过程却有一个可变动的参数σt,就是这个参数给DDPM带来了新鲜的结果。

几个例子 #

原则上来说,我们对σt没有过多的约束,但是不同σt的采样过程会呈现出不同的特点,我们举几个例子进行分析。

第一个简单例子就是取σt=β¯t1βtβ¯t,其中βt=1αt2,相应地有
(11)p(xt1|xt)p(xt1|xt,x0=μ¯(xt))=N(xt1;1αt(xtβt2β¯tϵθ(xt,t)),β¯t12βt2β¯t2I)
这就是上一篇文章所推导的DDPM。特别是,DDIM论文中还对σt=ηβ¯t1βtβ¯t做了对比实验,其中η[0,1]

第二个例子就是取σt=βt,这也是前两篇文章所指出的σt的两个选择之一,在此选择下式(10)未能做进一步的化简,但DDIM的实验结果显示此选择在DDPM的标准参数设置下表现还是很好的。

最特殊的一个例子是取σt=0,此时从xtxt1是一个确定性变换
(12)xt1=1αt(xt(β¯tαtβ¯t1)ϵθ(xt,t))
这也是DDIM论文中特别关心的一个例子,准确来说,原论文的DDIM就是特指σt=0的情形,其中“I”的含义就是“Implicit”,意思这是一个隐式的概率模型,因为跟其他选择所不同的是,此时从给定的xT=z出发,得到的生成结果x0是不带随机性的。后面我们将会看到,这在理论上和实用上都带来了一些好处。

加速生成 #

值得指出的是,在这篇文章中我们没有以p(xt|xt1)为出发点,所以前面的所有结果实际上全都是以α¯t,β¯t相关记号给出的,而αt,βt则是通过αt=α¯tα¯t1βt=1αt2派生出来的记号。从损失函数εϵθ(α¯tx0+β¯tε,t)2可以看出,给定了各个α¯t,训练过程也就确定了。

从这个过程中,DDIM进一步留意到了如下事实:

高观点2: DDPM的训练结果实质上包含了它的任意子序列参数的训练结果。

具体来说,设τ=[τ1,τ2,,τdim(τ)][1,2,,T]的任意子序列,那么我们以α¯τ1,α¯τ2,,α¯dim(τ)为参数训练一个扩散步数为dim(τ)步的DDPM,其目标函数实际上是原来以α¯1,α¯2,,α¯TT步DDPM的目标函数的一个子集!所以在模型拟合能力足够好的情况下,它其实包含了任意子序列参数的训练结果。

那么反过来想,如果有一个训练好的T步DDPM模型,我们也可以将它当成是以α¯τ1,α¯τ2,,α¯dim(τ)为参数训练出来的dim(τ)步模型,而既然是dim(τ)步的模型,生成过程也就只需要dim(τ)步了,根据式(10)有:
(13)p(xτi1|xτi)N(xτi1;α¯τi1α¯τi(xτi(β¯τiα¯τiα¯τi1β¯τi12σ~τi2)ϵθ(xτi,τi)),σ~τi2I)
这就是加速采样的生成过程了,从原来的T步扩散生成变成了dim(τ)步。要注意不能直接将式(10)αt换成ατi,因为我们说过αt是派生记号而已,它实际上等于α¯tα¯t1,因此αt要换成α¯τiα¯τi1才对。同理,σ~τi也不是直接取στi,而是在将其定义全部转化为α¯,β¯符号后,将t替换为τit1替换为τi1,比如式(11)对应的σ~τi
(14)σt=β¯t1βtβ¯t=β¯t1β¯t1α¯t2α¯t12β¯τi1β¯τi1α¯τi2α¯τi12=σ~τi

可能读者又想问,我们为什么干脆不直接训练一个dim(τ)步的扩散模型,而是要先训练T>dim(τ)步然后去做子序列采样?笔者认为可能有两方面的考虑:一方面从dim(τ)步生成来说,训练更多步数的模型也许能增强泛化能力;另一方面,通过子序列τ进行加速只是其中一种加速手段,训练更充分的T步允许我们尝试更多的其他加速手段,但并不会显著增加训练成本。

实验结果 #

原论文对不同的噪声强度和扩散步数dim(τ)做了组合对比,大致上的结果是“噪声越小,加速后的生成效果越好”,如下图

DDIM的实验结果,显示噪声越小,加速后的生成效果越好

DDIM的实验结果,显示噪声越小,加速后的生成效果越好

 

笔者的参考实现如下:

个人的实验结论是:

1、可能跟直觉相反,生成过程中的σt越小,最终生成图像的噪声和多样性反而相对来说越大;

2、扩散步数dim(τ)越少,生成的图片更加平滑,多样性也会有所降低;

3、结合1、2两点得知,在扩散步数dim(τ)减少时,可以适当缩小σt,以保持生成图片质量大致不变,这跟DDIM原论文的实验结论是一致的;

4、在σt较小时,相比可训练的Embedding层,用固定的Sinusoidal编码来表示t所生成图片的噪声要更小;

5、在σt较小时,原论文的U-Net架构(Github中的ddpm2.py)要比笔者自行构思的U-Net架构(Github中的ddpm.py)所生成图片的噪声要更小;

6、但个人感觉,总体来说不带噪声的生成过程的生成效果不如带噪声的生成过程,不带噪声时生成效果受模型架构影响较大。

此外,对于σt=0时的DDIM,它就是将任意正态噪声向量变换为图片的一个确定性变换,这已经跟GAN几乎一致了,所以跟GAN类似,我们可以对噪声向量进行插值,然后观察对应的生成效果。但要注意的是,DDPM或DDIM对噪声分布都比较敏感,所以我们不能用线性插值而要用球面插值,因为由正态分布的叠加性,如果z1,z2N(0,I)λz1+(1λ)z2一般就不服从N(0,I),要改为
(15)z=z1cosλπ2+z2sinλπ2,λ[0,1]

插值效果演示(笔者自己训练的模型):

DDIM随机向量的插值生成效果

DDIM随机向量的插值生成效果

 

微分方程 #

最后,我们来重点分析一下σt=0的情形。此时(12)可以等价地改写成:
(16)xtα¯txt1α¯t1=(β¯tα¯tβ¯t1α¯t1)ϵθ(xt,t)
T足够大,或者说αtαt1足够小时,我们可以将上式视为某个常微分方程的差分形式。特别地,引入虚拟的时间参数s,我们得到
(17)dds(x(s)α¯(s))=ϵθ(x(s),t(s))dds(β¯(s)α¯(s))
不失一般性,假设s[0,1],其中s=0对应t=0s=1对应t=T。注意DDIM原论文直接用β¯(s)α¯(s)作为虚拟时间参数,这原则上是不大适合的,因为它的范围是[0,),无界的区间不利于数值求解。

那么现在我们要做的事情就是在给定x(1)N(0,I)的情况下,去求解出x(0)。而DDPM或者DDIM的迭代过程,对应于该常微分方程的欧拉方法。众所周知欧拉法的效率相对来说是最慢的,如果要想加速求解,可以用Heun方法R-K方法等。也就是说,将生成过程等同于求解常微分方程后,可以借助常微分方程的数值解法,为生成过程的加速提供更丰富多样的手段。

以DDPM的默认参数T=1000αt=10.02tT为例,我们重复《生成扩散模型漫谈(一):DDPM = 拆楼 + 建楼》所做的估计
(18)logα¯t=i=ktlogαk=12k=1tlog(10.02kT)<12k=1t(0.02kT)=0.005t(t+1)T
事实上,由于每个αk都很接近于1,所以上述估计其实也是一个很好的近似。而我们说了本文的出发点是p(xt|x0),所以应该以α¯t为起点,根据上述近似,我们可以直接简单地取
(19)α¯t=exp(0.005t2T)=exp(5t2T2)
如果取s=t/T为参数,那么正好s[0,1],此时α¯(s)=e5s2,代入到式(17)化简得
(20)dx(s)ds=10s(ϵθ(x(s),sT)1e10s2x(s))
也可以取s=t2/T2为参数,此时也有s[0,1],以及α¯(s)=e5s,代入到式(17)化简得
(21)dx(s)ds=5(ϵθ(x(s),sT)1e10sx(s))

文章小结 #

本文接着上一篇DDPM的推导思路来介绍了DDIM,它重新审视了DDPM的出发点,去掉了推导过程中的p(xt|xt1),从而获得了一簇更广泛的解和加速生成过程的思路,最后这簇新解还允许我们将生成过程跟常微分方程的求解联系起来,从而借助常微分方程的方法进一步对生成过程进行研究。

转载到请包括本文地址:https://spaces.ac.cn/archives/9181

更详细的转载事宜请参考:《科学空间FAQ》

posted @   jasonzhangxianrong  阅读(198)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示