第 8 讲 · 扩散模型(下)· Diffusion Models (Part II) + VAE 引子

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

课程源码 ZIP ↓

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

本篇目录

对应 Maps to:CMU 10-423 / 10-623 / 10-723 Generative AI(Spring 2026;Aran Nayebi、Matt Gormley),Lecture 8 · Mon 9-Feb · Diffusion models (Part II)(slides:lecture8-diffusion-vae)。 阅读材料:Ho, Jain & Abbeel (2020), DDPM;Blei, Kucukelbir & McAuliffe (2017), Variational Inference: A Review for Statisticians;Doersch (2016), Tutorial on Variational Autoencoders。 依据说明:本讲以原课第 8 讲公开的 slides 为主线:回顾 U-Net、扩散模型与 DDPM、高斯的性质、三种参数化;训练算法的几个版本(选项 A:遍历所有时间步 / 随机挑时间步;选项 B;选项 C”实践中最好”)与训练的计算图;采样算法(一般形式、高斯形式、选项 A / B / C 各自的版本);DDPM 的目标函数是 ELBO(“其中的 KL 项 Lt−1L_{t-1} 希望两个条件分布尽量接近”);最后引出 VAE(GAN → VAE → 扩散模型的对照,以及讲 VAE 之前要铺垫的七件事)。ELBO 的逐项推导、少步采样(DDPM 跳步、DDIM)、余弦调度是本讲义按 Ho et al. (2020)、Song et al. (2021)、Nichol & Dhariwal (2021) 补充的。所有实验是本讲义自己设计的,不代表课堂上讲了什么。 配套代码 Code:code/lecture08/(4 个脚本 + 1 个模块;02 训练 U-Net 约 5.5 分钟,03 约 2 分钟,都有 --quick;其余几秒) 预计阅读时间:4 小时(含运行代码)


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

0.1 学习目标 Learning goals

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

  1. 写出 slides 的训练算法(选项 A / B / C)和采样算法,说明”遍历所有时间步”和”随机挑一个时间步”为什么等价。
  2. 从 log⁡pθ(x0)\log p_\theta(x_0) 出发推出 DDPM 的 ELBO,说出 LTL_T、Lt−1L_{t-1}、L0L_0 各是什么;把 Lt−1L_{t-1} 化成”加权的噪声预测误差”,解释 Ho et al. 为什么把权重换成 1。
  3. 在 28×28 的图像上训练扩散模型,解释为什么去噪网络要用 U-Net 而不是 MLP。
  4. 比较 DDPM 跳步和 DDIM,解释为什么少步时 DDIM 好得多;说明”确定性采样”带来的隐空间。
  5. 解释噪声调度的作用,比较线性和余弦调度。
  6. 用”隐变量 + 变分下界”把扩散模型和 VAE 联系起来。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面再展开 Previewed only
第 7 讲:前向过程、性质 1–3、三种参数化、U-NetVAE 的完整推导(第 9 讲)
前置讲 P2 §4:ELBO 的两种推导、log⁡p(x)=ELBO+KL\log p(x) = \text{ELBO} + \text{KL}潜空间扩散、分类器无关引导(第 12 讲)
第 6 讲 §0.4:评估生成图像的四把尺子蒸馏、一致性模型等更快的采样(第 18 讲)

0.3 本讲地图 Map

§1  训练与采样算法:slides 的几个版本
§2  目标函数从哪里来:DDPM 的 ELBO                                    ← 代码 01
§3  在形状世界上训练:U-Net vs MLP,和 GAN 比                          ← 代码 02
§4  采样要几步:DDPM 跳步 vs DDIM;确定性与插值                         ← 代码 03
§5  噪声调度:线性 vs 余弦                                            ← 代码 04
§6  从扩散模型到 VAE
§7–11  小结、误区、练习、延伸阅读、下一讲

1. 训练与采样算法 · Training and sampling

1.1 训练:slides 的四个版本

第 7 讲 §5.1 说过:给定一个训练样本 x0x_0,我们希望 pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t) 尽量接近 q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0)。参数化方式不同,训练算法就不同。slides 依次给了四个版本:

选项 A,遍历所有时间步:

for x_0 ∈ D:
  for t ∈ {1, …, T}:
    ε ~ N(0, I);  x_t ← √ᾱ_t x_0 + √(1−ᾱ_t) ε
    μ̃ ← α_t^(0) x_0 + α_t^(t) x_t
    ℓ_t(θ) ← ‖μ̃ − μ_θ(x_t, t)‖²
  θ ← θ − ∇_θ Σ_t ℓ_t(θ)

选项 A,随机挑一个时间步:把内层的”遍历所有 tt“换成 t∼Uniform(1,…,T)t \sim \text{Uniform}(1, \ldots, T),每个 x0x_0 只算一个 ℓt\ell_t。

选项 B:ℓt(θ)=∥x0−xθ(0)(xt,t)∥2\ell_t(\theta) = \lVert x_0 - x_\theta^{(0)}(x_t, t)\rVert^2。选项 C:ℓt(θ)=∥ε−εθ(xt,t)∥2\ell_t(\theta) = \lVert\varepsilon - \varepsilon_\theta(x_t, t)\rVert^2——slides 标注”选项 C 实践中最好”(第 7 讲 §5.3 的实验和解释)。

“遍历所有 tt“和”随机挑一个 tt“有什么关系?对固定的 x0x_0,Et∼Uniform[ℓt]=1T∑tℓt\mathbb E_{t \sim \text{Uniform}}[\ell_t] = \frac{1}{T}\sum_t \ell_t:随机挑一个 tt 的梯度是”遍历所有 tt“的梯度的无偏估计(差一个常数 TT),计算量却只有 1/T1/T。这和第 3 讲”用小批量代替整个数据集”是同一个道理:用一点点噪声换来巨大的计算节省。

训练的计算图(slides):x0x_0 和 ε\varepsilon 经过性质 1 得到 xtx_t;xtx_t 和 tt 进 U-Net 得到 εθ\varepsilon_\theta;和 ε\varepsilon 比较得到损失。注意计算图里只有一次网络调用——训练时不需要走完整条马尔可夫链。

1.2 采样:slides 的五个版本

一般形式:xT∼pθ(xT)x_T \sim p_\theta(x_T);对 t=T,…,1t = T, \ldots, 1:xt−1∼pθ(xt−1∣xt)x_{t-1} \sim p_\theta(x_{t-1} \mid x_t);返回 x0x_0。代入高斯:xt−1∼N(μθ(xt,t),Σθ(xt,t))x_{t-1} \sim \mathcal N(\mu_\theta(x_t, t), \Sigma_\theta(x_t, t)),即 xt−1=μθ(xt,t)+σtεx_{t-1} = \mu_\theta(x_t, t) + \sigma_t \varepsilon。三种参数化的区别只在”怎样算出 μθ\mu_\theta”:

第 3–4 行
选项 Aμ^t=μθ(xt,t)\hat\mu_t = \mu_\theta(x_t, t)
选项 Bμ^t=αt(0)xθ(0)(xt,t)+αt(t)xt\hat\mu_t = \alpha_t^{(0)} x_\theta^{(0)}(x_t, t) + \alpha_t^{(t)} x_t
选项 Cx^0=(xt−1−αˉt εθ(xt,t))/αˉt\hat x_0 = (x_t - \sqrt{1-\bar\alpha_t}\,\varepsilon_\theta(x_t, t))/\sqrt{\bar\alpha_t};μ^t=αt(0)x^0+αt(t)xt\hat\mu_t = \alpha_t^{(0)}\hat x_0 + \alpha_t^{(t)} x_t

然后都是 xt−1←μ^t+σtεx_{t-1} \leftarrow \hat\mu_t + \sigma_t\varepsilon(最后一步 σ1=0\sigma_1 = 0)。diffusion_lab.predict_mean 就是这张表;sample 是外面的循环。实践中还常把 x^0\hat x_0 截断到数据的范围(图像是 [−1,1][-1, 1])再代入——DDPM 官方实现的默认做法,能减少越界的像素。

训练和采样的不对称:训练时每一步独立、随机挑 tt、一次网络调用;采样时必须从 t=Tt = T 一步步走到 1,要调用网络 TT 次。DDPM 的 T=1000T = 1000,画一张图就要跑 1000 次 U-Net——这是扩散模型最大的代价(§4)。


2. 目标函数从哪里来:DDPM 的 ELBO · The DDPM objective

2.1 为什么要”下界”

和 GAN、VAE 一样(第 7 讲 §1),扩散模型的边缘似然

pθ(x0)=∫pθ(xT)∏t=1Tpθ(xt−1∣xt) dx1:Tp_\theta(x_0) = \int p_\theta(x_T)\prod_{t=1}^T p_\theta(x_{t-1} \mid x_t)\, dx_{1:T}

是对 T×784T \times 784 维的积分,算不出来。slides 的表格写的学习目标是 θ=arg⁡min⁡KL(q(z1:T∣x) ∥ pθ(z1:T∣x))\theta = \arg\min \mathrm{KL}(q(z_{1:T} \mid x) \,\|\, p_\theta(z_{1:T} \mid x))——让”前向过程给出的隐变量分布”和”模型认为的隐变量后验”接近。前置讲 P2 §4.3 证明过:对任意 qq,

log⁡pθ(x0)=Eq(x1:T∣x0) ⁣[log⁡pθ(x0:T)q(x1:T∣x0)]⏟ELBO+KL(q(x1:T∣x0) ∥ pθ(x1:T∣x0)).\log p_\theta(x_0) = \underbrace{\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]}_{\text{ELBO}} + \mathrm{KL}\big(q(x_{1:T} \mid x_0) \,\|\, p_\theta(x_{1:T} \mid x_0)\big).

KL ≥ 0,所以 ELBO ≤ log p;最大化 ELBO = 在最大化似然的下界,同时让上面那个 KL 变小。扩散模型的特别之处:q(x1:T∣x0)q(x_{1:T} \mid x_0) 是固定的前向过程,不用学(VAE 要学,第 9 讲)。

2.2 逐项拆开

把 pθ(x0:T)=p(xT)∏tpθ(xt−1∣xt)p_\theta(x_{0:T}) = p(x_T)\prod_t p_\theta(x_{t-1} \mid x_t) 和 q(x1:T∣x0)=∏tq(xt∣xt−1)q(x_{1:T} \mid x_0) = \prod_t q(x_t \mid x_{t-1}) 代进 ELBO,关键一步是用贝叶斯公式把每个前向步”翻转”成以 x0x_0 为条件的反向步:

q(xt∣xt−1)=q(xt∣xt−1,x0)=q(xt−1∣xt,x0) q(xt∣x0)q(xt−1∣x0)(t≥2).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)} \qquad (t \ge 2).

(第一个等号是马尔可夫性。)连乘时 q(xt∣x0)/q(xt−1∣x0)q(x_t \mid x_0)/q(x_{t-1} \mid x_0) 逐项抵消(“望远镜”求和),只剩 q(xT∣x0)/q(x1∣x0)q(x_T \mid x_0)/q(x_1 \mid x_0)。整理得到 Ho et al. (2020) 的式 5——负 ELBO:

Eq[KL(q(xT∣x0) ∥ p(xT))⏟LT+∑t=2TKL(q(xt−1∣xt,x0) ∥ pθ(xt−1∣xt))⏟Lt−1−log⁡pθ(x0∣x1)⏟L0].\mathbb E_q\Big[\underbrace{\mathrm{KL}(q(x_T \mid x_0) \,\|\, p(x_T))}_{L_T} + \sum_{t=2}^{T}\underbrace{\mathrm{KL}(q(x_{t-1} \mid x_t, x_0) \,\|\, p_\theta(x_{t-1} \mid x_t))}_{L_{t-1}} \underbrace{- \log p_\theta(x_0 \mid x_1)}_{L_0}\Big].
  • LTL_T:前向过程走到底有多接近 N(0,I)\mathcal N(0, I)。没有参数,不用学(第 7 讲 §3.3:约 0.013 nat)。
  • Lt−1L_{t-1}:slides 的原话——“这个 KL 项希望两个条件分布尽量接近”。左边是第 7 讲的性质 2(给定 x0x_0 的精确反向一步),右边是学到的反向一步。这就是第 7 讲 §5.1 那句”之后我们会证明”的证明。
  • L0L_0:最后一步”解码”出数据的对数似然。

2.3 Lt−1L_{t-1} = 加权的噪声预测误差

两个方差相同(都取 σt2\sigma_t^2,第 7 讲的”想法 1”)的高斯之间的 KL 只剩均值项:

Lt−1=12σt2∥μ~q(xt,x0)−μθ(xt,t)∥2+常数.L_{t-1} = \frac{1}{2\sigma_t^2}\lVert\tilde\mu_q(x_t, x_0) - \mu_\theta(x_t, t)\rVert^2 + \text{常数}.

再用性质 3 把两个均值都写成噪声的形式,μ~q−μθ=1−αtαt1−αˉt(εθ−ε)\tilde\mu_q - \mu_\theta = \frac{1-\alpha_t}{\sqrt{\alpha_t}\sqrt{1-\bar\alpha_t}}(\varepsilon_\theta - \varepsilon):

Lt−1=(1−αt)22σt2 αt (1−αˉt)⏟wt ∥ε−εθ(xt,t)∥2.L_{t-1} = \underbrace{\frac{(1-\alpha_t)^2}{2\sigma_t^2\,\alpha_t\,(1-\bar\alpha_t)}}_{w_t}\ \lVert\varepsilon - \varepsilon_\theta(x_t, t)\rVert^2 .

01 的第 1 部分在 1000 个随机样本上核对:KL 的闭式解和 wt∥ε−ε^∥2w_t\lVert\varepsilon - \hat\varepsilon\rVert^2 逐个相同(最大相对误差 6e-9)。

2.4 ELBO 的权重 vs LsimpleL_\text{simple}

t2310501002505007501000
wtw_t0.6000.3180.0860.0190.0100.00540.00550.00770.0102

严格的 ELBO 最看重最开始的几步:t=2t = 2 的权重是 t=1000t = 1000 的 59 倍,t=2..100t = 2..100 这 99 步占了全部权重的 39%(均匀的话是 10%)。原因:tt 很小时后验方差 σt2\sigma_t^2 极小,均值稍偏一点 KL 就很大。

Ho et al. (2020) 的关键发现:把所有 wtw_t 换成 1——也就是第 7 讲的选项 C,他们叫 LsimpleL_\text{simple}——样本质量反而更好。相对于 ELBO,它降低了小 tt(几乎没噪声、只差一点点)的权重,把注意力挪到更难、对画面更重要的大 tt 上。代价是 LsimpleL_\text{simple} 不再是似然的下界。(第 7 讲 §5.3 的三种参数化,加上这里的 ELBO,一共是同一个目标的四种时间加权。)

2.5 真的算一次:瑞士卷上的 ELBO

用第 1 部分的等式,可以拿第 7 讲训练好的”预测噪声”网络直接算 ELBO。瑞士卷的真实密度也能算(对螺线参数做数值积分),于是可以把 ELBO 和真实数据的对数似然放在一起看(01 的第 3 部分,2000 个新数据点,单位 nat):

项平均值包含几项平均每项
L0L_0(t=1t = 1 的解码,标准差取 1−α1=0.01\sqrt{1-\alpha_1} = 0.01)−6.3711−6.371
L1..L9L_1..L_9(t=2..10t = 2..10)+3.5599+0.396
t=11..100t = 11..100+2.78890+0.031
t=101..500t = 101..500+2.365400+0.006
t=501..1000t = 501..1000+0.154500+0.0003
LTL_T+0.0001+0.0001
  • ELBO 的平均值 −2.495,真实数据的平均 log⁡p(x)\log p(x) −1.273:下界成立,差 1.22 nat。差距包括模型本身不完美(log⁡pθ<log⁡pdata\log p_\theta < \log p_\text{data})和下界不紧(ELBO<log⁡pθ\text{ELBO} < \log p_\theta)两部分。
  • L0L_0 是负数:它是连续分布的 −log⁡-\log 密度,解码器标准差只有 0.01,密度远大于 1。所以 ELBO 的各项不是”占百分之几”的关系。
  • KL 项几乎全来自最后几步:t=2..10t = 2..10 平均每步 0.40 nat,t>500t > 500 每步只有 0.0003。这个模型是用 LsimpleL_\text{simple} 训练的,在 ELBO 最在乎的地方没用全力;想要更好的似然,可以学方差、改权重(Nichol & Dhariwal, 2021;Kingma et al., 2021)。

3. 在形状世界上训练 · DDPM on the shapes world

02 在和第 6 讲 GAN 完全相同的 8192 张形状图上(像素缩放到 [−1,1][-1, 1])训练选项 C 的 DDPM:T=1000T = 1000 的线性调度,每步 64 张,Adam(学习率 1e-3,前 200 步预热),4000 步,参数的指数滑动平均(EMA,衰减 0.995,采样用 EMA 的权重——DDPM 及之后几乎所有扩散模型都这样做,它平滑掉了 SGD 最后阶段的抖动)。

两个去噪网络:第 7 讲的小 U-Net(192,140 个参数,单线程每步约 70 ms,共 280 秒),和一个参数多 25 倍的 MLP(4,888,336 个,每步 8 ms)。

训练损失(最后 200 步)t = 50t = 250t = 750采样:FD↓像形状的比例
U-Net0.03780.1710.0240.001712.830.10
MLP0.12870.5100.0670.03144600.00

(t = … 列是 500 张没见过的图上的噪声预测误差;采样用 DDIM 50 步,各 500 张,§4。)

MLP 版本完全画不出形状。去噪需要”同一个局部规则用在每个位置上”——这正是卷积的归纳偏置(第 5 讲、第 7 讲 §7.4)。

和第 6 讲的 DCGAN 比(用同一套尺子,DDIM 50 步):FD 12.83 vs 33.85,像形状的比例 0.10 vs 0.03。扩散模型在 FD 上明显更好;但两把”分类”尺子(裁判和形状拟合)仍然只有约 35% 的时候意见一致——和 GAN 一样,生成的形状还不够标准,“画的是哪一类”本身就说不清(第 6 讲 §4.2)。按形状拟合,十字也偏少(0.06)。


4. 采样要几步?· How many sampling steps?

4.1 两种少步采样

DDPM 跳步(respacing):只在 SS 个均匀分布的时间步 τ1<⋯<τS\tau_1 < \cdots < \tau_S 上走。新调度的 αˉi′=αˉτi\bar\alpha'_i = \bar\alpha_{\tau_i},于是 αi′=αˉτi/αˉτi−1\alpha'_i = \bar\alpha_{\tau_i}/\bar\alpha_{\tau_{i-1}}——把原来连续的几小步噪声”合并”成一大步,其余公式不变(Schedule.respace)。网络还是同一个,只是每一步的步子大了。

DDIM(Song, Meng & Ermon, 2021):同一个训练好的网络,换一种确定性的反向过程。每一步先用网络估计 x^0\hat x_0,再按前向过程的闭式解把它”加噪”到下一个(更小的)噪声水平——只是加回去的不是新的随机噪声,而是网络认为”原本就在里面”的那份 ε^\hat\varepsilon:

xτ′=αˉτ′ x^0+1−αˉτ′ ε^,x^0=xτ−1−αˉτ ε^αˉτ, ε^=εθ(xτ,τ).x_{\tau'} = \sqrt{\bar\alpha_{\tau'}}\,\hat x_0 + \sqrt{1-\bar\alpha_{\tau'}}\,\hat\varepsilon,\qquad \hat x_0 = \frac{x_\tau - \sqrt{1-\bar\alpha_\tau}\,\hat\varepsilon}{\sqrt{\bar\alpha_\tau}},\ \hat\varepsilon = \varepsilon_\theta(x_\tau, \tau).

为什么可以用同一个网络?DDPM 的训练目标只涉及边缘分布 q(xt∣x0)q(x_t \mid x_0),不涉及”相邻两步怎样衔接”。DDIM 构造了一族不同的前向过程,它们有相同的 q(xt∣x0)q(x_t \mid x_0),所以训练目标完全一样;其中 η=0\eta = 0 的那一个反向过程是确定性的。

4.2 实验

03 用 §3 的 U-Net,每种方法采 250 张(真图 250 张的 FD”满分”是 3.26):

方法步数⏱ 每张图FD↓像形状的比例边缘宽度像素噪声两把”分类”尺子一致
真实新图——3.261.000.610.0300.98
DDPM1000317 ms28.760.200.860.0260.40
DDPM10032 ms41.100.240.850.0210.49
DDPM5016 ms41.080.290.850.0190.53
DDPM206 ms76.280.400.870.0150.45
DDPM103 ms102.750.420.930.0140.38
DDIM10031 ms13.610.100.940.0310.34
DDIM5016 ms12.720.100.940.0290.35
DDIM206 ms14.000.120.960.0260.36
DDIM103 ms25.420.101.020.0270.35

(⏱ 是单线程 CPU 上的实测,每次运行略有不同。边缘宽度:拟合形状时最合适的边缘模糊程度;像素噪声:远离边缘的平坦区域里的噪声。完整的列见脚本输出。)

几个结论:

  • 按 FD,DDIM 少步时稳得多:DDIM 10 步(FD 25.4)比 DDPM 跳到 10 步(102.8)好得多,DDIM 50 步(12.7)甚至比走满 1000 步的 DDPM(28.8)还好。
  • 但”像形状的比例”给出了相反的趋势:DDPM 步数越少越高(1000 步 0.20 → 10 步 0.42)。看纹理就明白了:DDPM 10 步的像素噪声只有 0.014(真图 0.030、DDPM 1000 步 0.026),边缘宽度 0.93(真图 0.61)——步子太大时,每一步的高斯近似把纹理”平均掉”了,画出来的是干净、平滑、但不真实的形状。形状拟合喜欢这种图,FD 不喜欢。又一次,两把尺子给出了不同的排序。
  • 为什么 DDPM 跳步不行:每一步仍然是”一个高斯”。第 7 讲 §4.2 证明过,步子越大,真正的反向一步越不像高斯,这个近似就越差。DDIM 不再假设”每一步是高斯”,而是每一步都先猜一个完整的 x^0\hat x_0,再确定性地走过去——步子大了也只是”猜得粗一点”。
  • 时间:每一步跑一次 U-Net。DDPM 1000 步每张图约 0.3 秒,DDIM 50 步约 16 ms——20 倍的加速。第 18 讲会讲更激进的加速(蒸馏到几步甚至一步)。

4.3 DDIM 的确定性与插值

DDIM 是确定性的:同样的 xTx_T 采两次(随机种子不同),结果完全相同(最大差别 0)。于是扩散模型也有了一个像 GAN 一样的”隐空间” xT↦x0x_T \mapsto x_0,可以插值、编辑——后来很多图像编辑方法(第 14 讲的 Prompt-to-Prompt 等)都建立在这种确定性的采样上。

插值要走球面。784 维的标准高斯向量,长度几乎总是 784=28\sqrt{784} = 28 左右(高维高斯的”薄壳”)。两个这样的向量直线插值,中点的长度只有约 28/2≈19.828/\sqrt2 \approx 19.8——落在训练时从没见过的地方;球面插值(slerp)保持长度不变。03 对 50 对随机起点比较插值中点生成的图:

起点平均 ∥xT∥\lVert x_T\rVert像形状的比例边缘宽度像素噪声裁判确信度
端点(α = 0)28.00.120.920.0280.905
直线插值的中点19.80.620.820.0150.836
球面插值的中点27.90.140.920.0290.878

我原以为直线插值的中点会”变空白”;实际上它们仍是完整的形状,只是更干净、更平滑:像素噪声从 0.028 降到 0.015,“像形状的比例”反而从 0.12 升到 0.62——起点里的噪声少了,最后画出来的细节和纹理也少了,和 §4.2 里少步 DDPM 的情况一样,形状拟合喜欢、但这不是数据的样子。球面插值的中点和端点几乎没有区别。大模型上直线插值常常得到发灰、模糊的图,所以在高斯噪声的空间里插值通常沿着球面走(slerp)。


5. 噪声调度 · Noise schedules

slides:“我们选一个固定的 αt\alpha_t 调度,使得 q(xT)≈N(0,I)q(x_T) \approx \mathcal N(0, I)。“满足这个条件的调度有无数种。Nichol & Dhariwal (2021) 提出的余弦调度直接规定

αˉt=f(t)f(0),f(t)=cos⁡2 ⁣(t/T+s1+s⋅π2), s=0.008.\bar\alpha_t = \frac{f(t)}{f(0)},\qquad f(t) = \cos^2\!\left(\frac{t/T + s}{1+s}\cdot\frac{\pi}{2}\right),\ s = 0.008 .

04 比较两种调度(T=1000T = 1000):

t1100250500750900
线性:αˉt\bar\alpha_t0.99990.8970.5240.0790.0030.0003
余弦:αˉt\bar\alpha_t1.00000.9720.8470.4940.1440.024

用 xtx_t 和 x0x_0 的相关系数衡量一张形状图”还看得出来”的程度(200 张图的平均):

调度几乎干净(> 0.9)的步数中间(0.1–0.9)几乎纯噪声(≤ 0.1)相关降到 0.5 以下的第一步
线性74507419248
余弦151732117477

线性调度有 42% 的步数里图像已经几乎是纯噪声。训练好的网络在这些步上能做的很少:t=700t = 700 时 xtx_t 和 x0x_0 的相关只有 0.045,网络估计的 x^0\hat x_0 还能有 0.394(它利用了”形状长什么样”的先验);但 t=900t = 900、1000 时只剩 0.091、0.074——只能猜一个”平均的形状”。采样时每一步都要跑一次网络,线性调度把太多步花在了这里。余弦调度让 αˉt\bar\alpha_t 在中间下降得更平缓,把步数更均匀地分给”从清楚到模糊”的整个过程(Nichol & Dhariwal 在 32×32、64×64 的图上看到了改进)。


6. 从扩散模型到 VAE · From diffusion to VAEs

slides 的后半段回到”GAN → VAE → 扩散模型”的表格(第 7 讲 §1),这一次关注中间一列。三者都是隐变量模型,都不能直接做最大似然:

  • 扩散模型:TT 层隐变量,每层和数据一样大;“编码器” q(xt∣xt−1)q(x_t \mid x_{t-1}) 固定;解码器 pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t) 学;目标是 ELBO(§2)。
  • VAE:一层隐变量 zz,通常比数据小得多;编码器 qϕ(z∣x)q_\phi(z \mid x) 也要学;解码器 pθ(x∣z)p_\theta(x \mid z);目标同样是 ELBO。

所以扩散模型可以看成一个”层数很多、编码器固定、每层隐变量都和数据一样大”的 VAE。反过来,VAE 要学编码器,就必须面对扩散模型没有的问题:编码器 qϕ(z∣x)q_\phi(z \mid x) 的参数出现在”对谁求期望”里,怎样对它求梯度?slides 列出了讲 VAE 之前要铺垫的七件事:

  1. 自编码器(不是变分的那种);
  2. KL 散度;
  3. 变分推断(用 KL 作目标函数);
  4. 蒙特卡洛估计(近似期望);
  5. (得分函数技巧);
  6. 重参数化技巧(降低方差);
  7. 随机梯度变分贝叶斯(SGVB)。

这就是第 9 讲的内容。


7. 小结 · Summary

  1. 训练时随机挑一个 tt,是”遍历所有 tt“的无偏估计,每个样本只需一次网络调用;采样时必须一步步走,要调用网络 TT 次。
  2. DDPM 的目标是 ELBO:LT+∑Lt−1+L0L_T + \sum L_{t-1} + L_0。Lt−1L_{t-1} 是”给定 x0x_0 的精确反向一步”和”学到的反向一步”之间的 KL,化简后是 wt∥ε−εθ∥2w_t\lVert\varepsilon - \varepsilon_\theta\rVert^2。
  3. ELBO 的权重 wtw_t 最看重最开始的几步;Ho et al. 把它们全换成 1(LsimpleL_\text{simple}),样本更好,但不再是似然的下界。
  4. 在 28×28 的图像上,U-Net 扩散模型的 FD 远好于 GAN;同样训练的 MLP 版本完全失败。
  5. DDPM 跳步在少步时退化(每一步的高斯近似失效,纹理被平均掉);DDIM 用同一个网络、确定性地采样,50 步就比 DDPM 1000 步的 FD 好。
  6. DDIM 让扩散模型有了确定性的”隐空间”;在高斯噪声空间里插值要走球面。
  7. 线性调度把太多步花在”几乎纯噪声”上,余弦调度分配得更均匀。
  8. 扩散模型 = 编码器固定、层数很多的 VAE;VAE 要学编码器,于是需要变分推断和重参数化(第 9 讲)。

8. 常见误区 · Common pitfalls

  • “随机挑一个 tt 训练,会漏掉一些 tt。” 在期望意义上每个 tt 都被同等对待;和小批量 SGD 一样,是无偏估计。
  • “DDPM 的训练目标就是 ELBO。” 严格的 ELBO 有权重 wtw_t;DDPM 实际用的是去掉权重的 LsimpleL_\text{simple},它不是似然的下界。
  • “ELBO 的每一项都是正的。” L0L_0 是连续密度的负对数,可以是负数(§2.5 是 −6.37)。
  • “少走几步,就是画得粗一点。” 对 DDPM 跳步来说不是:步子太大,每一步的高斯近似本身就错了,结果是纹理被平均掉、FD 大幅变差。DDIM 才是”粗一点”。
  • “DDIM 要重新训练。” 不需要,它用的就是 DDPM 训练好的网络。
  • “像形状的比例越高越好。” 平滑、没有纹理的图在形状拟合上得分很高(DDPM 10 步 0.42),FD 却很差。多看几把尺子。
  • “在噪声空间里插值和在 GAN 的 zz 空间里一样,直线就行。” 高维高斯的长度集中在 d\sqrt d 附近,直线插值的中点长度只有 1/21/\sqrt2。

9. 练习 · Exercises

练习 1(遍历 vs 随机)。 证明:对固定的 x0x_0,“随机挑一个 tt“的梯度乘以 TT,是”遍历所有 tt“的梯度的无偏估计。它的方差从哪里来?

参考答案

Et[T∇ℓt]=T⋅1T∑t∇ℓt=∑t∇ℓt\mathbb E_{t}[T\nabla\ell_t] = T\cdot\frac1T\sum_t\nabla\ell_t = \sum_t\nabla\ell_t。方差来自两处:挑到哪个 tt(不同 tt 的损失量级差很多,第 7 讲 §6.4),以及每个 tt 上随机的 ε\varepsilon。重要性采样 tt(按损失大小挑)可以减小第一部分(Nichol & Dhariwal, 2021)。

练习 2(望远镜)。 写出 ∏t=2Tq(xt∣x0)q(xt−1∣x0)\prod_{t=2}^{T}\frac{q(x_t \mid x_0)}{q(x_{t-1} \mid x_0)} 化简后的结果,并说明它在 ELBO 里变成了哪一项。

参考答案

q(xT∣x0)q(x1∣x0)\frac{q(x_T \mid x_0)}{q(x_1 \mid x_0)}。和 p(xT)p(x_T) 合起来给出 LT=KL(q(xT∣x0) ∥ p(xT))L_T = \mathrm{KL}(q(x_T \mid x_0)\,\|\,p(x_T));分母的 q(x1∣x0)q(x_1 \mid x_0) 和 t=1t = 1 那一项 q(x1∣x0)q(x_1 \mid x_0)(前向第一步)抵消,剩下 −log⁡pθ(x0∣x1)-\log p_\theta(x_0 \mid x_1),即 L0L_0。

练习 3(权重)。 用 σt2=(1−αˉt−1)(1−αt)1−αˉt\sigma_t^2 = \frac{(1-\bar\alpha_{t-1})(1-\alpha_t)}{1-\bar\alpha_t} 化简 wt=(1−αt)22σt2αt(1−αˉt)w_t = \frac{(1-\alpha_t)^2}{2\sigma_t^2\alpha_t(1-\bar\alpha_t)},并估算 t=2t = 2 时的值(1−α1=10−41 - \alpha_1 = 10^{-4},1−α2≈1.2×10−41 - \alpha_2 \approx 1.2\times10^{-4})。

参考答案

代入得 wt=1−αt2αt(1−αˉt−1)w_t = \frac{1-\alpha_t}{2\alpha_t(1-\bar\alpha_{t-1})}。t=2t = 2:1−αˉ1=10−41-\bar\alpha_1 = 10^{-4},所以 w2≈1.2×10−42×10−4=0.6w_2 \approx \frac{1.2\times10^{-4}}{2\times 10^{-4}} = 0.6(01 的输出:0.5997)。tt 很大时 1−αˉt−1≈11-\bar\alpha_{t-1} \approx 1,wt≈(1−αt)/2≈0.01w_t \approx (1-\alpha_t)/2 \approx 0.01。

练习 4(L0L_0 为什么是负的)。 一维数据,解码器 pθ(x0∣x1)=N(x0; μ,0.012)p_\theta(x_0 \mid x_1) = \mathcal N(x_0;\ \mu, 0.01^2),如果 μ\mu 恰好等于 x0x_0,L0L_0 是多少?

参考答案

−log⁡N=12log⁡(2π⋅10−4)=12(1.838−9.210)=−3.69-\log\mathcal N = \tfrac12\log(2\pi\cdot 10^{-4}) = \tfrac12(1.838 - 9.210) = -3.69 nat。二维再乘 2:−7.37。§2.5 的 −6.37 比这个大约 1 nat,因为 μ\mu 并不完全等于 x0x_0。连续分布的密度可以大于 1,负对数就可以是负数。

练习 5(DDIM 一步)。 设 αˉτ=0.25\bar\alpha_\tau = 0.25、αˉτ′=0.64\bar\alpha_{\tau'} = 0.64,当前 xτ=1.0x_\tau = 1.0,网络预测 ε^=0.4\hat\varepsilon = 0.4。求 x^0\hat x_0 和 DDIM 的下一步 xτ′x_{\tau'}。

参考答案

x^0=(1.0−0.75×0.4)/0.5=(1.0−0.3464)/0.5=1.307\hat x_0 = (1.0 - \sqrt{0.75}\times0.4)/0.5 = (1.0 - 0.3464)/0.5 = 1.307(如果截断到 [−1,1][-1, 1],则 x^0=1\hat x_0 = 1,再重算 ε^=(1.0−0.5×1)/0.75=0.577\hat\varepsilon = (1.0 - 0.5\times1)/\sqrt{0.75} = 0.577)。不截断时:xτ′=0.8×1.307+0.6×0.4=1.286x_{\tau'} = 0.8\times1.307 + 0.6\times0.4 = 1.286。

练习 6(为什么同一个网络能用于 DDIM)。 DDPM 的训练损失 Et,x0,ε∥ε−εθ(αˉtx0+1−αˉtε,t)∥2\mathbb E_{t, x_0, \varepsilon}\lVert\varepsilon - \varepsilon_\theta(\sqrt{\bar\alpha_t}x_0 + \sqrt{1-\bar\alpha_t}\varepsilon, t)\rVert^2 依赖前向过程的哪些性质?

参考答案

只依赖每个 tt 的边缘 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),不依赖相邻两步的联合分布 q(xt−1,xt∣x0)q(x_{t-1}, x_t \mid x_0)。任何具有相同边缘的前向过程(DDIM 构造的那一族)都给出相同的训练目标,所以训练好的 εθ\varepsilon_\theta 对它们都适用。

练习 7(高维的”薄壳”)。 z∼N(0,Id)z \sim \mathcal N(0, I_d),∥z∥2\lVert z\rVert^2 的均值和方差是多少?d=784d = 784 时 ∥z∥\lVert z\rVert 大约在什么范围?两个独立的 z0,z1z_0, z_1 直线插值的中点长度约是多少?

参考答案

∥z∥2∼χd2\lVert z\rVert^2 \sim \chi^2_d,均值 dd、方差 2d2d。d=784d = 784:∥z∥2≈784±40\lVert z\rVert^2 \approx 784 \pm 40,∥z∥≈28±0.7\lVert z\rVert \approx 28 \pm 0.7。中点 (z0+z1)/2∼N(0,I/2)(z_0 + z_1)/2 \sim \mathcal N(0, I/2),长度约 28/2≈19.828/\sqrt2 \approx 19.8(03 实测 19.8)。

练习 8(余弦调度)。 余弦调度在 t=T/2t = T/2 时 αˉt\bar\alpha_t 约是多少?为什么要加一个小的偏移 ss?

参考答案

αˉT/2≈cos⁡2(0.5+s1+s⋅π2)/cos⁡2(s1+s⋅π2)≈cos⁡2(π/4)=0.5\bar\alpha_{T/2} \approx \cos^2(\frac{0.5 + s}{1+s}\cdot\frac\pi2)/\cos^2(\frac{s}{1+s}\cdot\frac\pi2) \approx \cos^2(\pi/4) = 0.5(04:0.494)。没有 ss 时,tt 很小处 1−αˉt1 - \bar\alpha_t 太小(噪声几乎为 0),网络在那里很难学到有用的东西;Nichol & Dhariwal 取 s=0.008s = 0.008,让 t=1t = 1 时的噪声标准差和像素的量化间隔(1/127.5)差不多。

10. 延伸阅读 · Further reading

  • DDPM 与 ELBO:Ho, Jain & Abbeel (2020);Sohl-Dickstein et al. (2015);Luo (2022), Understanding Diffusion Models: A Unified Perspective(ELBO 的三种等价写法)。
  • 采样:Song, Meng & Ermon (2021), DDIM;Lu et al. (2022), DPM-Solver;Karras et al. (2022), EDM。
  • 改进训练:Nichol & Dhariwal (2021), Improved DDPM(余弦调度、学方差、重要性采样 tt);Kingma et al. (2021), Variational Diffusion Models(直接优化似然)。
  • 变分推断:Blei, Kucukelbir & McAuliffe (2017);Doersch (2016)。

11. 下一讲预告 · Next lecture

第 9 讲把”隐变量 + ELBO”用在只有一层隐变量、而且编码器也要学的模型上:变分自编码器。

  • 普通自编码器为什么不能采样;KL 散度作为目标函数会怎样;变分推断;
  • 蒙特卡洛估计,以及得分函数估计为什么方差太大、重参数化怎样解决;
  • 在形状世界上训练 VAE:它为什么”模糊”?VQ-VAE 怎样把图变成离散的”词”,再交给语言模型;
  • 最后把 GAN、扩散模型、VAE、VQ-VAE 放在同一张表里比较。
← 返回课程目录