DDPM(Denoising Diffusion Probabilistic Models)是一种基于扩散过程的生成模型。它通过逐步向数据中添加噪声来模拟数据的生成过程,然后学习一个逆向过程来去除噪声,从而生成新的数据样本。
2.1 扩散模型的正向过程#
2.1.1 扩散过程#
物理启发
扩散过程是一种概率方法,它将复杂的数据分布(例如图像)转换为一个更简单的分布(例如高斯噪声)。受物理学概念的启发,该过程逐步向原始数据中注入少量噪声,最终得到一个标准高斯分布 N(0,Id)。
数学形式
数学上,给定一个数据分布 q0(x0),我们在每一步逐步添加噪声 βtϵt∼N(0,βtId),其中我们将 t 步后的新数据分布表示为 qt(xt)。这个过程可以用以下方程描述:
xt=wtxt−1+βtϵt,ϵt∼N(0,Id),t=1,2,…,T其中 0<wt≤1,βt 是一个小的正常数,控制每一步添加的噪声量。
2.1.2 wt 的选取#
稳态均值
最终,我们希望达到一个状态,使得数据分布 qT(xT) 近似于一个标准高斯分布 N(0,Id)。这对 wt 的选取提出了要求。当 T→∞ 时,变量 xT 的期望变为
E(xT)=E(wTxT−1)+βTE(ϵT)=wTE(xT−1)=wTwT−1E(xT−2)=⋯=t=1∏TwtE(x0)≤wmaxTE(x0)只要 wmax=max{wt}t=1T<1,当 T→∞ 时,xT 的期望将指数级收敛到 0。
稳态方差
至于方差,有
Var(xT)=Var(wTxT−1)+Var(βTϵT)=wT2Var(xT−1)+βTId=wT2wT−12Var(xT−2)+βTId+wT2βT−1Id=⋯=t=1∏Twt2Var(x0)+βTId+wT2βT−1Id+⋯+wT2wT−12⋯w22β1Id这里,如果我们令 wt=1−βt,可以发现方差满足
Var(xT)=t=1∏T(1−βt)Var(x0)+βTId+(1−βT)βT−1Id+⋯+(1−βT)(1−βT−1)⋯(1−β2)β1Id=t=1∏T(1−βt)Var(x0)+(1−(1−βT)+(1−βT)βT−1+⋯+(1−βT)(1−βT−1)⋯(1−β2))β1Id=t=1∏T(1−βt)Var(x0)+(1−(1−βT)(1−βT−1)+(1−βT)(1−βT−1)βT−2+⋯+(1−βT)(1−βT−1)⋯(1−β2))β1Id=t=1∏T(1−βt)Var(x0)+[1−t=1∏T(1−βt)]Id≤αmaxTVar(x0)+[1−αminT]Id只要 αmax=max{1−βt}t=1T<1 且 0<αmin=min{1−βt}t=1T<1,当 T→∞ 时,xT 的方差将收敛到 1。
参数选取
因此,从以上分析可以看出,为了达到最终的标准高斯分布,我们可以选择参数
wt=1−βt其中 βt 满足 0<βt<1 以确保 wt<1 和 1−βt<1。
2.1.3 初始分布假设#
现在我们将扩散过程定义如下
xt=1−βtxt−1+βtϵt,ϵt∼N(0,Id),t=1,2,…,T根据前面的分析,我们证明了 xT 的均值和方差均符合标准高斯分布的要求。但是为了实现最终分布 qT(xT) 收敛到 N(0,Id),我们还需要做一个合理的假设。
这里,我们假设初始数据分布 q0(x0) 是一个高斯分布,并且 ϵt 与 xt 独立。在这种条件下,根据高斯分布的性质,我们可以证明每一步的分布 qt(xt) 也是一个高斯分布,这就可以保证最终 qT(xT) 收敛到 N(0,Id)。
2.1.4 前向 Markovian 链#
扩散过程是一步步分布变化的过程,我们可以用以下形式表示每一个时间步的分布
q(xt∣xt−1)qt(xt)=N(xt;1−βtxt−1,βtI)=∫q(xt∣xt−1)q(xt−1∣xt−2)…q(x0)dxt−1dxt−2…dx1dx0=∫q(xt,xt−1,…,x1,x0)dxt−1dxt−2…dx1dx0仔细观察,可以看出这个过程是一个马尔可夫链。当前变量 xt 只依赖于前一个变量 xt−1 和噪声 ϵt,而不依赖于其他更早的历史状态。
由上式,我们可以得到初始数据分布 q0(x0) 和 qt(xt) 的直接关系式,直接给出从 x0 到 xt 的单步转换。
q(xt∣x0)qt(xt)=N(xt;αˉtx0,(1−αˉt)Id)=∫q(xt∣x0)q0(x0)dx0其中 αt=1−βt 且 αˉt=∏s=1tαs。
现在,我们完成了扩散过程的建模。然而,不幸的是,我们需要很长的时间步长 T 才能达到最终的高斯分布,计算时间成本大。为了加快收敛速度,直观上我们可以将 βt 设置得更大,更接近 1,这样每一步添加的噪声就更大。但事实上,我们并不能将 βt 设置得过大,否则数据分布 qt(xt) 会与原始数据分布 q0(x0) 偏离太多,这将使逆向扩散过程很难学习。
2.2 扩散模型的逆向过程#
2.2.1 逆向 Markovian 链#
逆向过程
在去噪扩散概率模型(DDPM)中,逆向过程旨在将纯高斯噪声 xT 转换回真实的数据样本 x0。从概念上讲,这是前向(加噪)过程的逆过程,同样被建模为一个马尔可夫链,一次一个时间步地逐步完成去噪。通过学习,我们就可以使用逆向过程逐步还原出服从真实数据分布 q0(x0) 的样本。
数学形式
用数学语言来说,我们将以当前步状态 xt 为条件,前一步状态 xt−1 的条件分布建模为
pθt(xt−1∣xt)pθt,…,θT(xt−1)=N(xt−1;μθt(xt,t),Σθt(xt,t))=∫pθt(xt−1∣xt)pθt+1(xt∣xt+1)…pθT(xT−1∣xT)p(xT)dxtdxt+1…dxT其中我们使用 pθt(xt−1∣xt) 来表示学习到的条件分布。μθt 和 Σθt 是均值和协方差,由一个参数为 θt 的神经网络模型参数化表示。由于神经网络具有强大的函数逼近能力,可以肯定这样的单步逆向分布是可以通过学习得到的。
简化假设
为了使问题易于处理,我们对每一步 t 使用相同的参数 θ,而不是 T 个不同的参数 θt。因此,逆向过程可以表示为 pθ(xt−1∣xt)。
pθ(xt−1∣xt)pθ(xt−1)=N(xt−1;μθ(xt,t),Σθ(xt,t))=∫pθ(xt−1∣xt)pθ(xt∣xt+1)…pθ(xT−1∣xT)pθ(xT)dxtdxt+1…dxT其中 p(xT)=N(0,Id)。
2.2.2 初始的目标函数:ELBO#
从KLD开始
作为一个生成模型,DDPM 的最终目标是通过 pθ(x0) 来近似 q0(x0)。因此,我们使用 KL 散度来衡量 q0(x0) 和 pθ(x0) 之间的差异,并试图最小化它。
θminDKL[q0(x0)∥pθ(x0)]=Ex0∼q0(x0)[logq0(x0)−logpθ(x0)]然而,直接优化这个目标是棘手的,因为它需要计算边缘分布 pθ(x0),这涉及到对所有可能的噪声路径进行积分。为了解决这个问题,我们展开 KL 散度,并注意到由于 logq0(x0) 与 θ 无关
θminDKL[q0(x0)∥pθ(x0)]=θminEx0∼q0(x0)[logq0(x0)−logpθ(x0)]=θmaxEx0∼q0(x0)[logpθ(x0)]使用 Jensen 不等式推导出一个可处理的下界
logpθ(x0)=log∫pθ(x0,x1,…,xT)dx1…dxT=log∫q(x1,…,xT∣x0)pθ(x0,x1,…,xT)q(x1,…,xT∣x0)dx1…dxT=logEx1,…,xT∼q(x1,…,xT∣x0)[q(x1,…,xT∣x0)pθ(x0,x1,…,xT)]≥Ex1,…,xT∼q(x1,…,xT∣x0)[logq(x1,…,xT∣x0)pθ(x0,x1,…,xT)]得到 ELBO
定义
LELBO=Ex0,x1,…,xT∼q(x0,x1,…,xT)[logq(x1,…,xT∣x0)pθ(x0,x1,…,xT)]通过最大化证据下界(ELBO) LELBO,我们可以间接优化 q0(x0) 和 pθ(x0) 之间的 KL 散度
θmaxLELBO=Eq(x0,x1,…,xT)[logq(x1,…,xT∣x0)pθ(x0,x1,…,xT)]=Eq(x0,x1,…,xT)[log∏t=1Tq(xt∣xt−1)p(xT)∏t=1Tpθ(xt−1∣xt)]=Eq(x0,x1,…,xT)[logp(xT)+t=1∑Tlogpθ(xt−1∣xt)−t=1∑Tlogq(xt∣xt−1)]现在我们使用一个关键技巧,通过应用缩放和分组来重新排列各项。关键步骤是使用后验分布 q(xt−1∣xt,x0) 重写求和项。
LELBO=Eq(x0,x1,…,xT)[logp(xT)+t=1∑Tlogpθ(xt−1∣xt)−t=1∑Tlogq(xt∣xt−1)]=Eq(x0,x1,…,xT)[logp(xT)+logpθ(x0∣x1)+t=2∑Tlogpθ(xt−1∣xt)−logq(x1∣x0)−t=2∑Tlogq(xt∣xt−1)]=Eq(x0,x1,…,xT)[logp(xT)+logpθ(x0∣x1)+t=2∑Tlogpθ(xt−1∣xt)−logq(x1∣x0)−t=2∑Tlogq(xt−1∣x0)q(xt−1∣xt,x0)q(xt∣x0)]=Eq(x0,x1)[logpθ(x0∣x1)]−Eq(x0,x1)[logq(x1∣x0)]+EN(0,Id)[logp(xT)]+t=2∑TEq(xt−1,xt)[logpθ(xt−1∣xt)]−t=2∑TEq(xt−1,xt,x0)[logq(xt−1∣xt,x0)]−t=2∑TEq(x0,xt)[logq(xt∣x0)]+t=2∑TEq(x0,xt−1)[logq(xt−1∣x0)]=Eq(x0,x1)[logpθ(x0∣x1)]−Eq(x0,x1)[logq(x1∣x0)]+EN(0,Id)[logp(xT)]+t=2∑TEq(xt−1,xt)[logpθ(xt−1∣xt)]−t=2∑TEq(xt−1,xt,x0)[logq(xt−1∣xt,x0)]−t=2∑TEq(x0,xt)[logq(xt∣x0)]+t=1∑T−1Eq(x0,xt)[logq(xt∣x0)]=Eq(x0,x1)[logpθ(x0∣x1)]−Eq(x0,x1)[logq(x1∣x0)]+EN(0,Id)[logp(xT)]+t=2∑TEq(xt−1,xt)[logpθ(xt−1∣xt)]−t=2∑TEq(xt−1,xt,x0)[logq(xt−1∣xt,x0)]−Eq(x0,xT)[logq(xT∣x0)]+Eq(x0,x1)[logq(x1∣x0)]=Eq(x0,x1)[logpθ(x0∣x1)]+t=2∑TEq(x0,xt−1,xt)[logq(xt−1∣xt,x0)pθ(xt−1∣xt)]+Eq(x0,xT)[logq(xT∣x0)p(xT)]=Eq(x0,x1)[logpθ(x0∣x1)]−t=2∑TEq(x0,xt)[DKL[q(xt−1∣xt,x0)∥pθ(xt−1∣xt)]]−Eq(x0)[DKL[q(xT∣x0)∥p(xT)]]这里目标函数的分解揭示了以下的物理意义
重构项: Eq(x0,x1)[logpθ(x0∣x1)] - 给定 x1 重构 x0 的对数似然函数。
去噪项: ∑t=2TEq(x0,xt)[DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))] - 真实后验与学习到的先验之间的 KL 散度。
先验匹配项: Eq(x0)[DKL(q(xT∣x0)∥p(xT))] - 确保最终分布与标准高斯分布匹配。
LELBO=Eq(x0,x1)[logpθ(x0∣x1)]−t=2∑TEq(x0,xt)[DKL[q(xt−1∣xt,x0)∥pθ(xt−1∣xt)]]−Eq(x0)[DKL[q(xT∣x0)∥p(xT)]]2.2.3 为什么使用真实后验?#
问题:为什么我们使用包含 x0 的真实后验 q(xt−1∣xt,x0),而不是标准的逆向条件分布 q(xt−1∣xt)?
答:
(i) 损失函数:在 ELBO 中,我们用于逆向过程的分布是真实后验 q(xt−1∣xt,x0),而不是逆向条件分布 q(xt−1∣xt)。
(ii) 闭式表达式:因为真实后验
q(xt−1∣xt,x0)=N(xt−1;μ~t(xt,x0),β~tId)具有已知的、解析的均值和方差。相比之下,逆向条件分布
q(xt−1∣xt)=∫q(xt−1∣xt,x0)q(x0∣xt)dx0没有闭式解,因此无法明确写出。
使用真实后验 q(xt−1∣xt,x0) 作为我们学习的目标 pθ(xt−1∣xt) 是一个非常聪明的选择。虽然 pθ 在去噪时无法获取真实的 x0,但通过在训练时让它模仿以 x0 为条件的“理想”去噪步骤,模型就能学会如何有效地逆转扩散过程。本质上,我们给了模型一个“答案”,让它学习如何从带噪的 xt 中猜出这个答案。
2.2.4 真实后验的推导#
最后,我们需要推导真实后验 q(xt−1∣xt,x0) 的方程。根据贝叶斯定理
q(xt−1∣xt,x0)=q(xt∣x0)q(xt∣xt−1,x0)q(xt−1∣x0)由于前向过程的马尔可夫性质,xt 仅依赖于 xt−1 而不直接依赖于 x0
q(xt∣xt−1,x0)=q(xt∣xt−1)因此
q(xt−1∣xt,x0)=q(xt∣x0)q(xt∣xt−1)q(xt−1∣x0)在前向过程中,我们已知
- q(xt∣xt−1)=N(xt;αtxt−1,βtId)
- q(xt−1∣x0)=N(xt−1;αˉt−1x0,(1−αˉt−1)Id)
- q(xt∣x0)=N(xt;αˉtx0,(1−αˉt)Id)
取对数并关注涉及 xt−1 的项
logq(xt−1∣xt,x0)=logq(xt∣xt−1)+logq(xt−1∣x0)−logq(xt∣x0)+const展开高斯项
logq(xt∣xt−1)logq(xt−1∣x0)logq(xt∣x0)=−2βt1∥xt−αtxt−1∥2+const=−2(1−αˉt−1)1∥xt−1−αˉt−1x0∥2+const=−2(1−αˉt)1∥xt−αˉtx0∥2+const展开二次项并收集 xt−12、xt−1 和常数的系数
(i) 对于 xt−12 的系数
−2βtαt−2(1−αˉt−1)1=−21(βtαt+1−αˉt−11)由于 βt=1−αt 和 αˉt=αtαˉt−1:
βtαt+1−αˉt−11=1−αtαt+1−αˉt−11=βt(1−αˉt−1)1−αˉt(ii) 对于 xt−1 的系数
βtαtxt+1−αˉt−1αˉt−1x0配方后,我们得到一个高斯分布,其均值和方差为
方差:
β~t=1−αˉt1−αˉt−1βt均值:
μ~t(xt,x0)=1−αˉtαt(1−αˉt−1)xt+1−αˉtαˉt−1βtx0因此,真实后验分布的闭式表达式为
q(xt−1∣xt,x0)=N(xt−1;μ~t(xt,x0),β~tId)其中
μ~t(xt,x0)β~t=1−αˉtαt(1−αˉt−1)xt+1−αˉtαˉt−1βtx0=1−αˉt1−αˉt−1βt这个闭式表达式至关重要,因为它允许我们解析地计算 ELBO 中的 KL 散度,而无需通过采样来估计。
2.2.5 重参数化技巧#
ELBO 公式提供了理论基础,但由于复杂的 KL 散度项,直接优化仍然具有挑战性。DDPM 的关键洞见是使用重参数化技巧,将去噪目标转换为一个简单的噪声预测任务。
噪声预测
我们可以重参数化逆向分布 pθ(xt−1∣xt) 的均值 μθ(xt,t),使其预测在前向过程中添加的噪声 ϵ,而不是直接学习均值。
回想一下,给定 xt 和 x0,我们可以将真实后验 q(xt−1∣xt,x0) 的均值表示为
μ~t(xt,x0)=1−αˉtαt(1−αˉt−1)xt+1−αˉtαˉt−1βtx0我们可以将前向过程方程 x0=αˉtxt−1−αˉtϵ 代入后验均值中
μ~t(xt,x0)=1−αˉtαt(1−αˉt−1)xt+1−αˉtαˉt−1βt⋅αˉtxt−1−αˉtϵ=αt1(xt−1−αˉtβtϵ)这表明我们可以将我们学习到的均值参数化为
μθ(xt,t)=αt1(xt−1−αˉtβtϵθ(xt,t))其中 ϵθ(xt,t) 是一个预测噪声的神经网络。由此,逆向扩散过程可以表示为
pθ(xt−1∣xt)=N(xt−1;αt1(xt−1−αˉtβtϵθ(xt,t)),β~tId)这里我们直接使用从真实后验配置的方差 β~t=1−αˉt1−αˉt−1βt。
2.2.6 简化的损失函数#
通过这种参数化,去噪项中复杂的 KL 散度可以被简化。在我们的例子中,两个分布具有相同的协方差矩阵 β~tId
- q(xt−1∣xt,x0)=N(xt−1;μ~t(xt,x0),β~tId)
- pθ(xt−1∣xt)=N(xt−1;μθ(xt,t),β~tId)
由于 Σ1=Σ2=β~tId,我们有
- log∣Σ1∣∣Σ2∣=0
- tr(Σ2−1Σ1)=d (其中 d 是维度)
因此,
DKL[q(xt−1∣xt,x0)∥pθ(xt−1∣xt)]=2β~t1∥μ~t(xt,x0)−μθ(xt,t)∥2=2β~t1⋅αt(1−αˉt)βt2∥ϵ−ϵθ(xt,t)∥2将 β~t=1−αˉt1−αˉt−1βt 代入
DKL[q(xt−1∣xt,x0)∥pθ(xt−1∣xt)]=2⋅1−αˉt1−αˉt−1βt⋅αt(1−αˉt)βt2∥ϵ−ϵθ(xt,t)∥2=2βt⋅(1−αˉt−1)⋅αt(1−αˉt)βt2⋅(1−αˉt)∥ϵ−ϵθ(xt,t)∥2=2(1−αˉt−1)αtβt∥ϵ−ϵθ(xt,t)∥2这给了我们加权的噪声预测损失。经过大量的实验,DDPM 的作者发现,去掉这个加权项(将其设置为常数)实际上能提高性能,从而得到简单的损失函数
Lsimple=Et∼Uniform(1,T),x0∼q(x0),ϵ∼N(0,Id)[ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)2]其中 xt=αˉtx0+1−αˉtϵ。
这个公式将复杂的变分优化问题转化为一个直接的去噪任务:给定一个带噪图像 xt 和时间步 t,预测被添加的噪声 ϵ。
2.2.7 训练算法#
得到简化的损失函数后,训练过程也就变得异常简单了
- 采样一个随机时间步 t∼Uniform(1,T)
- 采样噪声 ϵ∼N(0,Id)
- 创建带噪图像 xt=αˉtx0+1−αˉtϵ
- 使用神经网络预测噪声 ϵθ(xt,t)
- 计算损失 ∥ϵ−ϵθ(xt,t)∥2
这种优雅的简化解释了为什么 DDPM 既有理论上的原则性(通过 ELBO 推导),又在实践中有效(通过简单的噪声预测目标)。
2.3 DDPM 的 SDE#
2.3.1 前向过程的 SDE#
已知离散表达式中扩散过程的公式为
xi=1−βixi−1+βiϵi, ϵi∼N(0,Id),i=1,⋯,T令 x~t=xi,x~t−T1=xi−1,ϵ~t=ϵi,β~t=Tβi,由此得到
x~t=1−T1β~tx~t−T1+T1β~tϵ~t, ϵt∼N(0,Id),t=T1,T2,⋯,1当 β~t→0 时,使用泰勒展开,有
x~t=(1−2T1β~t)x~t−T1+T1β~tϵ~t现在我们记 Δt=T1,得到
x~t=(1−2Δtβ~t)x~t−Δt+Δtβ~tϵ~t用 dw=ϵdt 替换后一项,其中 dw 是维纳过程,并令 Δt→0 (即 T→∞),有
x~t−x~t−Δt=−2Δtβ~tx~t−Δt+Δtβ~tϵ~tΔx~t=−2Δtβ~tx~t−Δt+β~tdw~更换符号,得到最终前向扩散过程的 SDE 为
dxt=−2βtxtdt+βtdw2.3.2 逆向过程的 SDE#
根据 Anderson 定理,可以得到逆向过程的 SDE 为
dxt=[−2βtxt−βt∇xtlogpt(xt)]dt+βtdwˉ2.3.3 连续化 DDPM#
当采用 DDPM 连续化后的 SDE 进行建模时,可以采用后续章节中介绍的动态分数匹配模型方法,利用神经网络 sθ(xt,t)对 ∇xlogpt(xt) 进行建模,从而利用模拟逆向 SDE 的方式进行采样。
dtdxt=−2βtxt−βtsθ(xt,t)+βtdwˉ