DDPM 的原理是什么?为什么训练目标是预测噪声?
简化版
DDPM(Denoising Diffusion Probabilistic Models)是最经典的扩散模型。它把生成拆成「前向逐步加噪 + 反向逐步去噪」两条马尔可夫链:前向用固定的噪声表把图像加噪成高斯噪声,反向训练一个 U-Net 去噪。训练目标之所以是预测每一步掺进去的噪声 ε,是因为经过变分下界(ELBO)推导和重参数化后,损失可以简化成「预测噪声的均方误差」‖ε − ε_θ(x_t, t)‖²——形式最简单、训练最稳定、效果还最好。
详细版
DDPM 的两条链
前向(固定,无参数):
q(x_t | x_{t-1}) = N(x_t; √(1-β_t)·x_{t-1}, β_t·I)
闭式解让我们能一步合成任意时刻的带噪图:
x_t = √ᾱ_t·x₀ + √(1-ᾱ_t)·ε, α_t=1-β_t, ᾱ_t=∏α, ε~N(0,I)
反向(可学):网络 ε_θ(x_t, t) 预测噪声,据此还原 x_{t-1}。
为什么预测噪声(三个层次的理由)
-
理论层面:ELBO 推导出的反向均值 μ 依赖于「已知 x_t 时对 x₀(或 ε)的估计」。由闭式解,x_t、x₀、ε 三者知二求一,所以预测 ε、预测 x₀、预测 μ 在数学上等价,可以互相换算。
-
形式层面:选择预测 ε 后,复杂的 ELBO 损失(含一堆 KL 散度)可简化为一个干净的 MSE:
L_simple = E_{t,x₀,ε} ‖ ε − ε_θ(√ᾱ_t·x₀ + √(1-ᾱ_t)·ε, t) ‖²
- 工程层面:ε 的分布始终是标准高斯,尺度稳定、与 t 无关,网络更好学、梯度更稳;而直接预测 x₀ 在高噪声步(t 大)时目标信息太少、难度大。
训练与采样流程
- 训练:取 x₀ → 随机 t、随机 ε → 合成 x_t → 网络预测 ε → MSE 反传。
- 采样:x_T~N(0,I) → 循环 T…1,每步用 ε_θ 算均值并加噪 → 得 x₀。
核心痛点:采样要跑 T≈1000 步,很慢,催生了 DDIM 等加速方法。
完整版教学
一、DDPM 在扩散模型谱系里的位置
「扩散模型」是一大类方法的统称,DDPM 是 2020 年 Ho 等人提出的、把这类方法真正带火的里程碑工作。它的贡献不在于发明扩散思想(更早有 Sohl-Dickstein 2015),而在于把训练目标简化到极致,让扩散模型第一次在图像质量上逼近甚至超过 GAN。面试里问「扩散模型原理」,标准答法就是讲 DDPM。
二、前向过程为什么要设计成这样
前向过程 q(x_t|x_{t-1}) = N(√(1-β_t)·x_{t-1}, β_t·I) 有两个精心的设计:
- 系数 √(1-β_t) 的缩放:每步都把信号稍微缩小,保证方差不爆炸。如果只加噪不缩放,图像的方差会越加越大;有了这个缩放,可以证明前向过程保持方差稳定,最终精确收敛到标准高斯
N(0,I)。这叫「方差保持(variance preserving)」的设计。 - β_t 逐渐变大的噪声表:早期步骤(t 小)加很少的噪声,保留大量细节;后期步骤加更多噪声。常见的有线性表、余弦表(cosine schedule,改善了线性表在两端加噪过快/过慢的问题,生成质量更好)。
由此推出的闭式解是训练高效的关键:
x_t = √ᾱ_t·x₀ + √(1-ᾱ_t)·ε
有了它,训练时对任意 t 都能「一步到位」造出带噪样本,无需真的迭代 t 次。可以说,没有这个闭式解,DDPM 训练就不现实。
三、从 ELBO 到「预测噪声」的推导脉络(面试够用版)
不用背完整推导,但要能说清脉络:
-
我们想最大化数据似然
log p_θ(x₀),直接算不了,于是用变分下界 ELBO:引入前向 q 作为近似后验,把log p_θ(x₀)下界成一串可计算的项。 -
ELBO 展开后是若干 KL 散度之和,其中主项是让反向分布
p_θ(x_{t-1}|x_t)去逼近「真实反向后验」q(x_{t-1}|x_t, x₀)。后者是可以精确算出的高斯,其均值记为 μ̃。 -
于是训练变成让网络输出的均值 μ_θ 去匹配 μ̃。而 μ̃ 可以写成关于 x_t 和 ε 的表达式。
-
重参数化:把 μ_θ 也写成同样的形式,只让网络去预测其中的 ε。代入后,KL 项化简为「真实 ε 与预测 ε 的加权平方差」。
-
DDPM 发现扔掉那个随 t 变化的权重系数(即用 L_simple 而非带权版本),训练更稳、生成更好。这就是最终的噪声预测 MSE。
简要说串起来:最大化似然 → ELBO → 匹配反向后验高斯的均值 → 重参数化成预测 ε → 去掉权重变成简单 MSE。
四、预测噪声 vs 预测 x₀ vs 预测 v
这是高频追问,给一张对比表:
| 参数化 | 网络输出 | 特点 | 适用 |
|---|---|---|---|
| ε-prediction | 预测掺入的噪声 ε | DDPM 原始选择,高噪声步稳定,最常见 | 通用 |
| x₀-prediction | 直接预测干净图 x₀ | 低噪声步直观,但高噪声步目标信息太少、难学 | 少数场景 |
| v-prediction | 预测 v = √ᾱ_t·ε − √(1-ᾱ_t)·x₀ | 兼顾两端,数值更稳定,蒸馏/高分辨率常用 | SD 2.x、蒸馏 |
它们本质等价(可互相换算),差别在不同噪声水平下的数值稳定性和梯度尺度。记住:ε 在高噪声端好学,x₀ 在低噪声端好学,v 是二者的折中。
五、采样过程的细节与随机项
采样单步公式:
x_{t-1} = 1/√α_t · ( x_t − (1-α_t)/√(1-ᾱ_t) · ε_θ(x_t,t) ) + σ_t·z, z~N(0,I)
- 前半部分是去噪均值:把预测噪声按比例减掉。
- 后半部分
σ_t·z是重新注入的随机性,让反向过程也是一条随机链(DDPM 是随机采样)。在最后一步 t=1 时不再加噪。 σ_t的取值可以设为√β_t或后验方差,二者效果接近。
易错点:反向不是「确定性地一路减噪」,DDPM 每步还会加回一点噪声。正是这个随机项保证了生成的多样性。想要确定性、可加速的采样,就用 DDIM(把 σ_t 设为 0)。
六、常见误区与面试追问
- 误区 1:以为网络在预测下一帧图像。 不是,网络预测的是噪声 ε(或等价的 x₀/v),图像是由公式反解出来的。
- 误区 2:以为 T 越大越好。 T 太大采样太慢;T 太小前向近似高斯不成立。DDPM 取 1000 是质量与成本的平衡,推理时可用 DDIM 压到 20–50 步。
- 追问:前向过程要训练吗? 不要,前向是固定的加噪流程,没有参数,只有反向的 ε_θ 需要训练。
- 追问:时间步 t 怎么告诉网络? 用正弦位置编码把 t 编成向量,通过嵌入注入 U-Net 的每个残差块(类似 Transformer 的位置编码)。
- 追问:为什么比 GAN 稳定? 因为它是纯回归任务(预测噪声的 MSE),没有判别器、没有对抗博弈,因此没有 GAN 那种模式崩溃和训练震荡。
七、常见误区与追问
- 误区:扩散模型只是把噪声慢慢擦掉。 更准确地说,模型学习的是每个噪声强度下如何估计噪声、干净样本或速度向量,采样器再用这些估计反推图像。
- 追问:为什么采样步数能减少但质量不一定崩? 因为 DDIM、DPM-Solver 等方法改变了反向路径的数值求解方式,但步数越少越依赖模型预测精度和调度设计。
- 误区:条件越强图像越好。 CFG、ControlNet 或文本条件过强会带来过饱和、结构僵硬、细节扭曲,条件控制本质上是质量、多样性和服从度的权衡。
- 追问:训练目标里的噪声调度为什么重要? 它决定模型在哪些噪声区间学得更充分,直接影响高频细节、全局结构和采样稳定性。
- 误区:扩散模型一定比 GAN 慢且只能离线生成。 传统扩散采样步数多,但蒸馏、潜空间扩散、DiT 优化和少步采样已经显著降低了推理成本。
八、加强记忆
DDPM 抓三点就够答:(1)前向固定加噪,闭式解 x_t=√ᾱ_t·x₀+√(1-ᾱ_t)·ε;(2)网络预测噪声 ε,损失是 ‖ε−ε_θ‖² 的简单 MSE,源头是 ELBO 推导 + 重参数化 + 去掉权重;(3)采样从纯噪声反复去噪 T 步,每步去噪均值再加一点随机噪声。 预测噪声之所以是「红线级」的标准答案,是因为它同时满足理论等价、形式最简、工程最稳这三条。把「化整为零 + 预测噪声 + 多步采样」刻进脑子,DDPM 就拿下了。