扩散模型(Diffusion Model)是继GAN、VAE后的一种生成式模型。《Denoising Diffusion Probabilistic Models》是UC Berkeley于2020年发表的一篇论文,其中引入扩散模型(Diffusion Model)进行图片生成。而目前在文生图领域比较流行的工具,如DALL-E2、Imagen、Stable Diffusion等,均是以上述扩散模型为基础,不断进行算法优化、迭代,取得了令人惊艳的效果。
本文是对于博客《What are Diffusion Models?》部分内容的翻译,主要是对于论文《Denoising Diffusion Probabilistic Models》中扩散模型的解读,后续会不断补充关于扩散模型算法迭代的论文阅读笔记。
扩散模型
正向扩散过程
令原始图片样本为x0,其满足分布x0∼q(x0)。定义前向扩散过程,在T步内,每步给样本增加一个小的满足高斯分布的噪声,从而产生T个带噪声的样本x1,...,xT,整个过程为一个一阶马尔可夫过程,xt只与xt−1有关,可用以下公式表示:
q(xt∣xt−1)=N(xt;1−βtxt−1,βtI)(1)
其中,q(xt∣xt−1)表示给定xt−1时,xt的条件概率,即均值为1−βtxt−1、方差为βtI的高斯分布,集合{βt∈(0,1)}t=1T用于控制每步的噪声大小。进一步给定x0时,整个马尔科夫过程的条件概率为各步条件概率的连乘,可用以下公式表示:
q(x1:T∣x0)=t=1∏Tq(xt∣xt−1)(2)
正向扩散过程可由图1从右到左的过程表示,其中x0为原始图片,随着每步增加噪声,图片逐渐变得模糊。

对于上述正向扩散过程,可进一步令αt=1−βt,且αˉt=∏i=1tαi,则xt可用以下公式表示:
xt=αtxt−1+1−αtϵt−1=αtαt−1xt−2+1−αtαt−1ϵˉt−2=...=αˉtx0+1−αˉtϵ;where ϵt−1,ϵt−2,...∼N(0,I);where ϵˉt−2 merge two Gaussians (∗).(3)
即xt是在xt−1的基础上,增加一个满足高斯分布的噪声ϵt−1,循环递归,即xt是在x0的基础上,增加一个满足高斯分布的噪声ϵ。这里使用了高斯分布的一个特性,即两个高斯分布合并后仍是一个高斯分布,例如分布N(0,σ12I)和N(0,σ22I),合并后的分布为N(0,(σ12+σ22)I)。因此,给定x0时,xt的条件概率为均值为αˉtx0、方差为(1−αˉt)I的高斯分布,可用以下公式表示:
q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)I)(4)
反向扩散过程
以上介绍了正向扩散过程,即图1从右到左,对原始图片逐步增加噪声,如果将过程逆向,即图1从左到右,那么就能从满足高斯分布的噪音xT∼N(0,I)逐步还原原始图片样本,这就是基于扩散模型生成图片的基本思想,即从xT到x0的每一步,在给定xt时,根据条件概率q(xt−1∣xt)采样求解xt−1,直至最终得到x0。
而当正向扩散过程每步增加的噪声很小时,反向扩散过程的条件概率q(xt−1∣xt)也可以认为满足高斯分布,但实际上,我们不能直接求解该条件概率,因为直接求解需要整体数据集合。除直接求解外,另一个方法是训练一个模型pθ近似预估上述条件概率,可用以下公式表示:
pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),Σθ(xt,t))(5)
pθ(x0:T)=p(xT)t=1∏Tpθ(xt−1∣xt)(6)
进一步,论文将求解q(xt−1∣xt)等价于求解q(xt−1∣xt,x0),可用以下公式表示:
q(xt−1∣xt,x0)=N(xt−1;μ~(xt,x0),β~tI)(7)
基于贝叶斯公式,可将q(xt−1∣xt,x0)作以下转化:
q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt∣x0)q(xt−1∣x0)(8)
而上述公式中,q(xt−1∣xt,x0)、q(xt−1∣x0)和q(xt∣x0)通过正向扩散过程中的分析可知均满足高斯分布,代入高斯分布的公式进一步转化可得:
q(xt−1∣xt,x0)=q(xt∣xt−1,x0)q(xt∣x0)q(xt−1∣x0)∝exp(−21(βt(xt−αtxt−1)2+1−αˉt−1(xt−1−αˉt−1x0)2−1−αˉt(xt−αˉtx0)2))=exp(−21(βtxt2−2αtxtxt−1+αtxt−12+1−αˉt−1xt−12−2αˉt−1x0xt−1+αˉt−1x02−1−αˉt(xt−αˉtx0)2))=exp(−21((βtαt+1−αˉt−11)xt−12−(βt2αtxt+1−αˉt−12αˉt−1x0)xt−1+C(xt,x0)))(9)
其中C(xt,x0)是不包含中间状态xt−1的函数。q(xt−1∣xt,x0)也满足高斯分布,对比公式7和公式9,并代入前向扩散过程中已定义的αt=1−βt、且αˉt=∏i=1tαi,可将公式7的方差和均值表示为以下公式:
β~t=1/(βtαt+1−αˉt−11)=1/(βt(1−αˉt−1)αt−αˉt+βt)=1−αˉt1−αˉt−1⋅βt(10)
μ~t(xt,x0)=(βtαtxt+1−αˉt−1αˉt−1x0)/(βtαt+1−αˉt−11)=(βtαtxt+1−αˉt−1αˉt−1x0)1−αˉt1−αˉt−1⋅βt=1−αˉtαt(1−αˉt−1)xt+1−αˉtαˉt−1βtx0(11)
在前向扩散过程中已推导xt和x0的关系,即x0=αˉt1(xt−1−αˉtϵt),将其代入上面的公式,可进一步得到:
μ~t=1−αˉtαt(1−αˉt−1)xt+1−αˉtαˉt−1βtαˉt1(xt−1−αˉtϵt)=αt1(xt−1−αˉt1−αtϵt)(12)
模型训练
目标函数
反向扩散过程中已提到通过训练一个模型pθ近似预估条件概率q(xt−1∣xt),对于该模型的训练,其目标函数即最小化以下交叉熵损失函数,也可以认为对于样本x0,在满足分布q(x0)下,最大化模型给出的概率pθ(x0)的期望:
LCE=−Eq(x0)logpθ(x0)=−Eq(x0)log(∫pθ(x0:T)dx1:T)=−Eq(x0)log(∫q(x1:T∣x0)q(x1:T∣x0)pθ(x0:T)dx1:T)=−Eq(x0)log(Eq(x1:T∣x0)q(x1:T∣x0)pθ(x0:T))≤−Eq(x0:T)logq(x1:T∣x0)pθ(x0:T)=Eq(x0:T)[logpθ(x0:T)q(x1:T∣x0)]=LVLB(13)
上述公式转化中,先将pθ(x0)转化为基于x1:T对pθ(x0:T)的积分,再将pθ(x0:T)转化为q(x1:T∣x0)q(x1:T∣x0)pθ(x0:T),最后通过变分下届舍弃Eq(x1:T∣x0),将目标函数由最小化LCE转化为最小化LVLB。
进一步对LVLB进行拆解转化,如下所示:
LVLB=Eq(x0:T)[logpθ(x0:T)q(x1:T∣x0)]=Eq[logpθ(xT)∏t=1Tpθ(xt−1∣xt)∏t=1Tq(xt∣xt−1)]=Eq[−logpθ(xT)+t=1∑Tlogpθ(xt−1∣xt)q(xt∣xt−1)]=Eq[−logpθ(xT)+t=2∑Tlogpθ(xt−1∣xt)q(xt∣xt−1)+logpθ(x0∣x1)q(x1∣x0)]=Eq[−logpθ(xT)+t=2∑Tlog(pθ(xt−1∣xt)q(xt−1∣xt,x0)⋅q(xt−1∣x0)q(xt∣x0))+logpθ(x0∣x1)q(x1∣x0)]=Eq[−logpθ(xT)+t=2∑Tlogpθ(xt−1∣xt)q(xt−1∣xt,x0)+t=2∑Tlogq(xt−1∣x0)q(xt∣x0)+logpθ(x0∣x1)q(x1∣x0)]=Eq[−logpθ(xT)+t=2∑Tlogpθ(xt−1∣xt)q(xt−1∣xt,x0)+logq(x1∣x0)q(xT∣x0)+logpθ(x0∣x1)q(x1∣x0)]=Eq[logpθ(xT)q(xT∣x0)+t=2∑Tlogpθ(xt−1∣xt)q(xt−1∣xt,x0)−logpθ(x0∣x1)]=Eq⎣⎡LTDKL(q(xT∣x0)∥pθ(xT))+t=2∑TLt−1DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))L0−logpθ(x0∣x1)⎦⎤(14)
其中,先将q(x1:T∣x0)、pθ(x0:T)分别表示为由每步q(xt∣xt−1)、pθ(xt−1∣xt)连乘的形式,接着将LVLB表示为每步logpθ(xt−1∣xt)q(xt∣xt−1)相加的形式,而形如logpθq的表达式在数学上被定义为KL散度,用来衡量真实概率分布q和近似概率分布pθ之间的相似度,因此,公式14最终会可通过公式15来表达:
LVLBwhere LTLtL0=LT+LT−1+⋯+L0=DKL(q(xT∣x0)∥pθ(xT))=DKL(q(xt∣xt+1,x0)∥pθ(xt∣xt+1)) for 1≤t≤T−1=−logpθ(x0∣x1)(15)
其中,LT是常量,Lt表示每步q(xt∣xt+1,x0)和pθ(xt∣xt+1)的KL散度。
反向扩散过程中已提到通过训练一个模型pθ近似预估条件概率q(xt−1∣xt),其中如公式12所示,预测值μ~t=αt1(xt−1−αˉt1−αtϵt),而xt是输入值,因此可以改为在第t步,针对输入xt预测噪声ϵt:
μθ(xt,t)Thus xt−1=αt1(xt−1−αˉt1−αtϵθ(xt,t))=N(xt−1;αt1(xt−1−αˉt1−αtϵθ(xt,t)),Σθ(xt,t))(16)
损失项Lt可以表示为最小化μ~的差值,即最小二乘法上述的μ~t和μθ:
Lt=Ex0,ϵ[2∥Σθ(xt,t)∥221∥μ~t(xt,x0)−μθ(xt,t)∥2]=Ex0,ϵ[2∥Σθ∥221∥ αt1(xt−1−αˉt1−αtϵt)−αt1(xt−1−αˉt1−αtϵθ(xt,t))∥2]=Ex0,ϵ[2αt(1−αˉt)∥Σθ∥22(1−αt)2∥ϵt−ϵθ(xt,t)∥2]=Ex0,ϵ[2αt(1−αˉt)∥Σθ∥22(1−αt)2∥ϵt−ϵθ(αˉtx0+1−αˉtϵt,t)∥2](17)
论文中进一步发现,训练扩散模型时,如果舍弃权重项,对损失函数项Lt进行简化,效果会更好,简化后的Lt如下:
Ltsimple=Et∼[1,T],x0,ϵt[∥ϵt−ϵθ(xt,t)∥2]=Et∼[1,T],x0,ϵt[∥ϵt−ϵθ(αˉtx0+1−αˉtϵt,t)∥2](18)
最终的损失函数为:
Lsimple=Ltsimple+C(19)
其中,C为依赖θ的常量。
训练过程

训练和采样算法如图2所示。在训练算法中,对于随机采样的样本x0和步数t按高斯分布生成噪声ϵ,然后基于噪声计算公式18的梯度,然后再基于梯度更新模型参数,循环上述步骤,直至收敛。在采样算法中,按高斯分布生成xT,然后分T步,每步预测噪音ϵθ,按公式12由xt和ϵθ计算xt−1,直至最后计算得到x0,另外,除最后一步外,前序每步计算结果都会再增加一个满足高斯分布的随机噪声z。