第 7 讲 · 扩散模型(上)· Diffusion Models (Part I)

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

课程源码 ZIP ↓

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

本篇目录

对应 Maps to:CMU 10-423 / 10-623 / 10-723 Generative AI(Spring 2026;Aran Nayebi、Matt Gormley),Lecture 7 · Wed 4-Feb · Diffusion models (Part I)。 阅读材料:Sohl-Dickstein et al. (2015), Deep Unsupervised Learning using Nonequilibrium Thermodynamics;Ho, Jain & Abbeel (2020), Denoising Diffusion Probabilistic Models(DDPM)。 依据说明:本讲以原课第 7 讲公开的 slides(lecture7-diffusion.pdf)为主线:回顾无监督学习的三种回答;GAN → VAE → 扩散模型的对照表;U-Net(语义分割、实例分割、收缩与扩张路径);扩散模型的前向过程与(学到的)反向过程;“哪些是隐变量”;DDPM 的定义;精确的反向过程为什么算不出来;噪声调度;高斯的四条性质;性质 1(q(xt∣x0)q(x_t \mid x_0) 的闭式解);“q 只是在加噪声,p 怎么会有意思?“;前向与反向的不对称;性质 2(q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0));学到的反向过程的两个想法和三种参数化(选项 A / B / C);性质 3;训练算法(选项 C)。记号完全沿用 slides(αt\alpha_t、αˉt\bar\alpha_t、αt(0)\alpha_t^{(0)}、αt(t)\alpha_t^{(t)}、σt2\sigma_t^2)。所有实验是本讲义自己设计的,不代表课堂上讲了什么。 配套代码 Code:code/lecture07/(5 个脚本 + 2 个模块;01、02 几秒,03–05 各约 1–1.5 分钟) 预计阅读时间:4 小时(含运行代码)


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

0.1 学习目标 Learning goals

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

  1. 说出 GAN、VAE、扩散模型各自怎样定义 pθ(x)p_\theta(x)、为什么都不能直接做最大似然、各自用什么目标代替。
  2. 写出扩散模型的前向过程,推导性质 1:q(xt∣x0)=N(αˉt x0,(1−αˉt)I)q(x_t \mid x_0) = \mathcal N(\sqrt{\bar\alpha_t}\, x_0, (1-\bar\alpha_t) I);解释噪声调度的作用。
  3. 用高斯的四条性质解释:为什么前向过程处处有闭式解、为什么反向过程要学、为什么”每一步是高斯”不意味着结果是高斯。
  4. 推导性质 2:q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0) 的均值和方差;写出性质 3(用 ε\varepsilon 表示的均值)。
  5. 比较三种参数化(预测均值 / 预测 x0x_0 / 预测噪声),并用”同一个目标、不同的时间权重”解释为什么预测噪声最好。
  6. 写出 DDPM 的训练算法和采样算法,并在二维数据上从零训练一个扩散模型。
  7. 描述 U-Net 的结构,解释为什么扩散模型的去噪网络用它。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面再展开 Previewed only
前置讲 P2:高斯的线性变换与条件分布、前向加噪的闭式解(§2.5)、ELBO(§4)变分下界的推导、DDPM 目标的完整来历(第 8 讲)
第 5 讲:卷积、CNN;第 6 讲:GAN、模式崩塌、图模型、隐变量少步采样、DDIM(第 8 讲)
第 2 讲:正弦位置编码(时间步嵌入用同一个公式)VAE 与变分推断(第 9 讲);潜空间扩散、DiT(第 12、14 讲)

这一讲是 slides 说的”不用变分推断的另一种讲法”:我们直接从高斯的性质出发,推出训练目标”预测噪声”,而把”这个目标其实是变分下界”留给第 8 讲。

0.3 本讲地图 Map

§1  回顾:无监督学习的三种回答;GAN → VAE → 扩散模型
§2  高斯的四条性质                                                  ← 代码 01(第 1 部分)
§3  前向过程:加噪、噪声调度、性质 1、边缘分布                         ← 代码 01
§4  反向过程:为什么算不出来、为什么每一步可以是高斯、性质 2、"背答案"    ← 代码 02
§5  参数化反向过程:两个想法、三种选项、性质 3                         ← 代码 04
§6  训练与采样:在二维数据上从零训练 DDPM                             ← 代码 03
§7  U-Net                                                          ← 代码 05
§8–12  小结、误区、练习、延伸阅读、下一讲

1. 回顾:无监督学习的三种回答 · Recap

第 6 讲 §7 的设定:数据来自某个分布 p∗(x0)p^*(x_0);我们选一个容易采样的分布 pθ(x0)p_\theta(x_0);目标是学 θ\theta 使 pθ≈p∗p_\theta \approx p^*。

  • 自回归语言模型:p(xt∣x1,…,xt−1)p(x_t \mid x_1, \ldots, x_{t-1}) 是一个 Categorical 分布,祖先采样精确高效;直接最大似然。
  • GAN:z∼N(0,I)z \sim \mathcal N(0, I)、x0=fθ(z)x_0 = f_\theta(z),采样容易;最大似然?不行——就连一层的网络,一张图 x0x_0 也只对应 zz 里的一个点,边缘分布几乎处处为 0(第 6 讲 §7.2)。改为优化极小极大损失。
  • VAE / 扩散模型:最大似然?算是吧——梯度算不出来,改为优化一个变分下界。

slides 把三种模型放进同一张表(“GAN → VAE → Diffusion”):

模型最大似然?学习
GANpθ(z)=N(0,I)p_\theta(z) = \mathcal N(0, I);pθ(x∣z)=p_\theta(x \mid z) = 在 Gθ(z)G_\theta(z) 上的点质量不行极小极大博弈
VAEpθ(z)=N(0,I)p_\theta(z) = \mathcal N(0, I);pθ(x∣z)=N(μθ(z),Σθ(z))p_\theta(x \mid z) = \mathcal N(\mu_\theta(z), \Sigma_\theta(z)),μθ\mu_\theta、Σθ\Sigma_\theta 是 MLP(如 h=tanh⁡(W1z+b1)h = \tanh(W_1 z + b_1),μθ=W2h+b2\mu_\theta = W_2 h + b_2);另有编码器 qϕ(z∣x)=N(μϕ(x),Σϕ(x))q_\phi(z \mid x) = \mathcal N(\mu_\phi(x), \Sigma_\phi(x))不行θ,ϕ=arg⁡min⁡KL(qϕ(z∣x) ∥ pθ(z∣x))\theta, \phi = \arg\min \mathrm{KL}(q_\phi(z \mid x) \,\|\, p_\theta(z \mid x))
扩散模型pθ(zT)=N(0,I)p_\theta(z_T) = \mathcal N(0, I);pθ(zt−1∣zt)=N(μθ(zt),Σθ(zt))p_\theta(z_{t-1} \mid z_t) = \mathcal N(\mu_\theta(z_t), \Sigma_\theta(z_t)),z0=xz_0 = x;“编码器”q(zt∣zt−1)q(z_t \mid z_{t-1}) 是固定的加噪不行θ=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))

三者都是隐变量模型(第 6 讲 §7.3)。GAN 的解码器是确定性的;VAE 的解码器是一步高斯,并且学一个编码器去近似后验;扩散模型把解码拆成 TT 个小小的高斯步,而”编码器”(前向加噪)不用学。这张表本讲先看最后一行,第 9 讲再回来看中间一行。


2. 高斯的四条性质 · Gaussians (an aside)

slides 在讲扩散模型之前插了一页”高斯小结”。设 X∼N(μx,σx2)X \sim \mathcal N(\mu_x, \sigma_x^2)、Y∼N(μy,σy2)Y \sim \mathcal N(\mu_y, \sigma_y^2) 独立:

  1. 两个高斯相加还是高斯:X+Y∼N(μx+μy,σx2+σy2)X + Y \sim \mathcal N(\mu_x + \mu_y, \sigma_x^2 + \sigma_y^2)。
  2. 两个高斯相减还是高斯:X−Y∼N(μx−μy,σx2+σy2)X - Y \sim \mathcal N(\mu_x - \mu_y, \sigma_x^2 + \sigma_y^2)——注意方差还是相加。
  3. 设 Z∣X∼N(g(X),σz2)Z \mid X \sim \mathcal N(g(X), \sigma_z^2)。若 gg 是线性 / 仿射函数,则边缘 pZ(z)=∫pZ∣X(z∣x)pX(x) dxp_Z(z) = \int p_{Z \mid X}(z \mid x) p_X(x)\, dx 是高斯,后验 pX∣Z(x∣z)p_{X \mid Z}(x \mid z) 也是高斯。
  4. 若 gg 是非线性函数,边缘一般不是高斯,后验也不是。

01 的第 1 部分(各 40 万个样本):

变量均值(理论 / 实测)方差(理论 / 实测)偏度超额峰度
X+YX + Y0.5 / +0.5036.25 / 6.237−0.007+0.002
X−YX - Y1.5 / +1.4976.25 / 6.280+0.002+0.010
Z∣X∼N(2X+1,0.52)Z \mid X \sim \mathcal N(2X+1, 0.5^2) 的边缘3 / +3.00116.25 / 16.298−0.004+0.000
Z∣X∼N(X2,0.52)Z \mid X \sim \mathcal N(X^2, 0.5^2) 的边缘5 / +5.011— / 48.3+2.669+10.509

(X∼N(1,22)X \sim \mathcal N(1, 2^2),Y∼N(−0.5,1.52)Y \sim \mathcal N(-0.5, 1.5^2)。高斯的偏度和超额峰度都是 0。)

后验也一样:线性情况下,观测到 Z≈3Z \approx 3 的样本里 XX 的均值 +1.010、方差 0.0607,高斯后验的公式给出 +1.000、0.0615;非线性情况下,观测到 Z≈4Z \approx 4(≈ X2X^2),XX 落在 +2 附近的占 0.716、−2 附近的占 0.283、中间几乎没有——后验有两个峰,因为平方抹掉了符号。

这四条就是整个扩散模型的”物理定律”:

  • 前向过程只用第 1、3 条(线性 + 高斯噪声)→ 处处有闭式解(§3、§4.3);
  • 反向过程用神经网络(非线性)给均值 → 合起来的 pθ(x0)p_\theta(x_0) 可以不是高斯,这正是我们想要的(§4.2)。

3. 前向过程:一点点加噪声 · The forward process

3.1 定义

slides 的图:从右到左是 x0x_0(图像)、x1x_1、……、xTx_T(噪声)。前向过程一步步往图像上加噪声:

qϕ(x0:T)=q(x0)∏t=1Tqϕ(xt∣xt−1),qϕ(xt∣xt−1)=N ⁣(αt xt−1, (1−αt)I).q_\phi(x_{0:T}) = q(x_0) \prod_{t=1}^{T} q_\phi(x_t \mid x_{t-1}),\qquad q_\phi(x_t \mid x_{t-1}) = \mathcal N\!\left(\sqrt{\alpha_t}\, x_{t-1},\ (1 - \alpha_t) I\right).

q(x0)q(x_0) 是数据分布。每一步先把上一步的图乘一个略小于 1 的数 αt\sqrt{\alpha_t},再加一点方差为 1−αt1 - \alpha_t 的高斯噪声。(很多论文写 βt=1−αt\beta_t = 1 - \alpha_t,两种记号等价。)乘 αt\sqrt{\alpha_t} 是为了保持方差:如果 xt−1x_{t-1} 的方差是 1,xtx_t 的方差是 αt+(1−αt)=1\alpha_t + (1 - \alpha_t) = 1。

slides 的问题:扩散模型里哪些是隐变量? x1,…,xTx_1, \ldots, x_T。只有 x0x_0 是观测到的数据;中间每一步的带噪版本都是隐变量——和第 6 讲 §7.3 的 z→xz \to x 一样,只是隐变量有 TT 组,每一组都和图像一样大。

3.2 噪声调度

α1,…,αT\alpha_1, \ldots, \alpha_T 是固定的(不学),选择的原则是:让 q(xT)≈N(0,I)q(x_T) \approx \mathcal N(0, I),和学到的反向过程的起点 pθ(xT)=N(0,I)p_\theta(x_T) = \mathcal N(0, I) 一样。DDPM 用 T=1000T = 1000,1−αt1 - \alpha_t 从 10−410^{-4} 线性增长到 0.020.02。01 的第 2 部分:

t1−αt1-\alpha_tαˉt\bar\alpha_tαˉt\sqrt{\bar\alpha_t}(原图系数)1−αˉt\sqrt{1-\bar\alpha_t}(噪声系数)信噪比 αˉt/(1−αˉt)\bar\alpha_t/(1-\bar\alpha_t)
10.000100.99990.99990.01009999
1000.002070.89700.94710.32098.71
2500.005060.52410.72390.68991.10
5000.010040.07860.28030.95990.085
10000.020000.000040.00641.00000.00004

每一步只加很少的噪声(最多 2%),1000 步累积下来原图的系数只剩 0.0064。信息不是均匀丢掉的:t=260t = 260 时 αˉt\bar\alpha_t 才降到 0.5 以下,之后信噪比按指数速度下降。第 8 讲会比较另一种(余弦)调度。

3.3 性质 1:任意一步的闭式解

q(xt∣x0)=N ⁣(αˉt x0, (1−αˉt)I),αˉt=∏s=1tαs.q(x_t \mid x_0) = \mathcal N\!\left(\sqrt{\bar\alpha_t}\, x_0,\ (1 - \bar\alpha_t) I\right),\qquad \bar\alpha_t = \prod_{s=1}^{t} \alpha_s .

推导(归纳法,只用 §2 第 1、3 条):设 xt−1=αˉt−1 x0+1−αˉt−1 ε′x_{t-1} = \sqrt{\bar\alpha_{t-1}}\, x_0 + \sqrt{1 - \bar\alpha_{t-1}}\, \varepsilon',则

xt=αt xt−1+1−αt ε′′=αˉt x0+αt(1−αˉt−1) ε′+1−αt ε′′⏟两个独立高斯之和,方差 αt−αˉt+1−αt  =  1−αˉt.x_t = \sqrt{\alpha_t}\, x_{t-1} + \sqrt{1 - \alpha_t}\, \varepsilon'' = \sqrt{\bar\alpha_t}\, x_0 + \underbrace{\sqrt{\alpha_t(1 - \bar\alpha_{t-1})}\, \varepsilon' + \sqrt{1-\alpha_t}\, \varepsilon''}_{\text{两个独立高斯之和,方差 } \alpha_t - \bar\alpha_t + 1 - \alpha_t \;=\; 1 - \bar\alpha_t} .

于是 slides 的结论:可以用闭式解从 x0x_0 直接采样任意一步

xt=αˉt x0+1−αˉt ε,ε∼N(0,I),x_t = \sqrt{\bar\alpha_t}\, x_0 + \sqrt{1 - \bar\alpha_t}\, \varepsilon,\qquad \varepsilon \sim \mathcal N(0, I),

slides 特意指出:“这和 VAE 里的重参数化技巧是同一回事”(第 9 讲)。01 的第 3 部分让 20 万条前向链从 x0=2x_0 = 2 出发一步步走:t=100t = 100 时均值 1.8942、标准差 0.3205,闭式解 1.8942、0.3209;偏度和峰度都 ≈ 0。训练时不需要真的走 tt 步——随便挑一个 tt,一步到位。

slides 的问题:q(xT∣x0)q(x_T \mid x_0) 是什么? N(0.0064 x0, 0.99996 I)\mathcal N(0.0064\, x_0,\ 0.99996\, I)——几乎就是 N(0,I)\mathcal N(0, I),和 x0x_0 无关。对 100 张形状图(784 维),KL(q(xT∣x0) ∥ N(0,I))\mathrm{KL}(q(x_T \mid x_0) \,\|\, \mathcal N(0, I)) 平均只有 0.013 nat。

3.4 前向与反向的不对称:边缘分布不是高斯

对一个固定的 x0x_0,q(xt∣x0)q(x_t \mid x_0) 永远是高斯。但对整个数据集,

q(xt)=∫q(xt∣x0) q(x0) dx0q(x_t) = \int q(x_t \mid x_0)\, q(x_0)\, dx_0

是很多个高斯的混合。01 的第 4 部分把二维”瑞士卷”(沿螺线分布的点)加噪到不同的 tt:t=20t = 20 时还是一条稍微变粗的螺线,t=100t = 100 时开始模糊,t=300t = 300 时只剩一团,t=1000t = 1000 时和标准高斯无法区分(离原点 < 0.5 的比例 0.117,标准高斯 0.118)。一张形状图也一样:和原图的相关系数 t=100t = 100 时 0.80、t=200t = 200 时 0.52、t=400t = 400 时 0.21、t=1000t = 1000 时 0.05。

slides 把这叫”前向 / 反向过程的不对称”:前向过程对中间变量积分,得到的 q(xt∣x0)q(x_t \mid x_0) 是高斯;而学到的反向过程对中间变量积分,得到的 pθ(x0)=∫pθ(xT)∏tpθ(xt−1∣xt) dx1:Tp_\theta(x_0) = \int p_\theta(x_T) \prod_t p_\theta(x_{t-1} \mid x_t)\, dx_{1:T} 不是高斯。


4. 反向过程 · The reverse process

4.1 我们想要什么

slides:“如果能从反向过程采样,我们就完成了”——从 xT∼N(0,I)x_T \sim \mathcal N(0, I) 出发,一步步去噪,最后得到一张图。学到的反向过程:

pθ(x0:T)=pθ(xT)∏t=1Tpθ(xt−1∣xt),pθ(xT)=N(0,I),pθ(xt−1∣xt)=N(μθ(xt,t),Σθ(xt,t)).p_\theta(x_{0:T}) = p_\theta(x_T) \prod_{t=1}^{T} p_\theta(x_{t-1} \mid x_t),\qquad p_\theta(x_T) = \mathcal N(0, I),\quad p_\theta(x_{t-1} \mid x_t) = \mathcal N(\mu_\theta(x_t, t), \Sigma_\theta(x_t, t)).

为什么不直接算精确的反向过程? slides:“学习很难,为什么不直接推出前向过程对应的精确反向过程?“因为精确的反向一步

q(xt−1∣xt)=∫q(x0:T) dx0:t−2, t+1:T∫q(x0:T) dx0:t−2, t:Tq(x_{t-1} \mid x_t) = \frac{\int q(x_{0:T})\, dx_{0:t-2,\,t+1:T}}{\int q(x_{0:T})\, dx_{0:t-2,\,t:T}}

需要对 x0x_0 积分,而 q(x0)q(x_0)(数据分布)“可能没那么简单”——我们根本不知道它的公式。

4.2 “如果每一步都是高斯,结果不也是高斯吗?”

slides 的两个问答:

  • 问:q 只是在加噪声,p 怎么会有意思? 答:因为 q(x0)q(x_0) 不只是噪声,pθp_\theta 必须捕捉那些有意思的变化。
  • 问:如果 pθ(xt−1∣xt)p_\theta(x_{t-1} \mid x_t) 是高斯,学到的 pθ(x0)p_\theta(x_0) 不也是高斯吗? 答:不是。步数 TT 足够多的扩散模型可以表示任何平滑的目标分布。

为了看清楚第二个回答,02 搭了一个”上帝视角”的实验台:如果数据分布本身是高斯混合(一维:0.3 N(−1,0.152)+0.7 N(+1,0.152)0.3\,\mathcal N(-1, 0.15^2) + 0.7\,\mathcal N(+1, 0.15^2)),那么每个 q(xt)q(x_t) 都是高斯混合,精确的反向一步 q(xt−1∣xt)q(x_{t-1} \mid x_t) 也能精确算出来(似然 q(xt∣xt−1)q(x_t \mid x_{t-1}) 是 xt−1x_{t-1} 的线性高斯,乘以一个高斯混合,还是高斯混合)。把同一条 1000 步的调度”合并”成 TT 步,衡量精确的反向一步和”均值方差相同的单个高斯”之间的 KL:

步数 T最大的一步噪声 1−αt1-\alpha_t最不像高斯的那一步:KL所有步的平均 KL
11.00001.211.21
50.97370.560.12
100.85340.100.016
1000.18221.5e-35.5e-5
10000.02007.4e-68.9e-8

T=1T = 1 时,反向一步就是”给定纯噪声猜数据”,它有两个峰——用一个高斯近似注定失败。步数越多,每一步的噪声越小,xt−1x_{t-1} 只能在 xtx_t 附近很小的范围里,范围内数据分布的形状来不及变化,反向一步就越像高斯。

再用”最好的高斯反向一步”采样:均值取精确的条件期望 E[xt−1∣xt]\mathbb E[x_{t-1} \mid x_t](这正是一个无限数据、无限容量的去噪网络会学到的东西,§5),方差取 DDPM 的 σt2\sigma_t^2:

T精确反向:W1W_1在峰上右峰比例高斯反向:W1W_1在峰上右峰比例
10.0140.9980.7050.8360.000—
50.0080.9980.7010.2590.7770.825
100.0070.9970.7010.1290.9570.746
1000.0030.9980.6990.0290.9990.706
10000.0110.9970.6940.0050.9970.697

(W1W_1:和 2 万个真实样本之间的 Wasserstein-1 距离,越小越好;真实的右峰比例 0.7。)

精确反向不管几步都能还原数据——“如果能从它采样,我们就完成了”。只用一个高斯时,T=1T = 1 所有样本都挤在 E[x0∣xT]\mathbb E[x_0 \mid x_T] 附近(一个峰都没有画对);T=1000T = 1000 时和精确反向几乎一样。这就是扩散模型要很多步的原因:步数少时,“每一步都是高斯”这个近似本身就不成立。很多个”几乎是高斯”的小步,每一步的均值是 xtx_t 的非线性函数,合起来就能变成复杂的分布。

slides 用了一个类比(“Diffusion Model Analogy”):一滴墨水在水里扩散开(前向),要把它收回成一滴(反向)——每一小步都只需要”往浓的地方挪一点点”。

4.3 性质 2:给定 x0x_0 时,反向一步有闭式解

q(xt−1∣xt)q(x_{t-1} \mid x_t) 算不出来,是因为不知道 q(x0)q(x_0)。但给定 x0x_0,它就是两个线性高斯(q(xt−1∣x0)q(x_{t-1} \mid x_0) 和 q(xt∣xt−1)q(x_t \mid x_{t-1}))的贝叶斯公式,有闭式解:

q(xt−1∣xt,x0)=N ⁣(μ~q(xt,x0), σt2I),q(x_{t-1} \mid x_t, x_0) = \mathcal N\!\left(\tilde\mu_q(x_t, x_0),\ \sigma_t^2 I\right), μ~q(xt,x0)=αˉt−1(1−αt)1−αˉt⏟αt(0) x0+αt(1−αˉt−1)1−αˉt⏟αt(t) xt,σt2=(1−αˉt−1)(1−αt)1−αˉt.\tilde\mu_q(x_t, x_0) = \underbrace{\frac{\sqrt{\bar\alpha_{t-1}}(1 - \alpha_t)}{1 - \bar\alpha_t}}_{\alpha_t^{(0)}}\, x_0 + \underbrace{\frac{\sqrt{\alpha_t}(1 - \bar\alpha_{t-1})}{1 - \bar\alpha_t}}_{\alpha_t^{(t)}}\, x_t,\qquad \sigma_t^2 = \frac{(1 - \bar\alpha_{t-1})(1 - \alpha_t)}{1 - \bar\alpha_t}.

推导:作为 xt−1x_{t-1} 的函数,q(xt−1∣xt,x0)∝q(xt∣xt−1) q(xt−1∣x0)q(x_{t-1} \mid x_t, x_0) \propto q(x_t \mid x_{t-1})\, q(x_{t-1} \mid x_0)。两个高斯因子的精度相加:αt1−αt+11−αˉt−1=1−αˉt(1−αt)(1−αˉt−1)\frac{\alpha_t}{1 - \alpha_t} + \frac{1}{1 - \bar\alpha_{t-1}} = \frac{1 - \bar\alpha_t}{(1-\alpha_t)(1-\bar\alpha_{t-1})},其倒数就是 σt2\sigma_t^2;均值是两个”观测”xt/αtx_t/\sqrt{\alpha_t} 和 αˉt−1 x0\sqrt{\bar\alpha_{t-1}}\, x_0 的精度加权平均(前置讲 P2 §2.6),整理即得上式。

02 的第 2 部分用 400 万对模拟样本核对:x0=1x_0 = 1、t=300t = 300,只留下 xt≈0.930x_t \approx 0.930 的 18,930 对,xt−1x_{t-1} 的经验均值 0.92870、方差 5.98e-3;公式给出 0.92943、6.03e-3。均值是 x0x_0 和 xtx_t 的加权平均(这里 αt(0)=0.006\alpha_t^{(0)} = 0.006、αt(t)=0.993\alpha_t^{(t)} = 0.993——一步只挪一点点),方差和 x0x_0、xtx_t 都无关。

训练时我们恰好知道 x0x_0(噪声是我们自己加的),所以可以用这个闭式解当”标准答案”;采样时不知道 x0x_0,就用网络的估计代进去。这就是 §5 的思路。

4.4 题外话:完美的去噪器只会”背答案”

如果训练集只有 8 个点,“对训练集最优”的去噪器是什么?训练集的经验分布是 8 个等权重的点,§4.2 的方法同样能精确算出它的条件期望。02 的第 4 部分用它采样 2 万次:样本到最近训练点的距离中位数 1.5e-6,每个训练点各占约 1/8——一个新样本也画不出来,完美地复现了训练集。(对照:从真实分布新采的点到最近训练点的距离中位数 0.039。)

训练目标(下面 §5 的”预测噪声”)在训练集上的最优解就是背答案。真实的扩散模型能生成新东西,是因为神经网络做不到这个最优解:它的容量、结构(卷积、平滑性)和有限的训练让它学到一个”平滑过的”去噪器,在训练点之间插值。模型很大、训练集很小时,它就会靠近这个最优解——这正是大扩散模型会复现部分训练图的原因(Carlini et al., 2023;第 6 讲 §4.4)。


5. 参数化反向过程 · Parameterizing the learned reverse process

5.1 两个想法

slides:“之后我们会证明,给定一个训练样本 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)。直觉上这很合理:如果学到的反向过程应该把噪声减掉,那么对一个具体的 x0x_0,它应该像精确的反向过程那样减掉噪声。”

  • 想法 1:不学方差,直接用 q(xt−1∣xt,x0)q(x_{t-1} \mid x_t, x_0) 的方差:Σθ(xt,t)=σt2I\Sigma_\theta(x_t, t) = \sigma_t^2 I。
  • 想法 2:让 μθ(xt,t)\mu_\theta(x_t, t) 接近 μ~q(xt,x0)\tilde\mu_q(x_t, x_0)。三种参数化:
    • 选项 A:网络直接输出均值,μθ(xt,t)=UNetθ(xt,t)\mu_\theta(x_t, t) = \text{UNet}_\theta(x_t, t)(tt 作为额外的特征输入)。
    • 选项 B:网络估计真正的 x0x_0,xθ(0)(xt,t)=UNetθ(xt,t)x_\theta^{(0)}(x_t, t) = \text{UNet}_\theta(x_t, t),再代进公式:μθ=αt(0)xθ(0)+αt(t)xt\mu_\theta = \alpha_t^{(0)} x_\theta^{(0)} + \alpha_t^{(t)} x_t。
    • 选项 C:网络估计前向过程里产生 xtx_t 的那份噪声 ε\varepsilon,εθ(xt,t)=UNetθ(xt,t)\varepsilon_\theta(x_t, t) = \text{UNet}_\theta(x_t, t),由它算出 xθ(0)=(xt−1−αˉt εθ)/αˉtx_\theta^{(0)} = (x_t - \sqrt{1-\bar\alpha_t}\, \varepsilon_\theta)/\sqrt{\bar\alpha_t},再同选项 B。

5.2 性质 3:用噪声表示的均值

把性质 1 反过来:x0=(xt−1−αˉt ε)/αˉtx_0 = (x_t - \sqrt{1 - \bar\alpha_t}\, \varepsilon)/\sqrt{\bar\alpha_t},代进性质 2 的 μ~q\tilde\mu_q:

μ~q(xt,x0)=1αt(xt−1−αt1−αˉt ε).\tilde\mu_q(x_t, x_0) = \frac{1}{\sqrt{\alpha_t}}\left(x_t - \frac{1 - \alpha_t}{\sqrt{1 - \bar\alpha_t}}\, \varepsilon\right).

slides:“这种参数化在实践中被证明有助于学习 pθp_\theta。“02 在 1000 组随机的 (xt,x0,t)(x_t, x_0, t) 上核对,两种写法最大相差 7e-8(float32 系数的舍入)。直觉:去噪 = 从 xtx_t 里减掉一小部分估计出来的噪声,再放大一点。

5.3 三种选项,哪个好?

04 用同一个小 MLP 去噪网络(7 万参数)、同样的训练步数,比较三种参数化:

数据训练步数A:预测均值B:预测 x0x_0C:预测噪声
八高斯圆环(高质量样本比例)30000.0560.4030.875
100000.0960.9170.961
瑞士卷(落在线上的比例)30000.1780.5130.911
100000.2060.9690.980

和 slides 一致:选项 C 最好。选项 B 训练得更久会追上来,选项 A 一直学不好。为什么?把三个损失都换算成 ∥ε−ε^∥2\lVert\varepsilon - \hat\varepsilon\rVert^2:

∥x0−x^0∥2=1−αˉtαˉt∥ε−ε^∥2,∥μ~q−μθ∥2=(1−αt)2αt(1−αˉt)∥ε−ε^∥2.\lVert x_0 - \hat x_0\rVert^2 = \frac{1-\bar\alpha_t}{\bar\alpha_t}\lVert\varepsilon - \hat\varepsilon\rVert^2,\qquad \lVert\tilde\mu_q - \mu_\theta\rVert^2 = \frac{(1-\alpha_t)^2}{\alpha_t(1-\bar\alpha_t)}\lVert\varepsilon - \hat\varepsilon\rVert^2 .

三个损失是同一个目标在不同 tt 上的不同加权:

t1101005001000
选项 A 的权重1.0e-44.1e-54.2e-51.1e-44.1e-4
选项 B 的权重1.0e-41.9e-30.11511.724,800
选项 C 的权重11111
  • 选项 A 的权重只有 10−410^{-4} 量级:它的回归目标 μ~q\tilde\mu_q 里,“什么都不做”的猜测 xt/αtx_t/\sqrt{\alpha_t} 已经解释了 99.988% 的方差,真正要学的修正只占 1.2×10−41.2\times10^{-4}——网络稍微”抄得不准”,就把这点信号淹没了。
  • 选项 B 把几乎全部注意力放在 tt 很大的步上(那里 x0x_0 根本猜不准,误差大),对 tt 很小时的精细修正几乎不在乎,所以样本不够”紧”。
  • 选项 C 对所有 tt 一视同仁,回归目标 ε\varepsilon 永远是标准高斯,量级固定,最好学。

第 8 讲会看到,从变分下界严格推出来的是第四组权重;Ho et al. (2020) 发现把它们全换成 1(选项 C 的”简化损失”)效果最好。


6. 训练与采样 · Diffusion model training

6.1 训练算法(选项 C)

slides 的 Algorithm 1:

1: 初始化 θ
2: for e ∈ {1, …, E}:
3:   for x_0 ∈ D:
4:     t ~ Uniform(1, …, T)
5:     ε ~ N(0, I)
6:     x_t ← √ᾱ_t · x_0 + √(1 − ᾱ_t) · ε
7:     ℓ_t(θ) ← ‖ε − ε_θ(x_t, t)‖²
8:     θ ← θ − ∇_θ ℓ_t(θ)

就是这么简单:随机挑一个时间步,用性质 1 一步加噪,让网络猜加了什么噪声,均方误差。diffusion_lab.diffusion_loss 就是这几行。采样算法是:xT∼N(0,I)x_T \sim \mathcal N(0, I);对 t=T,…,1t = T, \ldots, 1:xt−1=μθ(xt,t)+σtzx_{t-1} = \mu_\theta(x_t, t) + \sigma_t z(最后一步不加噪声)。第 8 讲会把它写成三种选项各自的版本。

时间步 tt 怎样输入网络?和第 2 讲 Transformer 的正弦位置编码同一个公式:一组不同频率的 sin⁡\sin、cos⁡\cos,低频分量分辨”大概在哪个阶段”,高频分量分辨相邻的步。

6.2 二维瑞士卷

03 用一个 7 万参数的 MLP 去噪网络,在瑞士卷上训练 10000 步(单线程 9 秒),采 2000 个点(走完 1000 步,1.7 秒):

  • 反向过程从一团标准高斯出发,前一半的步数里几乎看不出变化,t=250t = 250 时也只是一团略带结构的点,到 t=100t = 100 左右才看得出螺旋,最后几十步把点”收紧”到线上——和 §3.4 的前向过程正好倒过来。
  • 98% 的样本落在螺线附近(真实数据 100%),沿螺线各段分布得比较均匀(和均匀分布的总变差距离 0.060,真实数据 0.028)。

没有判别器,没有博弈,训练目标只是一个回归问题。

6.3 八高斯圆环:会模式崩塌吗?

第 6 讲的 GAN 在八高斯圆环上,学习率 1e-3 时四个种子覆盖 3、3、2、8 个模式。同样大小的扩散模型,四个种子:

种子0123
覆盖的模式数8888
高质量比例0.9600.9560.9460.949

扩散模型没有”追着跑”:它在每个 tt 上都是一个普通的回归问题,所有真实数据点都参与训练——漏掉一个模式,那个模式附近加噪后的点的回归误差就会很大,梯度会把它拉回来。第 8 讲会看到它的训练目标本质上是(变分形式的)最大似然,而第 6 讲 §3.7 说过:最大似然”宁可糊、不肯漏”。

6.4 训练损失不是质量指标

03 的第 3 部分把训练好的瑞士卷模型在不同 tt 上的损失分开算:

t110501002505007501000
∥ε−εθ∥2\lVert\varepsilon - \varepsilon_\theta\rVert^21.0210.8500.5690.6510.6180.1370.0070.002

(永远输出 0 的损失是 1。)tt 很小时损失接近 1:加的噪声(标准差 0.01)比数据本身的”厚度”(0.05)还小,根本分不清哪部分是我们加的——好在这时猜错影响很小。tt 很大时 xtx_t 几乎全是噪声,ε≈xt\varepsilon \approx x_t,抄一遍就对。所以不同 tt 的损失天然处在不同量级,整体的平均损失主要由”本来就猜不出”的小 tt 决定。扩散模型的训练损失不能直接当质量指标,要采样出来评估。


7. U-Net

7.1 从分割说起

slides 在讲扩散模型之前先介绍了 U-Net,因为它是 DDPM 的去噪网络。它最初是为分割设计的:

  • 语义分割(semantic segmentation):给图像的每个像素预测一个标签。它不只是分类,因为相邻像素的标签高度相关。
  • 实例分割(instance segmentation):在语义分割的基础上区分同一类的不同个体(两个人要分别标成”人-1""人-2”)。

这类任务和去噪有一个共同点:输出和输入一样大。

7.2 结构

slides 的描述:

  • 收缩路径:每个块是 3×3 卷积 → 3×3 卷积 → ReLU → 步长 2 的最大池化(下采样);重复 N 次,每次通道数翻倍。
  • 扩张路径:每个块是 2×2 卷积(上采样)→ 和收缩路径的特征拼接 → 3×3 卷积 → 3×3 卷积 → ReLU;重复 N 次,每次通道数减半。
  • 关键:“输出层和输入图像的长宽相同(通道数可以不同)。”

05 在 meta 设备上(只推算形状、不分配内存)构造了原论文的 U-Net(Ronneberger et al., 2015):通道 64 → 128 → 256 → 512 → 1024 再回来,31,030,658 个参数;输入 572×572,收缩路径的特征图依次是 568、280、136、64,最底层 1024×28×28,扩张路径依次是 52、100、196、388——输出 388×388。原论文的卷积不补零,每个 3×3 卷积让长宽各减 2,拼接前要把收缩路径的特征从中间裁剪(论文图里的”copy and crop”)。扩散模型用的 U-Net 都补零,输出和输入一样大。

收缩路径越往下,每个位置”看到”的范围越大,描述的是”这里大概是什么”;扩张路径把分辨率放大回来,跳接把收缩路径同一层的细节(边缘在哪里)直接送过来。

7.3 我们的小 U-Net

unet.TinyUNet(c = 24 时 19.2 万参数)是第 8 讲在形状世界上训练扩散模型用的:

(1, 28, 28) → 像素重排 → (4, 14, 14) → 3×3 卷积 → (24, 14, 14) → 块 ───────────┐ 跳接
  → 步长 2 卷积 → (48, 7, 7) → 块 → 块                                       │
  → 转置卷积 → (24, 14, 14) → 拼接 (48, 14, 14) → 块 → (24, 14, 14)  ←──────┘
  → 3×3 卷积 → (4, 14, 14) → 像素重排的逆 → (1, 28, 28)

和 slides 的差别:(1) 每个块是”GroupNorm → SiLU → 3×3 卷积”两次加残差,并把时间嵌入加到每个块里——同一张带噪的图,t=50t = 50 和 t=800t = 800 时该去掉的噪声完全不同,每一层都需要知道”现在噪声有多大”;GroupNorm 不依赖同一批的其他样本,训练和采样时行为一致。(2) 下采样用步长 2 的卷积,上采样用转置卷积(第 6 讲 §2.3)。(3) 像素重排(pixel unshuffle):先把每个 2×2 像素块叠成 4 个通道,所有卷积都在 14×14 和 7×7 上做。这是为了我们的 CPU 做的妥协——直接在 28×28 上卷积,每个训练步要 173 ms 以上,重排之后约 70 ms。第 14 讲的扩散 Transformer(DiT)“切块”是同一个思路。

7.4 为什么去噪要用 U-Net?

05 的第 3 部分用 DDPM 的训练目标把三种网络各训练 600 步,比较噪声预测误差:

网络参数t = 50t = 200t = 500
MLP(784 → 1024 → 1024 → 784)4,888,3360.75250.25390.1353
U-Net(有跳接)192,1400.21140.04620.0183
U-Net 去掉跳接185,7320.21840.04600.0202
  • 参数多 25 倍的 MLP 最差。它不知道哪些像素相邻,每个位置的”边缘长什么样”都要单独学;卷积在所有位置共享同一个去噪规则(第 5 讲的归纳偏置)。第 8 讲会看到,用 MLP 训练的扩散模型在形状图上完全画不出形状。
  • 去掉跳接,影响却很小(误差变化 +3.3%、−0.3%、+10.3%)。我原以为会差很多。原因是这个小 U-Net 只下采样一次,最底层 48×7×7 = 2352 个数比输入的 784 个像素还多,信息没有被”挤掉”;网络也很浅。跳接的价值在深的 U-Net 里才明显:原论文里,最高分辨率的细节如果不走跳接,从输入到输出要经过 23 层(18 个 3×3 卷积、4 个上采样卷积、1 个 1×1 卷积),中间被压到 28×28;走跳接只要 5 层。这和第 2 讲 Transformer 的残差连接是同一类想法。

8. 小结 · Summary

  1. 扩散模型 = 一个固定的前向加噪过程 + 一个学到的反向去噪过程。x1,…,xTx_1, \ldots, x_T 都是隐变量。
  2. 前向过程只用线性高斯,所以性质 1:xt=αˉt x0+1−αˉt εx_t = \sqrt{\bar\alpha_t}\, x_0 + \sqrt{1-\bar\alpha_t}\, \varepsilon,任意一步一次采到;噪声调度保证 q(xT)≈N(0,I)q(x_T) \approx \mathcal N(0, I)。
  3. 精确的反向一步依赖未知的数据分布,算不出来;但给定 x0x_0 有闭式解(性质 2),训练时正好知道 x0x_0。
  4. 每一步噪声很小时,反向一步几乎是高斯;很多个这样的小步合起来可以表示复杂的分布。步数少时这个近似失效。
  5. 三种参数化是同一个目标的三种时间加权;预测噪声(选项 C)权重均匀、目标量级固定,实践中最好。
  6. 训练就是”随机挑 tt、加噪、回归噪声”;在二维数据上它不模式崩塌。训练损失不是质量指标。
  7. U-Net 输出和输入一样大,用卷积的归纳偏置和跳接同时照顾全局与细节;在我们的小网络里跳接作用不大,MLP 则完全不行。
  8. 训练目标在训练集上的最优解是”背答案”;网络学不到这个最优解,才会生成新东西。

9. 常见误区 · Common pitfalls

  • “前向过程要学。” 不学。αt\alpha_t 是固定的调度,前向过程没有参数(slides 的 qϕq_\phi 里的 ϕ\phi 在 DDPM 里是固定的)。
  • “训练时要先跑 tt 步前向过程。” 不用,性质 1 一步到位。
  • “每一步是高斯,所以生成的图是高斯分布的。” 每一步的均值是神经网络(非线性)给的;很多步合起来可以是任意平滑的分布(§4.2)。
  • “两个高斯相减,方差相减。” 方差永远相加(§2 第 2 条)。
  • ”q(xt)q(x_t) 是高斯。” q(xt∣x0)q(x_t \mid x_0) 是高斯;q(xt)q(x_t) 是对数据分布的混合,tt 小的时候一点都不像高斯(§3.4)。
  • “预测 x0x_0、预测噪声、预测均值,数学上等价,所以没区别。” 可以互相换算,但作为训练目标,它们给不同的 tt 不同的权重,效果差别很大(§5.3)。
  • “训练损失越低,生成的图越好。” 损失主要由”本来就猜不出”的小 tt 决定(§6.4)。
  • “训练得越好越会生成新东西。” 训练目标在训练集上的完美解是背答案(§4.4)。

10. 练习 · Exercises

练习 1(性质 1 的归纳)。 假设 xt−1=αˉt−1 x0+1−αˉt−1 ε′x_{t-1} = \sqrt{\bar\alpha_{t-1}}\, x_0 + \sqrt{1 - \bar\alpha_{t-1}}\, \varepsilon',证明 xtx_t 的方差项是 1−αˉt1 - \bar\alpha_t。如果去掉每一步的 αt\sqrt{\alpha_t}(即 xt=xt−1+1−αt εx_t = x_{t-1} + \sqrt{1-\alpha_t}\,\varepsilon),xTx_T 会怎样?

参考答案

噪声部分是 αt(1−αˉt−1) ε′+1−αt ε′′\sqrt{\alpha_t(1-\bar\alpha_{t-1})}\,\varepsilon' + \sqrt{1-\alpha_t}\,\varepsilon'',两个独立高斯之和,方差 αt−αtαˉt−1+1−αt=1−αˉt\alpha_t - \alpha_t\bar\alpha_{t-1} + 1 - \alpha_t = 1 - \bar\alpha_t(因为 αtαˉt−1=αˉt\alpha_t\bar\alpha_{t-1} = \bar\alpha_t)。去掉缩放后 xT=x0+N(0,∑t(1−αt))x_T = x_0 + \mathcal N(0, \sum_t(1-\alpha_t)):原图的系数始终是 1,噪声方差约为 ∑tβt≈10\sum_t \beta_t \approx 10,xTx_T 既不是 N(0,I)\mathcal N(0, I),也没有”忘掉”x0x_0。(这其实是另一类”方差爆炸”的扩散模型,见 Song et al., 2021 的 SDE 框架。)

练习 2(估算 αˉT\bar\alpha_T)。 线性调度 1−αt1 - \alpha_t 从 1e-4 到 0.02,T=1000T = 1000。不用计算机,估算 αˉT\bar\alpha_T。

参考答案

ln⁡αˉT=∑tln⁡(1−βt)≈−∑tβt−12∑tβt2\ln\bar\alpha_T = \sum_t \ln(1 - \beta_t) \approx -\sum_t\beta_t - \tfrac12\sum_t\beta_t^2。∑βt=1000×(10−4+0.02)/2=10.05\sum\beta_t = 1000 \times (10^{-4} + 0.02)/2 = 10.05,∑βt2≈0.134\sum\beta_t^2 \approx 0.134。一阶近似 e−10.05=4.3×10−5e^{-10.05} = 4.3\times10^{-5};加上二阶项 ×e−0.067\times e^{-0.067},得 4.04×10−54.04\times10^{-5}。精确值 4.036×10−54.036\times10^{-5}(01 的输出)。

练习 3(性质 2)。 用”精度相加、均值按精度加权”推导 σt2\sigma_t^2 和 μ~q\tilde\mu_q。验证 t=1t = 1 时 σ12=0\sigma_1^2 = 0、μ~q=x0\tilde\mu_q = x_0,并解释为什么。

参考答案

xt−1x_{t-1} 的两个”信息来源”:先验 q(xt−1∣x0)=N(αˉt−1x0,1−αˉt−1)q(x_{t-1} \mid x_0) = \mathcal N(\sqrt{\bar\alpha_{t-1}}x_0, 1-\bar\alpha_{t-1});似然 q(xt∣xt−1)q(x_t \mid x_{t-1}) 看成 xt−1x_{t-1} 的函数是 N(xt/αt,(1−αt)/αt)\mathcal N(x_t/\sqrt{\alpha_t}, (1-\alpha_t)/\alpha_t)。精度 11−αˉt−1+αt1−αt=1−αˉt(1−αˉt−1)(1−αt)\frac{1}{1-\bar\alpha_{t-1}} + \frac{\alpha_t}{1-\alpha_t} = \frac{1-\bar\alpha_t}{(1-\bar\alpha_{t-1})(1-\alpha_t)},倒数即 σt2\sigma_t^2。均值 =σt2(αˉt−1x01−αˉt−1+αtxt1−αt)= \sigma_t^2\left(\frac{\sqrt{\bar\alpha_{t-1}}x_0}{1-\bar\alpha_{t-1}} + \frac{\sqrt{\alpha_t}x_t}{1-\alpha_t}\right),展开即 αt(0)x0+αt(t)xt\alpha_t^{(0)}x_0 + \alpha_t^{(t)}x_t。t=1t = 1 时 αˉ0=1\bar\alpha_0 = 1:先验方差为 0(x0x_0 已知,"xt−1x_{t-1}"就是 x0x_0),所以 σ12=0\sigma_1^2 = 0、均值 =x0= x_0。

练习 4(性质 3)。 把 x0=(xt−1−αˉt ε)/αˉtx_0 = (x_t - \sqrt{1-\bar\alpha_t}\,\varepsilon)/\sqrt{\bar\alpha_t} 代进 μ~q\tilde\mu_q,推出 1αt(xt−1−αt1−αˉtε)\frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\varepsilon)。

参考答案

xtx_t 的系数:αt(0)/αˉt+αt(t)=(1−αt)+αt(1−αˉt−1)αt(1−αˉt)=1−αˉtαt(1−αˉt)=1αt\alpha_t^{(0)}/\sqrt{\bar\alpha_t} + \alpha_t^{(t)} = \frac{(1-\alpha_t) + \alpha_t(1-\bar\alpha_{t-1})}{\sqrt{\alpha_t}(1-\bar\alpha_t)} = \frac{1-\bar\alpha_t}{\sqrt{\alpha_t}(1-\bar\alpha_t)} = \frac{1}{\sqrt{\alpha_t}}(用了 αˉt−1/αˉt=1/αt\sqrt{\bar\alpha_{t-1}}/\sqrt{\bar\alpha_t} = 1/\sqrt{\alpha_t})。ε\varepsilon 的系数:−αt(0)1−αˉt/αˉt=−1−αtαt1−αˉt-\alpha_t^{(0)}\sqrt{1-\bar\alpha_t}/\sqrt{\bar\alpha_t} = -\frac{1-\alpha_t}{\sqrt{\alpha_t}\sqrt{1-\bar\alpha_t}}。合起来即得。

练习 5(q(xt)q(x_t) 什么时候变成单峰)。 数据只有两个点 ±1(各一半)。q(xt)q(x_t) 是什么?tt 多大时它变成单峰?(提示:两个等权重、等方差的高斯 N(±m,s2)\mathcal N(\pm m, s^2) 的混合,当且仅当 m≤sm \le s 时是单峰。)

参考答案

q(xt)=12N(αˉt,1−αˉt)+12N(−αˉt,1−αˉt)q(x_t) = \tfrac12\mathcal N(\sqrt{\bar\alpha_t}, 1-\bar\alpha_t) + \tfrac12\mathcal N(-\sqrt{\bar\alpha_t}, 1-\bar\alpha_t)。单峰当且仅当 αˉt≤1−αˉt\sqrt{\bar\alpha_t} \le \sqrt{1-\bar\alpha_t},即 αˉt≤1/2\bar\alpha_t \le 1/2。线性调度下第一次满足是 t=260t = 260(01 第 2 部分)。之后的反向步要从一个单峰分布里”分出”两个峰,靠的是均值对 xtx_t 的非线性依赖。

练习 6(三种权重)。 推导选项 B 的损失 ∥x0−x^0∥2=1−αˉtαˉt∥ε−ε^∥2\lVert x_0 - \hat x_0\rVert^2 = \frac{1-\bar\alpha_t}{\bar\alpha_t}\lVert\varepsilon - \hat\varepsilon\rVert^2,并解释为什么它在 t=1000t = 1000 时的权重高达 2.5 万。

参考答案

x^0=(xt−1−αˉt ε^)/αˉt\hat x_0 = (x_t - \sqrt{1-\bar\alpha_t}\,\hat\varepsilon)/\sqrt{\bar\alpha_t},x0=(xt−1−αˉt ε)/αˉtx_0 = (x_t - \sqrt{1-\bar\alpha_t}\,\varepsilon)/\sqrt{\bar\alpha_t},相减得 x0−x^0=1−αˉtαˉt(ε^−ε)x_0 - \hat x_0 = \frac{\sqrt{1-\bar\alpha_t}}{\sqrt{\bar\alpha_t}}(\hat\varepsilon - \varepsilon),平方即得。t=1000t = 1000 时 αˉt=4×10−5\bar\alpha_t = 4\times10^{-5},1/αˉt≈250001/\bar\alpha_t \approx 25000:xtx_t 里只剩 0.6% 的原图,噪声估计的一点点误差被放大 160 倍变成 x0x_0 的误差。

练习 7(只有 8 个训练点)。 解释 02 第 4 部分的结果:为什么”对训练集最优”的去噪器只会复现训练点?如果改成 8000 个训练点,结果会变吗?

参考答案

训练目标是对训练集上的经验分布做回归,它的最优解是经验分布下的条件期望;用这个最优解(和 §4.2 中”精确反向”的论证一样)做 TT 很大的采样,得到的正是经验分布本身——8 个点各 1/8。8000 个点时最优解依然是”复现这 8000 个点”,只是点多了以后肉眼更难分辨”新”和”旧”。泛化来自网络达不到这个最优解。

练习 8(U-Net 的尺寸)。 原论文 U-Net 输入 572×572,卷积不补零。逐层推出最底层是 28×28、输出是 388×388。如果所有卷积都补零,输入 572 的输出是多少?

参考答案

收缩:572 → 570 → 568(两个卷积)→ 池化 284 → 280 → 140 → 136 → 68 → 64 → 32 → 最底层两个卷积 30 → 28。扩张:上采样 56 → 两个卷积 52;104 → 100;200 → 196;392 → 388。补零时卷积不改变尺寸,池化和上采样互相抵消:输出 572×572,和输入一样大。

练习 9(哪些是隐变量)。 slides 的问题:“扩散模型里哪些是隐变量?“再回答:和第 6 讲的 GAN 相比,扩散模型的隐变量有什么不同?

参考答案

x1,…,xTx_1, \ldots, x_T。和 GAN 的 zz(32 维,比图像小得多)不同:(1) 每个隐变量都和图像一样大(784 维);(2) 有 TT 组,形成一条马尔可夫链;(3) 编码器(前向过程)是固定的、不学;(4) 给定 x0x_0,隐变量的后验 q(x1:T∣x0)q(x_{1:T} \mid x_0) 完全已知(这就是第 8 讲变分下界能简单写出来的原因)。

11. 延伸阅读 · Further reading

  • 原始论文:Sohl-Dickstein et al. (2015)(扩散概率模型的提出);Ho, Jain & Abbeel (2020), DDPM;Song & Ermon (2019), Generative Modeling by Estimating Gradients of the Data Distribution(得分匹配的视角);Song et al. (2021), Score-Based Generative Modeling through SDEs(统一两者)。
  • 教程:Lilian Weng, What are Diffusion Models?(博客);Luo (2022), Understanding Diffusion Models: A Unified Perspective;Chan (2024), Tutorial on Diffusion Models for Imaging and Vision。
  • 参数化与权重:Salimans & Ho (2022), Progressive Distillation(v-参数化);Kingma et al. (2021), Variational Diffusion Models;Karras et al. (2022), Elucidating the Design Space of Diffusion-Based Generative Models(EDM)。
  • U-Net:Ronneberger, Fischer & Brox (2015), U-Net;Dhariwal & Nichol (2021) 的改进 U-Net。
  • 记忆与泛化:Carlini et al. (2023), Extracting Training Data from Diffusion Models;Kadkhodaie et al. (2024), Generalization in diffusion models arises from geometry-adaptive harmonic representations。

12. 下一讲预告 · Next lecture

这一讲的推导”跳过”了一件事:为什么”让 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)“是对的?第 8 讲:

  • 把 DDPM 的目标写成变分下界(ELBO),逐项拆开,看清楚”预测噪声”其实是把下界的权重换成了 1;
  • 在形状世界上训练 U-Net 扩散模型,和第 6 讲的 GAN 用同一套尺子比较;
  • 采样一张图要几步?DDPM 跳步 vs DDIM;
  • 从扩散模型走向 VAE:同样是隐变量 + 变分推断。
← 返回课程目录