扩散模型 (Diffusion Models)
扩散模型是一类基于逐步去噪思想的生成模型。其核心思路极为优雅:先定义一个前向过程,将数据逐步加噪直至变成纯高斯噪声;再训练一个神经网络学习反向过程,从噪声中一步步恢复出数据。这种"破坏再重建"的范式,使得扩散模型在图像生成、视频生成、音频合成、分子设计等领域取得了突破性成果,成为当前最具影响力的生成模型家族之一。
背景与动机
生成模型的发展脉络
生成模型的核心目标是学习数据分布 \(p_{data}(x)\),并从中采样生成新数据。在扩散模型崛起之前,主流的生成模型主要有三大家族:
| 模型家族 | 核心思路 | 代表工作 | 主要局限 |
|---|---|---|---|
| VAE (2013) | 通过编码器-解码器学习隐变量分布,最大化 ELBO | Kingma & Welling, 2013 | 生成质量受限于后验近似,图像往往模糊 |
| GAN (2014) | 生成器与判别器对抗博弈 | Goodfellow et al., 2014 | 训练不稳定,模式崩塌,难以覆盖全部模式 |
| Flow (2014-2018) | 可逆变换,精确计算似然 | NICE, RealNVP, Glow | 架构受限(必须可逆),计算成本高 |
每种方法都有明显的短板。VAE 生成的图像偏模糊,因为它优化的是重建误差的下界;GAN 能生成锐利图像,但训练不稳定且容易忽略部分数据模式(mode collapse);Flow 模型需要可逆架构的约束,限制了网络的表达能力。
核心灵感:非平衡热力学
扩散模型的灵感来源于非平衡统计热力学 (non-equilibrium thermodynamics)。2015 年,Sohl-Dickstein 等人在论文 "Deep Unsupervised Learning using Nonequilibrium Thermodynamics" 中首次系统提出了这一思想:
物理直觉是这样的:想象一滴墨水滴入清水中。随着时间推移,墨水会逐渐扩散,最终均匀分布在水中(对应前向加噪过程)。如果我们能学会"倒放"这个扩散过程,就能从均匀分布的状态恢复出墨水的初始形态(对应反向去噪过程)。
关键洞察在于:虽然前向扩散过程会破坏数据中的所有结构,但每一小步的破坏都是微小的、可预测的。如果噪声添加得足够缓慢,每一步的反向过程也是近似高斯的,因此可以用神经网络来参数化。
扩散模型的优势
扩散模型之所以能够超越前代方法,根本原因在于:
- 训练稳定性:不需要对抗训练(GAN 的痛点),损失函数是简单的均方误差,训练过程平稳
- 模式覆盖:最大化似然(的下界),天然倾向于覆盖数据分布的所有模式,不会出现 mode collapse
- 生成质量:通过足够多的去噪步骤,可以生成极高质量的样本
- 灵活性:不需要特殊的网络架构约束(不像 Flow 模型要求可逆),可以使用任意架构
- 理论优雅:与随机过程、分数匹配等理论有深刻联系,数学基础扎实
发展里程碑
- 2015: Sohl-Dickstein 等人提出扩散概率模型的原始框架
- 2019: Song & Ermon 提出 Score-Based Generative Models (NCSN)
- 2020: Ho et al. 提出 DDPM,证明扩散模型可以超越 GAN
- 2021: Nichol & Dhariwal 提出 Improved DDPM;Song et al. 提出 DDIM 加速采样
- 2021: Dhariwal & Nichol 发表 "Diffusion Models Beat GANs",引入 Classifier Guidance
- 2022: Rombach et al. 提出 Latent Diffusion / Stable Diffusion;Google 发布 Imagen;OpenAI 发布 DALL-E 2
- 2023-2024: 扩散模型扩展至视频 (Sora)、3D、音频、蛋白质设计等领域
DDPM 详解
DDPM (Denoising Diffusion Probabilistic Models, Ho et al., 2020) 是扩散模型的奠基性工作。它将 2015 年的理论框架转化为了实用的生成模型,并首次在图像生成质量上与 GAN 匹敌。
整体思路
DDPM 定义了两个互为逆过程的马尔可夫链:
前向过程 (Fixed, 不可学习):
x_0 ──加噪──> x_1 ──加噪──> x_2 ──...──> x_{T-1} ──加噪──> x_T ~ N(0, I)
(真实数据) (纯噪声)
反向过程 (Learned, 需要学习):
x_T ──去噪──> x_{T-1} ──去噪──> x_{T-2} ──...──> x_1 ──去噪──> x_0
(纯噪声) (生成数据)
整体架构的关键特征:
- 前向过程是预先定义好的,不需要学习任何参数
- 反向过程由参数化的神经网络驱动,这是我们需要训练的部分
- 通常 \(T = 1000\),即分 1000 步完成加噪/去噪
前向过程 (Forward / Diffusion Process)
前向过程定义了如何将干净数据 \(x_0\) 逐步变成噪声。每一步都是在上一步的结果上添加少量高斯噪声:
其中 \(\beta_t \in (0, 1)\) 是预先设定的噪声调度 (noise schedule),控制每一步添加多少噪声。
理解这个公式:在第 \(t\) 步,新的 \(x_t\) 是对 \(x_{t-1}\) 做了两件事:
- 缩小信号:乘以 \(\sqrt{1 - \beta_t}\)(略小于 1),让原始信号稍微衰减
- 添加噪声:加上方差为 \(\beta_t\) 的高斯噪声
直觉上,每一步都让数据"更吵一点"。经过足够多步后,原始数据的信息被完全淹没在噪声中。
噪声调度 (Noise Schedule)
\(\beta_t\) 的选取方式对模型性能有显著影响。常见的两种调度策略:
线性调度 (Linear Schedule):
DDPM 原论文使用 \(\beta_1 = 10^{-4}\), \(\beta_T = 0.02\),\(T = 1000\)。
余弦调度 (Cosine Schedule):
Nichol & Dhariwal (2021) 发现线性调度在接近 \(t = T\) 时加噪太快,提出了余弦调度:
其中 \(s = 0.008\) 是一个小偏移量,防止 \(\beta_t\) 在 \(t\) 接近 0 时太小。
为什么余弦调度更好?
线性调度的问题在于:在过程的后半段,\(\bar{\alpha}_t\) 下降得太快,导致数据信息被过早破坏。而余弦调度让 \(\bar{\alpha}_t\) 的下降更加平缓均匀,使得每一步都携带有意义的信号,网络在每个时间步都能获得有效的训练信号。
任意时刻直接采样(重参数化技巧)
训练时如果必须从 \(x_0\) 出发逐步采样到 \(x_t\),效率极低。好在,利用高斯分布的叠加性质,我们可以直接从 \(x_0\) 一步跳到任意 \(x_t\)。
定义:
\(\bar{\alpha}_t\) 是 \(\alpha\) 的累积乘积。由于每个 \(\alpha_t\) 略小于 1,\(\bar{\alpha}_t\) 随 \(t\) 增大而递减,最终趋近于 0。
推导过程:
由前向过程定义,我们有 \(x_t = \sqrt{\alpha_t} \, x_{t-1} + \sqrt{\beta_t} \, \epsilon_{t-1}\),其中 \(\epsilon_{t-1} \sim \mathcal{N}(0, \mathbf{I})\)。
递归展开:
由于两个独立高斯噪声的和仍是高斯噪声(方差相加),后两项可合并为一个高斯噪声,方差为 \(\alpha_t(1 - \alpha_{t-1}) + (1 - \alpha_t) = 1 - \alpha_t\alpha_{t-1}\)。
不断递归到 \(x_0\),最终得到:
等价地,用重参数化 (reparameterization) 表示:
重参数化的重要性
这个公式是 DDPM 训练效率的关键。训练时我们不需要逐步模拟前向过程,只需:(1) 随机采样时间步 \(t\);(2) 随机采样噪声 \(\epsilon\);(3) 用上式直接计算 \(x_t\)。这使得训练可以在任意时间步上并行进行。
\(\bar{\alpha}_t\) 的直觉理解:
- 当 \(t\) 很小时,\(\bar{\alpha}_t \approx 1\),\(x_t \approx x_0\),数据几乎未被破坏
- 当 \(t\) 很大时,\(\bar{\alpha}_t \approx 0\),\(x_t \approx \epsilon\),数据已完全变成噪声
- \(\bar{\alpha}_t\) 可以理解为时刻 \(t\) 时信号保留的比例
下面用 ASCII 图来展示前向加噪过程中 \(\bar{\alpha}_t\) 与图像质量的变化:
bar_alpha_t: 1.0 0.7 0.3 0.05 ~0
| | | | |
t: 0 250 500 750 1000
| | | | |
图像质量: [清晰原图] → [轻微噪点] → [模糊可辨] → [几乎纯噪声] → [纯高斯噪声]
反向过程 (Reverse / Denoising Process)
反向过程的目标是从 \(x_T \sim \mathcal{N}(0, \mathbf{I})\) 出发,逐步去噪,最终生成接近真实分布的数据 \(x_0\)。
真实的反向条件分布 \(q(x_{t-1} | x_t)\) 依赖于整个数据分布 \(q(x_0)\),无法直接计算。但是,当 \(\beta_t\) 足够小时,\(q(x_{t-1} | x_t)\) 近似为高斯分布。因此我们用参数化的高斯分布来近似它:
其中 \(\mu_\theta(x_t, t)\) 是由神经网络输出的均值,\(\sigma_t^2\) 是方差(可以固定或学习)。
预测噪声 vs 预测均值
Ho et al. 的关键发现是:与其让网络直接预测均值 \(\mu_\theta\),不如让网络预测噪声 \(\epsilon_\theta(x_t, t)\)。
这是因为,利用贝叶斯定理,我们可以推导出给定 \(x_0\) 时的真实反向条件分布:
其中:
由于 \(x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon\),我们可以将 \(x_0\) 用 \(x_t\) 和 \(\epsilon\) 表示:
将其代入 \(\tilde{\mu}_t\) 的公式,经过化简可得:
因此,如果我们的网络 \(\epsilon_\theta(x_t, t)\) 能准确预测加在 \(x_0\) 上的噪声 \(\epsilon\),那么反向过程的均值就是:
三种等价的预测目标
网络可以被训练来预测三种不同但等价的量:
- 预测噪声 \(\epsilon_\theta(x_t, t) \approx \epsilon\):DDPM 的默认选择,实践中效果最好
- 预测原始数据 \(x_\theta(x_t, t) \approx x_0\):在某些应用中更直观
- 预测分数 \(s_\theta(x_t, t) \approx \nabla_{x_t} \log q(x_t)\):与 Score-Based 方法的桥梁
这三者之间的关系为:\(\epsilon = -\sqrt{1 - \bar{\alpha}_t} \nabla_{x_t} \log q(x_t | x_0)\)
方差的选择
DDPM 中方差 \(\sigma_t^2\) 有两种常见选择:
- \(\sigma_t^2 = \beta_t\):对应最大化反向过程的熵
- \(\sigma_t^2 = \tilde{\beta}_t = \frac{1 - \bar{\alpha}_{t-1}}{1 - \bar{\alpha}_t}\beta_t\):对应真实反向条件分布的方差
Ho et al. 发现两种选择的效果类似。Improved DDPM (Nichol & Dhariwal, 2021) 提出学习两者的插值:
其中 \(v\) 由网络输出,在对数空间中对两个极端进行插值。
架构图
下面用 ASCII 图展示 DDPM 的完整前向-反向过程:
=========================== 前向过程 q (固定) ============================
q(x_1|x_0) q(x_2|x_1) q(x_T|x_{T-1})
x_0 ──────────> x_1 ──────────> x_2 ──── ... ────> x_{T-1} ──────────> x_T
(数据) (+少量噪声) (+少量噪声) (纯噪声)
~ N(0, I)
信号强度: ████████████████████████████████████░░░░░░░░░░░░░░░░░░░░░░░░░░░░
噪声强度: ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░████████████████████████████
========================= 反向过程 p_theta (学习) =========================
p(x_0|x_1) p(x_1|x_2) p(x_{T-1}|x_T)
x_0 <────────── x_1 <────────── x_2 <──── ... ──── x_{T-1} <────────── x_T
(生成数据) (去噪一步) (去噪一步) (采样噪声)
^ ^ ^
| | |
epsilon_theta epsilon_theta epsilon_theta
(神经网络) (神经网络) (神经网络)
| | |
[U-Net] [U-Net] [U-Net]
(共享权重) (共享权重) (共享权重)
U-Net 架构
DDPM 使用改进的 U-Net 作为噪声预测网络 \(\epsilon_\theta(x_t, t)\)。核心设计包括:
时间步嵌入 (Timestep Embedding):
时间步 \(t\) 通过正弦位置编码(类似 Transformer)转换为嵌入向量,然后注入到每个 ResBlock 中:
U-Net 结构示意:
输入 x_t (带噪图像)
|
v
[Conv] ──────────────────────────────────────────────> [+] → [Conv] → 输出 epsilon
| ^
v |
[ResBlock + t_emb] ─── skip connection ──────────> [ResBlock + t_emb]
| ^
v |
[ResBlock + t_emb + Attn] ─── skip ──────────> [ResBlock + t_emb + Attn]
| ^
v |
[Downsample] [Upsample]
| ^
v |
[ResBlock + t_emb + Attn] ─── skip ──────────> [ResBlock + t_emb + Attn]
| ^
v |
[Downsample] [Upsample]
| ^
v |
+──────> [ResBlock + Attn] ──> [ResBlock] ──────────>+
(Bottleneck 瓶颈层)
主要组件:
- ResBlock:残差块,接收时间步嵌入 \(t_{\text{emb}}\) 作为条件
- Self-Attention:在较低分辨率的特征图上使用,捕获全局依赖
- Skip Connection:U-Net 的标志性设计,连接编码器和解码器对应层
- 输入输出:输入为带噪图像 \(x_t\),输出为预测噪声 \(\epsilon_\theta\),两者尺寸相同
训练目标
从变分下界到简化损失
DDPM 的训练目标可以从最大化对数似然的变分下界 (ELBO) 推导得出。完整的变分下界为:
其中:
- \(L_T\):前向过程最终分布与先验 \(\mathcal{N}(0, \mathbf{I})\) 的 KL 散度,不含可学习参数,是常数
- \(L_{t-1}\) (\(t = 2, ..., T\)):比较真实反向条件分布与模型预测的 KL 散度
- \(L_0\):重建项,衡量从 \(x_1\) 重建 \(x_0\) 的质量
由于 \(q(x_{t-1}|x_t, x_0)\) 和 \(p_\theta(x_{t-1}|x_t)\) 都是高斯分布,两者之间的 KL 散度可以解析计算,最终可化简为均值之差的范数。
Ho et al. 的核心贡献之一是发现,使用以下简化损失函数效果更好:
其中 \(x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon\)。
直觉理解:这个损失函数的含义非常简单——我们知道加了什么噪声 \(\epsilon\),让网络预测这个噪声 \(\epsilon_\theta\),然后最小化两者的均方误差。
为什么简化损失比 VLB 效果更好?
完整 VLB 中的每个 \(L_{t-1}\) 项前面有一个与 \(t\) 相关的权重系数。简化损失去掉了这个权重(等价于所有时间步等权),这实际上对较小 \(t\)(去噪的最后几步)给予了更多权重。实验表明这种重新加权可以改善样本质量,虽然理论上不再是严格的似然下界。
训练算法
训练过程的伪代码如下:
算法: DDPM 训练
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
输入: 数据集, 噪声预测网络 epsilon_theta, 噪声调度 {alpha_t, bar_alpha_t}
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
repeat:
1. 从数据集采样一个 x_0 ~ q(x_0)
2. 随机采样时间步 t ~ Uniform{1, 2, ..., T}
3. 随机采样噪声 epsilon ~ N(0, I)
4. 构造加噪样本: x_t = sqrt(bar_alpha_t) * x_0 + sqrt(1 - bar_alpha_t) * epsilon
5. 计算损失: L = || epsilon - epsilon_theta(x_t, t) ||^2
6. 对 theta 做梯度下降: theta <- theta - eta * grad_theta(L)
until 收敛
训练的高效性
注意到每次训练迭代只需要处理一个时间步,而不是整个 \(T\) 步的链。这是因为我们可以直接用 \(x_t = \sqrt{\bar{\alpha}_t} x_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon\) 跳到任意时间步,无需逐步模拟前向过程。这使得训练效率与普通的监督学习类似。
采样过程
训练好模型后,生成新样本的过程如下:
算法: DDPM 采样
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
输入: 训练好的 epsilon_theta, 噪声调度 {alpha_t, beta_t, bar_alpha_t}
输出: 生成的样本 x_0
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
1. 采样初始噪声: x_T ~ N(0, I)
2. for t = T, T-1, ..., 1:
a. if t > 1: 采样 z ~ N(0, I)
else: z = 0
b. 用网络预测噪声: epsilon_pred = epsilon_theta(x_t, t)
c. 去噪一步:
x_{t-1} = (1/sqrt(alpha_t)) * (x_t - beta_t/sqrt(1 - bar_alpha_t) * epsilon_pred) + sigma_t * z
3. return x_0
其中 \(\sigma_t = \sqrt{\beta_t}\) 或 \(\sigma_t = \sqrt{\tilde{\beta}_t}\)。
注意事项:
- 最后一步 (\(t = 1\)) 不加噪声 (\(z = 0\)),否则生成的图像会有残余噪声
- 采样需要 \(T\) 次前向传播(通常 \(T = 1000\)),这是 DDPM 的主要瓶颈
- 每一步的计算量等于一次 U-Net 的前向传播
采样速度问题
DDPM 的致命弱点是采样速度。生成一张 \(256 \times 256\) 的图像需要 1000 次 U-Net 前向传播,在 GPU 上可能需要几十秒到几分钟。相比之下,GAN 只需要一次前向传播。这催生了大量加速采样的后续工作。
DDIM 加速采样
Song et al. (2021) 提出了 DDIM (Denoising Diffusion Implicit Models),可以在不重新训练模型的情况下大幅加速采样。
核心思想
DDPM 的前向过程是马尔可夫链:\(x_t\) 只依赖于 \(x_{t-1}\)。DDIM 的关键洞察是:只要保持边际分布 \(q(x_t | x_0)\) 不变,前向过程不一定要是马尔可夫的。
DDIM 构造了一族非马尔可夫的前向过程,使得:
- 每一步的边际分布 \(q_\sigma(x_t | x_0)\) 与 DDPM 完全相同
- 但联合分布 \(q_\sigma(x_{1:T} | x_0)\) 不同于 DDPM
- 由此导出的反向过程可以跳步采样
DDIM 更新规则
DDIM 的反向过程更新公式为:
其中 \(\epsilon_t \sim \mathcal{N}(0, \mathbf{I})\),\(\sigma_t\) 是一个可调参数:
- 当 \(\sigma_t = \sqrt{\frac{1-\bar{\alpha}_{t-1}}{1-\bar{\alpha}_t}} \sqrt{1 - \frac{\bar{\alpha}_t}{\bar{\alpha}_{t-1}}}\) 时,退化为 DDPM
- 当 \(\sigma_t = 0\) 时,得到确定性采样,即 DDIM
确定性采样 vs 随机采样
当 \(\sigma_t = 0\) 时,DDIM 的更新变成完全确定性的:
确定性采样的优势:
- 可跳步:由于没有随机性,可以在时间步子序列 \(\tau_1, \tau_2, ..., \tau_S\) 上采样(\(S \ll T\)),例如只用 50 步代替 1000 步
- 一致的隐编码:同一个 \(x_T\) 总是映射到同一个 \(x_0\),使得隐空间具有语义意义
- 可逆性:前向和反向过程都是确定性的,可以将任意图像编码到隐空间(类似 GAN 的 inversion)
加速效果
| 采样步数 | DDPM | DDIM | 备注 |
|---|---|---|---|
| 1000 步 | FID ~3.17 | FID ~4.04 | 几乎等价 |
| 100 步 | 无法直接使用 | FID ~6.84 | 10 倍加速 |
| 50 步 | 无法直接使用 | FID ~8.23 | 20 倍加速 |
| 20 步 | 无法直接使用 | FID ~16.7 | 50 倍加速,质量仍可接受 |
后续加速方法
DDIM 开创了加速采样的先河。此后涌现了更多方法:
- DPM-Solver (Lu et al., 2022):利用 ODE 的高阶求解器,10-20 步即可获得高质量样本
- Consistency Models (Song et al., 2023):训练模型直接映射到轨迹的起点,可以一步生成
- Progressive Distillation (Salimans & Ho, 2022):用知识蒸馏逐步减半采样步数
- Rectified Flow / Flow Matching:学习更直的传输路径,减少所需步数
Score-Based 视角
扩散模型还有一个同样重要的理解视角:基于分数的生成模型 (Score-Based Generative Models)。这个视角由 Song & Ermon (2019) 提出,后来被统一到 SDE 框架中。
Score Function
分数函数 (Score Function) 定义为数据对数概率密度的梯度:
分数函数指向数据密度增大最快的方向。如果我们知道分数函数,就可以用朗之万动力学 (Langevin Dynamics) 从分布中采样:
当 \(\delta \to 0\) 且 \(k \to \infty\) 时,\(x_k\) 收敛到 \(p(x)\) 的样本。
Score Matching
问题在于我们不知道真实的 \(\nabla_x \log p(x)\)。Score Matching (Hyvarinen, 2005) 提供了一种不需要知道归一化常数就能估计分数函数的方法。
训练一个分数网络 \(s_\theta(x) \approx \nabla_x \log p(x)\),最小化:
这个目标可以通过分部积分转化为不需要知道 \(\nabla_x \log p(x)\) 的形式(即 implicit score matching 或 denoising score matching)。
Denoising Score Matching
Vincent (2011) 证明了一个关键结果:如果我们用加噪的数据来训练分数网络,即:
当 \(q_\sigma(\tilde{x}|x) = \mathcal{N}(\tilde{x}; x, \sigma^2 I)\) 时,\(\nabla_{\tilde{x}} \log q_\sigma(\tilde{x}|x) = -\frac{\tilde{x} - x}{\sigma^2} = -\frac{\epsilon}{\sigma}\)。
这就建立了分数匹配与去噪之间的联系:估计分数函数等价于预测噪声。
与 DDPM 的等价性
DDPM 的噪声预测目标与分数匹配之间有精确的等价关系:
因此:
DDPM 的噪声预测网络 \(\epsilon_\theta\) 本质上就是在估计加噪数据的分数函数(乘以一个系数)。
SDE 统一框架
Song et al. (2021, "Score-Based Generative Modeling through Stochastic Differential Equations") 将离散的扩散过程推广为连续的随机微分方程 (SDE),提供了一个统一框架。
前向 SDE:
其中 \(f\) 是漂移系数,\(g\) 是扩散系数,\(w\) 是标准维纳过程 (Wiener process)。
反向 SDE(Anderson, 1982):
关键发现:反向 SDE 完全由分数函数 \(\nabla_x \log p_t(x)\) 决定。因此,只要训练好分数网络,就可以用任意 SDE 求解器进行采样。
不同的 SDE 对应不同的模型:
| SDE 类型 | \(f(x, t)\) | \(g(t)\) | 对应模型 |
|---|---|---|---|
| VP-SDE | \(-\frac{1}{2}\beta(t)x\) | \(\sqrt{\beta(t)}\) | DDPM |
| VE-SDE | \(0\) | \(\sqrt{\frac{d[\sigma^2(t)]}{dt}}\) | NCSN / SMLD |
| sub-VP SDE | \(-\frac{1}{2}\beta(t)x\) | \(\sqrt{\beta(t)(1-e^{-2\int_0^t \beta(s)ds})}\) | 改进版 |
Probability Flow ODE
对于每个 SDE,都存在一个对应的常微分方程 (ODE),其轨迹的边际分布与 SDE 完全相同:
这个 ODE 称为 Probability Flow ODE。它是确定性的(没有随机项),使得精确计算似然成为可能,也使得高阶 ODE 求解器(如 DPM-Solver)可以加速采样。DDIM 可以看作是 Probability Flow ODE 的一种离散化。
条件生成
无条件扩散模型学习 \(p(x)\),但实际应用中我们通常需要条件生成,即从 \(p(x|c)\) 采样,其中 \(c\) 是条件信息(如文本描述、类别标签、低分辨率图像等)。
Classifier Guidance
Dhariwal & Nichol (2021) 提出了 Classifier Guidance 方法。核心思想是利用一个在加噪数据上训练的分类器来引导扩散过程。
由贝叶斯定理:
即条件分数 = 无条件分数 + 分类器梯度。在采样时:
其中 \(w\) 是引导强度 (guidance scale):
- \(w = 0\):无条件生成
- \(w > 0\):向类别 \(c\) 引导,\(w\) 越大生成越"典型"但多样性越低
缺点:
- 需要额外训练一个分类器 \(p_\phi(c | x_t)\),且该分类器必须在加噪数据上训练
- 分类器的梯度可能引入对抗样本方向的偏差
Classifier-Free Guidance (CFG)
Ho & Salimans (2022) 提出了更优雅的 Classifier-Free Guidance,完全不需要外部分类器。
训练阶段:训练一个条件扩散模型 \(\epsilon_\theta(x_t, t, c)\),但在训练时以一定概率(通常 10%-20%)随机将条件 \(c\) 替换为空条件 \(\emptyset\)(即 dropout 条件信息)。这样一个网络同时学会了条件和无条件生成。
推理阶段:将条件预测和无条件预测做线性组合:
等价形式(更常见的写法):
直觉理解:无条件预测告诉我们"一般的图像是什么样的",条件预测告诉我们"符合条件 \(c\) 的图像是什么样的"。CFG 在两者之间做外推:不仅要走向条件方向,还要超过它,离无条件方向更远。
引导强度的选择
引导强度 \(w\)(或有些文献中用 \(s = 1 + w\) 表示)对生成质量至关重要:
- \(w = 0\) (\(s = 1\)):标准条件生成,多样性高但与条件的一致性可能不够
- \(w = 1 \sim 3\):较好的平衡
- \(w = 7 \sim 15\):Stable Diffusion 等模型的典型设置,图文一致性高
- \(w\) 过大:生成过于饱和、失真,多样性急剧下降
存在一个多样性-保真度权衡 (diversity-fidelity trade-off):引导强度越大,FID 先下降后上升,但 CLIP Score(图文一致性)持续上升。
CFG 的优势
与 Classifier Guidance 相比,CFG 有以下优势:
- 不需要训练额外的分类器
- 可以用于任意类型的条件(文本、图像、音频等),而不仅是离散类别标签
- 训练更简单,只需要在现有模型上做条件 dropout
- 实践中效果更好,已成为条件扩散模型的标准方法
Latent Diffusion (Stable Diffusion)
Rombach et al. (2022) 提出了 Latent Diffusion Model (LDM),其开源实现即为著名的 Stable Diffusion。LDM 的核心思想是:在潜空间而非像素空间做扩散。
动机
直接在像素空间做扩散有两个问题:
- 计算成本高:\(512 \times 512 \times 3\) 的图像有 786,432 维,U-Net 需要在这个高维空间做 \(T\) 次前向传播
- 语义与细节纠缠:像素空间同时包含高层语义信息和低层感知细节(纹理、高频噪声),扩散模型需要同时学习两者
LDM 的解决方案是两阶段方法:
- 第一阶段:训练一个自编码器(通常是 VAE),将图像压缩到低维潜空间
- 第二阶段:在低维潜空间上训练扩散模型
整体架构
Latent Diffusion Model 架构
==========================================================================
文本输入: "一只穿着太空服的猫"
|
v
[CLIP Text Encoder] ──> 文本嵌入 c (77 x 768)
|
| (Cross-Attention)
v
z_T ~ N(0,I) ──> [U-Net (带 Cross-Attention)] ──> z_0 (潜变量)
(潜空间噪声) 反复迭代 T 步去噪 |
(64 x 64 x 4) v
[VAE Decoder]
|
v
生成图像 x_0
(512 x 512 x 3)
==========================================================================
编码 (仅训练第一阶段时使用):
输入图像 x ──> [VAE Encoder] ──> z = E(x) (64 x 64 x 4)
压缩比: 512x512x3 = 786432 维 → 64x64x4 = 16384 维 (约 48 倍压缩)
第一阶段:感知压缩 (Perceptual Compression)
自编码器的训练目标包含:
- 重建损失:\(L_{\text{rec}} = \| x - D(E(x)) \|\)
- 感知损失:使用预训练 VGG 网络提取特征,比较特征层面的差异(LPIPS)
- 对抗损失:加入判别器确保重建图像的真实感
- KL 正则化(轻微的):\(L_{\text{KL}} = D_{KL}(q(z|x) \| \mathcal{N}(0, \mathbf{I}))\),权重极小
KL 权重的选择
LDM 论文中 KL 正则化的权重约为 \(10^{-6}\),非常小。这意味着潜空间的分布不像标准 VAE 那样被强制为标准正态分布,而是更自由地编码信息。这对重建质量很重要。另一种替代方案是使用 VQ-VAE(向量量化),用离散编码本代替 KL 正则化。
第二阶段:潜空间扩散
在预训练好的自编码器的潜空间中训练扩散模型。过程与标准 DDPM 完全相同,只是操作对象从像素变成了潜变量:
其中 \(z_t = \sqrt{\bar{\alpha}_t} z_0 + \sqrt{1 - \bar{\alpha}_t} \epsilon\),\(c\) 是条件信息。
U-Net + Cross-Attention
LDM 的 U-Net 在标准架构基础上增加了 Cross-Attention 层来注入条件信息:
U-Net 中每个 Block 的结构:
┌──────────────────────────────────┐
│ ResBlock (+ Timestep Embedding) │
│ | │
│ Self-Attention │ Q, K, V 都来自图像特征
│ | │
│ Cross-Attention │ Q 来自图像特征
│ Q = W_Q * z_feat │ K, V 来自文本嵌入 c
│ K = W_K * c │
│ V = W_V * c │
│ | │
│ FFN (Feed-Forward Network) │
└──────────────────────────────────┘
Cross-Attention 的计算:
其中 \(Q = W_Q \cdot \varphi(z_t)\)(图像特征的投影),\(K = W_K \cdot \tau_\theta(c)\), \(V = W_V \cdot \tau_\theta(c)\)(条件嵌入的投影)。
文本条件:CLIP Text Encoder
Stable Diffusion 使用 CLIP (Contrastive Language-Image Pre-training) 的文本编码器将文本提示转换为嵌入向量:
- 文本输入经过 tokenization,截断或填充到 77 个 token
- CLIP Text Encoder(Transformer 架构)将 token 序列编码为 \(77 \times 768\) 的嵌入矩阵
- 该嵌入通过 Cross-Attention 注入 U-Net
Stable Diffusion 的不同版本
- SD 1.x:使用 CLIP ViT-L/14 文本编码器 (768 维)
- SD 2.x:使用 OpenCLIP ViT-H/14 文本编码器 (1024 维)
- SDXL:同时使用 CLIP ViT-L 和 OpenCLIP ViT-bigG,拼接两者的输出
- SD 3.x:引入 MMDiT 架构(用 DiT 替代 U-Net),使用 T5-XXL + CLIP 双编码器
Latent Diffusion 的优势
| 方面 | 像素空间 Diffusion | Latent Diffusion |
|---|---|---|
| 空间维度 | \(512 \times 512 \times 3 = 786K\) | \(64 \times 64 \times 4 = 16K\) |
| 训练成本 | 极高 (数千 GPU-days) | 显著降低 (数百 GPU-days) |
| 推理速度 | 慢 | 快约 4-8 倍 |
| 可用消费级 GPU | 几乎不可能 | 可以 (8GB VRAM 即可推理) |
| 条件注入 | 较难灵活设计 | Cross-Attention 灵活且通用 |
Diffusion Transformer (DiT)
随着 Transformer 在各领域的统治地位日益巩固,用 Transformer 替代 U-Net 作为扩散模型的骨干网络成为自然趋势。Peebles & Xie (2023) 提出了 DiT (Diffusion Transformer)。
核心改动
DiT 将图像潜变量划分为 patch(类似 ViT),然后用标准 Transformer 处理:
潜变量 z_t (32x32x4)
|
v
[Patchify: 将 z 划分为 patch 序列] ──> (256 个 patch, 每个 2x2x4 = 16 维)
|
v
[线性投影 + 位置编码] ──> (256 个 token, d 维)
|
v
[DiT Block x N]
| - Self-Attention
| - Cross-Attention (或 adaLN-Zero 条件注入)
| - FFN
| - 条件信息 (t, c) 通过 adaLN-Zero 注入
|
v
[线性解码] ──> 预测噪声 epsilon (32x32x4)
adaLN-Zero (Adaptive Layer Norm - Zero):DiT 的条件注入方式。将时间步 \(t\) 和类别标签 \(c\) 编码后,用 MLP 生成 LayerNorm 的 scale 和 shift 参数以及残差连接的 gate 参数。
DiT 的意义
DiT 展示了 Transformer 架构在扩散模型中同样有效,且具有更好的 scaling 特性。这为后续的大规模扩散模型(如 Sora、SD3 的 MMDiT)奠定了基础。DiT 也验证了扩散模型的性能随模型规模和训练计算量的增加而持续提升(scaling law)。
模型对比
Diffusion vs GAN vs VAE
| 维度 | VAE | GAN | Diffusion |
|---|---|---|---|
| 生成质量 | 中等,图像偏模糊 | 高,图像锐利 | 最高,细节丰富 |
| 训练稳定性 | 稳定 | 不稳定,需要精心调参 | 非常稳定 |
| 模式覆盖 | 好 (最大化似然) | 差 (mode collapse) | 好 (最大化似然下界) |
| 采样速度 | 快 (一次前向) | 快 (一次前向) | 慢 (需多步迭代) |
| 似然计算 | ELBO 下界 | 无法直接计算 | ELBO 下界 (可用 ODE 精确计算) |
| 隐空间 | 有意义的连续隐空间 | 隐空间结构较弱 | DDIM 可提供有意义隐空间 |
| 条件生成 | 通过条件化编码器 | 通过条件化判别器/生成器 | CFG,非常灵活 |
| 架构限制 | 编码器-解码器 | 生成器+判别器 | 任意 (U-Net, DiT, ...) |
| 理论基础 | 变分推断 | 博弈论 / Wasserstein 距离 | 随机过程 / 分数匹配 |
| 代表应用 | 数据压缩、表征学习 | 图像超分、风格迁移 | 文生图、视频生成、分子设计 |
不同扩散模型变体的对比
| 方法 | 过程类型 | 采样步数 | 关键特征 |
|---|---|---|---|
| DDPM | 随机,马尔可夫 | ~1000 | 原始方法,简单但慢 |
| DDIM | 确定性/随机,非马尔可夫 | 10-100 | 跳步采样,可逆编码 |
| Score SDE | 连续 SDE | 灵活 | 统一框架,理论优雅 |
| LDM | 潜空间扩散 | 20-50 | 计算高效,可扩展 |
| DiT | Transformer 骨干 | 20-50 | 良好的 scaling 特性 |
| Consistency Models | 单步/少步 | 1-2 | 蒸馏或直接训练 |
思考与讨论
为什么 Diffusion 能超越 GAN?
这个问题可以从多个角度理解:
-
训练目标的本质差异:GAN 的训练是一个极小极大博弈 \(\min_G \max_D V(D, G)\),寻找纳什均衡点。但在高维空间中,纳什均衡可能不存在或不稳定。Diffusion 的训练是简单的回归问题(最小化 MSE),损失景观更平滑。
-
模式覆盖 vs 模式选择:GAN 的判别器只能区分"真"和"假",生成器倾向于找到几个能骗过判别器的模式(mode seeking)。Diffusion 最大化似然(的下界),天然倾向于覆盖所有模式(mode covering)。
-
多尺度去噪:Diffusion 模型在不同噪声水平上工作。大噪声时学习全局结构(构图、颜色),小噪声时学习局部细节(纹理、边缘)。这种从粗到细的生成过程天然地分解了难度。
-
评估指标的演进:早期 GAN 论文主要用 IS (Inception Score) 和 FID 评估,这些指标有局限性。当使用更全面的评估(如 precision-recall、多样性)时,Diffusion 的优势更加明显。
速度问题的解决方向
采样速度是扩散模型最大的瓶颈。目前的解决思路主要有四个方向:
- 更好的求解器:DDIM、DPM-Solver 等利用 ODE/SDE 数值求解的理论,用更高阶的方法减少步数
- 蒸馏:Progressive Distillation 将模型蒸馏为需要更少步数的版本;Consistency Distillation 训练模型直接跳到轨迹终点
- 潜空间压缩:LDM 通过在更低维的空间操作来减少每步的计算量
- 架构优化:更高效的注意力机制、模型剪枝、量化等工程手段
Diffusion 与 Flow Matching 的关系
Flow Matching (Lipman et al., 2023) 是近年来崛起的一种生成模型方法,与扩散模型有深刻联系:
共同点:
- 都是从噪声分布变换到数据分布
- 都可以用 ODE 的形式表达
- 都需要训练一个向量场/分数网络
关键区别:
- Diffusion 的传输路径是弯曲的(由扩散过程决定),Flow Matching 可以学习更直的路径 (optimal transport)
- 更直的路径意味着 ODE 更容易求解,即用更少的步数就能达到好的效果
- Flow Matching 的训练目标更简洁,直接回归速度场 \(v_t(x)\):\(L = \mathbb{E}_{t, x_0, x_1}\|v_\theta(x_t, t) - (x_1 - x_0)\|^2\)
Flow Matching 可以看作是扩散模型的"下一代":保留了扩散模型训练稳定的优点,同时通过更直的传输路径解决了采样速度问题。Stable Diffusion 3 和 Flux 等最新模型已经采用了 Flow Matching 的训练范式。
扩散模型的前沿方向
- 视频生成:Sora (OpenAI)、Veo (Google) 等将扩散模型扩展到时空域,生成高质量视频
- 3D 生成:利用扩散模型生成 3D 模型、NeRF、高斯溅射场景
- 科学应用:蛋白质结构设计 (RFdiffusion)、分子生成、天气预报 (GenCast)
- 世界模型:将扩散模型作为世界模拟器,用于机器人规划和强化学习
- 可控生成:ControlNet、IP-Adapter 等方法实现更精细的生成控制
- 效率优化:Consistency Models、SDXL Turbo 等方法实现实时生成
参考文献
核心论文按时间顺序:
- Sohl-Dickstein et al., "Deep Unsupervised Learning using Nonequilibrium Thermodynamics", ICML 2015
- Song & Ermon, "Generative Modeling by Estimating Gradients of the Data Distribution", NeurIPS 2019
- Ho et al., "Denoising Diffusion Probabilistic Models" (DDPM), NeurIPS 2020
- Song et al., "Denoising Diffusion Implicit Models" (DDIM), ICLR 2021
- Nichol & Dhariwal, "Improved Denoising Diffusion Probabilistic Models", ICML 2021
- Song et al., "Score-Based Generative Modeling through Stochastic Differential Equations", ICLR 2021
- Dhariwal & Nichol, "Diffusion Models Beat GANs on Image Synthesis", NeurIPS 2021
- Ho & Salimans, "Classifier-Free Diffusion Guidance", NeurIPS Workshop 2022
- Rombach et al., "High-Resolution Image Synthesis with Latent Diffusion Models" (LDM/Stable Diffusion), CVPR 2022
- Peebles & Xie, "Scalable Diffusion Models with Transformers" (DiT), ICCV 2023
- Song et al., "Consistency Models", ICML 2023
- Lipman et al., "Flow Matching for Generative Modeling", ICLR 2023