对应 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
学完这一讲,你应该能够:
写出扩散模型的前向过程 q ( x t ∣ x t − 1 ) q(x_t \mid x_{t-1}) q ( x t ∣ x t − 1 ) 和它的多步闭式解 q ( x t ∣ x 0 ) q(x_t \mid x_0) q ( x t ∣ x 0 ) ,说出噪声调度的作用。
把扩散模型看成层级 VAE :推导 ELBO = − L T − ∑ t L t − 1 − L 0 = -L_T - \sum_tL_{t-1} - L_0 = − L T − ∑ t L t − 1 − L 0 ,推导后验 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1} \mid x_t, x_0) q ( x t − 1 ∣ x t , x 0 ) ,说明 L t − 1 L_{t-1} L t − 1 为什么化简成 ∥ ϵ − ϵ θ ∥ 2 \Vert\epsilon - \epsilon_\theta\Vert^2 ∥ ϵ − ϵ θ ∥ 2 乘一个权重,以及 DDPM 的 L simple L_{\text{simple}} L simple 扔掉了什么。
说明扩散模型就是得分模型 :ϵ ∗ = − σ t ∇ log q t \epsilon^* = -\sigma_t\nabla\log q_t ϵ ∗ = − σ t ∇ log q t ,x ^ 0 \hat x_0 x ^ 0 = Tweedie 后验均值;DDPM 是第 14 讲 VP SDE 的离散化,L simple L_{\text{simple}} L simple 是 λ = σ 2 \lambda = \sigma^2 λ = σ 2 的去噪得分匹配。
比较 DDPM、跳步、DDIM、概率流 ODE 几种采样器:确定性 vs 随机、步数与质量;知道 DDIM 为什么能少步数采样。
推导无分类器引导 ,知道引导权重 w w w 怎样用多样性换保真度、为什么太大会失败。
说出潜空间扩散 的结构和它解决的问题(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 , … , T t = 1, \dots, T t = 1 , … , T 离散的时间步;x 0 x_0 x 0 是数据,x T x_T x T 几乎是纯噪声 β t \beta_t β t ,α t = 1 − β t \alpha_t = 1 - \beta_t α t = 1 − β t ,α ˉ t = ∏ s ≤ t α s \bar\alpha_t = \prod_{s \leq t}\alpha_s α ˉ t = ∏ s ≤ t α s 噪声调度;α ˉ 0 = 1 \bar\alpha_0 = 1 α ˉ 0 = 1 σ t = 1 − α ˉ t \sigma_t = \sqrt{1 - \bar\alpha_t} σ t = 1 − α ˉ t x t x_t x t 里噪声的标准差;S N R ( t ) = α ˉ t / ( 1 − α ˉ t ) \mathrm{SNR}(t) = \bar\alpha_t/(1 - \bar\alpha_t) SNR ( t ) = α ˉ t / ( 1 − α ˉ t ) β ~ t = 1 − α ˉ t − 1 1 − α ˉ t β t \tilde\beta_t = \frac{1 - \bar\alpha_{t-1}}{1 - \bar\alpha_t}\beta_t β ~ t = 1 − α ˉ t 1 − α ˉ t − 1 β t ,μ ~ t ( x t , x 0 ) \tilde\mu_t(x_t, x_0) μ ~ t ( x t , x 0 ) 后验 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1} \mid x_t, x_0) q ( x t − 1 ∣ x t , x 0 ) 的方差和均值 ϵ θ ( x t , t ) \epsilon_\theta(x_t, t) ϵ θ ( x t , t ) 预测噪声的网络;ϵ ∗ \epsilon^* ϵ ∗ 是最优(精确)的预测 σ t 2 \sigma_t^2 σ t 2 (反向)反向过程 p θ ( x t − 1 ∣ x t ) = N ( μ θ , σ t 2 I ) p_\theta(x_{t-1} \mid x_t) = \mathcal{N}(\mu_\theta, \sigma_t^2I) p θ ( x t − 1 ∣ x t ) = N ( μ θ , σ t 2 I ) 的方差(β t \beta_t β t 或 β ~ t \tilde\beta_t β ~ t ) w w w 引导权重(w = 1 w = 1 w = 1 是条件分布) NFE 采样时调用网络的次数
0.5 关于数字 · About the numbers
二维数据(两个高斯、双月牙、8 个高斯的圆环)是高斯混合:q t ( x t ) q_t(x_t) q t ( x t ) 对任何 t t t 仍是高斯混合,最优的 ϵ ∗ ( x t , t ) \epsilon^*(x_t, t) ϵ ∗ ( x t , t ) 、真实的 log p ( x ) \log p(x) log p ( x ) 都能精确计算。代码 01、02 第 1 部分全部用精确的 ϵ ∗ \epsilon^* ϵ ∗ ;代码 02–04 还训练了 MLP 网络(T = 1000 T = 1000 T = 1000 )。代码 05 用像素世界和第 6 讲缓存的 VAE。线性调度用 VP SDE 的连续极限(T = 1000 T = 1000 T = 1000 时和 DDPM 的线性 β t \beta_t β t 只差 10 − 5 10^{-5} 1 0 − 5 量级,见代码 README)。所有数字来自固定种子的单次运行;和预想不同的结果记录在 代码 README 的”关于实验结果”里。
1. 回顾:生成 = 反复去噪 · Recap
第 13–14 讲:给数据加不同程度的高斯噪声,用(去噪)得分匹配学每个噪声水平的得分 ∇ x log q σ ( x ) \nabla_x\log q_\sigma(x) ∇ x log q σ ( 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 定义
从数据 x 0 ∼ p data x_0 \sim p_{\text{data}} x 0 ∼ p data 出发,每一步把上一步稍微缩小、再加一点高斯噪声:
q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) , 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. q ( x t ∣ x t − 1 ) = N ( x t ; 1 − β t x t − 1 , β t I ) , t = 1 , … , T .
这是一条马尔可夫链(slides 的图:一张图一步步变成雪花点)。β t \beta_t β t 很小(DDPM:从 10 − 4 10^{-4} 1 0 − 4 线性涨到 0.02,T = 1000 T = 1000 T = 1000 ),乘以 1 − β t \sqrt{1 - \beta_t} 1 − β t 保证方差不会爆炸——这就是第 14 讲的方差保持 。
多步转移有闭式解 (slides “multi-step transitions”):高斯的线性组合仍是高斯,
q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) , x t = α ˉ t x 0 + 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) q ( x t ∣ x 0 ) = N ( x t ; α ˉ t x 0 , ( 1 − α ˉ t ) I ) , x t = α ˉ t x 0 + 1 − α ˉ t ϵ , ϵ ∼ N ( 0 , I )
(练习 1)。训练时可以直接跳到任意的 t t t ,不需要一步步模拟。T T T 足够大时 α ˉ T ≈ 0 \bar\alpha_T \approx 0 α ˉ T ≈ 0 ,q ( x T ∣ x 0 ) ≈ N ( 0 , I ) q(x_T \mid x_0) \approx \mathcal{N}(0, I) q ( x T ∣ x 0 ) ≈ N ( 0 , I ) ——和 x 0 x_0 x 0 无关,这就是先验。
前向过程没有任何参数 :它就是 VAE 的编码器,只不过是固定的、手工设计的。
2.2 噪声调度:信息什么时候被毁掉
代码 01 第 1 部分:两个高斯(左 0.8 / 右 0.2),在每个 t t t 用贝叶斯最优的分类器从 x t x_t x t 猜 x 0 x_0 x 0 来自哪个模式(只猜”左”是 80%):
t t t 线性:α ˉ t \bar\alpha_t α ˉ t SNR 准确率 余弦:α ˉ t \bar\alpha_t α ˉ t SNR 准确率 100 0.8963 8.6 100.0% 0.9721 34.8 100.0% 250 0.5237 1.10 97.8% 0.8470 5.54 100.0% 500 0.0791 0.086 82.4% 0.4938 0.98 97.4% 750 0.0034 0.0035 79.9% 0.1443 0.17 85.9% 1000 4 × 10 − 5 4\times10^{-5} 4 × 1 0 − 5 4 × 10 − 5 4\times10^{-5} 4 × 1 0 − 5 79.9% 2 × 10 − 9 2\times10^{-9} 2 × 1 0 − 9 2 × 10 − 9 2\times10^{-9} 2 × 1 0 − 9 79.9%
线性调度在一半的时间里就毁掉了几乎全部信息(t = 500 t = 500 t = 500 时 82.4%),后一半的步数都花在”几乎纯噪声”上;余弦调度(Nichol & Dhariwal 2021)让 α ˉ t \bar\alpha_t α ˉ t 下降得更均匀,t = 500 t = 500 t = 500 时还有 97.4%。调度决定了有多少步数花在”有东西可学”的区间。
3. 扩散模型是层级 VAE · Diffusion models as hierarchical VAEs
3.1 反向过程与 ELBO
slides 的核心视角:把 x 1 , … , x T x_1, \dots, x_T x 1 , … , x T 看成 T T T 层隐变量。
编码器 (固定):q ( x 1 : T ∣ x 0 ) = ∏ t q ( x t ∣ x t − 1 ) q(x_{1:T} \mid x_0) = \prod_tq(x_t \mid x_{t-1}) q ( x 1 : T ∣ x 0 ) = ∏ t q ( x t ∣ x t − 1 ) ;
解码器 (学习):p θ ( x 0 : T ) = p ( x T ) ∏ t p θ ( x t − 1 ∣ x t ) p_\theta(x_{0:T}) = p(x_T)\prod_tp_\theta(x_{t-1} \mid x_t) p θ ( x 0 : T ) = p ( x T ) ∏ t p θ ( x t − 1 ∣ x t ) ,p ( x T ) = N ( 0 , I ) p(x_T) = \mathcal{N}(0, I) p ( x T ) = N ( 0 , I ) ,p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , σ t 2 I ) p_\theta(x_{t-1} \mid x_t) = \mathcal{N}(\mu_\theta(x_t, t), \sigma_t^2I) p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , σ t 2 I ) 。
为什么反向一步可以是高斯? 第 14 讲 §4.2:步子很小时,真实的反向转移 q ( x t − 1 ∣ x t ) q(x_{t-1} \mid x_t) q ( x t − 1 ∣ x t ) 近似是高斯(均值多了一项得分)。步子大了就不是——代码 01 第 4 部分会看到这一点。
和任何 VAE 一样,用 ELBO 训练:
log p θ ( x 0 ) ≥ E q ( x 1 : T ∣ x 0 ) [ log p θ ( x 0 : T ) q ( x 1 : T ∣ x 0 ) ] . \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]. log p θ ( x 0 ) ≥ E q ( x 1 : T ∣ x 0 ) [ log q ( x 1 : T ∣ x 0 ) p θ ( x 0 : T ) ] .
3.2 ELBO 的分解
关键的一步 :由马尔可夫性和贝叶斯公式,q ( x t ∣ x t − 1 ) = q ( x t ∣ x t − 1 , x 0 ) = q ( x t − 1 ∣ x t , x 0 ) q ( x t ∣ x 0 ) q ( x t − 1 ∣ x 0 ) 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)} q ( x t ∣ x t − 1 ) = q ( x t ∣ x t − 1 , x 0 ) = q ( x t − 1 ∣ x 0 ) q ( x t − 1 ∣ x t , x 0 ) q ( x t ∣ x 0 ) 。代进 ELBO,q ( x t ∣ x 0 ) / q ( x t − 1 ∣ x 0 ) q(x_t \mid x_0)/q(x_{t-1} \mid x_0) q ( x t ∣ x 0 ) / q ( x t − 1 ∣ x 0 ) 逐项相消(望远镜求和),得到(练习 2):
− E L B O = D K L ( q ( x T ∣ x 0 ) ∥ p ( x T ) ) ⏟ L T + ∑ t = 2 T E q [ D K L ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t ) ) ] ⏟ L t − 1 − E q log p θ ( x 0 ∣ x 1 ) ⏟ L 0 . -\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}. − ELBO = L T D KL ( q ( x T ∣ x 0 ) ∥ p ( x T )) + ∑ t = 2 T L t − 1 E q [ D KL ( q ( x t − 1 ∣ x t , x 0 ) ∥ p θ ( x t − 1 ∣ x t )) ] L 0 − E q log p θ ( x 0 ∣ x 1 ) .
L T L_T L T 没有参数(前向过程固定),T T T 足够大时接近 0;
每个 L t − 1 L_{t-1} L t − 1 是两个高斯之间的 KL ——可以精确算出来;
L 0 L_0 L 0 是最后一步的重构项。
3.3 后验与”预测噪声”
后验 q ( x t − 1 ∣ x t , x 0 ) q(x_{t-1} \mid x_t, x_0) q ( x t − 1 ∣ x t , x 0 ) :给定 x 0 x_0 x 0 时 x t − 1 x_{t-1} x t − 1 和 x t x_t x t 联合高斯,条件分布也是高斯(练习 3):
q ( x t − 1 ∣ x t , x 0 ) = N ( μ ~ t , β ~ t I ) , μ ~ t = α ˉ t − 1 β t 1 − α ˉ t x 0 + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t x t , β ~ t = 1 − α ˉ t − 1 1 − α ˉ 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. q ( x t − 1 ∣ x t , x 0 ) = N ( μ ~ t , β ~ t I ) , μ ~ t = 1 − α ˉ t α ˉ t − 1 β t x 0 + 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) x t , β ~ t = 1 − α ˉ t 1 − α ˉ t − 1 β t .
代码 01 第 2 部分用通用的二元高斯条件公式逐个核对了系数和方差,和 DDPM 的闭式解一致到所有打印的位数。
预测噪声的参数化。 把 x 0 = ( x t − 1 − α ˉ t ϵ ) / α ˉ t x_0 = (x_t - \sqrt{1 - \bar\alpha_t}\epsilon)/\sqrt{\bar\alpha_t} x 0 = ( x t − 1 − α ˉ t ϵ ) / α ˉ t 代进 μ ~ t \tilde\mu_t μ ~ t :
μ ~ t = 1 α t ( x t − β t 1 − α ˉ t ϵ ) . \tilde\mu_t = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{\beta_t}{\sqrt{1 - \bar\alpha_t}}\epsilon\right). μ ~ t = α t 1 ( x t − 1 − α ˉ t β t ϵ ) .
于是让网络用同样的形式输出均值:μ θ ( x t , t ) = 1 α t ( x t − β t 1 − α ˉ t ϵ θ ( x t , 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) μ θ ( x t , t ) = α t 1 ( x t − 1 − α ˉ t β t ϵ θ ( x t , t ) ) ——网络只需要猜出加进去的噪声 ϵ \epsilon ϵ 。两个方差相同的高斯之间的 KL 只看均值差,于是
L t − 1 = β t 2 2 σ t 2 α t ( 1 − α ˉ t ) E x 0 , ϵ ∥ ϵ − ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) ∥ 2 ( σ t 2 = β ~ 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{ 时}). L t − 1 = 2 σ t 2 α t ( 1 − α ˉ t ) β t 2 E x 0 , ϵ ϵ − ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) 2 ( σ t 2 = β ~ t 时 ) .
DDPM 的简化目标 :扔掉权重,t t t 均匀抽取,
L simple = E t , x 0 , ϵ ∥ ϵ − ϵ θ ( α ˉ t x 0 + 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. L simple = E t , x 0 , ϵ ϵ − ϵ θ ( α ˉ t x 0 + 1 − α ˉ t ϵ , t ) 2 .
Ho et al. 发现它的样本质量比真正的 ELBO 更好。
3.4 实验:用精确的 ε*,ELBO 有多紧?(代码 02 第 1 部分)
两个高斯,1 万个测试点,三种反向方差共用同一组噪声(差别里没有蒙特卡洛噪声),括号里是 − E L B O − ( − log p ) -\mathrm{ELBO} - (-\log p) − ELBO − ( − log p ) 的配对平均 ± 标准误(真实的 − log p = 1.5030 -\log p = 1.5030 − log p = 1.5030 nat):
步数 T T T σ t 2 = β ~ t \sigma_t^2 = \tilde\beta_t σ t 2 = β ~ t σ t 2 = β t \sigma_t^2 = \beta_t σ t 2 = β t σ t 2 \sigma_t^2 σ t 2 = 最优(Analytic-DPM)10 2.2572(+0.754 ± 0.022) 1.9658(+0.463 ± 0.012) 1.8316(+0.329 ± 0.014) 100 2.9375(+1.435 ± 0.025) 1.5138(+0.011 ± 0.014) 1.4813(−0.022 ± 0.014) 1000 2.3498(+0.847 ± 0.019) 1.4839(−0.019 ± 0.014) 1.4806(−0.022 ± 0.014)
(“最优”是给定精确均值时每个 t t t 最优的各向同性方差 β ~ t + c 0 , t 2 E [ t r C o v ( x 0 ∣ x t ) ] / d \tilde\beta_t + c_{0,t}^2\mathbb{E}[\mathrm{tr}\,\mathrm{Cov}(x_0 \mid x_t)]/d β ~ t + c 0 , t 2 E [ tr Cov ( x 0 ∣ x t )] / d ,用二阶 Tweedie 公式精确计算,Bao et al. 2022。)
T = 1000 T = 1000 T = 1000 时各项的分解:
反向方差 L T L_T L T ∑ L t − 1 \sum L_{t-1} ∑ L t − 1 ,t = 2 t = 2 t = 2 –10t = 11 t = 11 t = 11 –100t = 101 t = 101 t = 101 –1000L 0 L_0 L 0 合计 β ~ t \tilde\beta_t β ~ t 0.0001 3.6281 3.6348 1.3724 −6.2856 2.3498 β t \beta_t β t 0.0001 2.8739 3.5239 1.3717 −6.2856 1.4839
反向方差的选择决定了 ELBO 紧不紧。 σ t 2 = β ~ t \sigma_t^2 = \tilde\beta_t σ t 2 = β ~ t (“知道 x 0 x_0 x 0 时”的方差)时 T = 1000 T = 1000 T = 1000 仍差 0.85 nat;多出的 0.87 nat 里有 0.75 nat 来自最前面的 9 步。原因:t t t 很小时 β ~ t \tilde\beta_t β ~ t 远小于 β t \beta_t β t (代码 01 第 2 部分:t = 2 t = 2 t = 2 时不到一半),反向过程太”自信”,每一步都为”其实不知道 x 0 x_0 x 0 “付出代价——这一项不随 T → ∞ T \to \infty T → ∞ 消失 。
σ t 2 = β t \sigma_t^2 = \beta_t σ t 2 = β t 或最优方差时,T = 1000 T = 1000 T = 1000 的差距和 0 分不开:步数足够多、每一步都最优时,扩散模型这个层级 VAE 的下界是紧的 。T T T 小时最优方差明显更好。
L 0 L_0 L 0 是负的:连续数据的高斯解码器方差只有 β 1 ≈ 10 − 4 \beta_1 \approx 10^{-4} β 1 ≈ 1 0 − 4 ,密度可以大于 1。
代码 01 第 4 部分:T = 1000 T = 1000 T = 1000 时两种方差的样本 几乎一样(DDPM 论文的观察),步数少时 β t \beta_t β t 明显更好。样本质量对方差不敏感,似然非常敏感 ——Improved DDPM(学习方差)和 Analytic-DPM(解析最优方差)都是为似然而做的。
3.5 ELBO 的权重 vs 等权(代码 02 第 2–3 部分)
σ t 2 = β t \sigma_t^2 = \beta_t σ t 2 = β t 时,ELBO 给 ∥ ϵ − ϵ θ ∥ 2 \Vert\epsilon - \epsilon_\theta\Vert^2 ∥ ϵ − ϵ θ ∥ 2 的权重是 β t 2 α t ( 1 − α ˉ t ) \frac{\beta_t}{2\alpha_t(1 - \bar\alpha_t)} 2 α t ( 1 − α ˉ t ) β t :t = 2 t = 2 t = 2 时 0.27、t = 100 t = 100 t = 100 时 0.010、t = 500 t = 500 t = 500 时 0.0055、t = 1000 t = 1000 t = 1000 时 0.010。ELBO 最在乎几乎没有噪声时的去噪精度 ——那里决定细节,也决定似然;L simple L_{\text{simple}} L simple 把所有 t t t 等权,相对地压低了小 t t t 、抬高了中大 t t t 。
L simple L_{\text{simple}} L simple 就是 NCSN 的加权 :∥ ϵ − ϵ θ ∥ 2 = σ t 2 ∥ s θ − ( − ϵ / σ t ) ∥ 2 \Vert\epsilon - \epsilon_\theta\Vert^2 = \sigma_t^2\Vert s_\theta - (-\epsilon/\sigma_t)\Vert^2 ∥ ϵ − ϵ θ ∥ 2 = σ t 2 ∥ s θ − ( − ϵ / σ t ) ∥ 2 ,正是第 14 讲 λ ( σ ) = σ 2 \lambda(\sigma) = \sigma^2 λ ( σ ) = σ 2 加权的去噪得分匹配。
训练两个网络(MLP 128 × 3,8,000 步,两个高斯):
训练目标 − - − ELBO(σ 2 = β \sigma^2 = \beta σ 2 = β )∥ ϵ θ − ϵ ∗ ∥ 2 \Vert\epsilon_\theta - \epsilon^*\Vert^2 ∥ ϵ θ − ϵ ∗ ∥ 2 :t ≤ 10 t \leq 10 t ≤ 10 t = 11 t = 11 t = 11 –100t = 101 t = 101 t = 101 –1000左边比例 切片 W1 L simple L_{\text{simple}} L simple 1.5495 0.0035 0.0102 0.0073 0.782 0.088 L vlb L_{\text{vlb}} L vlb 1.5513 0.0016 0.0110 0.0081 0.772 0.092
L vlb L_{\text{vlb}} L vlb 把权重放在小 t t t ,那里学得更准,中大 t t t 更差;L simple L_{\text{simple}} L simple 相反。在这个二维例子里两者的似然和样本几乎一样;DDPM 在 CIFAR-10 上发现 L simple L_{\text{simple}} L simple 样本更好、L vlb L_{\text{vlb}} L vlb 似然更好,而直接优化 L vlb L_{\text{vlb}} L vlb 梯度方差很大(Nichol & Dhariwal 2021 用重要性采样 t t t 缓解)。两个网络的 − - − ELBO 只比精确 ϵ ∗ \epsilon^* ϵ ∗ 的 1.4839 高约 0.07 nat。
4. 扩散模型就是得分模型 · Diffusion models are score-based models
4.1 预测噪声 = 估计得分
L simple L_{\text{simple}} L simple 的最优解是 ϵ ∗ ( x t , t ) = E [ ϵ ∣ x t ] \epsilon^*(x_t, t) = \mathbb{E}[\epsilon \mid x_t] ϵ ∗ ( x t , t ) = E [ ϵ ∣ x t ] 。由第 13 讲的去噪得分匹配(条件得分 − ϵ / σ t -\epsilon/\sigma_t − ϵ / σ t ):
ϵ ∗ ( x t , t ) = − 1 − α ˉ t ∇ x t log q t ( x t ) , x ^ 0 = x t − 1 − α ˉ t ϵ ∗ α ˉ t = E [ x 0 ∣ x t ] ( 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}). ϵ ∗ ( x t , t ) = − 1 − α ˉ t ∇ x t log q t ( x t ) , x ^ 0 = α ˉ t x t − 1 − α ˉ t ϵ ∗ = E [ x 0 ∣ x t ] ( Tweedie ) .
预测噪声、估计得分、预测干净的 x 0 x_0 x 0 是同一个量的三种写法 (slides:“denoising diffusion models are score-based models”)。代码 01 第 3 部分:− ϵ ∗ / σ t -\epsilon^*/\sigma_t − ϵ ∗ / σ t 和精确得分的差 ≤ 9 × 10 − 16 \leq 9\times10^{-16} ≤ 9 × 1 0 − 16 ,由 ϵ ∗ \epsilon^* ϵ ∗ 算出的 x ^ 0 \hat x_0 x ^ 0 和直接按贝叶斯公式算的后验均值差 ≤ 6 × 10 − 15 \leq 6\times10^{-15} ≤ 6 × 1 0 − 15 。
DDPM 的反向一步 x t − 1 = 1 α t ( x t + β t ∇ log q t ) + σ t z x_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t + \beta_t\nabla\log q_t) + \sigma_tz x t − 1 = α t 1 ( x t + β t ∇ log q t ) + σ t z (把 ϵ \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^* ϵ ∗ ,两个高斯):σ t 2 = β t \sigma_t^2 = \beta_t σ t 2 = β t 时 T T T = 10、30、100、1000 的切片 W1 为 0.041、0.021、0.014、0.020(噪声底约 0.02–0.03);σ t 2 = β ~ t \sigma_t^2 = \tilde\beta_t σ t 2 = β ~ t 时为 0.175、0.064、0.028、0.021。即使去噪器是完美的,步数太少也不行 :反向一步是高斯的假设只在步子小时成立。
4.3 网络架构
slides 介绍了扩散模型常用的 U-Net :编码–解码的卷积网络,跨层连接保留细节,中间几层加自注意力;时间 t t t 通过正弦嵌入加到每个残差块里。输入输出同形状(预测一张”噪声图”)。代码里的二维玩具用 MLP + 时间的正弦编码(EpsNet),原理相同。后来的 DiT(§9)把 U-Net 换成了 Transformer。
4.4 SDE 视角
T → ∞ T \to \infty T → ∞ ,DDPM 变成第 14 讲的 VP SDE;采样器可以用任何 SDE / ODE 求解器,也可以加朗之万校正(预测–校正)。slides 引用 Song et al.(2021)的结果:这样得到 CIFAR-10 FID 2.20、1024×1024 的人脸。代码 diffusion.py 的线性调度就是 VP SDE 在 T T T 个格点上的值,所以第 14 讲的 pf_ode、ode_loglik 可以直接用在本讲训练的网络上(§6)。
5. 加速采样(一):跳步 · Faster sampling by respacing
DDPM 要 T = 1000 T = 1000 T = 1000 次网络调用——比 GAN、VAE、流模型慢三个数量级。最简单的加速:只在一个子序列 τ 1 > τ 2 > ⋯ > τ S \tau_1 > \tau_2 > \dots > \tau_S τ 1 > τ 2 > ⋯ > τ S 上走,把子序列当成一条新的 S S S 步马尔可夫链(每一步的"β \beta β "用 1 − α ˉ τ i / α ˉ τ i + 1 1 - \bar\alpha_{\tau_i}/\bar\alpha_{\tau_{i+1}} 1 − α ˉ τ i / α ˉ τ 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):L simple L_{\text{simple}} L simple 只依赖边缘分布 q ( x t ∣ x 0 ) q(x_t \mid x_0) q ( x t ∣ x 0 ) ,不依赖前向过程是不是马尔可夫链。所以可以换一个非马尔可夫 的前向过程,只要它的边缘分布不变,训练好的 ϵ θ \epsilon_\theta ϵ θ 照样能用。DDIM 选的反向一步是
x t ′ = α ˉ t ′ x ^ 0 + 1 − α ˉ t ′ − σ 2 ϵ θ ( x t , t ) + σ z , x ^ 0 = x t − 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 t ′ = α ˉ t ′ x ^ 0 + 1 − α ˉ t ′ − σ 2 ϵ θ ( x t , t ) + σ z , x ^ 0 = α ˉ t x t − 1 − α ˉ t ϵ θ .
直觉 :先用网络猜出干净的 x ^ 0 \hat x_0 x ^ 0 和”方向”ϵ θ \epsilon_\theta ϵ θ ,再把它们按目标时刻 t ′ 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 − α ˉ t ′ ) / ( 1 − α ˉ t ) 1 − α ˉ t / α ˉ t ′ :
η = 1 \eta = 1 η = 1 :和 DDPM 祖先采样同分布(随机);
η = 0 \eta = 0 η = 0 :完全确定性 ——同一个初始噪声永远得到同一个样本。它是概率流 ODE 的一种一阶离散化(练习 8)。
6.2 确定性、插值、两种似然(代码 03 第 2–3 部分)
同一个初始噪声:DDIM 两次结果的差是 0;DDPM 两次的差约 1.7。在两个噪声之间做球面插值(slerp),DDIM 把它们映射成一条样本路径:从下弧跳到上弧的那一步(λ = 0.1 \lambda = 0.1 λ = 0.1 )落在两条弧线之间(log p = − 6.2 \log p = -6.2 log p = − 6.2 ),其余都沿着上弧平滑移动、log p data \log p_{\text{data}} log p data 保持在数据的水平。噪声成了一个确定的”隐变量” ,像 VAE 的解码器、流模型的逆变换——可以做插值、编辑、反演。
同一个 ϵ \epsilon ϵ 网络(双月牙)的两种似然:真实 − log p = 1.7987 -\log p = 1.7987 − log p = 1.7987 ;DDPM 的 − - − ELBO(σ 2 = β \sigma^2 = \beta σ 2 = β ,T = 1000 T = 1000 T = 1000 )1.9188;概率流 ODE 的精确 − log p -\log p − log p (RK4 100 步)1.8953。两者都比真实分布差约 0.1 nat、彼此接近,但严格说是两个不同模型 的似然:ELBO 给的是离散祖先采样器那个分布的下界,ODE 给的是确定性流那个分布的精确值(第 15 讲:报告时要写清楚)。
6.3 质量 vs 步数(代码 03 第 1 部分)
双月牙,同一组初始噪声。每格:切片 W1 / 平均 log p data \log p_{\text{data}} log p data (真实 −1.82)。上面是精确的 ϵ ∗ \epsilon^* ϵ ∗ (只有离散化误差),下面是学到的网络 (MLP 256 × 4,余弦学习率):
采样器 10 NFE 25 NFE 100 NFE 精确 ϵ ∗ \epsilon^* ϵ ∗ :DDPM 跳步 0.092 / −4.02 0.050 / −2.36 0.025 / −1.95 精确 ϵ ∗ \epsilon^* ϵ ∗ :DDIM η = 1 \eta = 1 η = 1 0.179 / −2.38 0.077 / −1.69 0.028 / −1.71 精确 ϵ ∗ \epsilon^* ϵ ∗ :DDIM η = 0 \eta = 0 η = 0 0.135 / −2.26 0.055 / −1.74 0.028 / −1.79 精确 ϵ ∗ \epsilon^* ϵ ∗ :概率流 ODE(Heun) 0.060 / −3.150.029 / −2.180.023 / −1.87学到的网络:DDPM 跳步 0.096 / −4.12 0.058 / −2.65 0.032 / −2.18 学到的网络:DDIM η = 0 \eta = 0 η = 0 0.118 / −2.37 0.053 / −2.04 0.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 log p −4.0,很多点落在弧线外),DDIM(η = 0 \eta = 0 η = 0 )更贴近弧线(−2.3)但整体形状偏差更大;二阶的 Heun 两方面都最好。25 次 NFE 时 Heun 已到噪声底。
如实地说 :DDIM 论文在 CIFAR-10 上报告 η = 0 \eta = 0 η = 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 p t ( x ∣ y ) = ∇ log p t ( x ) + ∇ log p t ( y ∣ x ) \nabla\log p_t(x \mid y) = \nabla\log p_t(x) + \nabla\log p_t(y \mid x) ∇ log p t ( x ∣ y ) = ∇ log p t ( x ) + ∇ log p t ( y ∣ x ) ,加权 w w w 的分类器引导 需要一个在每个噪声水平上训练的分类器。Ho & Salimans(2021)的无分类器引导 只训练一个网络 ϵ θ ( x t , t , y ) \epsilon_\theta(x_t, t, y) ϵ θ ( x t , t , y ) :训练时以一定概率(如 10%–20%)把 y y y 换成”空”∅ \varnothing ∅ ,于是同一个网络同时学会条件和无条件的 ϵ \epsilon ϵ 。采样时
ϵ ~ = ϵ θ ( x t , t , ∅ ) + w ( ϵ θ ( x t , t , y ) − ϵ θ ( x t , t , ∅ ) ) . \tilde\epsilon = \epsilon_\theta(x_t, t, \varnothing) + w\left(\epsilon_\theta(x_t, t, y) - \epsilon_\theta(x_t, t, \varnothing)\right). ϵ ~ = ϵ θ ( x t , t , ∅ ) + w ( ϵ θ ( x t , t , y ) − ϵ θ ( x t , t , ∅ ) ) .
换成得分(s = − ϵ / σ t s = -\epsilon/\sigma_t s = − ϵ / σ t ):s ~ = ∇ log p t ( x ) + w ( ∇ log p t ( x ∣ y ) − ∇ log p t ( x ) ) = ∇ log p t ( x ) + w ∇ log p t ( 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) s ~ = ∇ log p t ( x ) + w ( ∇ log p t ( x ∣ y ) − ∇ log p t ( x )) = ∇ log p t ( x ) + w ∇ log p t ( y ∣ x ) ——和权重为 w w w 的分类器引导完全相同 ,只是分类器 ∇ log p t ( y ∣ x ) = − ( ϵ ( x , y ) − ϵ ( x , ∅ ) ) / σ t \nabla\log p_t(y \mid x) = -(\epsilon(x, y) - \epsilon(x, \varnothing))/\sigma_t ∇ log p t ( y ∣ x ) = − ( ϵ ( x , y ) − ϵ ( x , ∅ )) / σ t 由生成模型自己”免费”给出,天然知道每个噪声水平。
7.2 实验(代码 04,8 个高斯的圆环,目标 0 号)
DDIM 50 步,每格:目标类比例 / 类内标准差(真实 0.25)/ 离群比例(离所有模式中心都超过 0.75):
引导权重 学到的网络 精确的 ϵ ∗ \epsilon^* ϵ ∗ w = 0 w = 0 w = 0 (无条件)11.7% / 0.358 / 11.8% 12.3% / 0.234 / 1.2% w = 1 w = 1 w = 1 (条件)99.8% / 0.226 / 0.7% 99.8% / 0.228 / 0.6% w = 1.5 w = 1.5 w = 1.5 100.0% / 0.143 / 0.7% 100.0% / 0.160 / 0.4% w = 2 w = 2 w = 2 100.0% / 0.115 / 1.5% 100.0% / 0.132 / 0.5% w = 3 w = 3 w = 3 100.0% / 0.128 / 4.2% 100.0% / 0.103 / 1.7% w = 5 w = 5 w = 5 100.0% / 0.472 / 19.6% 100.0% / 0.079 / 16.4% w = 8 w = 8 w = 8 100.0% / 1.584 / 88.8% 100.0% / 0.065 / 94.4%
w = 0 w = 0 w = 0 时学到的网络比精确值差(离群 11.8% vs 1.2%):无条件分支只用了 15% 被丢掉标签的数据训练。
w = 1.5 w = 1.5 w = 1.5 –3:类内标准差从 0.23 降到 0.10–0.13——多样性下降,样本更”典型” 。
w w w 再大,精确的 引导也会失败:样本被挤成一个更小的团(w = 8 w = 8 w = 8 :标准差 0.065),但这个团被推离了模式中心、远离其他类——94% 的样本跑出了数据分布。图像上这表现为颜色过饱和、细节失真。学到的网络在 w ≥ 5 w \geq 5 w ≥ 5 时还会因为误差被 w w w 放大而散开。
Stable Diffusion 默认 w = 7.5 w = 7.5 w = 7.5 在图像上效果好,这里 w = 8 w = 8 w = 8 已经失败:合适的 w w w 取决于条件信息有多强、模型有多准 。练习 9 说明 w ≠ 1 w \neq 1 w = 1 时采的并不是一个简单的”倾斜分布”。
隐含分类器的质量 :− ( ϵ θ ( x , y ) − ϵ θ ( x , ∅ ) ) / σ t -(\epsilon_\theta(x, y) - \epsilon_\theta(x, \varnothing))/\sigma_t − ( ϵ θ ( x , y ) − ϵ θ ( x , ∅ )) / σ t 和精确的 ∇ log p t ( y ∣ x ) \nabla\log p_t(y \mid x) ∇ log p t ( y ∣ x ) 方向余弦 0.98–0.999;相对误差在中大噪声下 4%–5%,小噪声(t = 50 t = 50 t = 50 )时 21%——它是两个大数之差,网络的小误差在那里被放大。
8. 潜空间扩散 · Latent diffusion models
8.1 结构
slides 的最后一个主题是 Rombach et al.(2022)的潜空间扩散模型 (Stable Diffusion):
先训练一个自编码器(VAE,KL 权重极小,约 10 − 6 10^{-6} 1 0 − 6 ;或 VQ),把 512 × 512 × 3 512 \times 512 \times 3 512 × 512 × 3 的图压成 64 × 64 × 4 64 \times 64 \times 4 64 × 64 × 4 的隐变量;
在隐空间里训练扩散模型(U-Net + 文字的交叉注意力);
生成:隐空间里扩散采样,再用解码器变回图像。
两个好处:便宜 (隐空间小几十倍,训练、采样都快);分工 (自编码器负责感知上不重要的细节,扩散模型负责语义结构)。从第 6 讲的角度还有第三个:VAE 的先验 N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) 和编码器实际使用的聚合后验 q ( z ) = E x q ( z ∣ x ) q(z) = \mathbb{E}_xq(z \mid x) q ( z ) = E x q ( z ∣ x ) 往往对不上(先验空洞);扩散模型可以直接学 q ( z ) q(z) q ( z ) 。
8.2 实验:什么时候有用(代码 05)
像素世界,第 6 讲缓存的三个 d z = 8 d_z = 8 d z = 8 的 VAE(β \beta β = 0.25、0.5、1),三种先验:VAE 自己的 N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) 、隐空间里训练的扩散模型(10,000 个聚合后验样本,MLP 256 × 4,DDIM 100 步)、聚合后验本身(解码测试图的编码,“理想的先验”)。
VAE + 先验 隐空间两样本分类准确率 FID ↓ 平均 log 2 p data \log_2 p_{\text{data}} log 2 p data ↑ 真实分布 — 0.009 −25.56 β = 0.25 \beta = 0.25 β = 0.25 (7 维活跃)+ N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) 0.651 0.599 −35.13 β = 0.25 \beta = 0.25 β = 0.25 + 隐空间扩散0.610 0.415 −32.58 β = 0.25 \beta = 0.25 β = 0.25 + 聚合后验— 0.028 −26.78 β = 0.5 \beta = 0.5 β = 0.5 (6 维)+ N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) 0.618 0.525 −33.18 β = 0.5 \beta = 0.5 β = 0.5 + 隐空间扩散0.594 0.454 −32.22 β = 1 \beta = 1 β = 1 (4 维)+ N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) 0.564 0.478 −31.79 β = 1 \beta = 1 β = 1 + 隐空间扩散0.569 0.388 −31.88 β = 1 \beta = 1 β = 1 + 聚合后验— 0.178 −29.39
(两样本分类准确率:先验的样本和聚合后验在活跃维度上能否分开,0.5 = 分不开。)
β \beta β 越小,活跃维度越多,聚合后验离 N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) 越远(0.56 → 0.65),从 N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) 采样的图也越差——先验空洞 。
β = 0.25 \beta = 0.25 β = 0.25 时,只把先验换成隐空间扩散(编码器、解码器都不变),log p data \log p_{\text{data}} log p data 好了 2.5 bit、FID 从 0.60 降到 0.42:问题出在先验,不是解码器 。β = 1 \beta = 1 β = 1 时聚合后验本来就接近 N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) ,扩散先验只让 FID 略降,log p data \log p_{\text{data}} log p data 没变。
如实地说 :扩散先验离”理想的先验”还很远。诊断显示,它的样本到训练编码均值的平均距离几乎和 N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) 一样——这个小扩散模型学到了聚合后验的大致形状,没学到”每种配置一个团”的细结构;更多数据、更长训练、1,000 步 DDPM 都没有改善(代码 README)。
这正是 Stable Diffusion 把 KL 权重设得极小的原因:隐空间几乎不受 N ( 0 , I ) \mathcal{N}(0, I) 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
前向过程 :q ( x t ∣ x t − 1 ) = N ( 1 − β t x t − 1 , β t I ) q(x_t \mid x_{t-1}) = \mathcal{N}(\sqrt{1 - \beta_t}x_{t-1}, \beta_tI) q ( x t ∣ x t − 1 ) = N ( 1 − β t x t − 1 , β t I ) ,固定、无参数;q ( x t ∣ x 0 ) q(x_t \mid x_0) q ( x t ∣ x 0 ) 有闭式解,可以直接跳到任意 t t t 。调度决定信息被毁掉的速度(线性调度一半时间就毁掉了几乎全部信息,余弦更均匀)。
层级 VAE :ELBO = − L T − ∑ L t − 1 − L 0 = -L_T - \sum L_{t-1} - L_0 = − L T − ∑ L t − 1 − L 0 ,每个 L t − 1 L_{t-1} L t − 1 是两个高斯的 KL;预测噪声的参数化让它变成加权的 ∥ ϵ − ϵ θ ∥ 2 \Vert\epsilon - \epsilon_\theta\Vert^2 ∥ ϵ − ϵ θ ∥ 2 ;DDPM 扔掉权重得到 L simple L_{\text{simple}} L simple 。
反向方差决定 ELBO 紧不紧 :精确 ϵ ∗ \epsilon^* ϵ ∗ 下,σ 2 = β ~ t \sigma^2 = \tilde\beta_t σ 2 = β ~ t 时 T = 1000 T = 1000 T = 1000 仍差 0.85 nat(来自最前面几步),σ 2 = β t \sigma^2 = \beta_t σ 2 = β t 或最优方差时差距和 0 分不开;样本质量对它不敏感。
扩散 = 得分 :ϵ ∗ = − σ t ∇ log q t \epsilon^* = -\sigma_t\nabla\log q_t ϵ ∗ = − σ t ∇ log q t ,x ^ 0 \hat x_0 x ^ 0 = Tweedie;DDPM = VP SDE 的离散化,L simple L_{\text{simple}} L simple = λ = σ 2 \lambda = \sigma^2 λ = σ 2 的去噪得分匹配。
加速采样 :跳步、DDIM(η = 0 \eta = 0 η = 0 确定性,概率流 ODE 的一阶离散化)、高阶 ODE 求解器(Heun 25 次 NFE 到噪声底)、蒸馏;确定性采样让噪声成为可插值、可反演的隐变量。
无分类器引导 :一个网络、随机丢标签;ϵ ~ = ϵ ( ∅ ) + w ( ϵ ( y ) − ϵ ( ∅ ) ) \tilde\epsilon = \epsilon(\varnothing) + w(\epsilon(y) - \epsilon(\varnothing)) ϵ ~ = ϵ ( ∅ ) + w ( ϵ ( y ) − ϵ ( ∅ )) = 权重 w w w 的分类器引导;w w w 大则多样性下降,太大时连精确的引导也会把样本推出数据区。
潜空间扩散 :自编码器压缩 + 隐空间扩散;当 VAE 的先验失配大时(β \beta β 小),扩散先验明显改善样本(log p data \log p_{\text{data}} log p data +2.5 bit)。
11. 常见误区 · Common pitfalls
“扩散模型和得分模型是两类模型。” 预测噪声 = 估计得分(§4.1);DDPM 是 VP SDE、NCSN 是 VE SDE 的离散化。
”L simple L_{\text{simple}} L simple 就是 ELBO。” 它扔掉了权重(§3.5),不再是似然的界;要报告似然,得用带权重的 ELBO 或概率流 ODE。
“有了完美的 ϵ θ \epsilon_\theta ϵ θ ,ELBO 就等于 log p \log p log p 。” 还要反向方差合适、步数足够多:σ 2 = β ~ t \sigma^2 = \tilde\beta_t σ 2 = β ~ t 时差 0.85 nat,T T T 再大也不消失(§3.4)。
“反向方差无所谓,DDPM 论文说两种结果差不多。” 样本质量差不多(T = 1000 T = 1000 T = 1000 时),似然差很多;步数少时样本也差很多(§4.2)。
“步数越少越好,用 DDIM 就行。” 少步数时所有一阶方法都有明显的离散化误差;高阶求解器或蒸馏才能真正省步数(§6.3)。
“DDIM 是 DDPM 的近似。” DDIM 是对同一组边缘分布的另一种走法,η = 0 \eta = 0 η = 0 时是确定性的 ODE 离散化,不需要重新训练(§6.1)。
“引导权重越大,图越好。” 多样性下降,太大时样本被推出数据分布(§7.2:w = 8 w = 8 w = 8 时 94% 离群)。
“潜空间扩散总能大幅改善 VAE。” 只有当聚合后验和 N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) 差得多时才明显(§8.2:β = 1 \beta = 1 β = 1 时几乎没帮助);扩散模型本身也得足够强。
12. 练习 · Exercises
练习 1(多步转移的闭式解)
用归纳法证明 q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) q(x_t \mid x_0) = \mathcal{N}(\sqrt{\bar\alpha_t}x_0, (1 - \bar\alpha_t)I) q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) 。
参考答案
t = 1 t = 1 t = 1 成立。设 x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ϵ 1 x_{t-1} = \sqrt{\bar\alpha_{t-1}}x_0 + \sqrt{1 - \bar\alpha_{t-1}}\epsilon_1 x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ϵ 1 ,则 x t = α t x t − 1 + β t ϵ 2 = α ˉ t x 0 + α t ( 1 − α ˉ t − 1 ) ϵ 1 + β t ϵ 2 x_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 x t = α t x t − 1 + β t ϵ 2 = α ˉ t x 0 + α t ( 1 − α ˉ t − 1 ) ϵ 1 + β t ϵ 2 。两个独立高斯噪声之和的方差 α t − α ˉ t + 1 − α t = 1 − α ˉ t \alpha_t - \bar\alpha_t + 1 - \alpha_t = 1 - \bar\alpha_t α t − α ˉ t + 1 − α t = 1 − α ˉ t 。代码 diffusion.py 的自检用 20 万个样本逐步加噪 300 步核对了它。
练习 2(ELBO 的望远镜求和)
从 E q [ log p ( x T ) + ∑ t ≥ 1 log p θ ( x t − 1 ∣ x t ) q ( x t ∣ x t − 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})}] E q [ log p ( x T ) + ∑ t ≥ 1 log q ( x t ∣ x t − 1 ) p θ ( x t − 1 ∣ x t ) ] 出发,用 q ( x t ∣ x t − 1 ) = q ( x t − 1 ∣ x t , x 0 ) q ( x t ∣ x 0 ) q ( x t − 1 ∣ x 0 ) 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)} q ( x t ∣ x t − 1 ) = q ( x t − 1 ∣ x 0 ) q ( x t − 1 ∣ x t , x 0 ) q ( x t ∣ x 0 ) (t ≥ 2 t \geq 2 t ≥ 2 )推出 §3.2 的分解。
参考答案
把 t = 1 t = 1 t = 1 单独拿出来,t ≥ 2 t \geq 2 t ≥ 2 的项写成 log p θ ( x t − 1 ∣ x t ) q ( x t − 1 ∣ x t , x 0 ) + log q ( x t − 1 ∣ x 0 ) q ( x t ∣ x 0 ) \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)} log q ( x t − 1 ∣ x t , x 0 ) p θ ( x t − 1 ∣ x t ) + log q ( x t ∣ x 0 ) q ( x t − 1 ∣ x 0 ) 。第二部分对 t = 2.. T t = 2..T t = 2.. T 求和相消,只剩 log q ( x 1 ∣ x 0 ) q ( x T ∣ x 0 ) \log\frac{q(x_1 \mid x_0)}{q(x_T \mid x_0)} log q ( x T ∣ x 0 ) q ( x 1 ∣ x 0 ) 。和 t = 1 t = 1 t = 1 项 log p θ ( x 0 ∣ x 1 ) q ( x 1 ∣ x 0 ) \log\frac{p_\theta(x_0\mid x_1)}{q(x_1 \mid x_0)} log q ( x 1 ∣ x 0 ) p θ ( x 0 ∣ x 1 ) 合并,q ( x 1 ∣ x 0 ) q(x_1\mid x_0) q ( x 1 ∣ x 0 ) 消掉。整理:E L B O = E q [ log p ( x T ) q ( x T ∣ x 0 ) + ∑ t ≥ 2 log p θ ( x t − 1 ∣ x t ) q ( x t − 1 ∣ x t , x 0 ) + log p θ ( x 0 ∣ x 1 ) ] \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)] ELBO = E q [ log q ( x T ∣ x 0 ) p ( x T ) + ∑ t ≥ 2 log q ( x t − 1 ∣ x t , x 0 ) p θ ( x t − 1 ∣ x t ) + log p θ ( x 0 ∣ x 1 )] ,取期望即为 − L T − ∑ L t − 1 − L 0 -L_T - \sum L_{t-1} - L_0 − L T − ∑ L t − 1 − L 0 。
练习 3(后验的均值和方差)
用二元高斯的条件分布公式推出 μ ~ t \tilde\mu_t μ ~ t 、β ~ t \tilde\beta_t β ~ t 。(提示:给定 x 0 x_0 x 0 ,V a r ( x t − 1 ) = 1 − α ˉ t − 1 \mathrm{Var}(x_{t-1}) = 1 - \bar\alpha_{t-1} Var ( x t − 1 ) = 1 − α ˉ t − 1 ,C o v ( x t − 1 , x t ) = α t ( 1 − α ˉ t − 1 ) \mathrm{Cov}(x_{t-1}, x_t) = \sqrt{\alpha_t}(1 - \bar\alpha_{t-1}) Cov ( x t − 1 , x t ) = α t ( 1 − α ˉ t − 1 ) ,V a r ( x t ) = 1 − α ˉ t \mathrm{Var}(x_t) = 1 - \bar\alpha_t Var ( x t ) = 1 − α ˉ t 。)
参考答案
条件均值 = E x t − 1 + C o v V a r ( x t ) ( x t − E x t ) = α ˉ t − 1 x 0 + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t ( x t − α ˉ t x 0 ) = \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) = E x t − 1 + Var ( x t ) Cov ( x t − E x t ) = α ˉ t − 1 x 0 + 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) ( x t − α ˉ t x 0 ) 。x 0 x_0 x 0 的系数 α ˉ t − 1 − α t α ˉ t ( 1 − α ˉ t − 1 ) 1 − α ˉ t = α ˉ t − 1 1 − α ˉ t − α t + α ˉ t 1 − α ˉ t = α ˉ t − 1 β t 1 − α ˉ 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} α ˉ t − 1 − 1 − α ˉ t α t α ˉ t ( 1 − α ˉ t − 1 ) = α ˉ t − 1 1 − α ˉ t 1 − α ˉ t − α t + α ˉ t = 1 − α ˉ t α ˉ t − 1 β t 。条件方差 = ( 1 − α ˉ t − 1 ) − α t ( 1 − α ˉ t − 1 ) 2 1 − α ˉ t = ( 1 − α ˉ t − 1 ) β t 1 − α ˉ 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 = ( 1 − α ˉ t − 1 ) − 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) 2 = 1 − α ˉ t ( 1 − α ˉ t − 1 ) β t = β ~ t 。这正是代码 01 第 2 部分做的数值核对。
练习 4(L_{t−1} 的权重)
推导 L t − 1 L_{t-1} L t − 1 在一般的反向方差 σ t 2 \sigma_t^2 σ t 2 下的表达式(包括方差不匹配项),并说明为什么 σ t 2 = β ~ t \sigma_t^2 = \tilde\beta_t σ t 2 = β ~ t 时只剩均值项。
参考答案
D K L ( N ( μ ~ , β ~ I ) ∥ N ( μ θ , σ 2 I ) ) = d 2 ( β ~ σ 2 − 1 − log β ~ σ 2 ) + ∥ μ ~ − μ θ ∥ 2 2 σ 2 D_{\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} D KL ( N ( μ ~ , β ~ I ) ∥ N ( μ θ , σ 2 I )) = 2 d ( σ 2 β ~ − 1 − log σ 2 β ~ ) + 2 σ 2 ∥ μ ~ − μ θ ∥ 2 ,∥ μ ~ − μ θ ∥ 2 = β t 2 α 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 = α t ( 1 − α ˉ t ) β t 2 ∥ ϵ − ϵ θ ∥ 2 。σ 2 = β ~ \sigma^2 = \tilde\beta σ 2 = β ~ 时第一项为 0。diffusion.elbo_terms 实现的就是这个公式。
练习 5(为什么 β̃ 让 ELBO 不紧)
设数据是一维 N ( 0 , 1 ) \mathcal{N}(0, 1) N ( 0 , 1 ) (这时 q t = N ( 0 , 1 ) q_t = \mathcal{N}(0, 1) q t = N ( 0 , 1 ) 对所有 t t t 成立)。(a) 求真实的反向转移 q ( x t − 1 ∣ x t ) q(x_{t-1} \mid x_t) q ( x t − 1 ∣ x t ) 。(b) 比较它的方差和 β t \beta_t β t 、β ~ t \tilde\beta_t β ~ t 。(c) 由此说明:对这个数据,σ t 2 = β t \sigma_t^2 = \beta_t σ t 2 = β t 是精确的,而 σ t 2 = β ~ t \sigma_t^2 = \tilde\beta_t σ t 2 = β ~ t 在 t t t 小时有固定的代价。
参考答案
(a) x t − 1 ∼ N ( 0 , 1 ) x_{t-1} \sim \mathcal{N}(0, 1) x t − 1 ∼ N ( 0 , 1 ) ,x t = α t x t − 1 + β t ϵ x_t = \sqrt{\alpha_t}x_{t-1} + \sqrt{\beta_t}\epsilon x t = α t x t − 1 + β t ϵ ,联合高斯:E [ x t − 1 ∣ x t ] = α t x t \mathbb{E}[x_{t-1}\mid x_t] = \sqrt{\alpha_t}x_t E [ x t − 1 ∣ x t ] = α t x t ,V a r = 1 − α t = β t \mathrm{Var} = 1 - \alpha_t = \beta_t Var = 1 − α t = β t 。(b) 真实方差恰好是 β t \beta_t β t ;β ~ t = 1 − α ˉ t − 1 1 − α ˉ t β t \tilde\beta_t = \frac{1 - \bar\alpha_{t-1}}{1 - \bar\alpha_t}\beta_t β ~ t = 1 − α ˉ t 1 − α ˉ t − 1 β t 在 t = 2 t = 2 t = 2 时约为 β / 2 \beta/2 β /2 (α ˉ 1 ≈ 1 − β \bar\alpha_1 \approx 1 - \beta α ˉ 1 ≈ 1 − β )。(c) 用 β ~ \tilde\beta β ~ 时每一步都有方差不匹配的 KL 1 2 ( r − 1 − log r ) \frac12(r - 1 - \log r) 2 1 ( r − 1 − log r ) ,r = β t / β ~ t r = \beta_t/\tilde\beta_t r = β t / β ~ t ;r t ≈ t / ( t − 1 ) r_t \approx t/(t-1) r t ≈ t / ( t − 1 ) (t t t 小时),这些项之和是一个与 T T T 无关的常数——T → ∞ T \to \infty T → ∞ 也不消失,和代码 02 看到的一样。(练习的数据是标准正态;代码里两个高斯的情形中,小 t t t 时数据在噪声尺度上也”近似是平的”,结论相同。)
练习 6(DDPM 是 VP SDE 的离散化)
把 DDPM 的反向一步写成 x t − 1 = 1 α t ( x t + β t s t ( x t ) ) + σ t z x_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t + \beta_ts_t(x_t)) + \sigma_tz x t − 1 = α t 1 ( x t + β t s t ( x t )) + σ t z (s t s_t s t 是得分),并和第 14 讲反向 VP SDE 的欧拉–丸山步 x ← x + [ 1 2 β x + β s ] Δ t + β Δ t z x \leftarrow x + [\frac12\beta x + \beta s]\Delta t + \sqrt\beta\sqrt{\Delta t}\,z x ← x + [ 2 1 β x + β s ] Δ t + β Δ t z 比较(β Δ t ↔ β t \beta\Delta t \leftrightarrow \beta_t β Δ t ↔ β t )。
参考答案
ϵ = − σ t s t \epsilon = -\sigma_ts_t ϵ = − σ t s t ,β t 1 − α ˉ t ϵ = − β t s t \frac{\beta_t}{\sqrt{1 - \bar\alpha_t}}\epsilon = -\beta_ts_t 1 − α ˉ t β t ϵ = − β t s t ,所以 x t − 1 = 1 α t ( x t + β t s t ) + σ t z x_{t-1} = \frac{1}{\sqrt{\alpha_t}}(x_t + \beta_ts_t) + \sigma_tz x t − 1 = α t 1 ( x t + β t s t ) + σ t z 。1 1 − β t ≈ 1 + 1 2 β t \frac{1}{\sqrt{1 - \beta_t}} \approx 1 + \frac12\beta_t 1 − β t 1 ≈ 1 + 2 1 β t ,展开到一阶:x t − 1 ≈ x t + 1 2 β t x t + β t s t + β t z x_{t-1} \approx x_t + \frac12\beta_tx_t + \beta_ts_t + \sqrt{\beta_t}z x t − 1 ≈ x t + 2 1 β t x t + β t s t + β t z (取 σ t 2 = β t \sigma_t^2 = \beta_t σ t 2 = β t ),和欧拉–丸山步逐项相同。二阶项不同,所以 T T T 小时两者有差别,T → ∞ T \to \infty T → ∞ 时一致。
练习 7(L_simple 与 NCSN 的加权)
证明 ∥ ϵ − ϵ θ ∥ 2 = σ t 2 ∥ s θ + ϵ / σ t ∥ 2 \Vert\epsilon - \epsilon_\theta\Vert^2 = \sigma_t^2\Vert s_\theta + \epsilon/\sigma_t\Vert^2 ∥ ϵ − ϵ θ ∥ 2 = σ t 2 ∥ s θ + ϵ / σ t ∥ 2 (s θ = − ϵ θ / σ t s_\theta = -\epsilon_\theta/\sigma_t s θ = − ϵ θ / σ t ),并说明 L simple L_{\text{simple}} L simple 对应第 14 讲的哪种加权、”t t t 均匀抽取”对应什么样的噪声水平分布。
参考答案
σ t 2 ∥ − ϵ θ / σ t + ϵ / σ t ∥ 2 = ∥ ϵ − ϵ θ ∥ 2 \sigma_t^2\Vert -\epsilon_\theta/\sigma_t + \epsilon/\sigma_t\Vert^2 = \Vert\epsilon - \epsilon_\theta\Vert^2 σ t 2 ∥ − ϵ θ / σ t + ϵ / σ t ∥ 2 = ∥ ϵ − ϵ θ ∥ 2 。这是 λ ( σ ) = σ 2 \lambda(\sigma) = \sigma^2 λ ( σ ) = σ 2 加权的去噪得分匹配(NCSN)。t t t 均匀抽取等价于噪声水平 σ t = 1 − α ˉ t \sigma_t = \sqrt{1 - \bar\alpha_t} σ t = 1 − α ˉ t 按调度的”时间密度”分布:线性调度下大部分 t t t 对应 σ t ≈ 1 \sigma_t \approx 1 σ t ≈ 1 (代码 01 第 1 部分:一半的 t t t 已经几乎是纯噪声),所以 L simple L_{\text{simple}} L simple 实际上很重视大噪声——和 ELBO 的权重(重视小噪声)正好相反(§3.5)。
练习 8(DDIM 与概率流 ODE)
在 DDIM(η = 0 \eta = 0 η = 0 )里令 t ′ = t − Δ t' = t - \Delta t ′ = t − Δ ,把更新写成 x t ′ α ˉ t ′ = x t α ˉ t + ( 1 − α ˉ t ′ α ˉ t ′ − 1 − α ˉ t α ˉ t ) ϵ θ ( x t , 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) α ˉ t ′ x t ′ = α ˉ t x t + ( α ˉ t ′ 1 − α ˉ t ′ − α ˉ t 1 − α ˉ t ) ϵ θ ( x t , t ) 。说明它是变量 x ˉ = x / α ˉ \bar x = x/\sqrt{\bar\alpha} x ˉ = x / α ˉ 、“时间” ν = ( 1 − α ˉ ) / α ˉ \nu = \sqrt{(1 - \bar\alpha)/\bar\alpha} ν = ( 1 − α ˉ ) / α ˉ 下 ODE d x ˉ / d ν = ϵ θ d\bar x/d\nu = \epsilon_\theta d x ˉ / d ν = ϵ θ 的欧拉步。
参考答案
x t ′ = α ˉ t ′ x ^ 0 + 1 − α ˉ t ′ ϵ θ x_{t'} = \sqrt{\bar\alpha_{t'}}\hat x_0 + \sqrt{1 - \bar\alpha_{t'}}\epsilon_\theta x t ′ = α ˉ t ′ x ^ 0 + 1 − α ˉ t ′ ϵ θ ,x ^ 0 = ( x t − 1 − α ˉ t ϵ θ ) / α ˉ t \hat x_0 = (x_t - \sqrt{1 - \bar\alpha_t}\epsilon_\theta)/\sqrt{\bar\alpha_t} x ^ 0 = ( x t − 1 − α ˉ t ϵ θ ) / α ˉ t 。两边除以 α ˉ t ′ \sqrt{\bar\alpha_{t'}} α ˉ t ′ :x t ′ α ˉ t ′ = x t α ˉ 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 α ˉ t ′ x t ′ = α ˉ t x t − α ˉ t 1 − α ˉ t ϵ θ + α ˉ t ′ 1 − α ˉ t ′ ϵ θ ,即 x ˉ t ′ = x ˉ t + ( ν t ′ − ν t ) ϵ θ \bar x_{t'} = \bar x_t + (\nu_{t'} - \nu_t)\epsilon_\theta x ˉ t ′ = x ˉ t + ( ν t ′ − ν t ) ϵ θ ——ODE d x ˉ / d ν = ϵ θ ( x , t ) d\bar x/d\nu = \epsilon_\theta(x, t) d x ˉ / d ν = ϵ θ ( x , t ) 的一步欧拉法。这个 ODE 就是概率流 ODE 换了变量的形式(Song et al. 2021 附录),所以 DDIM 是确定性的、一阶的 ODE 求解器;Heun 这样的二阶方法更准(§6.3)。
练习 9(引导到底在采什么)
(a) 说明 w ≠ 1 w \neq 1 w = 1 时,引导后的”得分” ∇ log p t ( x ) + w ∇ log p t ( y ∣ x ) \nabla\log p_t(x) + w\nabla\log p_t(y \mid x) ∇ log p t ( x ) + w ∇ log p t ( y ∣ x ) 一般不是任何分布族 { p ~ t } \{\tilde p_t\} { p ~ t } (由某个 p ~ 0 \tilde p_0 p ~ 0 经前向过程得到)的得分。(b) 用代码 04 的 w = 8 w = 8 w = 8 结果说明,这种不一致会把样本推到哪里。
参考答案
(a) 若 p ~ 0 ∝ p 0 ( x ) p ( y ∣ x ) w \tilde p_0 \propto p_0(x)p(y \mid x)^w p ~ 0 ∝ p 0 ( x ) p ( y ∣ x ) w ,它加噪后的 p ~ t \tilde p_t p ~ t 的得分是 ∇ log ∫ q ( x t ∣ x 0 ) p 0 ( x 0 ) p ( y ∣ x 0 ) w d x 0 \nabla\log\int q(x_t \mid x_0)p_0(x_0)p(y \mid x_0)^wdx_0 ∇ log ∫ q ( x t ∣ x 0 ) p 0 ( x 0 ) p ( y ∣ x 0 ) w d x 0 ,而 p t ( y ∣ x t ) w = ( ∫ p ( y ∣ x 0 ) p ( x 0 ∣ x t ) d x 0 ) w p_t(y \mid x_t)^w = (\int p(y \mid x_0)p(x_0 \mid x_t)dx_0)^w p t ( y ∣ x t ) w = ( ∫ p ( y ∣ x 0 ) p ( x 0 ∣ x t ) d x 0 ) w ——“先平均再取 w w w 次方”和”先取 w w w 次方再平均”不同,只有 w = 1 w = 1 w = 1 时相等(第 14 讲练习 9)。(b) 大噪声时,∇ log p t ( y ∣ x ) \nabla\log p_t(y \mid x) ∇ log p t ( y ∣ x ) 指向”更像 y y y 、更不像其他类”的方向;乘以 w = 8 w = 8 w = 8 后,样本在大噪声阶段就被推过了头,越过了 0 号模式的中心、远离其他类的一侧,后面的小噪声阶段也拉不回来——代码里 94% 的样本离模式中心超过 0.75,却挤成一个标准差 0.065 的小团。
练习 10(动手:余弦调度)
在 01_forward_and_reverse.py 第 4 部分把 Schedule(T) 换成 Schedule(T, "cosine")。预测:精确 ϵ ∗ \epsilon^* ϵ ∗ 的 DDPM 采样在 T = 10 T = 10 T = 10 、30 时会更好还是更差?为什么?
参考答案(预测的思路)
余弦调度在小 t t t 时 β t \beta_t β t 更小、在大 t t t 时更大(α ˉ T \bar\alpha_T α ˉ T 只有 2 × 10 − 9 2\times10^{-9} 2 × 1 0 − 9 )。步数少时,最难的是”从几乎纯噪声走到模式分开”的那一段和最后的细节;余弦调度把更多步数放在中间信息丰富的区间,通常对少步数采样更友好。但 T = 10 T = 10 T = 10 时最后一步的 β T \beta_T β 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)、可逆变换(流)、得分 ∇ x log p \nabla_x\log p ∇ x log p (得分模型、扩散)。可是很多数据和隐变量本身是离散 的:类别、单词、“这张图是哪种形状”。第 17 讲(原课 Lecture 17,Discrete Latent Variable Models )问:隐变量是离散的时候,重参数化技巧不能用了,怎样求梯度?
对数导数技巧(REINFORCE)及其高方差;控制变量与基线(NVIL);
Gumbel-max 技巧与 Gumbel-Softmax:连续松弛、温度带来的偏差–方差权衡;
像素世界上的离散隐变量 VAE(4 个 8 类的符号,4,096 个码字可以枚举):几种梯度估计量的偏差、方差与 ELBO。