Lecture 16 · 基于得分的扩散模型 · Score-Based Diffusion Models

Deep Generative Models · Lecture 16。个人学习讲义与配套实验,按主题整理并持续修订。

课程源码 ZIP ↓

个人整理的学习笔记,非官方讲义;课程来源与整理说明见课程介绍。配套示例未逐一运行验证。

本篇目录

对应 Maps to:Stanford CS236 Deep Generative Models(Fall 2023,Stefano Ermon),Lecture 16 · 2023-11-27 · Score Based Diffusion Models(slides:lecture16-2023-comp.pptx)。 依据说明:本讲按原课 slides 的顺序展开:回顾得分模型(去噪得分匹配、多尺度噪声、SDE)→ 扩散模型:逐步加噪的前向过程、多步转移的闭式解 → 扩散模型是层级 VAE:固定的编码器、学习的解码器、ELBO 的分解、预测噪声的参数化、DDPM 的训练与采样算法 → 扩散模型就是得分模型:预测噪声 = 估计得分;U-Net 架构 → 无穷多个噪声尺度:SDE 视角、预测–校正 → 概率流 ODE:连续归一化流、精确似然、高效采样(DDIM、更好的求解器、并行、蒸馏)→ 潜空间扩散模型 → 条件生成:分类器引导与无分类器引导。主要依据 Ho, Jain & Abbeel(DDPM,2020)、Song, Meng & Ermon(DDIM,2021)、Song et al.(SDE,2021)、Ho & Salimans(无分类器引导,2021)、Rombach et al.(潜空间扩散,2022)。ELBO 在精确 ε 下的逐项分解与反向方差(β_t、β̃_t、最优值)对紧致性的影响、L_simple 与 L_vlb 的误差分配、用精确 ε 把采样器的离散化误差和网络误差分开、无分类器引导在大权重下”推出数据区”的精确验证、隐含分类器与精确 ∇log p_t(y|x) 的对照、潜空间扩散何时有用(取决于 VAE 的先验失配)**是本讲义补充的。和前三讲一样,数据是高斯混合时任何时刻的最优去噪器都能精确写出来。 配套代码 Code:code/lecture16/(PyTorch;共享模块 diffusion.py + 5 个演示脚本,复用第 13、14 讲的 score.py、sde.py,最长的约 75 秒) 预计阅读时间:3.5 小时(含运行代码)


0. 本讲导航 · How to read this lecture

0.1 学习目标 Learning goals

学完这一讲,你应该能够:

  1. 写出扩散模型的前向过程 q(xt∣xt−1)q(x_t \mid x_{t-1}) 和它的多步闭式解 q(xt∣x0)q(x_t \mid x_0),说出噪声调度的作用。
  2. 把扩散模型看成层级 VAE:推导 ELBO =−LT−∑tLt−1−L0= -L_T - \sum_tL_{t-1} - L_0,推导后验 q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0),说明 Lt−1L_{t-1} 为什么化简成 ∥ϵ−ϵθ∥2\Vert\epsilon - \epsilon_\theta\Vert^2 乘一个权重,以及 DDPM 的 LsimpleL_{\text{simple}} 扔掉了什么。
  3. 说明扩散模型就是得分模型:ϵ∗=−σt∇log⁡qt\epsilon^* = -\sigma_t\nabla\log q_t,x^0\hat x_0 = Tweedie 后验均值;DDPM 是第 14 讲 VP SDE 的离散化,LsimpleL_{\text{simple}} 是 λ=σ2\lambda = \sigma^2 的去噪得分匹配。
  4. 比较 DDPM、跳步、DDIM、概率流 ODE 几种采样器:确定性 vs 随机、步数与质量;知道 DDIM 为什么能少步数采样。
  5. 推导无分类器引导,知道引导权重 ww 怎样用多样性换保真度、为什么太大会失败。
  6. 说出潜空间扩散的结构和它解决的问题(VAE 的先验失配、计算代价)。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉 Previewed only
第 5–6 讲:ELBO、VAE、先验空洞U-Net、注意力等网络架构的细节
第 13 讲:去噪得分匹配、Tweedie 公式视频、三维、音频的扩散模型
第 14 讲:VP SDE、反向 SDE、概率流 ODE、分类器引导离散数据的扩散(第 18 讲)
第 15 讲:FID、precision / recall、ELBO 与似然蒸馏、一致性模型的训练细节(§9 介绍)

0.3 本讲地图 Map

§1  回顾:得分模型与"生成 = 反复去噪"
§2  前向过程:逐步加噪;q(x_t | x_0) 的闭式解;噪声调度                        ← 代码 01 第 1 部分
§3  扩散模型是层级 VAE:ELBO、后验、预测噪声、L_simple;反向方差与 ELBO 的紧致性   ← 代码 01 第 2 部分、代码 02
§4  扩散模型就是得分模型:ε* = −σ·得分;DDPM 训练与采样;U-Net;SDE 视角        ← 代码 01 第 3–4 部分
§5  加速采样(一):跳步                                                      ← 代码 03 第 1 部分
§6  加速采样(二):DDIM 与概率流 ODE;确定性与插值;两种似然                    ← 代码 03
§7  条件生成:无分类器引导                                                    ← 代码 04
§8  潜空间扩散                                                              ← 代码 05
§9  2023 年之后
§10–14  小结、常见误区、练习、延伸阅读、下一讲预告

0.4 记号 Notation

符号含义
t=1,…,Tt = 1, \dots, T离散的时间步;x0x_0 是数据,xTx_T 几乎是纯噪声
βt\beta_t,αt=1−βt\alpha_t = 1 - \beta_t,αˉt=∏s≤tαs\bar\alpha_t = \prod_{s \leq t}\alpha_s噪声调度;αˉ0=1\bar\alpha_0 = 1
σt=1−αˉt\sigma_t = \sqrt{1 - \bar\alpha_t}xtx_t 里噪声的标准差;SNR(t)=αˉt/(1−αˉt)\mathrm{SNR}(t) = \bar\alpha_t/(1 - \bar\alpha_t)
β~t=1−αˉt−11−αˉtβt\tilde\beta_t = \frac{1 - \bar\alpha_{t-1}}{1 - \bar\alpha_t}\beta_t,μ~t(xt,x0)\tilde\mu_t(x_t, x_0)后验 q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0) 的方差和均值
ϵθ(xt,t)\epsilon_\theta(x_t, t)预测噪声的网络;ϵ∗\epsilon^* 是最优(精确)的预测
σt2\sigma_t^2(反向)反向过程 pθ(xt−1∣xt)=N(μθ,σt2I)p_\theta(x_{t-1} \mid x_t) = \mathcal{N}(\mu_\theta, \sigma_t^2I) 的方差(βt\beta_t 或 β~t\tilde\beta_t)
ww引导权重(w=1w = 1 是条件分布)
NFE采样时调用网络的次数

0.5 关于数字 · About the numbers

二维数据(两个高斯、双月牙、8 个高斯的圆环)是高斯混合:qt(xt)q_t(x_t) 对任何 tt 仍是高斯混合,最优的 ϵ∗(xt,t)\epsilon^*(x_t, t)、真实的 log⁡p(x)\log p(x) 都能精确计算。代码 01、02 第 1 部分全部用精确的 ϵ∗\epsilon^*;代码 02–04 还训练了 MLP 网络(T=1000T = 1000)。代码 05 用像素世界和第 6 讲缓存的 VAE。线性调度用 VP SDE 的连续极限(T=1000T = 1000 时和 DDPM 的线性 βt\beta_t 只差 10−510^{-5} 量级,见代码 README)。所有数字来自固定种子的单次运行;和预想不同的结果记录在 代码 README 的”关于实验结果”里。


1. 回顾:生成 = 反复去噪 · Recap

第 13–14 讲:给数据加不同程度的高斯噪声,用(去噪)得分匹配学每个噪声水平的得分 ∇xlog⁡qσ(x)\nabla_x\log q_\sigma(x);采样时从纯噪声出发,逐级降低噪声,用朗之万或反向 SDE 走回数据。第 13 讲 §3.4 的 Tweedie 公式说:最优去噪器就是得分。所以”得分模型的采样”也可以读成:从噪声出发,反复地”去一点噪”。

slides 从这个角度重新出发:如果生成就是”反复去噪”,能不能把整个过程写成一个概率模型——有明确的似然、可以用 ELBO 训练?这就是扩散模型(Sohl-Dickstein et al. 2015;DDPM,Ho et al. 2020)。本讲会看到它和得分模型是同一个东西的两种看法。


2. 前向过程:逐步加噪 · The forward (diffusion) process

2.1 定义

从数据 x0∼pdatax_0 \sim p_{\text{data}} 出发,每一步把上一步稍微缩小、再加一点高斯噪声:

q(xt∣xt−1)=N(xt;1−βt xt−1,βtI),t=1,…,T.q(x_t \mid x_{t-1}) = \mathcal{N}\left(x_t; \sqrt{1 - \beta_t}\,x_{t-1}, \beta_tI\right), \qquad t = 1, \dots, T.

这是一条马尔可夫链(slides 的图:一张图一步步变成雪花点)。βt\beta_t 很小(DDPM:从 10−410^{-4} 线性涨到 0.02,T=1000T = 1000),乘以 1−βt\sqrt{1 - \beta_t} 保证方差不会爆炸——这就是第 14 讲的方差保持。

多步转移有闭式解(slides “multi-step transitions”):高斯的线性组合仍是高斯,

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

(练习 1)。训练时可以直接跳到任意的 tt,不需要一步步模拟。TT 足够大时 αˉT≈0\bar\alpha_T \approx 0,q(xT∣x0)≈N(0,I)q(x_T \mid x_0) \approx \mathcal{N}(0, I)——和 x0x_0 无关,这就是先验。

前向过程没有任何参数:它就是 VAE 的编码器,只不过是固定的、手工设计的。

2.2 噪声调度:信息什么时候被毁掉

代码 01 第 1 部分:两个高斯(左 0.8 / 右 0.2),在每个 tt 用贝叶斯最优的分类器从 xtx_t 猜 x0x_0 来自哪个模式(只猜”左”是 80%):

tt线性:αˉt\bar\alpha_tSNR准确率余弦:αˉt\bar\alpha_tSNR准确率
1000.89638.6100.0%0.972134.8100.0%
2500.52371.1097.8%0.84705.54100.0%
5000.07910.08682.4%0.49380.9897.4%
7500.00340.003579.9%0.14430.1785.9%
10004×10−54\times10^{-5}4×10−54\times10^{-5}79.9%2×10−92\times10^{-9}2×10−92\times10^{-9}79.9%

线性调度在一半的时间里就毁掉了几乎全部信息(t=500t = 500 时 82.4%),后一半的步数都花在”几乎纯噪声”上;余弦调度(Nichol & Dhariwal 2021)让 αˉt\bar\alpha_t 下降得更均匀,t=500t = 500 时还有 97.4%。调度决定了有多少步数花在”有东西可学”的区间。


3. 扩散模型是层级 VAE · Diffusion models as hierarchical VAEs

3.1 反向过程与 ELBO

slides 的核心视角:把 x1,…,xTx_1, \dots, x_T 看成 TT 层隐变量。

  • 编码器(固定):q(x1:T∣x0)=∏tq(xt∣xt−1)q(x_{1:T} \mid x_0) = \prod_tq(x_t \mid x_{t-1});
  • 解码器(学习):pθ(x0:T)=p(xT)∏tpθ(xt−1∣xt)p_\theta(x_{0:T}) = p(x_T)\prod_tp_\theta(x_{t-1} \mid x_t),p(xT)=N(0,I)p(x_T) = \mathcal{N}(0, I),pθ(xt−1∣xt)=N(μθ(xt,t),σt2I)p_\theta(x_{t-1} \mid x_t) = \mathcal{N}(\mu_\theta(x_t, t), \sigma_t^2I)。

为什么反向一步可以是高斯? 第 14 讲 §4.2:步子很小时,真实的反向转移 q(xt−1∣xt)q(x_{t-1} \mid x_t) 近似是高斯(均值多了一项得分)。步子大了就不是——代码 01 第 4 部分会看到这一点。

和任何 VAE 一样,用 ELBO 训练:

log⁡pθ(x0)≥Eq(x1:T∣x0)[log⁡pθ(x0:T)q(x1:T∣x0)].\log p_\theta(x_0) \geq \mathbb{E}_{q(x_{1:T} \mid x_0)}\left[\log\frac{p_\theta(x_{0:T})}{q(x_{1:T} \mid x_0)}\right].

3.2 ELBO 的分解

关键的一步:由马尔可夫性和贝叶斯公式,q(xt∣xt−1)=q(xt∣xt−1,x0)=q(xt−1∣xt,x0)q(xt∣x0)q(xt−1∣x0)q(x_t \mid x_{t-1}) = q(x_t \mid x_{t-1}, x_0) = \frac{q(x_{t-1} \mid x_t, x_0)q(x_t \mid x_0)}{q(x_{t-1} \mid x_0)}。代进 ELBO,q(xt∣x0)/q(xt−1∣x0)q(x_t \mid x_0)/q(x_{t-1} \mid x_0) 逐项相消(望远镜求和),得到(练习 2):

−ELBO=DKL(q(xT∣x0)∥p(xT))⏟LT+∑t=2TEq[DKL(q(xt−1∣xt,x0)∥pθ(xt−1∣xt))]⏟Lt−1−Eqlog⁡pθ(x0∣x1)⏟L0.-\mathrm{ELBO} = \underbrace{D_{\mathrm{KL}}(q(x_T \mid x_0) \Vert p(x_T))}_{L_T} + \sum_{t=2}^T\underbrace{\mathbb{E}_q\left[D_{\mathrm{KL}}(q(x_{t-1} \mid x_t, x_0) \Vert p_\theta(x_{t-1} \mid x_t))\right]}_{L_{t-1}} \underbrace{- \mathbb{E}_q\log p_\theta(x_0 \mid x_1)}_{L_0}.

  • LTL_T 没有参数(前向过程固定),TT 足够大时接近 0;
  • 每个 Lt−1L_{t-1} 是两个高斯之间的 KL——可以精确算出来;
  • L0L_0 是最后一步的重构项。

3.3 后验与”预测噪声”

后验 q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0):给定 x0x_0 时 xt−1x_{t-1} 和 xtx_t 联合高斯,条件分布也是高斯(练习 3):

q(xt−1∣xt,x0)=N(μ~t,β~tI),μ~t=αˉt−1βt1−αˉtx0+αt(1−αˉt−1)1−αˉtxt,β~t=1−αˉt−11−αˉtβt.q(x_{t-1} \mid x_t, x_0) = \mathcal{N}\left(\tilde\mu_t, \tilde\beta_tI\right), \quad \tilde\mu_t = \frac{\sqrt{\bar\alpha_{t-1}}\beta_t}{1 - \bar\alpha_t}x_0 + \frac{\sqrt{\alpha_t}(1 - \bar\alpha_{t-1})}{1 - \bar\alpha_t}x_t, \quad \tilde\beta_t = \frac{1 - \bar\alpha_{t-1}}{1 - \bar\alpha_t}\beta_t.

代码 01 第 2 部分用通用的二元高斯条件公式逐个核对了系数和方差,和 DDPM 的闭式解一致到所有打印的位数。

预测噪声的参数化。 把 x0=(xt−1−αˉtϵ)/αˉtx_0 = (x_t - \sqrt{1 - \bar\alpha_t}\epsilon)/\sqrt{\bar\alpha_t} 代进 μ~t\tilde\mu_t:

μ~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).

于是让网络用同样的形式输出均值:μθ(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)——网络只需要猜出加进去的噪声 ϵ\epsilon。两个方差相同的高斯之间的 KL 只看均值差,于是

Lt−1=βt22σt2αt(1−αˉt)Ex0,ϵ∥ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)∥2(σt2=β~t 时).L_{t-1} = \frac{\beta_t^2}{2\sigma_t^2\alpha_t(1 - \bar\alpha_t)}\mathbb{E}_{x_0, \epsilon}\left\Vert\epsilon - \epsilon_\theta\left(\sqrt{\bar\alpha_t}x_0 + \sqrt{1 - \bar\alpha_t}\epsilon, t\right)\right\Vert^2 \quad (\sigma_t^2 = \tilde\beta_t\text{ 时}).

DDPM 的简化目标:扔掉权重,tt 均匀抽取,

Lsimple=Et,x0,ϵ∥ϵ−ϵθ(αˉtx0+1−αˉtϵ,t)∥2.L_{\text{simple}} = \mathbb{E}_{t, x_0, \epsilon}\left\Vert\epsilon - \epsilon_\theta(\sqrt{\bar\alpha_t}x_0 + \sqrt{1 - \bar\alpha_t}\epsilon, t)\right\Vert^2.

Ho et al. 发现它的样本质量比真正的 ELBO 更好。

3.4 实验:用精确的 ε*,ELBO 有多紧?(代码 02 第 1 部分)

两个高斯,1 万个测试点,三种反向方差共用同一组噪声(差别里没有蒙特卡洛噪声),括号里是 −ELBO−(−log⁡p)-\mathrm{ELBO} - (-\log p) 的配对平均 ± 标准误(真实的 −log⁡p=1.5030-\log p = 1.5030 nat):

步数 TTσt2=β~t\sigma_t^2 = \tilde\beta_tσt2=βt\sigma_t^2 = \beta_tσt2\sigma_t^2 = 最优(Analytic-DPM)
102.2572(+0.754 ± 0.022)1.9658(+0.463 ± 0.012)1.8316(+0.329 ± 0.014)
1002.9375(+1.435 ± 0.025)1.5138(+0.011 ± 0.014)1.4813(−0.022 ± 0.014)
10002.3498(+0.847 ± 0.019)1.4839(−0.019 ± 0.014)1.4806(−0.022 ± 0.014)

(“最优”是给定精确均值时每个 tt 最优的各向同性方差 β~t+c0,t2E[tr Cov(x0∣xt)]/d\tilde\beta_t + c_{0,t}^2\mathbb{E}[\mathrm{tr}\,\mathrm{Cov}(x_0 \mid x_t)]/d,用二阶 Tweedie 公式精确计算,Bao et al. 2022。)

T=1000T = 1000 时各项的分解:

反向方差LTL_T∑Lt−1\sum L_{t-1},t=2t = 2–10t=11t = 11–100t=101t = 101–1000L0L_0合计
β~t\tilde\beta_t0.00013.62813.63481.3724−6.28562.3498
βt\beta_t0.00012.87393.52391.3717−6.28561.4839
  • 反向方差的选择决定了 ELBO 紧不紧。 σt2=β~t\sigma_t^2 = \tilde\beta_t(“知道 x0x_0 时”的方差)时 T=1000T = 1000 仍差 0.85 nat;多出的 0.87 nat 里有 0.75 nat 来自最前面的 9 步。原因:tt 很小时 β~t\tilde\beta_t 远小于 βt\beta_t(代码 01 第 2 部分:t=2t = 2 时不到一半),反向过程太”自信”,每一步都为”其实不知道 x0x_0“付出代价——这一项不随 T→∞T \to \infty 消失。
  • σt2=βt\sigma_t^2 = \beta_t 或最优方差时,T=1000T = 1000 的差距和 0 分不开:步数足够多、每一步都最优时,扩散模型这个层级 VAE 的下界是紧的。TT 小时最优方差明显更好。
  • L0L_0 是负的:连续数据的高斯解码器方差只有 β1≈10−4\beta_1 \approx 10^{-4},密度可以大于 1。
  • 代码 01 第 4 部分:T=1000T = 1000 时两种方差的样本几乎一样(DDPM 论文的观察),步数少时 βt\beta_t 明显更好。样本质量对方差不敏感,似然非常敏感——Improved DDPM(学习方差)和 Analytic-DPM(解析最优方差)都是为似然而做的。

3.5 ELBO 的权重 vs 等权(代码 02 第 2–3 部分)

σt2=βt\sigma_t^2 = \beta_t 时,ELBO 给 ∥ϵ−ϵθ∥2\Vert\epsilon - \epsilon_\theta\Vert^2 的权重是 βt2αt(1−αˉt)\frac{\beta_t}{2\alpha_t(1 - \bar\alpha_t)}:t=2t = 2 时 0.27、t=100t = 100 时 0.010、t=500t = 500 时 0.0055、t=1000t = 1000 时 0.010。ELBO 最在乎几乎没有噪声时的去噪精度——那里决定细节,也决定似然;LsimpleL_{\text{simple}} 把所有 tt 等权,相对地压低了小 tt、抬高了中大 tt。

LsimpleL_{\text{simple}} 就是 NCSN 的加权:∥ϵ−ϵθ∥2=σt2∥sθ−(−ϵ/σt)∥2\Vert\epsilon - \epsilon_\theta\Vert^2 = \sigma_t^2\Vert s_\theta - (-\epsilon/\sigma_t)\Vert^2,正是第 14 讲 λ(σ)=σ2\lambda(\sigma) = \sigma^2 加权的去噪得分匹配。

训练两个网络(MLP 128 × 3,8,000 步,两个高斯):

训练目标−-ELBO(σ2=β\sigma^2 = \beta)∥ϵθ−ϵ∗∥2\Vert\epsilon_\theta - \epsilon^*\Vert^2:t≤10t \leq 10t=11t = 11–100t=101t = 101–1000左边比例切片 W1
LsimpleL_{\text{simple}}1.54950.00350.01020.00730.7820.088
LvlbL_{\text{vlb}}1.55130.00160.01100.00810.7720.092

LvlbL_{\text{vlb}} 把权重放在小 tt,那里学得更准,中大 tt 更差;LsimpleL_{\text{simple}} 相反。在这个二维例子里两者的似然和样本几乎一样;DDPM 在 CIFAR-10 上发现 LsimpleL_{\text{simple}} 样本更好、LvlbL_{\text{vlb}} 似然更好,而直接优化 LvlbL_{\text{vlb}} 梯度方差很大(Nichol & Dhariwal 2021 用重要性采样 tt 缓解)。两个网络的 −-ELBO 只比精确 ϵ∗\epsilon^* 的 1.4839 高约 0.07 nat。


4. 扩散模型就是得分模型 · Diffusion models are score-based models

4.1 预测噪声 = 估计得分

LsimpleL_{\text{simple}} 的最优解是 ϵ∗(xt,t)=E[ϵ∣xt]\epsilon^*(x_t, t) = \mathbb{E}[\epsilon \mid x_t]。由第 13 讲的去噪得分匹配(条件得分 −ϵ/σt-\epsilon/\sigma_t):

ϵ∗(xt,t)=−1−αˉt ∇xtlog⁡qt(xt),x^0=xt−1−αˉt ϵ∗αˉt=E[x0∣xt]  (Tweedie).\epsilon^*(x_t, t) = -\sqrt{1 - \bar\alpha_t}\,\nabla_{x_t}\log q_t(x_t), \qquad \hat x_0 = \frac{x_t - \sqrt{1 - \bar\alpha_t}\,\epsilon^*}{\sqrt{\bar\alpha_t}} = \mathbb{E}[x_0 \mid x_t] \;(\text{Tweedie}).

预测噪声、估计得分、预测干净的 x0x_0 是同一个量的三种写法(slides:“denoising diffusion models are score-based models”)。代码 01 第 3 部分:−ϵ∗/σt-\epsilon^*/\sigma_t 和精确得分的差 ≤9×10−16\leq 9\times10^{-16},由 ϵ∗\epsilon^* 算出的 x^0\hat x_0 和直接按贝叶斯公式算的后验均值差 ≤6×10−15\leq 6\times10^{-15}。

DDPM 的反向一步 xt−1=1αt(xt+βt∇log⁡qt)+σtzx_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t + \beta_t\nabla\log q_t) + \sigma_tz(把 ϵ\epsilon 换成得分),正是第 14 讲 VP SDE 的反向 SDE 用欧拉–丸山法离散化的结果(练习 6)。DDPM = VP SDE,NCSN = VE SDE,两条路线在 2021 年汇合。

4.2 训练与采样算法(slides,DDPM 论文算法 1、2)

训练:重复
    x_0 ~ 数据;t ~ Uniform{1, …, T};ε ~ N(0, I)
    对 ‖ε − ε_θ(√ᾱ_t x_0 + √(1 − ᾱ_t) ε, t)‖² 做一步梯度下降

采样:x_T ~ N(0, I)
    for t = T, …, 1:
        z ~ N(0, I)(t = 1 时 z = 0)
        x_{t−1} = (x_t − β_t/√(1 − ᾱ_t) · ε_θ(x_t, t)) / √α_t + σ_t z
    返回 x_0

训练极其简单:一个回归问题,没有对抗、没有 MCMC、没有需要平衡的 KL 项。

代码 01 第 4 部分(精确 ϵ∗\epsilon^*,两个高斯):σt2=βt\sigma_t^2 = \beta_t 时 TT = 10、30、100、1000 的切片 W1 为 0.041、0.021、0.014、0.020(噪声底约 0.02–0.03);σt2=β~t\sigma_t^2 = \tilde\beta_t 时为 0.175、0.064、0.028、0.021。即使去噪器是完美的,步数太少也不行:反向一步是高斯的假设只在步子小时成立。

4.3 网络架构

slides 介绍了扩散模型常用的 U-Net:编码–解码的卷积网络,跨层连接保留细节,中间几层加自注意力;时间 tt 通过正弦嵌入加到每个残差块里。输入输出同形状(预测一张”噪声图”)。代码里的二维玩具用 MLP + 时间的正弦编码(EpsNet),原理相同。后来的 DiT(§9)把 U-Net 换成了 Transformer。

4.4 SDE 视角

T→∞T \to \infty,DDPM 变成第 14 讲的 VP SDE;采样器可以用任何 SDE / ODE 求解器,也可以加朗之万校正(预测–校正)。slides 引用 Song et al.(2021)的结果:这样得到 CIFAR-10 FID 2.20、1024×1024 的人脸。代码 diffusion.py 的线性调度就是 VP SDE 在 TT 个格点上的值,所以第 14 讲的 pf_ode、ode_loglik 可以直接用在本讲训练的网络上(§6)。


5. 加速采样(一):跳步 · Faster sampling by respacing

DDPM 要 T=1000T = 1000 次网络调用——比 GAN、VAE、流模型慢三个数量级。最简单的加速:只在一个子序列 τ1>τ2>⋯>τS\tau_1 > \tau_2 > \dots > \tau_S 上走,把子序列当成一条新的 SS 步马尔可夫链(每一步的"β\beta"用 1−αˉτi/αˉτi+11 - \bar\alpha_{\tau_i}/\bar\alpha_{\tau_{i+1}}),网络不用重新训练(Nichol & Dhariwal 2021 的 respacing)。代价:步子大了,“反向一步是高斯”的近似变差(§4.2)。结果见 §6.3 的表格。


6. 加速采样(二):DDIM 与概率流 ODE · DDIM and the probability flow ODE

6.1 DDIM

观察(Song, Meng & Ermon 2021):LsimpleL_{\text{simple}} 只依赖边缘分布 q(xt∣x0)q(x_t \mid x_0),不依赖前向过程是不是马尔可夫链。所以可以换一个非马尔可夫的前向过程,只要它的边缘分布不变,训练好的 ϵθ\epsilon_\theta 照样能用。DDIM 选的反向一步是

xt′=αˉt′ x^0+1−αˉt′−σ2 ϵθ(xt,t)+σz,x^0=xt−1−αˉtϵθαˉt.x_{t'} = \sqrt{\bar\alpha_{t'}}\,\hat x_0 + \sqrt{1 - \bar\alpha_{t'} - \sigma^2}\,\epsilon_\theta(x_t, t) + \sigma z, \qquad \hat x_0 = \frac{x_t - \sqrt{1 - \bar\alpha_t}\epsilon_\theta}{\sqrt{\bar\alpha_t}}.

直觉:先用网络猜出干净的 x^0\hat x_0 和”方向”ϵθ\epsilon_\theta,再把它们按目标时刻 t′t' 的比例重新混合。σ=η(1−αˉt′)/(1−αˉt)1−αˉt/αˉt′\sigma = \eta\sqrt{(1 - \bar\alpha_{t'})/(1 - \bar\alpha_t)}\sqrt{1 - \bar\alpha_t/\bar\alpha_{t'}}:

  • η=1\eta = 1:和 DDPM 祖先采样同分布(随机);
  • η=0\eta = 0:完全确定性——同一个初始噪声永远得到同一个样本。它是概率流 ODE 的一种一阶离散化(练习 8)。

6.2 确定性、插值、两种似然(代码 03 第 2–3 部分)

同一个初始噪声:DDIM 两次结果的差是 0;DDPM 两次的差约 1.7。在两个噪声之间做球面插值(slerp),DDIM 把它们映射成一条样本路径:从下弧跳到上弧的那一步(λ=0.1\lambda = 0.1)落在两条弧线之间(log⁡p=−6.2\log p = -6.2),其余都沿着上弧平滑移动、log⁡pdata\log p_{\text{data}} 保持在数据的水平。噪声成了一个确定的”隐变量”,像 VAE 的解码器、流模型的逆变换——可以做插值、编辑、反演。

同一个 ϵ\epsilon 网络(双月牙)的两种似然:真实 −log⁡p=1.7987-\log p = 1.7987;DDPM 的 −-ELBO(σ2=β\sigma^2 = \beta,T=1000T = 1000)1.9188;概率流 ODE 的精确 −log⁡p-\log p(RK4 100 步)1.8953。两者都比真实分布差约 0.1 nat、彼此接近,但严格说是两个不同模型的似然:ELBO 给的是离散祖先采样器那个分布的下界,ODE 给的是确定性流那个分布的精确值(第 15 讲:报告时要写清楚)。

6.3 质量 vs 步数(代码 03 第 1 部分)

双月牙,同一组初始噪声。每格:切片 W1 / 平均 log⁡pdata\log p_{\text{data}}(真实 −1.82)。上面是精确的 ϵ∗\epsilon^*(只有离散化误差),下面是学到的网络(MLP 256 × 4,余弦学习率):

采样器10 NFE25 NFE100 NFE
精确 ϵ∗\epsilon^*:DDPM 跳步0.092 / −4.020.050 / −2.360.025 / −1.95
精确 ϵ∗\epsilon^*:DDIM η=1\eta = 10.179 / −2.380.077 / −1.690.028 / −1.71
精确 ϵ∗\epsilon^*:DDIM η=0\eta = 00.135 / −2.260.055 / −1.740.028 / −1.79
精确 ϵ∗\epsilon^*:概率流 ODE(Heun)0.060 / −3.150.029 / −2.180.023 / −1.87
学到的网络:DDPM 跳步0.096 / −4.120.058 / −2.650.032 / −2.18
学到的网络:DDIM η=0\eta = 00.118 / −2.370.053 / −2.040.033 / −2.04
学到的网络:概率流 ODE(Heun)0.061 / −2.220.028 / −2.010.029 / −2.02

(1,000 步的 DDPM:精确 0.023、网络 0.027。Heun 每步 2 次 NFE,所以 10 NFE = 5 步。)

  • 10 次 NFE:DDPM 跳步的样本”散”(平均 log⁡p\log p −4.0,很多点落在弧线外),DDIM(η=0\eta = 0)更贴近弧线(−2.3)但整体形状偏差更大;二阶的 Heun 两方面都最好。25 次 NFE 时 Heun 已到噪声底。
  • 如实地说:DDIM 论文在 CIFAR-10 上报告 η=0\eta = 0 在 10–50 步时远好于 DDPM;这个二维例子里 DDIM 相对 DDPM 跳步的优势不明显。但”更高阶的 ODE 求解器更省步数”非常清楚——这正是 DPM-Solver(Lu et al. 2022)等后续工作的方向。
  • 网络误差和离散化误差叠加:学到的网络在每一行都比精确 ϵ∗\epsilon^* 略差。采样器再好,也只能还原网络学到的那个分布。

slides 还列了另外两条加速路线:并行采样(ParaDiGMS,Shih et al. 2023:把 ODE 的多步用不动点迭代并行求解)和蒸馏(progressive distillation,Salimans & Ho 2022:训练一个学生网络一步走老师的两步,反复减半;一致性模型,§9)。


7. 条件生成:无分类器引导 · Classifier-free guidance

7.1 从分类器引导到无分类器引导

第 14 讲 §6:∇log⁡pt(x∣y)=∇log⁡pt(x)+∇log⁡pt(y∣x)\nabla\log p_t(x \mid y) = \nabla\log p_t(x) + \nabla\log p_t(y \mid x),加权 ww 的分类器引导需要一个在每个噪声水平上训练的分类器。Ho & Salimans(2021)的无分类器引导只训练一个网络 ϵθ(xt,t,y)\epsilon_\theta(x_t, t, y):训练时以一定概率(如 10%–20%)把 yy 换成”空”∅\varnothing,于是同一个网络同时学会条件和无条件的 ϵ\epsilon。采样时

ϵ~=ϵθ(xt,t,∅)+w(ϵθ(xt,t,y)−ϵθ(xt,t,∅)).\tilde\epsilon = \epsilon_\theta(x_t, t, \varnothing) + w\left(\epsilon_\theta(x_t, t, y) - \epsilon_\theta(x_t, t, \varnothing)\right).

换成得分(s=−ϵ/σts = -\epsilon/\sigma_t):s~=∇log⁡pt(x)+w(∇log⁡pt(x∣y)−∇log⁡pt(x))=∇log⁡pt(x)+w∇log⁡pt(y∣x)\tilde s = \nabla\log p_t(x) + w(\nabla\log p_t(x \mid y) - \nabla\log p_t(x)) = \nabla\log p_t(x) + w\nabla\log p_t(y \mid x)——和权重为 ww 的分类器引导完全相同,只是分类器 ∇log⁡pt(y∣x)=−(ϵ(x,y)−ϵ(x,∅))/σt\nabla\log p_t(y \mid x) = -(\epsilon(x, y) - \epsilon(x, \varnothing))/\sigma_t 由生成模型自己”免费”给出,天然知道每个噪声水平。

7.2 实验(代码 04,8 个高斯的圆环,目标 0 号)

DDIM 50 步,每格:目标类比例 / 类内标准差(真实 0.25)/ 离群比例(离所有模式中心都超过 0.75):

引导权重学到的网络精确的 ϵ∗\epsilon^*
w=0w = 0(无条件)11.7% / 0.358 / 11.8%12.3% / 0.234 / 1.2%
w=1w = 1(条件)99.8% / 0.226 / 0.7%99.8% / 0.228 / 0.6%
w=1.5w = 1.5100.0% / 0.143 / 0.7%100.0% / 0.160 / 0.4%
w=2w = 2100.0% / 0.115 / 1.5%100.0% / 0.132 / 0.5%
w=3w = 3100.0% / 0.128 / 4.2%100.0% / 0.103 / 1.7%
w=5w = 5100.0% / 0.472 / 19.6%100.0% / 0.079 / 16.4%
w=8w = 8100.0% / 1.584 / 88.8%100.0% / 0.065 / 94.4%
  • w=0w = 0 时学到的网络比精确值差(离群 11.8% vs 1.2%):无条件分支只用了 15% 被丢掉标签的数据训练。
  • w=1.5w = 1.5–3:类内标准差从 0.23 降到 0.10–0.13——多样性下降,样本更”典型”。
  • ww 再大,精确的引导也会失败:样本被挤成一个更小的团(w=8w = 8:标准差 0.065),但这个团被推离了模式中心、远离其他类——94% 的样本跑出了数据分布。图像上这表现为颜色过饱和、细节失真。学到的网络在 w≥5w \geq 5 时还会因为误差被 ww 放大而散开。
  • Stable Diffusion 默认 w=7.5w = 7.5 在图像上效果好,这里 w=8w = 8 已经失败:合适的 ww 取决于条件信息有多强、模型有多准。练习 9 说明 w≠1w \neq 1 时采的并不是一个简单的”倾斜分布”。

隐含分类器的质量:−(ϵθ(x,y)−ϵθ(x,∅))/σt-(\epsilon_\theta(x, y) - \epsilon_\theta(x, \varnothing))/\sigma_t 和精确的 ∇log⁡pt(y∣x)\nabla\log p_t(y \mid x) 方向余弦 0.98–0.999;相对误差在中大噪声下 4%–5%,小噪声(t=50t = 50)时 21%——它是两个大数之差,网络的小误差在那里被放大。


8. 潜空间扩散 · Latent diffusion models

8.1 结构

slides 的最后一个主题是 Rombach et al.(2022)的潜空间扩散模型(Stable Diffusion):

  1. 先训练一个自编码器(VAE,KL 权重极小,约 10−610^{-6};或 VQ),把 512×512×3512 \times 512 \times 3 的图压成 64×64×464 \times 64 \times 4 的隐变量;
  2. 在隐空间里训练扩散模型(U-Net + 文字的交叉注意力);
  3. 生成:隐空间里扩散采样,再用解码器变回图像。

两个好处:便宜(隐空间小几十倍,训练、采样都快);分工(自编码器负责感知上不重要的细节,扩散模型负责语义结构)。从第 6 讲的角度还有第三个:VAE 的先验 N(0,I)\mathcal{N}(0, I) 和编码器实际使用的聚合后验 q(z)=Exq(z∣x)q(z) = \mathbb{E}_xq(z \mid x) 往往对不上(先验空洞);扩散模型可以直接学 q(z)q(z)。

8.2 实验:什么时候有用(代码 05)

像素世界,第 6 讲缓存的三个 dz=8d_z = 8 的 VAE(β\beta = 0.25、0.5、1),三种先验:VAE 自己的 N(0,I)\mathcal{N}(0, I)、隐空间里训练的扩散模型(10,000 个聚合后验样本,MLP 256 × 4,DDIM 100 步)、聚合后验本身(解码测试图的编码,“理想的先验”)。

VAE + 先验隐空间两样本分类准确率FID ↓平均 log⁡2pdata\log_2 p_{\text{data}} ↑
真实分布—0.009−25.56
β=0.25\beta = 0.25(7 维活跃)+ N(0,I)\mathcal{N}(0, I)0.6510.599−35.13
β=0.25\beta = 0.25 + 隐空间扩散0.6100.415−32.58
β=0.25\beta = 0.25 + 聚合后验—0.028−26.78
β=0.5\beta = 0.5(6 维)+ N(0,I)\mathcal{N}(0, I)0.6180.525−33.18
β=0.5\beta = 0.5 + 隐空间扩散0.5940.454−32.22
β=1\beta = 1(4 维)+ N(0,I)\mathcal{N}(0, I)0.5640.478−31.79
β=1\beta = 1 + 隐空间扩散0.5690.388−31.88
β=1\beta = 1 + 聚合后验—0.178−29.39

(两样本分类准确率:先验的样本和聚合后验在活跃维度上能否分开,0.5 = 分不开。)

  • β\beta 越小,活跃维度越多,聚合后验离 N(0,I)\mathcal{N}(0, I) 越远(0.56 → 0.65),从 N(0,I)\mathcal{N}(0, I) 采样的图也越差——先验空洞。
  • β=0.25\beta = 0.25 时,只把先验换成隐空间扩散(编码器、解码器都不变),log⁡pdata\log p_{\text{data}} 好了 2.5 bit、FID 从 0.60 降到 0.42:问题出在先验,不是解码器。β=1\beta = 1 时聚合后验本来就接近 N(0,I)\mathcal{N}(0, I),扩散先验只让 FID 略降,log⁡pdata\log p_{\text{data}} 没变。
  • 如实地说:扩散先验离”理想的先验”还很远。诊断显示,它的样本到训练编码均值的平均距离几乎和 N(0,I)\mathcal{N}(0, I) 一样——这个小扩散模型学到了聚合后验的大致形状,没学到”每种配置一个团”的细结构;更多数据、更长训练、1,000 步 DDPM 都没有改善(代码 README)。
  • 这正是 Stable Diffusion 把 KL 权重设得极小的原因:隐空间几乎不受 N(0,I)\mathcal{N}(0, I) 约束,由一个大扩散模型负责学它的分布。

9. 2023 年之后 · Since 2023

  • Transformer 取代 U-Net。 DiT(Peebles & Xie, ICCV 2023)把隐空间切成 patch,用 Transformer 做去噪网络,规模越大 FID 越好;Stable Diffusion 3(Esser et al., ICML 2024)用多模态 Transformer + rectified flow(第 14 讲 §7 的流匹配)。视频模型(Sora,2024 等)把同样的结构推到时空 patch。
  • 一步或几步生成。 一致性模型(Song et al., ICML 2023)、潜空间一致性模型(LCM,Luo et al. 2023)、对抗扩散蒸馏(SDXL Turbo,Sauer et al. 2023)、分布匹配蒸馏(DMD,Yin et al., CVPR 2024)把采样压到 1–4 步。§6 的”确定性映射”是它们的出发点。
  • 引导的改进。 只在中间一段噪声区间做引导(Kynkäänniemi et al., NeurIPS 2024)可以避免 §7.2 的”推出数据区”;autoguidance(Karras et al., NeurIPS 2024)用一个”差一点的同一模型”代替无条件分支来引导,同时提高质量又不损失多样性。
  • 似然。 Variational Diffusion Models(Kingma, Salimans, Poole & Ho, NeurIPS 2021)学习噪声调度、在连续时间里优化 ELBO,取得当时最好的 bits/dim;本讲 §3.4 的”方差决定紧致性”是其中的一个要素。
  • 扩散模型做文本。 掩码离散扩散(SEDD、MDLM,2024)和更大规模的扩散语言模型(如 LLaDA,2025)让扩散模型在文本上接近自回归模型——第 18 讲的主题。

10. 小结 · Summary

  1. 前向过程:q(xt∣xt−1)=N(1−βtxt−1,βtI)q(x_t \mid x_{t-1}) = \mathcal{N}(\sqrt{1 - \beta_t}x_{t-1}, \beta_tI),固定、无参数;q(xt∣x0)q(x_t \mid x_0) 有闭式解,可以直接跳到任意 tt。调度决定信息被毁掉的速度(线性调度一半时间就毁掉了几乎全部信息,余弦更均匀)。
  2. 层级 VAE:ELBO =−LT−∑Lt−1−L0= -L_T - \sum L_{t-1} - L_0,每个 Lt−1L_{t-1} 是两个高斯的 KL;预测噪声的参数化让它变成加权的 ∥ϵ−ϵθ∥2\Vert\epsilon - \epsilon_\theta\Vert^2;DDPM 扔掉权重得到 LsimpleL_{\text{simple}}。
  3. 反向方差决定 ELBO 紧不紧:精确 ϵ∗\epsilon^* 下,σ2=β~t\sigma^2 = \tilde\beta_t 时 T=1000T = 1000 仍差 0.85 nat(来自最前面几步),σ2=βt\sigma^2 = \beta_t 或最优方差时差距和 0 分不开;样本质量对它不敏感。
  4. 扩散 = 得分:ϵ∗=−σt∇log⁡qt\epsilon^* = -\sigma_t\nabla\log q_t,x^0\hat x_0 = Tweedie;DDPM = VP SDE 的离散化,LsimpleL_{\text{simple}} = λ=σ2\lambda = \sigma^2 的去噪得分匹配。
  5. 加速采样:跳步、DDIM(η=0\eta = 0 确定性,概率流 ODE 的一阶离散化)、高阶 ODE 求解器(Heun 25 次 NFE 到噪声底)、蒸馏;确定性采样让噪声成为可插值、可反演的隐变量。
  6. 无分类器引导:一个网络、随机丢标签;ϵ~=ϵ(∅)+w(ϵ(y)−ϵ(∅))\tilde\epsilon = \epsilon(\varnothing) + w(\epsilon(y) - \epsilon(\varnothing)) = 权重 ww 的分类器引导;ww 大则多样性下降,太大时连精确的引导也会把样本推出数据区。
  7. 潜空间扩散:自编码器压缩 + 隐空间扩散;当 VAE 的先验失配大时(β\beta 小),扩散先验明显改善样本(log⁡pdata\log p_{\text{data}} +2.5 bit)。

11. 常见误区 · Common pitfalls

  1. “扩散模型和得分模型是两类模型。” 预测噪声 = 估计得分(§4.1);DDPM 是 VP SDE、NCSN 是 VE SDE 的离散化。
  2. ”LsimpleL_{\text{simple}} 就是 ELBO。” 它扔掉了权重(§3.5),不再是似然的界;要报告似然,得用带权重的 ELBO 或概率流 ODE。
  3. “有了完美的 ϵθ\epsilon_\theta,ELBO 就等于 log⁡p\log p。” 还要反向方差合适、步数足够多:σ2=β~t\sigma^2 = \tilde\beta_t 时差 0.85 nat,TT 再大也不消失(§3.4)。
  4. “反向方差无所谓,DDPM 论文说两种结果差不多。” 样本质量差不多(T=1000T = 1000 时),似然差很多;步数少时样本也差很多(§4.2)。
  5. “步数越少越好,用 DDIM 就行。” 少步数时所有一阶方法都有明显的离散化误差;高阶求解器或蒸馏才能真正省步数(§6.3)。
  6. “DDIM 是 DDPM 的近似。” DDIM 是对同一组边缘分布的另一种走法,η=0\eta = 0 时是确定性的 ODE 离散化,不需要重新训练(§6.1)。
  7. “引导权重越大,图越好。” 多样性下降,太大时样本被推出数据分布(§7.2:w=8w = 8 时 94% 离群)。
  8. “潜空间扩散总能大幅改善 VAE。” 只有当聚合后验和 N(0,I)\mathcal{N}(0, I) 差得多时才明显(§8.2:β=1\beta = 1 时几乎没帮助);扩散模型本身也得足够强。

12. 练习 · Exercises

练习 1(多步转移的闭式解) 用归纳法证明 q(xt∣x0)=N(αˉtx0,(1−αˉt)I)q(x_t \mid x_0) = \mathcal{N}(\sqrt{\bar\alpha_t}x_0, (1 - \bar\alpha_t)I)。

参考答案

t=1t = 1 成立。设 xt−1=αˉt−1x0+1−αˉt−1ϵ1x_{t-1} = \sqrt{\bar\alpha_{t-1}}x_0 + \sqrt{1 - \bar\alpha_{t-1}}\epsilon_1,则 xt=αtxt−1+βtϵ2=αˉtx0+αt(1−αˉt−1)ϵ1+βtϵ2x_t = \sqrt{\alpha_t}x_{t-1} + \sqrt{\beta_t}\epsilon_2 = \sqrt{\bar\alpha_t}x_0 + \sqrt{\alpha_t(1 - \bar\alpha_{t-1})}\epsilon_1 + \sqrt{\beta_t}\epsilon_2。两个独立高斯噪声之和的方差 αt−αˉt+1−αt=1−αˉt\alpha_t - \bar\alpha_t + 1 - \alpha_t = 1 - \bar\alpha_t。代码 diffusion.py 的自检用 20 万个样本逐步加噪 300 步核对了它。

练习 2(ELBO 的望远镜求和) 从 Eq[log⁡p(xT)+∑t≥1log⁡pθ(xt−1∣xt)q(xt∣xt−1)]\mathbb{E}_q[\log p(x_T) + \sum_{t \geq 1}\log\frac{p_\theta(x_{t-1} \mid x_t)}{q(x_t \mid x_{t-1})}] 出发,用 q(xt∣xt−1)=q(xt−1∣xt,x0)q(xt∣x0)q(xt−1∣x0)q(x_t \mid x_{t-1}) = \frac{q(x_{t-1} \mid x_t, x_0)q(x_t \mid x_0)}{q(x_{t-1} \mid x_0)}(t≥2t \geq 2)推出 §3.2 的分解。

参考答案

把 t=1t = 1 单独拿出来,t≥2t \geq 2 的项写成 log⁡pθ(xt−1∣xt)q(xt−1∣xt,x0)+log⁡q(xt−1∣x0)q(xt∣x0)\log\frac{p_\theta(x_{t-1}\mid x_t)}{q(x_{t-1}\mid x_t, x_0)} + \log\frac{q(x_{t-1}\mid x_0)}{q(x_t \mid x_0)}。第二部分对 t=2..Tt = 2..T 求和相消,只剩 log⁡q(x1∣x0)q(xT∣x0)\log\frac{q(x_1 \mid x_0)}{q(x_T \mid x_0)}。和 t=1t = 1 项 log⁡pθ(x0∣x1)q(x1∣x0)\log\frac{p_\theta(x_0\mid x_1)}{q(x_1 \mid x_0)} 合并,q(x1∣x0)q(x_1\mid x_0) 消掉。整理:ELBO=Eq[log⁡p(xT)q(xT∣x0)+∑t≥2log⁡pθ(xt−1∣xt)q(xt−1∣xt,x0)+log⁡pθ(x0∣x1)]\mathrm{ELBO} = \mathbb{E}_q[\log\frac{p(x_T)}{q(x_T\mid x_0)} + \sum_{t \geq 2}\log\frac{p_\theta(x_{t-1}\mid x_t)}{q(x_{t-1}\mid x_t,x_0)} + \log p_\theta(x_0 \mid x_1)],取期望即为 −LT−∑Lt−1−L0-L_T - \sum L_{t-1} - L_0。

练习 3(后验的均值和方差) 用二元高斯的条件分布公式推出 μ~t\tilde\mu_t、β~t\tilde\beta_t。(提示:给定 x0x_0,Var(xt−1)=1−αˉt−1\mathrm{Var}(x_{t-1}) = 1 - \bar\alpha_{t-1},Cov(xt−1,xt)=αt(1−αˉt−1)\mathrm{Cov}(x_{t-1}, x_t) = \sqrt{\alpha_t}(1 - \bar\alpha_{t-1}),Var(xt)=1−αˉt\mathrm{Var}(x_t) = 1 - \bar\alpha_t。)

参考答案

条件均值 =Ext−1+CovVar(xt)(xt−Ext)=αˉt−1x0+αt(1−αˉt−1)1−αˉt(xt−αˉtx0)= \mathbb{E}x_{t-1} + \frac{\mathrm{Cov}}{\mathrm{Var}(x_t)}(x_t - \mathbb{E}x_t) = \sqrt{\bar\alpha_{t-1}}x_0 + \frac{\sqrt{\alpha_t}(1 - \bar\alpha_{t-1})}{1 - \bar\alpha_t}(x_t - \sqrt{\bar\alpha_t}x_0)。x0x_0 的系数 αˉt−1−αtαˉt(1−αˉt−1)1−αˉt=αˉt−11−αˉt−αt+αˉt1−αˉt=αˉt−1βt1−αˉt\sqrt{\bar\alpha_{t-1}} - \frac{\sqrt{\alpha_t}\sqrt{\bar\alpha_t}(1 - \bar\alpha_{t-1})}{1 - \bar\alpha_t} = \sqrt{\bar\alpha_{t-1}}\frac{1 - \bar\alpha_t - \alpha_t + \bar\alpha_t}{1 - \bar\alpha_t} = \frac{\sqrt{\bar\alpha_{t-1}}\beta_t}{1 - \bar\alpha_t}。条件方差 =(1−αˉt−1)−αt(1−αˉt−1)21−αˉt=(1−αˉt−1)βt1−αˉt=β~t= (1 - \bar\alpha_{t-1}) - \frac{\alpha_t(1 - \bar\alpha_{t-1})^2}{1 - \bar\alpha_t} = \frac{(1 - \bar\alpha_{t-1})\beta_t}{1 - \bar\alpha_t} = \tilde\beta_t。这正是代码 01 第 2 部分做的数值核对。

练习 4(L_{t−1} 的权重) 推导 Lt−1L_{t-1} 在一般的反向方差 σt2\sigma_t^2 下的表达式(包括方差不匹配项),并说明为什么 σt2=β~t\sigma_t^2 = \tilde\beta_t 时只剩均值项。

参考答案

DKL(N(μ~,β~I)∥N(μθ,σ2I))=d2(β~σ2−1−log⁡β~σ2)+∥μ~−μθ∥22σ2D_{\mathrm{KL}}(\mathcal{N}(\tilde\mu, \tilde\beta I)\Vert\mathcal{N}(\mu_\theta, \sigma^2I)) = \frac d2\left(\frac{\tilde\beta}{\sigma^2} - 1 - \log\frac{\tilde\beta}{\sigma^2}\right) + \frac{\Vert\tilde\mu - \mu_\theta\Vert^2}{2\sigma^2},∥μ~−μθ∥2=βt2αt(1−αˉt)∥ϵ−ϵθ∥2\Vert\tilde\mu - \mu_\theta\Vert^2 = \frac{\beta_t^2}{\alpha_t(1 - \bar\alpha_t)}\Vert\epsilon - \epsilon_\theta\Vert^2。σ2=β~\sigma^2 = \tilde\beta 时第一项为 0。diffusion.elbo_terms 实现的就是这个公式。

练习 5(为什么 β̃ 让 ELBO 不紧) 设数据是一维 N(0,1)\mathcal{N}(0, 1)(这时 qt=N(0,1)q_t = \mathcal{N}(0, 1) 对所有 tt 成立)。(a) 求真实的反向转移 q(xt−1∣xt)q(x_{t-1} \mid x_t)。(b) 比较它的方差和 βt\beta_t、β~t\tilde\beta_t。(c) 由此说明:对这个数据,σt2=βt\sigma_t^2 = \beta_t 是精确的,而 σt2=β~t\sigma_t^2 = \tilde\beta_t 在 tt 小时有固定的代价。

参考答案

(a) xt−1∼N(0,1)x_{t-1} \sim \mathcal{N}(0, 1),xt=αtxt−1+βtϵx_t = \sqrt{\alpha_t}x_{t-1} + \sqrt{\beta_t}\epsilon,联合高斯:E[xt−1∣xt]=αtxt\mathbb{E}[x_{t-1}\mid x_t] = \sqrt{\alpha_t}x_t,Var=1−αt=βt\mathrm{Var} = 1 - \alpha_t = \beta_t。(b) 真实方差恰好是 βt\beta_t;β~t=1−αˉt−11−αˉtβt\tilde\beta_t = \frac{1 - \bar\alpha_{t-1}}{1 - \bar\alpha_t}\beta_t 在 t=2t = 2 时约为 β/2\beta/2(αˉ1≈1−β\bar\alpha_1 \approx 1 - \beta)。(c) 用 β~\tilde\beta 时每一步都有方差不匹配的 KL 12(r−1−log⁡r)\frac12(r - 1 - \log r),r=βt/β~tr = \beta_t/\tilde\beta_t;rt≈t/(t−1)r_t \approx t/(t-1)(tt 小时),这些项之和是一个与 TT 无关的常数——T→∞T \to \infty 也不消失,和代码 02 看到的一样。(练习的数据是标准正态;代码里两个高斯的情形中,小 tt 时数据在噪声尺度上也”近似是平的”,结论相同。)

练习 6(DDPM 是 VP SDE 的离散化) 把 DDPM 的反向一步写成 xt−1=1αt(xt+βtst(xt))+σtzx_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t + \beta_ts_t(x_t)) + \sigma_tz(sts_t 是得分),并和第 14 讲反向 VP SDE 的欧拉–丸山步 x←x+[12βx+βs]Δt+βΔt zx \leftarrow x + [\frac12\beta x + \beta s]\Delta t + \sqrt\beta\sqrt{\Delta t}\,z 比较(βΔt↔βt\beta\Delta t \leftrightarrow \beta_t)。

参考答案

ϵ=−σtst\epsilon = -\sigma_ts_t,βt1−αˉtϵ=−βtst\frac{\beta_t}{\sqrt{1 - \bar\alpha_t}}\epsilon = -\beta_ts_t,所以 xt−1=1αt(xt+βtst)+σtzx_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t + \beta_ts_t) + \sigma_tz。11−βt≈1+12βt\frac{1}{\sqrt{1 - \beta_t}} \approx 1 + \frac12\beta_t,展开到一阶:xt−1≈xt+12βtxt+βtst+βtzx_{t-1} \approx x_t + \frac12\beta_tx_t + \beta_ts_t + \sqrt{\beta_t}z(取 σt2=βt\sigma_t^2 = \beta_t),和欧拉–丸山步逐项相同。二阶项不同,所以 TT 小时两者有差别,T→∞T \to \infty 时一致。

练习 7(L_simple 与 NCSN 的加权) 证明 ∥ϵ−ϵθ∥2=σt2∥sθ+ϵ/σt∥2\Vert\epsilon - \epsilon_\theta\Vert^2 = \sigma_t^2\Vert s_\theta + \epsilon/\sigma_t\Vert^2(sθ=−ϵθ/σts_\theta = -\epsilon_\theta/\sigma_t),并说明 LsimpleL_{\text{simple}} 对应第 14 讲的哪种加权、”tt 均匀抽取”对应什么样的噪声水平分布。

参考答案

σt2∥−ϵθ/σt+ϵ/σt∥2=∥ϵ−ϵθ∥2\sigma_t^2\Vert -\epsilon_\theta/\sigma_t + \epsilon/\sigma_t\Vert^2 = \Vert\epsilon - \epsilon_\theta\Vert^2。这是 λ(σ)=σ2\lambda(\sigma) = \sigma^2 加权的去噪得分匹配(NCSN)。tt 均匀抽取等价于噪声水平 σt=1−αˉt\sigma_t = \sqrt{1 - \bar\alpha_t} 按调度的”时间密度”分布:线性调度下大部分 tt 对应 σt≈1\sigma_t \approx 1(代码 01 第 1 部分:一半的 tt 已经几乎是纯噪声),所以 LsimpleL_{\text{simple}} 实际上很重视大噪声——和 ELBO 的权重(重视小噪声)正好相反(§3.5)。

练习 8(DDIM 与概率流 ODE) 在 DDIM(η=0\eta = 0)里令 t′=t−Δt' = t - \Delta,把更新写成 xt′αˉt′=xtαˉt+(1−αˉt′αˉt′−1−αˉtαˉt)ϵθ(xt,t)\frac{x_{t'}}{\sqrt{\bar\alpha_{t'}}} = \frac{x_t}{\sqrt{\bar\alpha_t}} + \left(\sqrt{\frac{1 - \bar\alpha_{t'}}{\bar\alpha_{t'}}} - \sqrt{\frac{1 - \bar\alpha_t}{\bar\alpha_t}}\right)\epsilon_\theta(x_t, t)。说明它是变量 xˉ=x/αˉ\bar x = x/\sqrt{\bar\alpha}、“时间” ν=(1−αˉ)/αˉ\nu = \sqrt{(1 - \bar\alpha)/\bar\alpha} 下 ODE dxˉ/dν=ϵθd\bar x/d\nu = \epsilon_\theta 的欧拉步。

参考答案

xt′=αˉt′x^0+1−αˉt′ϵθx_{t'} = \sqrt{\bar\alpha_{t'}}\hat x_0 + \sqrt{1 - \bar\alpha_{t'}}\epsilon_\theta,x^0=(xt−1−αˉtϵθ)/αˉt\hat x_0 = (x_t - \sqrt{1 - \bar\alpha_t}\epsilon_\theta)/\sqrt{\bar\alpha_t}。两边除以 αˉt′\sqrt{\bar\alpha_{t'}}:xt′αˉt′=xtαˉt−1−αˉtαˉtϵθ+1−αˉt′αˉt′ϵθ\frac{x_{t'}}{\sqrt{\bar\alpha_{t'}}} = \frac{x_t}{\sqrt{\bar\alpha_t}} - \sqrt{\frac{1 - \bar\alpha_t}{\bar\alpha_t}}\epsilon_\theta + \sqrt{\frac{1 - \bar\alpha_{t'}}{\bar\alpha_{t'}}}\epsilon_\theta,即 xˉt′=xˉt+(νt′−νt)ϵθ\bar x_{t'} = \bar x_t + (\nu_{t'} - \nu_t)\epsilon_\theta——ODE dxˉ/dν=ϵθ(x,t)d\bar x/d\nu = \epsilon_\theta(x, t) 的一步欧拉法。这个 ODE 就是概率流 ODE 换了变量的形式(Song et al. 2021 附录),所以 DDIM 是确定性的、一阶的 ODE 求解器;Heun 这样的二阶方法更准(§6.3)。

练习 9(引导到底在采什么) (a) 说明 w≠1w \neq 1 时,引导后的”得分” ∇log⁡pt(x)+w∇log⁡pt(y∣x)\nabla\log p_t(x) + w\nabla\log p_t(y \mid x) 一般不是任何分布族 {p~t}\{\tilde p_t\}(由某个 p~0\tilde p_0 经前向过程得到)的得分。(b) 用代码 04 的 w=8w = 8 结果说明,这种不一致会把样本推到哪里。

参考答案

(a) 若 p~0∝p0(x)p(y∣x)w\tilde p_0 \propto p_0(x)p(y \mid x)^w,它加噪后的 p~t\tilde p_t 的得分是 ∇log⁡∫q(xt∣x0)p0(x0)p(y∣x0)wdx0\nabla\log\int q(x_t \mid x_0)p_0(x_0)p(y \mid x_0)^wdx_0,而 pt(y∣xt)w=(∫p(y∣x0)p(x0∣xt)dx0)wp_t(y \mid x_t)^w = (\int p(y \mid x_0)p(x_0 \mid x_t)dx_0)^w——“先平均再取 ww 次方”和”先取 ww 次方再平均”不同,只有 w=1w = 1 时相等(第 14 讲练习 9)。(b) 大噪声时,∇log⁡pt(y∣x)\nabla\log p_t(y \mid x) 指向”更像 yy、更不像其他类”的方向;乘以 w=8w = 8 后,样本在大噪声阶段就被推过了头,越过了 0 号模式的中心、远离其他类的一侧,后面的小噪声阶段也拉不回来——代码里 94% 的样本离模式中心超过 0.75,却挤成一个标准差 0.065 的小团。

练习 10(动手:余弦调度) 在 01_forward_and_reverse.py 第 4 部分把 Schedule(T) 换成 Schedule(T, "cosine")。预测:精确 ϵ∗\epsilon^* 的 DDPM 采样在 T=10T = 10、30 时会更好还是更差?为什么?

参考答案(预测的思路)

余弦调度在小 tt 时 βt\beta_t 更小、在大 tt 时更大(αˉT\bar\alpha_T 只有 2×10−92\times10^{-9})。步数少时,最难的是”从几乎纯噪声走到模式分开”的那一段和最后的细节;余弦调度把更多步数放在中间信息丰富的区间,通常对少步数采样更友好。但 T=10T = 10 时最后一步的 βT\beta_T 可能很大(接近 1),反向一步的高斯近似变差。具体结果以你的运行为准——这正是 EDM(Karras et al. 2022)系统研究”时间步怎样分配”的原因。


13. 延伸阅读 · Further reading

原课材料

扩散模型

  • Sohl-Dickstein, Weiss, Maheswaranathan & Ganguli, Deep Unsupervised Learning using Nonequilibrium Thermodynamics, ICML 2015
  • Ho, Jain & Abbeel, Denoising Diffusion Probabilistic Models, NeurIPS 2020
  • Nichol & Dhariwal, Improved Denoising Diffusion Probabilistic Models, ICML 2021(余弦调度、学习方差、respacing)
  • Song, Meng & Ermon, Denoising Diffusion Implicit Models, ICLR 2021
  • Bao, Li, Zhu & Zhang, Analytic-DPM: an Analytic Estimate of the Optimal Reverse Variance in Diffusion Probabilistic Models, ICLR 2022
  • Kingma, Salimans, Poole & Ho, Variational Diffusion Models, NeurIPS 2021
  • Lu et al., DPM-Solver, NeurIPS 2022;Salimans & Ho, Progressive Distillation for Fast Sampling of Diffusion Models, ICLR 2022;Shih et al., Parallel Sampling of Diffusion Models, NeurIPS 2023

条件生成与潜空间

  • Ho & Salimans, Classifier-Free Diffusion Guidance, NeurIPS 2021 Workshop
  • Rombach, Blattmann, Lorenz, Esser & Ommer, High-Resolution Image Synthesis with Latent Diffusion Models, CVPR 2022
  • Ramesh et al., Hierarchical Text-Conditional Image Generation with CLIP Latents(DALL·E 2), 2022;Saharia et al., Imagen, NeurIPS 2022

2023 年之后

  • Peebles & Xie, Scalable Diffusion Models with Transformers, ICCV 2023
  • Esser et al., Scaling Rectified Flow Transformers for High-Resolution Image Synthesis, ICML 2024
  • Song, Dhariwal, Chen & Sutskever, Consistency Models, ICML 2023;Luo et al., Latent Consistency Models, 2023;Yin et al., One-step Diffusion with Distribution Matching Distillation, CVPR 2024
  • Kynkäänniemi et al., Applying Guidance in a Limited Interval Improves Sample and Distribution Quality in Diffusion Models, NeurIPS 2024;Karras et al., Guiding a Diffusion Model with a Bad Version of Itself, NeurIPS 2024

14. 下一讲预告 · Next lecture

从第 5 讲到本讲,几乎所有模型都依赖一个关键技巧:对连续变量求梯度——重参数化(VAE)、可逆变换(流)、得分 ∇xlog⁡p\nabla_x\log p(得分模型、扩散)。可是很多数据和隐变量本身是离散的:类别、单词、“这张图是哪种形状”。第 17 讲(原课 Lecture 17,Discrete Latent Variable Models)问:隐变量是离散的时候,重参数化技巧不能用了,怎样求梯度?

  • 对数导数技巧(REINFORCE)及其高方差;控制变量与基线(NVIL);
  • Gumbel-max 技巧与 Gumbel-Softmax:连续松弛、温度带来的偏差–方差权衡;
  • 像素世界上的离散隐变量 VAE(4 个 8 类的符号,4,096 个码字可以枚举):几种梯度估计量的偏差、方差与 ELBO。
← 返回课程目录