引:DDPM 是 Jonathan Ho、Ajay Jain 和 Pieter Abbeel 在 2020 年提出的工作。它用一个固定的加噪过程构造不同难度的去噪任务,再学习反向过程,从纯高斯噪声逐步生成图像。本文最关键的部分是:怎样将反向分布的学习转化为噪声预测,以及为什么最终可以用一个简单的均方误差训练生成模型。 理解这条推导,也就能理解后来 DiT 等工作中噪声预测目标的来源。

背景

我们可以先想象一张清晰图像:如果不断往其中加入少量随机噪声,图像的细节会逐渐消失,最后几乎只剩噪声。这个破坏过程很容易实现,因为每次加入什么噪声、加入多少,都可以由我们自己决定。

DDPM 要做的是学习与之对应的生成过程:给模型一张噪声图,让它逐步得到噪声更少的状态,最终产生一张自然图像。这里学习的是数据的分布,模型需要知道什么样的图像结构是合理的,以及在当前噪声水平下应该怎样更新输入。

扩散概率模型在本文之前已经被提出。DDPM 的贡献在于,通过一套具体的参数化和训练目标,让这类模型得到了很好的图像生成效果,并说明了它与 Denoising Score Matching 和 Langevin Dynamics 的联系。

为了看懂它,我们需要把三个问题接起来:

  1. 怎样定义加噪过程,并高效地构造训练输入;
  2. 怎样利用这个已知过程,为反向生成提供监督;
  3. 为什么监督最后会变成“预测加入的高斯噪声”。

预备知识

似然

给定一份已经观测到的数据 xx,将 pθ(x)p_\theta(x) 看作关于模型参数 θ\theta 的函数,就得到似然。训练生成模型时,希望真实数据在模型下的似然较高。通常先取对数,再取负号,把最大化似然改成最小化负对数似然。

有时 pθ(x)p_\theta(x) 包含无法直接算出的积分。这时可以构造一个容易计算的对数似然下界,称为 ELBO;取负号后,它就成为负对数似然的上界。DDPM 使用的工具是 Jensen 不等式:对正随机变量 XX,因为 −log⁡-\log 是凸函数,所以

−log⁡E[X]≤E[−log⁡X].-\log \mathbb{E}[X]\leq\mathbb{E}[-\log X].

也就是说,先求平均再取负对数,结果不会大于先取负对数再求平均。这个上界与真实目标可能有间隙,但可以作为训练时的替代目标。

KL 散度。 要比较两个概率分布 qq 和 pp,可以使用 Kullback–Leibler divergence:

DKL(q∥p)=Ex∼q[log⁡q(x)p(x)].D_{\mathrm{KL}}(q\|p) =\mathbb{E}_{x\sim q}\left[\log\frac{q(x)}{p(x)}\right].

它非负,两个分布相同时为零;交换 q,pq,p 后一般得到不同的值。对于两个一维高斯分布,KL 可以直接计算:

DKL(N(μ1,σ12)∥N(μ2,σ22))=12log⁡σ22σ12+σ12+(μ1−μ2)22σ22−12.D_{\mathrm{KL}}\left(\mathcal{N}(\mu_1,\sigma_1^2)\|\mathcal{N}(\mu_2,\sigma_2^2)\right) =\frac{1}{2}\log\frac{\sigma_2^2}{\sigma_1^2} +\frac{\sigma_1^2+(\mu_1-\mu_2)^2}{2\sigma_2^2}-\frac{1}{2}.

如果两个方差固定,而我们要学习第二个分布的均值,那么上式中只有 (μ1−μ2)2(\mu_1-\mu_2)^2 与待学习的均值有关。因此,最小化这两个高斯分布的 KL,就变成了拟合均值。这会在后面用来理解噪声预测损失。

Score 与 Langevin dynamics。 Score 是对数概率密度对输入的梯度,指出从当前位置向哪个方向移动可以增大密度。以一维高斯分布为例,均值右侧的 score 为负、左侧为正,都指向密度更高的中心。Score matching 学习这个梯度场;denoising score matching 利用加噪数据的条件分布来训练。Langevin dynamics 的基本更新包含沿 score 方向移动和加入高斯噪声两部分,后面会看到它与 DDPM 采样的联系。

概率模型

设真实图像为 x0∼q(x0)\mathbf{x}_0\sim q(\mathbf{x}_0),x1,…,xT\mathbf{x}_1,\ldots,\mathbf{x}_T 是与图像同维度的中间变量;θ\theta 表示神经网络参数。粗体表示向量或整个图像张量,I\mathbf{I} 是单位矩阵。本文在像素空间进行扩散,这些中间变量不是 VAE 编码后的 latent。

作者先定义生成模型,也就是 reverse process(反向过程)。从标准高斯先验 p(xT)=N(xT;0,I)p(\mathbf{x}_T)=\mathcal{N}(\mathbf{x}_T;\mathbf{0},\mathbf{I}) 出发,逐步生成图像:

pθ(x0:T)=p(xT)∏t=1Tpθ(xt−1∣xt),pθ(xt−1∣xt)=N ⁣(xt−1;μθ(xt,t),Σθ(xt,t)).(1)\begin{aligned} p_\theta(\mathbf{x}_{0:T}) &= p(\mathbf{x}_T)\prod_{t=1}^{T}p_\theta(\mathbf{x}_{t-1}\mid\mathbf{x}_t),\\ p_\theta(\mathbf{x}_{t-1}\mid\mathbf{x}_t) &=\mathcal{N}\!\left(\mathbf{x}_{t-1}; \boldsymbol{\mu}_\theta(\mathbf{x}_t,t), \boldsymbol{\Sigma}_\theta(\mathbf{x}_t,t)\right). \end{aligned} \tag{1}

这里的 pθ(xt−1∣xt)p_\theta(\mathbf{x}_{t-1}\mid\mathbf{x}_t) 描述:已经知道当前带噪图像时,前一个状态可能在哪里。均值 μθ\boldsymbol{\mu}_\theta 决定这个分布的中心,协方差 Σθ\boldsymbol{\Sigma}_\theta 决定各维度的波动及相关性。它们都可以依赖当前输入和时间步,后面再讨论具体怎样由网络确定。

第一行将这些单步转移连起来,得到的是一整条生成轨迹的联合分布。这里使用了马尔可夫假设:给定当前状态,下一次转移不再额外依赖更早的状态,因此可以把轨迹的联合概率分解为初始分布与各步条件分布的乘积。

与之配套, forward process(前向过程) 从真实图像出发,按照噪声方差序列 β1,…,βT\beta_1,\ldots,\beta_T 逐步加噪。βt\beta_t 决定第 tt 步新加入的噪声有多大,这一整套安排称为 variance schedule:

q(x1:T∣x0)=∏t=1Tq(xt∣xt−1),q(xt∣xt−1)=N ⁣(xt;1−βt xt−1,βtI).(2)\begin{aligned} q(\mathbf{x}_{1:T}\mid\mathbf{x}_0) &=\prod_{t=1}^{T}q(\mathbf{x}_t\mid\mathbf{x}_{t-1}),\\ q(\mathbf{x}_t\mid\mathbf{x}_{t-1}) &=\mathcal{N}\!\left(\mathbf{x}_t; \sqrt{1-\beta_t}\,\mathbf{x}_{t-1},\beta_t\mathbf{I}\right). \end{aligned} \tag{2}

举个例子,单个像素值经过这一步,就变成原值的 1−βt\sqrt{1-\beta_t} 倍,再加上一份标准差为 βt\sqrt{\beta_t} 的高斯噪声。对整张图像也是同样的操作;βtI\beta_t\mathbf{I} 表示给定上一张图像时,各分量新加入的噪声相互独立、方差都是 βt\beta_t。

DDPM 的前向加噪与反向生成过程

图来自作者项目页,对应原论文 Fig. 2。qq 从数据走向噪声,pθp_\theta 从噪声走向数据。

训练目标

现在我们已经规定了模型怎样从噪声生成图像,但还没有解决训练问题:什么样的参数 θ\theta 才算学得好? 一个自然的标准是,让模型给数据集中真实出现的图像分配更高的概率。

对单张真实图像,模型给出的 pθ(x0)p_\theta(\mathbf{x}_0) 就是我们关心的似然;对整个数据分布,我们希望降低平均负对数似然 E[−log⁡pθ(x0)]\mathbb{E}[-\log p_\theta(\mathbf{x}_0)],实践中用数据集的样本平均估计。连续变量中使用概率密度,离散像素的概率则会在最后一步解码时处理。

但是 Eq. 1 能直接给出的是“图像加上整条中间轨迹”的联合分布。同一张最终图像可能经过许多不同的中间轨迹生成,我们只关心这张图像时,就要把这些可能性全部加起来,也就是用积分:

pθ(x0)=∫pθ(x0:T) dx1:T.p_\theta(\mathbf{x}_0) =\int p_\theta(\mathbf{x}_{0:T})\,d\mathbf{x}_{1:T}.

这个操作叫作边缘化。每个中间状态都与整张图像一样大,又有很多个时间步,因此直接计算这个高维积分很困难。单步转移分布容易计算,不代表最终图像的边缘似然也容易计算。

前向过程这时就有了训练上的用途:给定真实图像,我们很容易按 q(x1:T∣x0)q(\mathbf{x}_{1:T}\mid\mathbf{x}_0) 构造中间轨迹。在上面的积分中乘上再除以前向分布,可以将固定图像的似然改写为期望:

pθ(x0)=Eq(x1:T∣x0)[pθ(x0:T)q(x1:T∣x0)].p_\theta(\mathbf{x}_0) =\mathbb{E}_{q(\mathbf{x}_{1:T}\mid\mathbf{x}_0)} \left[ \frac{p_\theta(\mathbf{x}_{0:T})}{q(\mathbf{x}_{1:T}\mid\mathbf{x}_0)} \right].

现在对这个期望应用预备知识中的 Jensen 不等式,再对真实图像取平均,就得到负对数似然的上界 LL:

E ⁣[−log⁡pθ(x0)]≤Eq ⁣[−log⁡pθ(x0:T)q(x1:T∣x0)]=L.(3)\mathbb{E}\!\left[-\log p_\theta(\mathbf{x}_0)\right] \leq \mathbb{E}_q\!\left[ -\log\frac{p_\theta(\mathbf{x}_{0:T})} {q(\mathbf{x}_{1:T}\mid\mathbf{x}_0)} \right] = L. \tag{3}

这里左侧仍然是我们希望降低的真实数据负对数似然;右侧是在真实图像和前向加噪轨迹上取平均的另一个目标。训练时可以从数据取图、按前向过程采样轨迹,再计算右侧的量来更新 θ\theta,无需先求出左侧那个困难的积分。

有了训练目标,还需要解决怎样高效构造输入、怎样评价某一步的预测。前向过程的高斯结构恰好让这两件事都能进一步简化。

加噪采样

接着定义 αt=1−βt\alpha_t=1-\beta_t、αˉt=∏s=1tαs\bar\alpha_t=\prod_{s=1}^{t}\alpha_s。前向过程有一个关键性质:可以直接采样任意时间步,无须先依次生成全部中间状态:

q(xt∣x0)=N ⁣(xt;αˉt x0,(1−αˉt)I).(4)q(\mathbf{x}_t\mid\mathbf{x}_0) =\mathcal{N}\!\left(\mathbf{x}_t; \sqrt{\bar\alpha_t}\,\mathbf{x}_0, (1-\bar\alpha_t)\mathbf{I}\right). \tag{4}

也就是 xt=αˉtx0+1−αˉtϵ\mathbf{x}_t=\sqrt{\bar\alpha_t}\mathbf{x}_0+\sqrt{1-\bar\alpha_t}\boldsymbol{\epsilon},其中 ϵ∼N(0,I)\boldsymbol{\epsilon}\sim\mathcal{N}(\mathbf{0},\mathbf{I})。这份噪声与图像同形状,表示多步加噪合并后的随机扰动。训练若只需要第 tt 步的输入,就可以用这条式子直接生成它,不必从第 1 步逐次加噪。

我们可以用前两步来理解多步噪声怎样合并。设这两步分别使用独立的标准高斯噪声 ϵ1,ϵ2\boldsymbol{\epsilon}_1,\boldsymbol{\epsilon}_2,展开得到:

x2=α2α1x0+α2β1ϵ1+β2ϵ2.\mathbf{x}_2=\sqrt{\alpha_2\alpha_1}\mathbf{x}_0 +\sqrt{\alpha_2\beta_1}\boldsymbol{\epsilon}_1 +\sqrt{\beta_2}\boldsymbol{\epsilon}_2.

后两项的协方差相加为 (α2β1+β2)I=(1−α1α2)I(\alpha_2\beta_1+\beta_2)\mathbf{I}=(1-\alpha_1\alpha_2)\mathbf{I}。由于两份噪声相互独立,交叉协方差为零;继续展开就得到 Eq. 4。

损失分解

现在我们能方便地得到某个时间步的带噪图像,但 Eq. 3 的目标还写成整条轨迹的概率比值。要把训练落实到每一步,接下来需要将它拆成对各个反向分布的评价。

直观上,模型给出 pθ(xt−1∣xt)p_\theta(\mathbf{x}_{t-1}\mid\mathbf{x}_t),我们希望知道它与正确的上一步分布有多大差别。训练时,产生当前状态的原图 x0\mathbf{x}_0 是已知的,因此可以利用 q(xt−1∣xt,x0)q(\mathbf{x}_{t-1}\mid\mathbf{x}_t,\mathbf{x}_0) 提供监督。这里多出的 x0\mathbf{x}_0 是训练信息,不会作为生成时的输入。

这里就可以用预备知识中的 KL 散度:把已知的训练分布放在 qq 的位置,把模型预测放在 pp 的位置,通过最小化 KL 来训练反向分布。

具体地,将 Eq. 1、2 的乘积代入 Eq. 3,乘积的对数变成各时间步的求和。再用贝叶斯公式将前向转移改写为给定 x0\mathbf{x}_0 的反向后验,就可以把同一个 LL 整理为下面三部分。这种整理也减少了直接采样整条轨迹来估计损失时的波动:

L=Eq[DKL ⁣(q(xT∣x0) ∥ p(xT))⏟LT+∑t=2TDKL ⁣(q(xt−1∣xt,x0) ∥ pθ(xt−1∣xt))⏟Lt−1−log⁡pθ(x0∣x1)⏟L0].(5)\begin{aligned} L=\mathbb{E}_q\Bigg[ &\underbrace{D_{\mathrm{KL}}\!\left( q(\mathbf{x}_T\mid\mathbf{x}_0)\,\|\,p(\mathbf{x}_T) \right)}_{L_T}\\ &+\sum_{t=2}^{T}\underbrace{D_{\mathrm{KL}}\!\left( q(\mathbf{x}_{t-1}\mid\mathbf{x}_t,\mathbf{x}_0) \,\|\,p_\theta(\mathbf{x}_{t-1}\mid\mathbf{x}_t) \right)}_{L_{t-1}}\\ &\underbrace{-\log p_\theta(\mathbf{x}_0\mid\mathbf{x}_1)}_{L_0} \Bigg]. \end{aligned} \tag{5}

这个式子没有另换一个目标,而是将 Eq. 3 的 LL 分解成了三类任务:

  • LTL_T:终点与先验。 从真实图像加噪得到的终点分布,要与生成时使用的标准高斯先验对得上。
  • Lt−1L_{t-1}:中间步骤。 对 t>1t>1,用 KL 比较给定原图时的反向后验与模型预测的反向分布。这部分最终会导出均值预测和噪声预测的损失。
  • L0L_0:最后一步。 直接评价模型从 x1\mathbf{x}_1 恢复真实图像 x0\mathbf{x}_0 的概率,因此是一个负对数似然项。

这样,我们就知道每个反向步骤要学什么了。后面的方法设计将分别处理这三类项,而训练可以随机抽取时间步来估计其中的求和,不必每次运行完整生成链。

反向后验

Eq. 5 中间项的监督分布为什么能得到,还需要进一步说明。只给一张带噪图像 xt\mathbf{x}_t,它可能来自很多原图;但训练时,我们还知道它是由哪一张 x0\mathbf{x}_0 加噪得到的。

举个例子,若某个像素加噪后的值是 0.30.3,单凭这个数不能确定它此前是什么;同时知道原图的像素值,就能缩小上一步状态的可能范围。q(xt−1∣xt,x0)q(\mathbf{x}_{t-1}\mid\mathbf{x}_t,\mathbf{x}_0) 描述的正是这种同时知道当前状态和原图之后,上一步状态的条件分布。

由于前向过程是线性高斯链,这个后验仍然是高斯分布,且均值、方差可以精确计算:

q(xt−1∣xt,x0)=N ⁣(xt−1;μ~t(xt,x0),β~tI),t>1.(6)q(\mathbf{x}_{t-1}\mid\mathbf{x}_t,\mathbf{x}_0) =\mathcal{N}\!\left(\mathbf{x}_{t-1}; \tilde{\boldsymbol{\mu}}_t(\mathbf{x}_t,\mathbf{x}_0), \tilde\beta_t\mathbf{I}\right),\qquad t>1. \tag{6}

其中:

μ~t(xt,x0)=αˉt−1βt1−αˉtx0+αt(1−αˉt−1)1−αˉtxt,β~t=1−αˉt−11−αˉtβt.(7)\begin{aligned} \tilde{\boldsymbol{\mu}}_t(\mathbf{x}_t,\mathbf{x}_0) &= \frac{\sqrt{\bar\alpha_{t-1}}\beta_t}{1-\bar\alpha_t}\mathbf{x}_0 +\frac{\sqrt{\alpha_t}(1-\bar\alpha_{t-1})}{1-\bar\alpha_t}\mathbf{x}_t,\\ \tilde\beta_t &=\frac{1-\bar\alpha_{t-1}}{1-\bar\alpha_t}\beta_t. \end{aligned} \tag{7}

这些式子来自贝叶斯公式:

q(xt−1∣xt,x0)∝q(xt∣xt−1)q(xt−1∣x0).q(\mathbf{x}_{t-1}\mid\mathbf{x}_t,\mathbf{x}_0) \propto q(\mathbf{x}_t\mid\mathbf{x}_{t-1}) q(\mathbf{x}_{t-1}\mid\mathbf{x}_0).

右侧第一项由 Eq. 2 给出,表示候选的上一步状态能以多大密度产生当前状态;第二项由 Eq. 4 给出,表示这张原图加噪到上一步时的分布。将两项相乘、合并高斯指数中的二次项并配方,就得到 Eq. 6–7。∝\propto 表示相差一个不依赖 xt−1\mathbf{x}_{t-1} 的归一化常数。

这就为训练提供了一个能计算的分布目标。 模型只接收 xt,t\mathbf{x}_t,t,训练代码则利用额外已知的 x0\mathbf{x}_0 算出监督分布,并通过 Eq. 5 的 KL 项评价预测。生成时没有原图,就使用模型学到的反向分布逐步采样。

方法

有了概率模型和变分目标,接下来就要决定:哪些量固定、网络预测什么,以及最后用什么损失训练。

前向过程

作者将前向噪声方差序列 β1,…,βT\beta_1,\ldots,\beta_T 固定为超参数,不通过训练学习。这样,整个前向过程 qq 没有可学习参数,而先验 p(xT)p(\mathbf{x}_T) 也固定,所以 LTL_T 与 θ\theta 无关,可以在优化模型参数时忽略。

这里忽略的是一个不影响参数更新的常数项,并非要求 LTL_T 严格为零。只要 αˉT\bar\alpha_T 足够小,Eq. 4 中原始信号的贡献就很小,前向终点也就接近标准高斯先验。具体采用的 TT 与 βt\beta_t 数值放在实验设置中交代。

反向过程

这一节处理 1<t≤T1<t\leq T 的中间反向步骤。作者先将 Eq. 1 中的一般协方差固定为随时间变化的各向同性方差:

Σθ(xt,t)=σt2I.\boldsymbol{\Sigma}_\theta(\mathbf{x}_t,t)=\sigma_t^2\mathbf{I}.

论文考察了 σt2=βt\sigma_t^2=\beta_t 和 σt2=β~t\sigma_t^2=\tilde\beta_t,两种选择得到相近的结果。因此,原始 DDPM 的主要设计中,网络不需要输出协方差,接下来重点解决均值怎样参数化。

均值预测

现在回到 Eq. 5 的中间项。我们已经能利用真实图像算出监督分布的均值 μ~t\tilde{\boldsymbol{\mu}}_t 与方差 β~tI\tilde\beta_t\mathbf{I},模型则给出自己的均值 μθ\boldsymbol{\mu}_\theta 和固定方差 σt2I\sigma_t^2\mathbf{I}。训练需要比较的就是这两个高斯分布。

两个分布都是高斯分布,可以使用预备知识中的高斯 KL 公式。由于两边的方差都不参与学习,只有均值差的平方依赖 θ\theta。因此,优化这个 KL 就转成了拟合均值;对各个图像分量求和,均值差的平方和变成向量平方范数。

对数据和前向噪声取期望,把与 θ\theta 无关的部分合并为 CC,得到:

Lt−1=Eq ⁣[12σt2∥μ~t(xt,x0)−μθ(xt,t)∥2]+C.(8)L_{t-1} =\mathbb{E}_q\!\left[ \frac{1}{2\sigma_t^2} \left\|\tilde{\boldsymbol{\mu}}_t(\mathbf{x}_t,\mathbf{x}_0) -\boldsymbol{\mu}_\theta(\mathbf{x}_t,t)\right\|^2 \right]+C. \tag{8}

CC 是与 θ\theta 无关的项。最直接的做法就是让网络预测后验均值 μ~t\tilde{\boldsymbol{\mu}}_t,但作者接着把这个目标改写为噪声预测。

重参数化

利用 Eq. 4 的重参数化,令 xt(x0,ϵ)=αˉtx0+1−αˉtϵ\mathbf{x}_t(\mathbf{x}_0,\boldsymbol{\epsilon})=\sqrt{\bar\alpha_t}\mathbf{x}_0+\sqrt{1-\bar\alpha_t}\boldsymbol{\epsilon},可以反解出 x0=(xt−1−αˉtϵ)/αˉt\mathbf{x}_0=(\mathbf{x}_t-\sqrt{1-\bar\alpha_t}\boldsymbol{\epsilon})/\sqrt{\bar\alpha_t}。下面为缩短公式,将这个 xt(x0,ϵ)\mathbf{x}_t(\mathbf{x}_0,\boldsymbol{\epsilon}) 简写为 xt\mathbf{x}_t,代入 Eq. 8:

Lt−1−C=Ex0,ϵ ⁣[12σt2∥μ~t ⁣(xt,xt−1−αˉtϵαˉt)−μθ(xt,t)∥2].(9)L_{t-1}-C =\mathbb{E}_{\mathbf{x}_0,\boldsymbol{\epsilon}}\!\left[ \frac{1}{2\sigma_t^2} \left\| \tilde{\boldsymbol{\mu}}_t\!\left( \mathbf{x}_t, \frac{\mathbf{x}_t-\sqrt{1-\bar\alpha_t}\boldsymbol{\epsilon}}{\sqrt{\bar\alpha_t}} \right) -\boldsymbol{\mu}_\theta(\mathbf{x}_t,t) \right\|^2\right]. \tag{9}

再将 Eq. 7 的后验均值展开。xt\mathbf{x}_t 的系数合并为 1/αt1/\sqrt{\alpha_t},ϵ\boldsymbol{\epsilon} 的系数合并为 −βt/(αt1−αˉt)-\beta_t/(\sqrt{\alpha_t}\sqrt{1-\bar\alpha_t}),于是得到:

Lt−1−C=Ex0,ϵ ⁣[12σt2∥1αt(xt−βt1−αˉtϵ)−μθ(xt,t)∥2].(10)L_{t-1}-C =\mathbb{E}_{\mathbf{x}_0,\boldsymbol{\epsilon}}\!\left[ \frac{1}{2\sigma_t^2} \left\| \frac{1}{\sqrt{\alpha_t}}\left( \mathbf{x}_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\boldsymbol{\epsilon} \right) -\boldsymbol{\mu}_\theta(\mathbf{x}_t,t) \right\|^2\right]. \tag{10}

也就是说,模型要预测的均值已经能写成“当前输入加上真实噪声的线性变换”。xt\mathbf{x}_t 已经给了网络,其他系数由日程确定,因此可以让网络只负责估计 ϵ\boldsymbol{\epsilon}。

噪声预测与采样

用 ϵθ(xt,t)\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t) 代替未知的噪声,就定义了模型的均值函数:

μθ(xt,t)=1αt(xt−βt1−αˉtϵθ(xt,t)).(11)\boldsymbol{\mu}_\theta(\mathbf{x}_t,t) =\frac{1}{\sqrt{\alpha_t}}\left( \mathbf{x}_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}} \boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t) \right). \tag{11}

网络直接输出噪声预测,采样程序据此计算反向均值。 例如输入是 32×32×332\times32\times3 的带噪图像,输出也是同形状的噪声预测。均值并没有被省略,而是通过这个参数化间接得到。

生成时先采样 xT∼N(0,I)\mathbf{x}_T\sim\mathcal{N}(\mathbf{0},\mathbf{I}),再按原文 Algorithm 2,从 t=Tt=T 到 11 依次更新:

xt−1=1αt(xt−1−αt1−αˉtϵθ(xt,t))+σtz.\mathbf{x}_{t-1} =\frac{1}{\sqrt{\alpha_t}}\left( \mathbf{x}_t-\frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}} \boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t) \right)+\sigma_t\mathbf{z}.

其中 t>1t>1 时 z∼N(0,I)\mathbf{z}\sim\mathcal{N}(\mathbf{0},\mathbf{I}),t=1t=1 时 z=0\mathbf{z}=\mathbf{0}。z\mathbf{z} 是反向采样时新抽取的随机噪声,与前向加噪的 ϵ\boldsymbol{\epsilon} 作用不同,也不是 DiT 中的图像 latent。

这一步先根据预测噪声算均值,再按照固定方差采样。生成时必须逐步得到前一个状态,与训练时可以直接构造任意 xt\mathbf{x}_t 不同。

加权噪声损失

将 Eq. 11 代入 Eq. 10,两个均值中的 xt\mathbf{x}_t 抵消,只留下真实噪声与预测噪声之差。原文 Eq. 12 对应:

Lt−1−C=Ex0,ϵ[βt22σt2αt(1−αˉt)⋅∥ϵ−ϵθ ⁣(αˉtx0+1−αˉtϵ,t)∥2].(12)\begin{aligned} L_{t-1}-C =\mathbb{E}_{\mathbf{x}_0,\boldsymbol{\epsilon}}\Bigg[ &\frac{\beta_t^2}{2\sigma_t^2\alpha_t(1-\bar\alpha_t)}\\ &\cdot\left\|\boldsymbol{\epsilon}- \boldsymbol{\epsilon}_\theta\!\left( \sqrt{\bar\alpha_t}\mathbf{x}_0+ \sqrt{1-\bar\alpha_t}\boldsymbol{\epsilon},t \right)\right\|^2 \Bigg]. \end{aligned} \tag{12}

到这里,训练反向分布已经转成了加权噪声 MSE。作者还从另一个角度解释这个结果:它与多个噪声水平上的 denoising score matching 有联系。

为什么噪声预测能与 score 联系起来?对 Eq. 4 的高斯扰动分布取对数,再对 xt\mathbf{x}_t 求导,就有:

∇xtlog⁡q(xt∣x0)=−xt−αˉtx01−αˉt=−ϵ1−αˉt.\nabla_{\mathbf{x}_t}\log q(\mathbf{x}_t\mid\mathbf{x}_0) =-\frac{\mathbf{x}_t-\sqrt{\bar\alpha_t}\mathbf{x}_0}{1-\bar\alpha_t} =-\frac{\boldsymbol{\epsilon}}{\sqrt{1-\bar\alpha_t}}.

因此,预测噪声经过尺度换算后就对应一个 score 估计。网络只接收 xt,t\mathbf{x}_t,t,MSE 的最优预测会对可能产生当前输入的噪声进行条件平均,对应加噪数据边缘分布的 score。这个公式是帮助理解的补充推导;原文在 Eq. 12 后指出,噪声预测目标类似去噪 score matching,配套的采样链则类似 Langevin dynamics。

到这里,预测均值与预测噪声是反向过程的两种参数化;仅做这次改写,并没有去掉 Eq. 12 的时间步权重。原文随后通过实验比较这些选择。

DDPM 的训练与采样算法

图来自作者项目页,对应原论文 Algorithm 1–2。Algorithm 2 使用上面的均值参数化;Algorithm 1 采用的简化训练目标将在后面说明。

数据缩放与解码

前面处理的是 t>1t>1 的中间步骤。最后一步要从 x1\mathbf{x}_1 输出真实图像,其训练项是 L0=−log⁡pθ(x0∣x1)L_0=-\log p_\theta(\mathbf{x}_0\mid\mathbf{x}_1)。这里还要处理一个实际问题:图像的像素是离散整数,高斯分布却是连续的。

作者先将 {0,1,…,255}\{0,1,\ldots,255\} 的像素线性缩放到 [−1,1][-1,1],相邻像素值的间隔因此是 2/2552/255。为了给一个离散像素值分配概率,不能只取高斯密度在该点的数值,而要对这个像素对应的区间积分。原文定义:

pθ(x0∣x1)=∏i=1D∫δ−(x0i)δ+(x0i)N ⁣(x;μθi(x1,1),σ12) dx,(13)p_\theta(\mathbf{x}_0\mid\mathbf{x}_1) =\prod_{i=1}^{D} \int_{\delta_-(x_0^i)}^{\delta_+(x_0^i)} \mathcal{N}\!\left(x; \mu_\theta^i(\mathbf{x}_1,1),\sigma_1^2\right)\,dx, \tag{13}

其中 DD 是图像全部标量分量的数量,上标 ii 表示取第 ii 个分量。积分边界为:

δ+(x)={∞,x=1,x+1255,x<1,δ−(x)={−∞,x=−1,x−1255,x>−1.\delta_+(x)= \begin{cases} \infty,&x=1,\\ x+\frac{1}{255},&x<1, \end{cases} \qquad \delta_-(x)= \begin{cases} -\infty,&x=-1,\\ x-\frac{1}{255},&x>-1. \end{cases}

举个例子,整数像素 128 缩放后是 1/2551/255,对应的积分区间就是 [0,2/255][0,2/255],半宽为 1/2551/255。最小、最大像素则分别接收高斯分布两侧的尾部概率,让全部离散取值的概率加起来为 1。

这里的 decoder 指最后一步将连续高斯分布转换为离散像素概率的规则,不是另外接一个 VAE Decoder。这个定义使 L0L_0 能用于离散图像的似然与编码长度计算;实际生成结束时,作者直接显示 μθ(x1,1)\boldsymbol{\mu}_\theta(\mathbf{x}_1,1),不再加入随机噪声。

简化训练目标

至此,Eq. 12 的中间项和 Eq. 13 的最后一步解码已经确定,完整变分目标可以直接用于训练。不过,作者发现改用下面的目标,生成图像的效果更好,实施起来也更简单:

Lsimple(θ)=Et,x0,ϵ[∥ϵ−ϵθ ⁣(αˉtx0+1−αˉtϵ,t)∥2].(14)\begin{aligned} L_{\mathrm{simple}}(\theta) =\mathbb{E}_{t,\mathbf{x}_0,\boldsymbol{\epsilon}}\Big[ \big\|\boldsymbol{\epsilon}- \boldsymbol{\epsilon}_\theta\!\left( \sqrt{\bar\alpha_t}\mathbf{x}_0+ \sqrt{1-\bar\alpha_t}\boldsymbol{\epsilon},t \right)\big\|^2\Big]. \end{aligned} \tag{14}

其中 t∼Uniform({1,…,T})t\sim\mathrm{Uniform}(\{1,\ldots,T\}),x0∼q(x0)\mathbf{x}_0\sim q(\mathbf{x}_0),ϵ∼N(0,I)\boldsymbol{\epsilon}\sim\mathcal{N}(\mathbf{0},\mathbf{I})。这个目标与完整变分目标的关系,需要分别看:

  • t>1t>1 时,去掉了 Eq. 12 中随时间变化的系数 βt2/[2σt2αt(1−αˉt)]\beta_t^2/[2\sigma_t^2\alpha_t(1-\bar\alpha_t)]。
  • t=1t=1 时,不再精确计算 Eq. 13 的离散积分;原文将其联系到“高斯密度乘区间宽度”的近似,再忽略固定方差相关系数及边界效应。
  • LTL_T 与 θ\theta 无关,不参与参数优化。

所以,LsimpleL_{\mathrm{simple}} 改变了各时间步在原始目标中的相对权重。在本文的日程设置下,它相对降低了小 tt、噪声很少的去噪任务的权重,将优化重点更多分配给较大噪声下的任务。生成质量上的好处要由后面的实验支持。

原文 Algorithm 1 的训练过程可以直接整理为:

  1. 取真实图像 x0\mathbf{x}_0,将像素缩放到 [−1,1][-1,1];
  2. 均匀采样时间步 tt,采样同形状的标准高斯噪声 ϵ\boldsymbol{\epsilon};
  3. 用 Eq. 4 的重参数化直接构造 xt\mathbf{x}_t;
  4. 将 xt,t\mathbf{x}_t,t 输入网络,得到 ϵθ(xt,t)\boldsymbol{\epsilon}_\theta(\mathbf{x}_t,t);
  5. 计算 Eq. 14 的噪声 MSE,反向传播更新 θ\theta。

同一网络在所有时间步共享参数,一次训练更新只处理随机选中的时间步;生成时才需要按 Algorithm 2 依次运行反向链。这里就把概率模型、均值参数化、训练监督与最终采样接起来了。

实验

数据与基本设定

作者在 CIFAR10 的 32×3232\times32 图像,以及 CelebA-HQ、LSUN 的 256×256256\times256 图像上验证模型。所有实验采用 T=1000T=1000,前向噪声方差从 β1=10−4\beta_1=10^{-4} 线性增加到 βT=0.02\beta_T=0.02,主要模型使用固定的反向方差。

反向网络采用 U-Net,使用 GroupNorm,在 16×1616\times16 特征图上加入 self-attention。所有时间步共享参数,时间步通过正弦、余弦 embedding 输入网络;主要图像生成实验为无条件生成。

实现补充:官方代码会先从噪声预测计算 x^0\hat{\mathbf{x}}_0,裁剪到 [−1,1][-1,1],再用它计算反向后验均值。

本文关注的主要指标为:

  • FID:比较生成图像与真实图像在特征空间中的分布差异,越低越好;
  • Inception Score(IS):根据分类器输出衡量样本的可辨识性和类别多样性,越高越好;
  • Negative Log-Likelihood(NLL):评价模型对数据分配的概率,以 bits/dim 报告,越低越好。论文通过变分目标计算其上界。

图像生成效果

下面摘出原论文 Table 1 中的部分无条件 CIFAR10 结果。该表的 FID 采用训练集作为真实数据参照:

方法 IS ↑ FID ↓ NLL(bits/dim)↓
NCSN 8.87±0.128.87\pm0.12 25.32 —
StyleGAN2 + ADA(v1) 9.74±0.059.74\pm0.05 3.26 —
DDPM,原始变分目标 LL 7.67±0.137.67\pm0.13 13.51 ≤3.70\leq3.70
DDPM,LsimpleL_{\mathrm{simple}} 9.46±0.119.46\pm0.11 3.17 ≤3.75\leq3.75

使用简化噪声预测目标后,DDPM 得到了 3.17 的 FID,展示了扩散模型生成高质量图像的能力。在更高分辨率的 LSUN 数据上,论文报告 Church 的 FID 为 7.89,Bedroom 为 4.90,并展示了相应的生成样本。

表中也能看到,生成质量和似然指标对训练目标的响应不同:原始变分目标取得更好的 NLL 上界,简化目标则显著改善 FID。这与前面的推导对应——去掉时间步权重会改变优化重点,而不仅是换一种形式写同一个损失。

消融实验

原论文 Table 2 进一步比较了反向过程的参数化。下面三项都使用固定的各向同性方差:

预测对象 训练目标 FID ↓
后验均值 μ~t\tilde{\boldsymbol{\mu}}_t 原始变分目标 13.22
噪声 ϵ\boldsymbol{\epsilon} 原始变分目标 13.51
噪声 ϵ\boldsymbol{\epsilon} 简化的无时间步权重 MSE 3.17

在原始变分目标下,预测均值和预测噪声的结果接近;最好的效果来自噪声预测参数化与简化训练权重的组合。所以,本文的经验结论需要结合这两个选择一起理解。

作者也尝试直接学习反向分布的对角协方差,但在本文的实验设置中,训练稳定性和生成质量不如固定方差的方案。后来 DiT 中使用的方差学习,还涉及后续 Improved DDPM / ADM 的设计,不能直接当作这篇原始 DDPM 的默认做法。

渐进生成与压缩视角

除了最终生成效果,作者还观察了反向过程的中间状态。我们已经有了由 xt\mathbf{x}_t 估计干净图像的公式,因此可以在采样过程中持续观察 x^0\hat{\mathbf{x}}_0 怎样变化。论文的可视化中,大尺度结构较早出现,细节随后逐步完善。

DDPM 的生成指标及码率—失真分析

图来自作者项目页,展示图像生成指标与渐进有损压缩的分析。

从压缩角度看,反向过程也可以被理解为逐步传递图像信息:已有部分信息时,就能先得到一份粗略估计;继续接收信息后,重建误差进一步下降。论文通过变分目标中的 KL 项分析信息代价,并用 x^0\hat{\mathbf{x}}_0 与真实图像之间的 RMSE 衡量失真,发现低码率区域的误差下降很快。

这帮助解释了前面那个现象:一些对精确编码仍然有成本的微小差异,未必会显著改变视觉效果。因此,直接优化完整似然与优先获得好看的样本,会产生不同的训练取舍。

作者还将两张真实图像分别加噪到同一个时间步,在两个中间状态之间做插值,再通过反向过程生成图像。随着插值所用的噪声水平改变,结果可以在保留较多原图信息与产生更大变化之间调整。这里使用的中间表示就是像素加噪状态 xt\mathbf{x}_t。

核心点和不足

值得关注

DDPM 将一个复杂的图像分布学习问题,组织成了一组有明确监督的去噪任务。前向过程的闭式表达让训练输入可以直接生成;已知原图时的高斯后验,让反向分布的训练目标可以计算;噪声预测参数化则将这个目标进一步连接到简单的 MSE。

这条链的价值在于,概率模型、训练目标和最终采样过程能够对应起来。网络预测的噪声有明确用途,采样公式中的系数也来自前向过程和反向参数化。

同时,本文将反向分布的具体主干与扩散目标分开了。原始模型使用 U-Net,后来的 DiT 用 Transformer 处理带噪输入,但仍然可以采用噪声预测这类目标。理解这篇文章后,再读这些工作时,就能分别追踪:生成对象如何表示,主干怎样处理它,以及预测结果怎样被采样器使用。

仍然存在的问题

首先,原始采样需要依次运行 1000 个反向步骤,每一步都要调用神经网络。训练时只抽一个时间步的高效做法,并不能直接消除生成时的串行计算,这让采样加速成为后续工作的一个重要问题。

其次,本文直接在像素空间处理图像。分辨率增加时,每一步网络处理的空间尺寸也会增加,多步去噪的计算成本因此更加明显。后来 Latent Diffusion 将扩散搬到压缩后的特征空间,就是沿着计算表示继续改进的一条路线。

另外,本文主要验证无条件生成。如何将类别、文本或空间约束有效接入去噪过程,需要额外的条件建模;这也与 DiT 笔记中讨论的条件注入和 CFG 等后续设计形成联系。

总结

DDPM 的主要过程可以归纳为:

  • 用固定的高斯前向过程,将真实图像变成不同噪声水平的训练样本;
  • 根据变分目标与高斯后验,把反向均值的学习改写成噪声预测,并采用简化 MSE 训练;
  • 从高斯噪声出发,利用预测噪声计算每一步的反向均值,逐步采样得到图像。

其核心是通过一个容易计算的破坏过程,建立一套可以学习的生成过程。阅读时最值得真正理顺的,就是从 q(xt∣x0)q(\mathbf{x}_t\mid \mathbf{x}_0)、后验 q(xt−1∣xt,x0)q(x_{t-1}\mid \mathbf{x}_t,\mathbf{x}_0),到 μθ\boldsymbol{\mu}_\theta 的噪声参数化,再到训练与采样算法的这条关系。

接下来可以继续读 Improved DDPM,看看方差学习、训练权重和采样效率怎样改进;也可以读 DDIM,理解同类噪声预测模型怎样配合不同的采样过程。再回到 DiT,就可以更清楚地区分它沿用的扩散框架与重新设计的 Transformer 主干。

参考