它从不学画画,只学猜噪声

扩散模型(DDPM 及其后续工作)的训练目标有一个值得注意的特点:网络不直接输出图像,而是输出一个噪声向量。初看这与「生成」的目标相悖,但这一设计并非随意选择,而是由反向过程的数学结构所决定的。本文从反向过程的学习目标出发,说明「预测噪声」如何从推导中自然浮现。

1. 扩散模型的基本框架

扩散模型的灵感来自非平衡热力学:一滴墨水滴进水里,从集中到扩散,最终变成均匀的混合状态。扩散模型借用了这个思想——把真实数据一步步「毁掉」成纯噪声,再训练一个模型学会把噪声一步步「还原」成真实数据。

整个模型由两个过程构成。

前向过程是人为定义的加噪过程:从数据 x0x_0 出发,逐步注入高斯噪声,经过 TT 步后逼近标准正态分布 xT∼N(0,I)x_T\sim\mathcal N(0,I)。每一步的转移核为

q(xt∣xt−1)=N(xt;1−βt xt−1,βtI),q(x_t\mid x_{t-1})=\mathcal N\big(x_t;\sqrt{1-\beta_t}\,x_{t-1},\beta_t I\big),

其中 βt\beta_t 是预设的噪声调度(noise schedule)。整个前向过程是一条马尔可夫链——每一步只依赖上一步,与更早的状态无关。

由于高斯分布的可加性,可绕过逐步采样,直接写出任意时刻的闭式形式:

q(xt∣x0)=N(xt;αˉt x0,(1−αˉt)I),xt=αˉt x0+1−αˉt ϵ,q(x_t\mid x_0)=\mathcal N\big(x_t;\sqrt{\bar\alpha_t}\,x_0,(1-\bar\alpha_t)I\big),\qquad x_t=\sqrt{\bar\alpha_t}\,x_0+\sqrt{1-\bar\alpha_t}\,\epsilon,

这里 αt=1−βt\alpha_t=1-\beta_t,αˉt=∏s=1tαs\bar\alpha_t=\prod_{s=1}^t\alpha_s,ϵ∼N(0,I)\epsilon\sim\mathcal N(0,I)。可以清楚地看到:αˉtx0\sqrt{\bar\alpha_t}x_0 是保留下来的原始信号,1−αˉtϵ\sqrt{1-\bar\alpha_t}\epsilon 是注入的噪声。随着 tt 增大,αˉt\bar\alpha_t 逐渐趋零,信号消失殆尽。

反向过程是待学习的去噪过程,从纯噪声逐步恢复数据。生成模型的全部困难都集中在这一步。

2. 反向过程的学习目标

反向过程需要学习分布 pθ(xt−1∣xt)p_\theta(x_{t-1}\mid x_t)——给定当前带噪样本,上一步应当是什么。该分布无法直接获得,但存在一个关键的切入点:

若已知原始数据 x0x_0,则真实的后验 q(xt−1∣xt,x0)q(x_{t-1}\mid x_t,x_0) 有闭式解。

原因在于前向过程完全由高斯转移构成,而高斯分布的条件分布仍是高斯。对三个高斯分布应用贝叶斯公式,可得该后验仍为高斯:

q(xt−1∣xt,x0)=N(xt−1;μ~t,β~tI),q(x_{t-1}\mid x_t,x_0)=\mathcal N\big(x_{t-1};\tilde\mu_t,\tilde\beta_t I\big),

其均值为

μ~t=1αt(xt−βt1−αˉt ϵ).\tilde\mu_t=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon\right).

训练的本质就是:让网络学的反向去噪过程,尽可能贴近这个已知的后验分布。

3.「预测噪声」如何浮现

观察上式中的各量:

  • xtx_t 是当前输入,已知;
  • αt\alpha_t、βt\beta_t、αˉt\bar\alpha_t 由噪声调度定义,已知;
  • ϵ\epsilon 是前向过程注入的噪声,未知。

后验均值的唯一未知量是噪声 ϵ\epsilon。 换言之,若网络能够预测 ϵ\epsilon,即可确定后验分布的均值,从而确定去噪方向。于是,让网络预测噪声,与「学习去噪」在数学上是等价的:

μθ(xt,t)=1αt(xt−βt1−αˉt ϵθ(xt,t)).\mu_\theta(x_t,t)=\frac{1}{\sqrt{\alpha_t}}\left(x_t-\frac{\beta_t}{\sqrt{1-\bar\alpha_t}}\,\epsilon_\theta(x_t,t)\right).

这正是 DDPM 采用噪声预测参数化的原因。这个参数化也直接决定了损失函数的形式。

4. 参数化的选择

需要指出的是,「预测噪声」并非唯一可行的参数化。由前向闭式关系 xt=αˉtx0+1−αˉtϵx_t=\sqrt{\bar\alpha_t}x_0+\sqrt{1-\bar\alpha_t}\epsilon,噪声 ϵ\epsilon、干净样本 x0x_0 与上一步 xt−1x_{t-1} 三者可以相互换算。因此,预测三者中的任意一个在数学上等价,只是未知量的选择不同。

DDPM 选择预测噪声,主要基于数值稳定性的考虑。当 tt 接近 TT 时,xtx_t 几乎为纯噪声,此时直接预测 x0x_0 的目标高度多解且难以优化;而噪声 ϵ\epsilon 服从标准高斯,目标明确、无歧义。原论文(Ho et al., 2020)的实验也表明预测噪声的效果最优。

5. 损失函数

扩散模型真正想最大化的是数据对数似然 log⁡pθ(x0)\log p_\theta(x_0),但这需要对所有中间潜变量 x1:Tx_{1:T} 积分,无法直接算。于是用变分推断把它松弛为 ELBO(证据下界)。整个推导的线索是:

后验 q(xt−1∣xt,x0)q(x_{t-1}\mid x_t,x_0) 可解析算 → 它是高斯,有明确均值 → 网络只需学这个均值 → 均值最终只依赖噪声 ϵ\epsilon → 损失退化成预测噪声的 MSE。

令网络的反向分布取与真实后验相同的形式。由于两者都是高斯且方差一致,二者之间的 KL 散度退化为均值差的加权平方。将均值公式代入并化简(完整推导见扩散模型的损失推导):

Lt−1=E[12σt2∥μ~t−μθ∥2]∝E[∥ϵ−ϵθ(xt,t)∥2]L_{t-1} = \mathbb{E}\left[\frac{1}{2\sigma_t^2}\|\tilde\mu_t - \mu_\theta\|^2\right] \propto \mathbb{E}\left[\|\epsilon - \epsilon_\theta(x_t,t)\|^2\right]

DDPM 实验发现,丢掉前面的权重系数、均匀采样时间步 tt,训练反而更稳定。最终训练目标为

Lsimple=Ex0,ϵ,t[∥ϵ−ϵθ(xt,t)∥2].L_{\text{simple}}=\mathbb E_{x_0,\epsilon,t}\Big[\big\|\epsilon-\epsilon_\theta(x_t,t)\big\|^2\Big].

整个生成模型的训练由此收敛为一个均方误差:网络只需让预测的噪声逼近真实注入的噪声。

用代码写出来,训练循环非常简洁:

for x0 in dataloader: # x0 ~ 训练数据
t = torch.randint(0, T, (x0.shape[0],)) # 采样时间步
eps = torch.randn_like(x0) # 采样噪声 ε ~ N(0,I)
xt = sqrt(alpha_bar[t]) * x0 + sqrt(1 - alpha_bar[t]) * eps # 构造 x_t
loss = F.mse_loss(model(xt, t), eps) # L_simple = ‖ε - ε_θ‖²
loss.backward(); opt.step()

6. 这一设计的后续意义

「预测噪声」是理解扩散模型后续发展的基础。后续的三个重要工作——DDIM、CFG 和 Latent Diffusion——都直接建立在这一参数化之上。

DDIM:确定性加速采样

DDPM 采样慢的根源在于:反向过程被定义成马尔可夫链,必须老老实实走完 TT(通常 1000)步。DDIM(Song et al., ICLR 2021)的关键洞察是:训练损失 LsimpleL_{\text{simple}} 只依赖边缘分布 q(xt∣x0)q(x_t\mid x_0),不依赖具体的联合分布。因此采样时可以将马尔可夫链替换为非马尔可夫的隐式过程:先用噪声预测估计干净样本 x^0\hat x_0,再按目标时刻的噪声比例重新加噪回去——

xt−1=αˉt−1 x^0+1−αˉt−1 ϵθ(xt,t)x_{t-1} = \sqrt{\bar\alpha_{t-1}}\,\hat x_0 + \sqrt{1-\bar\alpha_{t-1}}\,\epsilon_\theta(x_t,t)

这个过程没有随机项,给定初始噪声 xTx_T 后生成结果唯一。实际效果是 50 步即可替代 1000 步,质量几乎不下降。从连续时间的视角看(见 Score SDE),DDIM 正是概率流 ODE 的离散化——ODE 的解是平滑曲线,离散化时步长可以更大,而不像 SDE 的随机游走那样必须小步。

CFG:无分类器引导

直接条件生成的结果往往偏「保守」——能满足条件,但不够鲜明。CFG(Classifier-Free Guidance, Ho & Salimans, 2022)的思路是:训练时以一定概率(通常 10%–20%)随机丢弃条件,让同一个网络既能做条件生成、也能做无条件生成。采样时将「条件预测」沿「条件 − 无条件」的方向外推:

ϵ^θ=ϵθ(xt,t,∅)+γ(ϵθ(xt,t,c)−ϵθ(xt,t,∅))\hat\epsilon_\theta = \epsilon_\theta(x_t, t, \varnothing) + \gamma\Big(\epsilon_\theta(x_t, t, c) - \epsilon_\theta(x_t, t, \varnothing)\Big)

γ\gamma 是引导强度,通常取 5–10。这个公式的含义是:条件噪声预测与无条件噪声预测之差,就是条件引导的方向。放大这个方向,就得到更「听话」的结果。更深层地,由 Tweedie 公式,噪声预测与分数(score)∇xlog⁡p(x)\nabla_x\log p(x) 只差一个系数(见第 1 节的噪声预测参数化)——因此这个外推实质上是在分数空间里做条件引导。

Latent Diffusion:从像素到潜空间

直接在像素空间扩散太贵:一张 512×512 的图有约 26 万维,而像素间大量信息是冗余的。Latent Diffusion(Rombach et al., 2022)把扩散过程从像素空间搬到低维的潜在空间:先用 VAE 把图像压缩成小的 latent 表示,在 latent 上做扩散/去噪,最后用 VAE 解码回像素。Stable Diffusion 就是这条路线的代表。

原图 → VAE 编码器 → 压缩 latent → 在 latent 中扩散/去噪 → 生成 latent → VAE 解码器 → 输出图片

损失函数的形式与第 5 节完全一致——只是把 xx 换成了 latent zz。文本条件通过编码器变成 embedding,用 cross-attention 注入 U-Net 的每一层。采样时用 CFG 做引导、DDIM 做加速,三者无缝组合。

参考资料