对应 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 ( x t ∣ x 0 ) q(x_t \mid x_0) q ( x t ∣ x 0 ) 的闭式解);“q 只是在加噪声,p 怎么会有意思?“;前向与反向的不对称;性质 2(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 ) );学到的反向过程的两个想法和三种参数化(选项 A / B / C);性质 3;训练算法(选项 C)。记号完全沿用 slides(α t \alpha_t α t 、α ˉ t \bar\alpha_t α ˉ t 、α t ( 0 ) \alpha_t^{(0)} α t ( 0 ) 、α t ( t ) \alpha_t^{(t)} α t ( t ) 、σ t 2 \sigma_t^2 σ 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
学完这一讲,你应该能够:
说出 GAN、VAE、扩散模型各自怎样定义 p θ ( x ) p_\theta(x) p θ ( x ) 、为什么都不能直接做最大似然、各自用什么目标代替。
写出扩散模型的前向过程,推导性质 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 ) ;解释噪声调度的作用。
用高斯的四条性质解释:为什么前向过程处处有闭式解、为什么反向过程要学、为什么”每一步是高斯”不意味着结果是高斯。
推导性质 2: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 ) 的均值和方差;写出性质 3(用 ε \varepsilon ε 表示的均值)。
比较三种参数化(预测均值 / 预测 x 0 x_0 x 0 / 预测噪声),并用”同一个目标、不同的时间权重”解释为什么预测噪声最好。
写出 DDPM 的训练算法和采样算法,并在二维数据上从零训练一个扩散模型。
描述 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 ∗ ( x 0 ) p^*(x_0) p ∗ ( x 0 ) ;我们选一个容易采样 的分布 p θ ( x 0 ) p_\theta(x_0) p θ ( x 0 ) ;目标是学 θ \theta θ 使 p θ ≈ p ∗ p_\theta \approx p^* p θ ≈ p ∗ 。
自回归语言模型 :p ( x t ∣ x 1 , … , x t − 1 ) p(x_t \mid x_1, \ldots, x_{t-1}) p ( x t ∣ x 1 , … , x t − 1 ) 是一个 Categorical 分布,祖先采样精确高效;直接最大似然。
GAN :z ∼ N ( 0 , I ) z \sim \mathcal N(0, I) z ∼ N ( 0 , I ) 、x 0 = f θ ( z ) x_0 = f_\theta(z) x 0 = f θ ( z ) ,采样容易;最大似然?不行 ——就连一层的网络,一张图 x 0 x_0 x 0 也只对应 z z z 里的一个点,边缘分布几乎处处为 0(第 6 讲 §7.2)。改为优化极小极大损失。
VAE / 扩散模型 :最大似然?算是吧 ——梯度算不出来,改为优化一个变分下界 。
slides 把三种模型放进同一张表(“GAN → VAE → Diffusion”):
模型 最大似然? 学习 GAN p θ ( z ) = N ( 0 , I ) p_\theta(z) = \mathcal N(0, I) p θ ( z ) = N ( 0 , I ) ;p θ ( x ∣ z ) = p_\theta(x \mid z) = p θ ( x ∣ z ) = 在 G θ ( z ) G_\theta(z) G θ ( z ) 上的点质量不行 极小极大博弈 VAE p θ ( z ) = N ( 0 , I ) p_\theta(z) = \mathcal N(0, I) p θ ( z ) = N ( 0 , I ) ;p θ ( x ∣ z ) = N ( μ θ ( z ) , Σ θ ( z ) ) p_\theta(x \mid z) = \mathcal N(\mu_\theta(z), \Sigma_\theta(z)) p θ ( x ∣ z ) = N ( μ θ ( z ) , Σ θ ( z )) ,μ θ \mu_\theta μ θ 、Σ θ \Sigma_\theta Σ θ 是 MLP(如 h = tanh ( W 1 z + b 1 ) h = \tanh(W_1 z + b_1) h = tanh ( W 1 z + b 1 ) ,μ θ = W 2 h + b 2 \mu_\theta = W_2 h + b_2 μ θ = W 2 h + b 2 );另有编码器 q ϕ ( z ∣ x ) = N ( μ ϕ ( x ) , Σ ϕ ( x ) ) q_\phi(z \mid x) = \mathcal N(\mu_\phi(x), \Sigma_\phi(x)) q ϕ ( z ∣ x ) = N ( μ ϕ ( x ) , Σ ϕ ( x )) 不行 θ , ϕ = arg min K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ∣ x ) ) \theta, \phi = \arg\min \mathrm{KL}(q_\phi(z \mid x) \,\|\, p_\theta(z \mid x)) θ , ϕ = arg min KL ( q ϕ ( z ∣ x ) ∥ p θ ( z ∣ x )) 扩散模型 p θ ( z T ) = N ( 0 , I ) p_\theta(z_T) = \mathcal N(0, I) p θ ( z T ) = N ( 0 , I ) ;p θ ( z t − 1 ∣ z t ) = N ( μ θ ( z t ) , Σ θ ( z t ) ) p_\theta(z_{t-1} \mid z_t) = \mathcal N(\mu_\theta(z_t), \Sigma_\theta(z_t)) p θ ( z t − 1 ∣ z t ) = N ( μ θ ( z t ) , Σ θ ( z t )) ,z 0 = x z_0 = x z 0 = x ;“编码器”q ( z t ∣ z t − 1 ) q(z_t \mid z_{t-1}) q ( z t ∣ z t − 1 ) 是固定的 加噪不行 θ = arg min K L ( q ( z 1 : T ∣ x ) ∥ p θ ( z 1 : T ∣ x ) ) \theta = \arg\min \mathrm{KL}(q(z_{1:T} \mid x) \,\|\, p_\theta(z_{1:T} \mid x)) θ = arg min KL ( q ( z 1 : T ∣ x ) ∥ p θ ( z 1 : T ∣ x ))
三者都是隐变量模型(第 6 讲 §7.3)。GAN 的解码器是确定性的;VAE 的解码器是一步高斯,并且学 一个编码器去近似后验;扩散模型把解码拆成 T T T 个小小的高斯步,而”编码器”(前向加噪)不用学 。这张表本讲先看最后一行,第 9 讲再回来看中间一行。
2. 高斯的四条性质 · Gaussians (an aside)
slides 在讲扩散模型之前插了一页”高斯小结”。设 X ∼ N ( μ x , σ x 2 ) X \sim \mathcal N(\mu_x, \sigma_x^2) X ∼ N ( μ x , σ x 2 ) 、Y ∼ N ( μ y , σ y 2 ) Y \sim \mathcal N(\mu_y, \sigma_y^2) Y ∼ N ( μ y , σ y 2 ) 独立:
两个高斯相加还是高斯 :X + Y ∼ N ( μ x + μ y , σ x 2 + σ y 2 ) X + Y \sim \mathcal N(\mu_x + \mu_y, \sigma_x^2 + \sigma_y^2) X + Y ∼ N ( μ x + μ y , σ x 2 + σ y 2 ) 。
两个高斯相减还是高斯 :X − Y ∼ N ( μ x − μ y , σ x 2 + σ y 2 ) X - Y \sim \mathcal N(\mu_x - \mu_y, \sigma_x^2 + \sigma_y^2) X − Y ∼ N ( μ x − μ y , σ x 2 + σ y 2 ) ——注意方差还是相加 。
设 Z ∣ X ∼ N ( g ( X ) , σ z 2 ) Z \mid X \sim \mathcal N(g(X), \sigma_z^2) Z ∣ X ∼ N ( g ( X ) , σ z 2 ) 。若 g g g 是线性 / 仿射 函数,则边缘 p Z ( z ) = ∫ p Z ∣ X ( z ∣ x ) p X ( x ) d x p_Z(z) = \int p_{Z \mid X}(z \mid x) p_X(x)\, dx p Z ( z ) = ∫ p Z ∣ X ( z ∣ x ) p X ( x ) d x 是高斯,后验 p X ∣ Z ( x ∣ z ) p_{X \mid Z}(x \mid z) p X ∣ Z ( x ∣ z ) 也是高斯。
若 g g g 是非线性 函数,边缘一般不是高斯,后验也不是。
01 的第 1 部分(各 40 万个样本):
变量 均值(理论 / 实测) 方差(理论 / 实测) 偏度 超额峰度 X + Y X + Y X + Y 0.5 / +0.503 6.25 / 6.237 −0.007 +0.002 X − Y X - Y X − Y 1.5 / +1.497 6.25 / 6.280 +0.002 +0.010 Z ∣ X ∼ N ( 2 X + 1 , 0.5 2 ) Z \mid X \sim \mathcal N(2X+1, 0.5^2) Z ∣ X ∼ N ( 2 X + 1 , 0. 5 2 ) 的边缘3 / +3.001 16.25 / 16.298 −0.004 +0.000 Z ∣ X ∼ N ( X 2 , 0.5 2 ) Z \mid X \sim \mathcal N(X^2, 0.5^2) Z ∣ X ∼ N ( X 2 , 0. 5 2 ) 的边缘5 / +5.011 — / 48.3 +2.669 +10.509
(X ∼ N ( 1 , 2 2 ) X \sim \mathcal N(1, 2^2) X ∼ N ( 1 , 2 2 ) ,Y ∼ N ( − 0.5 , 1.5 2 ) Y \sim \mathcal N(-0.5, 1.5^2) Y ∼ N ( − 0.5 , 1. 5 2 ) 。高斯的偏度和超额峰度都是 0。)
后验也一样:线性情况下,观测到 Z ≈ 3 Z \approx 3 Z ≈ 3 的样本里 X X X 的均值 +1.010、方差 0.0607,高斯后验的公式给出 +1.000、0.0615;非线性情况下,观测到 Z ≈ 4 Z \approx 4 Z ≈ 4 (≈ X 2 X^2 X 2 ),X X X 落在 +2 附近的占 0.716、−2 附近的占 0.283、中间几乎没有——后验有两个峰 ,因为平方抹掉了符号。
这四条就是整个扩散模型的”物理定律”:
前向过程只用第 1、3 条(线性 + 高斯噪声)→ 处处有闭式解(§3、§4.3);
反向过程用神经网络(非线性)给均值 → 合起来的 p θ ( x 0 ) p_\theta(x_0) p θ ( x 0 ) 可以不是高斯,这正是我们想要的(§4.2)。
3. 前向过程:一点点加噪声 · The forward process
3.1 定义
slides 的图:从右到左是 x 0 x_0 x 0 (图像)、x 1 x_1 x 1 、……、x T x_T x T (噪声)。前向过程 一步步往图像上加噪声:
q ϕ ( x 0 : T ) = q ( x 0 ) ∏ t = 1 T q ϕ ( x t ∣ x t − 1 ) , q ϕ ( x t ∣ x t − 1 ) = N ( α t x t − 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 ϕ ( x 0 : T ) = q ( x 0 ) t = 1 ∏ T q ϕ ( x t ∣ x t − 1 ) , q ϕ ( x t ∣ x t − 1 ) = N ( α t x t − 1 , ( 1 − α t ) I ) .
q ( x 0 ) q(x_0) q ( x 0 ) 是数据分布。每一步先把上一步的图乘一个略小于 1 的数 α t \sqrt{\alpha_t} α t ,再加一点方差为 1 − α t 1 - \alpha_t 1 − α t 的高斯噪声。(很多论文写 β t = 1 − α t \beta_t = 1 - \alpha_t β t = 1 − α t ,两种记号等价。)乘 α t \sqrt{\alpha_t} α t 是为了保持方差 :如果 x t − 1 x_{t-1} x t − 1 的方差是 1,x t x_t x t 的方差是 α t + ( 1 − α t ) = 1 \alpha_t + (1 - \alpha_t) = 1 α t + ( 1 − α t ) = 1 。
slides 的问题:扩散模型里哪些是隐变量? x 1 , … , x T x_1, \ldots, x_T x 1 , … , x T 。只有 x 0 x_0 x 0 是观测到的数据;中间每一步的带噪版本都是隐变量——和第 6 讲 §7.3 的 z → x z \to x z → x 一样,只是隐变量有 T T T 组,每一组都和图像一样大。
3.2 噪声调度
α 1 , … , α T \alpha_1, \ldots, \alpha_T α 1 , … , α T 是固定的 (不学),选择的原则是:让 q ( x T ) ≈ N ( 0 , I ) q(x_T) \approx \mathcal N(0, I) q ( x T ) ≈ N ( 0 , I ) ,和学到的反向过程的起点 p θ ( x T ) = N ( 0 , I ) p_\theta(x_T) = \mathcal N(0, I) p θ ( x T ) = N ( 0 , I ) 一样。DDPM 用 T = 1000 T = 1000 T = 1000 ,1 − α t 1 - \alpha_t 1 − α t 从 10 − 4 10^{-4} 1 0 − 4 线性增长到 0.02 0.02 0.02 。01 的第 2 部分:
t 1 − α t 1-\alpha_t 1 − α t α ˉ t \bar\alpha_t α ˉ t α ˉ t \sqrt{\bar\alpha_t} α ˉ t (原图系数)1 − α ˉ t \sqrt{1-\bar\alpha_t} 1 − α ˉ t (噪声系数)信噪比 α ˉ t / ( 1 − α ˉ t ) \bar\alpha_t/(1-\bar\alpha_t) α ˉ t / ( 1 − α ˉ t ) 1 0.00010 0.9999 0.9999 0.0100 9999 100 0.00207 0.8970 0.9471 0.3209 8.71 250 0.00506 0.5241 0.7239 0.6899 1.10 500 0.01004 0.0786 0.2803 0.9599 0.085 1000 0.02000 0.00004 0.0064 1.0000 0.00004
每一步只加很少的噪声(最多 2%),1000 步累积下来原图的系数只剩 0.0064。信息不是均匀丢掉的:t = 260 t = 260 t = 260 时 α ˉ t \bar\alpha_t α ˉ t 才降到 0.5 以下,之后信噪比按指数速度下降。第 8 讲会比较另一种(余弦)调度。
3.3 性质 1:任意一步的闭式解
q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) , α ˉ t = ∏ s = 1 t α 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 . q ( x t ∣ x 0 ) = N ( α ˉ t x 0 , ( 1 − α ˉ t ) I ) , α ˉ t = s = 1 ∏ t α s .
推导 (归纳法,只用 §2 第 1、3 条):设 x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ε ′ x_{t-1} = \sqrt{\bar\alpha_{t-1}}\, x_0 + \sqrt{1 - \bar\alpha_{t-1}}\, \varepsilon' x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ε ′ ,则
x t = α t x t − 1 + 1 − α t ε ′ ′ = α ˉ t x 0 + α 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} . x t = α t x t − 1 + 1 − α t ε ′′ = α ˉ t x 0 + 两个独立高斯之和,方差 α t − α ˉ t + 1 − α t = 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) ε ′ + 1 − α t ε ′′ .
于是 slides 的结论:可以用闭式解从 x 0 x_0 x 0 直接采样任意一步
x t = α ˉ t x 0 + 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), x t = α ˉ t x 0 + 1 − α ˉ t ε , ε ∼ N ( 0 , I ) ,
slides 特意指出:“这和 VAE 里的重参数化技巧 是同一回事”(第 9 讲)。01 的第 3 部分让 20 万条前向链从 x 0 = 2 x_0 = 2 x 0 = 2 出发一步步走:t = 100 t = 100 t = 100 时均值 1.8942、标准差 0.3205,闭式解 1.8942、0.3209;偏度和峰度都 ≈ 0。训练时不需要 真的走 t t t 步——随便挑一个 t t t ,一步到位。
slides 的问题:q ( x T ∣ x 0 ) q(x_T \mid x_0) q ( x T ∣ x 0 ) 是什么? N ( 0.0064 x 0 , 0.99996 I ) \mathcal N(0.0064\, x_0,\ 0.99996\, I) N ( 0.0064 x 0 , 0.99996 I ) ——几乎就是 N ( 0 , I ) \mathcal N(0, I) N ( 0 , I ) ,和 x 0 x_0 x 0 无关。对 100 张形状图(784 维),K L ( q ( x T ∣ x 0 ) ∥ N ( 0 , I ) ) \mathrm{KL}(q(x_T \mid x_0) \,\|\, \mathcal N(0, I)) KL ( q ( x T ∣ x 0 ) ∥ N ( 0 , I )) 平均只有 0.013 nat。
3.4 前向与反向的不对称:边缘分布不是高斯
对一个固定的 x 0 x_0 x 0 ,q ( x t ∣ x 0 ) q(x_t \mid x_0) q ( x t ∣ x 0 ) 永远是高斯。但对整个数据集,
q ( x t ) = ∫ q ( x t ∣ x 0 ) q ( x 0 ) d x 0 q(x_t) = \int q(x_t \mid x_0)\, q(x_0)\, dx_0 q ( x t ) = ∫ q ( x t ∣ x 0 ) q ( x 0 ) d x 0
是很多个高斯的混合。01 的第 4 部分把二维”瑞士卷”(沿螺线分布的点)加噪到不同的 t t t :t = 20 t = 20 t = 20 时还是一条稍微变粗的螺线,t = 100 t = 100 t = 100 时开始模糊,t = 300 t = 300 t = 300 时只剩一团,t = 1000 t = 1000 t = 1000 时和标准高斯无法区分(离原点 < 0.5 的比例 0.117,标准高斯 0.118)。一张形状图也一样:和原图的相关系数 t = 100 t = 100 t = 100 时 0.80、t = 200 t = 200 t = 200 时 0.52、t = 400 t = 400 t = 400 时 0.21、t = 1000 t = 1000 t = 1000 时 0.05。
slides 把这叫”前向 / 反向过程的不对称”:前向过程对中间变量积分,得到的 q ( x t ∣ x 0 ) q(x_t \mid x_0) q ( x t ∣ x 0 ) 是高斯;而学到的反向过程对中间变量积分,得到的 p θ ( x 0 ) = ∫ p θ ( x T ) ∏ t p θ ( x t − 1 ∣ x t ) d x 1 : T p_\theta(x_0) = \int p_\theta(x_T) \prod_t p_\theta(x_{t-1} \mid x_t)\, dx_{1:T} p θ ( x 0 ) = ∫ p θ ( x T ) ∏ t p θ ( x t − 1 ∣ x t ) d x 1 : T 不是 高斯。
4. 反向过程 · The reverse process
4.1 我们想要什么
slides:“如果能从反向过程采样,我们就完成了”——从 x T ∼ N ( 0 , I ) x_T \sim \mathcal N(0, I) x T ∼ N ( 0 , I ) 出发,一步步去噪,最后得到一张图。学到的反向过程 :
p θ ( x 0 : T ) = p θ ( x T ) ∏ t = 1 T p θ ( x t − 1 ∣ x t ) , p θ ( x T ) = N ( 0 , I ) , p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , Σ θ ( x t , 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)). p θ ( x 0 : T ) = p θ ( x T ) t = 1 ∏ T p θ ( x t − 1 ∣ x t ) , p θ ( x T ) = N ( 0 , I ) , p θ ( x t − 1 ∣ x t ) = N ( μ θ ( x t , t ) , Σ θ ( x t , t )) .
为什么不直接算精确的反向过程? slides:“学习很难,为什么不直接推出前向过程对应的精确反向过程?“因为精确的反向一步
q ( x t − 1 ∣ x t ) = ∫ q ( x 0 : T ) d x 0 : t − 2 , t + 1 : T ∫ q ( x 0 : T ) d x 0 : t − 2 , t : T q(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}} q ( x t − 1 ∣ x t ) = ∫ q ( x 0 : T ) d x 0 : t − 2 , t : T ∫ q ( x 0 : T ) d x 0 : t − 2 , t + 1 : T
需要对 x 0 x_0 x 0 积分,而 q ( x 0 ) q(x_0) q ( x 0 ) (数据分布)“可能没那么简单”——我们根本不知道它的公式。
4.2 “如果每一步都是高斯,结果不也是高斯吗?”
slides 的两个问答:
问:q 只是在加噪声,p 怎么会有意思? 答:因为 q ( x 0 ) q(x_0) q ( x 0 ) 不只是噪声,p θ p_\theta p θ 必须捕捉那些有意思的变化。
问:如果 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1} \mid x_t) p θ ( x t − 1 ∣ x t ) 是高斯,学到的 p θ ( x 0 ) p_\theta(x_0) p θ ( x 0 ) 不也是高斯吗? 答:不是。步数 T T T 足够多的扩散模型可以表示任何平滑的 目标分布。
为了看清楚第二个回答,02 搭了一个”上帝视角”的实验台:如果数据分布本身是高斯混合(一维:0.3 N ( − 1 , 0.15 2 ) + 0.7 N ( + 1 , 0.15 2 ) 0.3\,\mathcal N(-1, 0.15^2) + 0.7\,\mathcal N(+1, 0.15^2) 0.3 N ( − 1 , 0.1 5 2 ) + 0.7 N ( + 1 , 0.1 5 2 ) ),那么每个 q ( x t ) q(x_t) q ( x t ) 都是高斯混合,精确的反向一步 q ( x t − 1 ∣ x t ) q(x_{t-1} \mid x_t) q ( x t − 1 ∣ x t ) 也能精确算出来 (似然 q ( x t ∣ x t − 1 ) q(x_t \mid x_{t-1}) q ( x t ∣ x t − 1 ) 是 x t − 1 x_{t-1} x t − 1 的线性高斯,乘以一个高斯混合,还是高斯混合)。把同一条 1000 步的调度”合并”成 T T T 步,衡量精确的反向一步和”均值方差相同的单个高斯”之间的 KL:
步数 T 最大的一步噪声 1 − α t 1-\alpha_t 1 − α t 最不像高斯的那一步:KL 所有步的平均 KL 1 1.0000 1.21 1.21 5 0.9737 0.56 0.12 10 0.8534 0.10 0.016 100 0.1822 1.5e-3 5.5e-5 1000 0.0200 7.4e-6 8.9e-8
T = 1 T = 1 T = 1 时,反向一步就是”给定纯噪声猜数据”,它有两个峰——用一个高斯近似注定失败。步数越多,每一步的噪声越小,x t − 1 x_{t-1} x t − 1 只能在 x t x_t x t 附近很小的范围里,范围内数据分布的形状来不及变化,反向一步就越像高斯。
再用”最好的高斯反向一步 ”采样:均值取精确的条件期望 E [ x t − 1 ∣ x t ] \mathbb E[x_{t-1} \mid x_t] E [ x t − 1 ∣ x t ] (这正是一个无限数据、无限容量 的去噪网络会学到的东西,§5),方差取 DDPM 的 σ t 2 \sigma_t^2 σ t 2 :
T 精确反向:W 1 W_1 W 1 在峰上 右峰比例 高斯反向:W 1 W_1 W 1 在峰上 右峰比例 1 0.014 0.998 0.705 0.836 0.000 — 5 0.008 0.998 0.701 0.259 0.777 0.825 10 0.007 0.997 0.701 0.129 0.957 0.746 100 0.003 0.998 0.699 0.029 0.999 0.706 1000 0.011 0.997 0.694 0.005 0.997 0.697
(W 1 W_1 W 1 :和 2 万个真实样本之间的 Wasserstein-1 距离,越小越好;真实的右峰比例 0.7。)
精确反向不管几步都能还原数据——“如果能从它采样,我们就完成了”。只用一个高斯时,T = 1 T = 1 T = 1 所有样本都挤在 E [ x 0 ∣ x T ] \mathbb E[x_0 \mid x_T] E [ x 0 ∣ x T ] 附近(一个峰都没有画对);T = 1000 T = 1000 T = 1000 时和精确反向几乎一样。这就是扩散模型要很多步的原因 :步数少时,“每一步都是高斯”这个近似本身就不成立。很多个”几乎是高斯”的小步,每一步的均值是 x t x_t x t 的非线性函数,合起来就能变成复杂的分布。
slides 用了一个类比(“Diffusion Model Analogy”):一滴墨水在水里扩散开(前向),要把它收回成一滴(反向)——每一小步都只需要”往浓的地方挪一点点”。
4.3 性质 2:给定 x 0 x_0 x 0 时,反向一步有闭式解
q ( x t − 1 ∣ x t ) q(x_{t-1} \mid x_t) q ( x t − 1 ∣ x t ) 算不出来,是因为不知道 q ( x 0 ) q(x_0) q ( x 0 ) 。但给定 x 0 x_0 x 0 ,它就是两个线性高斯(q ( x t − 1 ∣ x 0 ) q(x_{t-1} \mid x_0) q ( x t − 1 ∣ x 0 ) 和 q ( x t ∣ x t − 1 ) q(x_t \mid x_{t-1}) q ( x t ∣ x t − 1 ) )的贝叶斯公式,有闭式解:
q ( x t − 1 ∣ x t , x 0 ) = N ( μ ~ q ( x t , x 0 ) , σ t 2 I ) , 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 ( x t − 1 ∣ x t , x 0 ) = N ( μ ~ q ( x t , x 0 ) , σ t 2 I ) ,
μ ~ q ( x t , x 0 ) = α ˉ t − 1 ( 1 − α t ) 1 − α ˉ t ⏟ α t ( 0 ) x 0 + α t ( 1 − α ˉ t − 1 ) 1 − α ˉ t ⏟ α t ( t ) x t , σ t 2 = ( 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}. μ ~ q ( x t , x 0 ) = α t ( 0 ) 1 − α ˉ t α ˉ t − 1 ( 1 − α t ) x 0 + α t ( t ) 1 − α ˉ t α t ( 1 − α ˉ t − 1 ) x t , σ t 2 = 1 − α ˉ t ( 1 − α ˉ t − 1 ) ( 1 − α t ) .
推导 :作为 x t − 1 x_{t-1} x t − 1 的函数,q ( x t − 1 ∣ x t , x 0 ) ∝ q ( x t ∣ x t − 1 ) q ( x t − 1 ∣ x 0 ) q(x_{t-1} \mid x_t, x_0) \propto q(x_t \mid x_{t-1})\, q(x_{t-1} \mid x_0) q ( x t − 1 ∣ x t , x 0 ) ∝ q ( x t ∣ x t − 1 ) q ( x t − 1 ∣ x 0 ) 。两个高斯因子的精度相加:α t 1 − α t + 1 1 − α ˉ 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})} 1 − α t α t + 1 − α ˉ t − 1 1 = ( 1 − α t ) ( 1 − α ˉ t − 1 ) 1 − α ˉ t ,其倒数就是 σ t 2 \sigma_t^2 σ t 2 ;均值是两个”观测”x t / α t x_t/\sqrt{\alpha_t} x t / α t 和 α ˉ t − 1 x 0 \sqrt{\bar\alpha_{t-1}}\, x_0 α ˉ t − 1 x 0 的精度加权平均(前置讲 P2 §2.6),整理即得上式。
02 的第 2 部分用 400 万对模拟样本核对:x 0 = 1 x_0 = 1 x 0 = 1 、t = 300 t = 300 t = 300 ,只留下 x t ≈ 0.930 x_t \approx 0.930 x t ≈ 0.930 的 18,930 对,x t − 1 x_{t-1} x t − 1 的经验均值 0.92870、方差 5.98e-3;公式给出 0.92943、6.03e-3。均值是 x 0 x_0 x 0 和 x t x_t x t 的加权平均(这里 α t ( 0 ) = 0.006 \alpha_t^{(0)} = 0.006 α t ( 0 ) = 0.006 、α t ( t ) = 0.993 \alpha_t^{(t)} = 0.993 α t ( t ) = 0.993 ——一步只挪一点点),方差和 x 0 x_0 x 0 、x t x_t x t 都无关。
训练时我们恰好知道 x 0 x_0 x 0 (噪声是我们自己加的),所以可以用这个闭式解当”标准答案”;采样时不知道 x 0 x_0 x 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:“之后我们会证明,给定一个训练样本 x 0 x_0 x 0 ,我们希望 p θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1} \mid x_t) p θ ( x t − 1 ∣ x t ) 尽量接近 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 ,它应该像精确的反向过程那样减掉噪声。”
想法 1 :不学方差,直接用 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 ) = σ t 2 I \Sigma_\theta(x_t, t) = \sigma_t^2 I Σ θ ( x t , t ) = σ t 2 I 。
想法 2 :让 μ θ ( x t , t ) \mu_\theta(x_t, t) μ θ ( x t , t ) 接近 μ ~ q ( x t , x 0 ) \tilde\mu_q(x_t, x_0) μ ~ q ( x t , x 0 ) 。三种参数化:
选项 A :网络直接输出均值,μ θ ( x t , t ) = UNet θ ( x t , t ) \mu_\theta(x_t, t) = \text{UNet}_\theta(x_t, t) μ θ ( x t , t ) = UNet θ ( x t , t ) (t t t 作为额外的特征输入)。
选项 B :网络估计真正的 x 0 x_0 x 0 ,x θ ( 0 ) ( x t , t ) = UNet θ ( x t , t ) x_\theta^{(0)}(x_t, t) = \text{UNet}_\theta(x_t, t) x θ ( 0 ) ( x t , t ) = UNet θ ( x t , t ) ,再代进公式:μ θ = α t ( 0 ) x θ ( 0 ) + α t ( t ) x t \mu_\theta = \alpha_t^{(0)} x_\theta^{(0)} + \alpha_t^{(t)} x_t μ θ = α t ( 0 ) x θ ( 0 ) + α t ( t ) x t 。
选项 C :网络估计前向过程里产生 x t x_t x t 的那份噪声 ε \varepsilon ε ,ε θ ( x t , t ) = UNet θ ( x t , t ) \varepsilon_\theta(x_t, t) = \text{UNet}_\theta(x_t, t) ε θ ( x t , t ) = UNet θ ( x t , t ) ,由它算出 x θ ( 0 ) = ( x t − 1 − α ˉ t ε θ ) / α ˉ t x_\theta^{(0)} = (x_t - \sqrt{1-\bar\alpha_t}\, \varepsilon_\theta)/\sqrt{\bar\alpha_t} x θ ( 0 ) = ( x t − 1 − α ˉ t ε θ ) / α ˉ t ,再同选项 B。
5.2 性质 3:用噪声表示的均值
把性质 1 反过来:x 0 = ( x t − 1 − α ˉ t ε ) / α ˉ t x_0 = (x_t - \sqrt{1 - \bar\alpha_t}\, \varepsilon)/\sqrt{\bar\alpha_t} x 0 = ( x t − 1 − α ˉ t ε ) / α ˉ t ,代进性质 2 的 μ ~ q \tilde\mu_q μ ~ q :
μ ~ q ( x t , x 0 ) = 1 α t ( x t − 1 − α t 1 − α ˉ 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). μ ~ q ( x t , x 0 ) = α t 1 ( x t − 1 − α ˉ t 1 − α t ε ) .
slides:“这种参数化在实践中被证明有助于学习 p θ p_\theta p θ 。“02 在 1000 组随机的 ( x t , x 0 , t ) (x_t, x_0, t) ( x t , x 0 , t ) 上核对,两种写法最大相差 7e-8(float32 系数的舍入)。直觉:去噪 = 从 x t x_t x t 里减掉一小部分估计出来的噪声,再放大一点 。
5.3 三种选项,哪个好?
04 用同一个小 MLP 去噪网络(7 万参数)、同样的训练步数,比较三种参数化:
数据 训练步数 A:预测均值 B:预测 x 0 x_0 x 0 C:预测噪声 八高斯圆环(高质量样本比例) 3000 0.056 0.403 0.875 10000 0.096 0.917 0.961 瑞士卷(落在线上的比例) 3000 0.178 0.513 0.911 10000 0.206 0.969 0.980
和 slides 一致:选项 C 最好 。选项 B 训练得更久会追上来,选项 A 一直学不好。为什么?把三个损失都换算成 ∥ ε − ε ^ ∥ 2 \lVert\varepsilon - \hat\varepsilon\rVert^2 ∥ ε − ε ^ ∥ 2 :
∥ x 0 − 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 . ∥ x 0 − x ^ 0 ∥ 2 = α ˉ t 1 − α ˉ t ∥ ε − ε ^ ∥ 2 , ∥ μ ~ q − μ θ ∥ 2 = α t ( 1 − α ˉ t ) ( 1 − α t ) 2 ∥ ε − ε ^ ∥ 2 .
三个损失是同一个目标在不同 t t t 上的不同加权 :
t 1 10 100 500 1000 选项 A 的权重 1.0e-4 4.1e-5 4.2e-5 1.1e-4 4.1e-4 选项 B 的权重 1.0e-4 1.9e-3 0.115 11.7 24,800 选项 C 的权重 1 1 1 1 1
选项 A 的权重只有 10 − 4 10^{-4} 1 0 − 4 量级:它的回归目标 μ ~ q \tilde\mu_q μ ~ q 里,“什么都不做”的猜测 x t / α t x_t/\sqrt{\alpha_t} x t / α t 已经解释了 99.988% 的方差,真正要学的修正只占 1.2 × 10 − 4 1.2\times10^{-4} 1.2 × 1 0 − 4 ——网络稍微”抄得不准”,就把这点信号淹没了。
选项 B 把几乎全部注意力放在 t t t 很大的步上(那里 x 0 x_0 x 0 根本猜不准,误差大),对 t t t 很小时的精细修正几乎不在乎,所以样本不够”紧”。
选项 C 对所有 t t t 一视同仁,回归目标 ε \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 就是这几行。采样算法是:x T ∼ N ( 0 , I ) x_T \sim \mathcal N(0, I) x T ∼ N ( 0 , I ) ;对 t = T , … , 1 t = T, \ldots, 1 t = T , … , 1 :x t − 1 = μ θ ( x t , t ) + σ t z x_{t-1} = \mu_\theta(x_t, t) + \sigma_t z x t − 1 = μ θ ( x t , t ) + σ t z (最后一步不加噪声)。第 8 讲会把它写成三种选项各自的版本。
时间步 t t t 怎样输入网络?和第 2 讲 Transformer 的正弦位置编码同一个公式:一组不同频率的 sin \sin sin 、cos \cos cos ,低频分量分辨”大概在哪个阶段”,高频分量分辨相邻的步。
6.2 二维瑞士卷
03 用一个 7 万参数的 MLP 去噪网络,在瑞士卷上训练 10000 步(单线程 9 秒),采 2000 个点(走完 1000 步,1.7 秒):
反向过程从一团标准高斯出发,前一半的步数里几乎看不出变化,t = 250 t = 250 t = 250 时也只是一团略带结构的点,到 t = 100 t = 100 t = 100 左右才看得出螺旋,最后几十步把点”收紧”到线上——和 §3.4 的前向过程正好倒过来。
98% 的样本落在螺线附近(真实数据 100%),沿螺线各段分布得比较均匀(和均匀分布的总变差距离 0.060,真实数据 0.028)。
没有判别器,没有博弈,训练目标只是一个回归问题。
6.3 八高斯圆环:会模式崩塌吗?
第 6 讲的 GAN 在八高斯圆环上,学习率 1e-3 时四个种子覆盖 3、3、2、8 个模式。同样大小的扩散模型,四个种子:
种子 0 1 2 3 覆盖的模式数 8 8 8 8 高质量比例 0.960 0.956 0.946 0.949
扩散模型没有”追着跑”:它在每个 t t t 上都是一个普通的回归问题,所有真实数据点都参与训练——漏掉一个模式,那个模式附近加噪后的点的回归误差就会很大,梯度会把它拉回来。第 8 讲会看到它的训练目标本质上是(变分形式的)最大似然,而第 6 讲 §3.7 说过:最大似然”宁可糊、不肯漏”。
6.4 训练损失不是质量指标
03 的第 3 部分把训练好的瑞士卷模型在不同 t t t 上的损失分开算:
t 1 10 50 100 250 500 750 1000 ∥ ε − ε θ ∥ 2 \lVert\varepsilon - \varepsilon_\theta\rVert^2 ∥ ε − ε θ ∥ 2 1.021 0.850 0.569 0.651 0.618 0.137 0.007 0.002
(永远输出 0 的损失是 1。)t t t 很小时损失接近 1:加的噪声(标准差 0.01)比数据本身的”厚度”(0.05)还小,根本分不清哪部分是我们加的——好在这时猜错影响很小。t t t 很大时 x t x_t x t 几乎全是噪声,ε ≈ x t \varepsilon \approx x_t ε ≈ x t ,抄一遍就对。所以不同 t t t 的损失天然处在不同量级,整体的平均损失主要由”本来就猜不出”的小 t t t 决定。扩散模型的训练损失不能直接当质量指标 ,要采样出来评估。
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 = 50 t = 50 t = 50 和 t = 800 t = 800 t = 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 = 50 t = 200 t = 500 MLP(784 → 1024 → 1024 → 784) 4,888,336 0.7525 0.2539 0.1353 U-Net(有跳接) 192,140 0.2114 0.0462 0.0183 U-Net 去掉跳接 185,732 0.2184 0.0460 0.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
扩散模型 = 一个固定的 前向加噪过程 + 一个学到的 反向去噪过程。x 1 , … , x T x_1, \ldots, x_T x 1 , … , x T 都是隐变量。
前向过程只用线性高斯,所以性质 1:x t = α ˉ t x 0 + 1 − α ˉ t ε x_t = \sqrt{\bar\alpha_t}\, x_0 + \sqrt{1-\bar\alpha_t}\, \varepsilon x t = α ˉ t x 0 + 1 − α ˉ t ε ,任意一步一次采到;噪声调度保证 q ( x T ) ≈ N ( 0 , I ) q(x_T) \approx \mathcal N(0, I) q ( x T ) ≈ N ( 0 , I ) 。
精确的反向一步依赖未知的数据分布,算不出来;但给定 x 0 x_0 x 0 有闭式解(性质 2),训练时正好知道 x 0 x_0 x 0 。
每一步噪声很小时,反向一步几乎是高斯;很多个这样的小步合起来可以表示复杂的分布。步数少时这个近似失效。
三种参数化是同一个目标的三种时间加权;预测噪声(选项 C)权重均匀、目标量级固定,实践中最好。
训练就是”随机挑 t t t 、加噪、回归噪声”;在二维数据上它不模式崩塌。训练损失不是质量指标。
U-Net 输出和输入一样大,用卷积的归纳偏置和跳接同时照顾全局与细节;在我们的小网络里跳接作用不大,MLP 则完全不行。
训练目标在训练集上的最优解是”背答案”;网络学不到这个最优解,才会生成新东西。
9. 常见误区 · Common pitfalls
“前向过程要学。” 不学。α t \alpha_t α t 是固定的调度,前向过程没有参数(slides 的 q ϕ q_\phi q ϕ 里的 ϕ \phi ϕ 在 DDPM 里是固定的)。
“训练时要先跑 t t t 步前向过程。” 不用,性质 1 一步到位。
“每一步是高斯,所以生成的图是高斯分布的。” 每一步的均值是神经网络(非线性)给的;很多步合起来可以是任意平滑的分布(§4.2)。
“两个高斯相减,方差相减。” 方差永远相加(§2 第 2 条)。
”q ( x t ) q(x_t) q ( x t ) 是高斯。” q ( x t ∣ x 0 ) q(x_t \mid x_0) q ( x t ∣ x 0 ) 是高斯;q ( x t ) q(x_t) q ( x t ) 是对数据分布的混合,t t t 小的时候一点都不像高斯(§3.4)。
“预测 x 0 x_0 x 0 、预测噪声、预测均值,数学上等价,所以没区别。” 可以互相换算,但作为训练目标,它们给不同的 t t t 不同的权重,效果差别很大(§5.3)。
“训练损失越低,生成的图越好。” 损失主要由”本来就猜不出”的小 t t t 决定(§6.4)。
“训练得越好越会生成新东西。” 训练目标在训练集上的完美解是背答案(§4.4)。
10. 练习 · Exercises
练习 1(性质 1 的归纳)。 假设 x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ε ′ x_{t-1} = \sqrt{\bar\alpha_{t-1}}\, x_0 + \sqrt{1 - \bar\alpha_{t-1}}\, \varepsilon' x t − 1 = α ˉ t − 1 x 0 + 1 − α ˉ t − 1 ε ′ ,证明 x t x_t x t 的方差项是 1 − α ˉ t 1 - \bar\alpha_t 1 − α ˉ t 。如果去掉每一步的 α t \sqrt{\alpha_t} α t (即 x t = x t − 1 + 1 − α t ε x_t = x_{t-1} + \sqrt{1-\alpha_t}\,\varepsilon x t = x t − 1 + 1 − α t ε ),x T x_T x T 会怎样?
参考答案
噪声部分是 α t ( 1 − α ˉ t − 1 ) ε ′ + 1 − α t ε ′ ′ \sqrt{\alpha_t(1-\bar\alpha_{t-1})}\,\varepsilon' + \sqrt{1-\alpha_t}\,\varepsilon'' α t ( 1 − α ˉ t − 1 ) ε ′ + 1 − α t ε ′′ ,两个独立高斯之和,方差 α 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 α ˉ t − 1 + 1 − α t = 1 − α ˉ t (因为 α t α ˉ t − 1 = α ˉ t \alpha_t\bar\alpha_{t-1} = \bar\alpha_t α t α ˉ t − 1 = α ˉ t )。去掉缩放后 x T = x 0 + N ( 0 , ∑ t ( 1 − α t ) ) x_T = x_0 + \mathcal N(0, \sum_t(1-\alpha_t)) x T = x 0 + N ( 0 , ∑ t ( 1 − α t )) :原图的系数始终是 1,噪声方差约为 ∑ t β t ≈ 10 \sum_t \beta_t \approx 10 ∑ t β t ≈ 10 ,x T x_T x T 既不是 N ( 0 , I ) \mathcal N(0, I) N ( 0 , I ) ,也没有”忘掉”x 0 x_0 x 0 。(这其实是另一类”方差爆炸”的扩散模型,见 Song et al., 2021 的 SDE 框架。)
练习 2(估算 α ˉ T \bar\alpha_T α ˉ T )。 线性调度 1 − α t 1 - \alpha_t 1 − α t 从 1e-4 到 0.02,T = 1000 T = 1000 T = 1000 。不用计算机,估算 α ˉ T \bar\alpha_T α ˉ T 。
参考答案
ln α ˉ T = ∑ t ln ( 1 − β t ) ≈ − ∑ t β t − 1 2 ∑ t β t 2 \ln\bar\alpha_T = \sum_t \ln(1 - \beta_t) \approx -\sum_t\beta_t - \tfrac12\sum_t\beta_t^2 ln α ˉ T = ∑ t ln ( 1 − β t ) ≈ − ∑ t β t − 2 1 ∑ t β t 2 。∑ β t = 1000 × ( 10 − 4 + 0.02 ) / 2 = 10.05 \sum\beta_t = 1000 \times (10^{-4} + 0.02)/2 = 10.05 ∑ β t = 1000 × ( 1 0 − 4 + 0.02 ) /2 = 10.05 ,∑ β t 2 ≈ 0.134 \sum\beta_t^2 \approx 0.134 ∑ β t 2 ≈ 0.134 。一阶近似 e − 10.05 = 4.3 × 10 − 5 e^{-10.05} = 4.3\times10^{-5} e − 10.05 = 4.3 × 1 0 − 5 ;加上二阶项 × e − 0.067 \times e^{-0.067} × e − 0.067 ,得 4.04 × 10 − 5 4.04\times10^{-5} 4.04 × 1 0 − 5 。精确值 4.036 × 10 − 5 4.036\times10^{-5} 4.036 × 1 0 − 5 (01 的输出)。
练习 3(性质 2)。 用”精度相加、均值按精度加权”推导 σ t 2 \sigma_t^2 σ t 2 和 μ ~ q \tilde\mu_q μ ~ q 。验证 t = 1 t = 1 t = 1 时 σ 1 2 = 0 \sigma_1^2 = 0 σ 1 2 = 0 、μ ~ q = x 0 \tilde\mu_q = x_0 μ ~ q = x 0 ,并解释为什么。
参考答案
x t − 1 x_{t-1} x t − 1 的两个”信息来源”:先验 q ( x t − 1 ∣ x 0 ) = N ( α ˉ t − 1 x 0 , 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 ( x t − 1 ∣ x 0 ) = N ( α ˉ t − 1 x 0 , 1 − α ˉ t − 1 ) ;似然 q ( x t ∣ x t − 1 ) q(x_t \mid x_{t-1}) q ( x t ∣ x t − 1 ) 看成 x t − 1 x_{t-1} x t − 1 的函数是 N ( x t / α t , ( 1 − α t ) / α t ) \mathcal N(x_t/\sqrt{\alpha_t}, (1-\alpha_t)/\alpha_t) N ( x t / α t , ( 1 − α t ) / α t ) 。精度 1 1 − α ˉ t − 1 + α t 1 − α 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)} 1 − α ˉ t − 1 1 + 1 − α t α t = ( 1 − α ˉ t − 1 ) ( 1 − α t ) 1 − α ˉ t ,倒数即 σ t 2 \sigma_t^2 σ t 2 。均值 = σ t 2 ( α ˉ t − 1 x 0 1 − α ˉ t − 1 + α t x t 1 − α 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 2 ( 1 − α ˉ t − 1 α ˉ t − 1 x 0 + 1 − α t α t x t ) ,展开即 α t ( 0 ) x 0 + α t ( t ) x t \alpha_t^{(0)}x_0 + \alpha_t^{(t)}x_t α t ( 0 ) x 0 + α t ( t ) x t 。t = 1 t = 1 t = 1 时 α ˉ 0 = 1 \bar\alpha_0 = 1 α ˉ 0 = 1 :先验方差为 0(x 0 x_0 x 0 已知,"x t − 1 x_{t-1} x t − 1 "就是 x 0 x_0 x 0 ),所以 σ 1 2 = 0 \sigma_1^2 = 0 σ 1 2 = 0 、均值 = x 0 = x_0 = x 0 。
练习 4(性质 3)。 把 x 0 = ( x t − 1 − α ˉ t ε ) / α ˉ t x_0 = (x_t - \sqrt{1-\bar\alpha_t}\,\varepsilon)/\sqrt{\bar\alpha_t} x 0 = ( x t − 1 − α ˉ t ε ) / α ˉ t 代进 μ ~ q \tilde\mu_q μ ~ q ,推出 1 α t ( x t − 1 − α t 1 − α ˉ t ε ) \frac{1}{\sqrt{\alpha_t}}(x_t - \frac{1-\alpha_t}{\sqrt{1-\bar\alpha_t}}\varepsilon) α t 1 ( x t − 1 − α ˉ t 1 − α t ε ) 。
参考答案
x t x_t x 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 ( 0 ) / α ˉ t + α t ( t ) = α t ( 1 − α ˉ t ) ( 1 − α t ) + α t ( 1 − α ˉ t − 1 ) = α t ( 1 − α ˉ t ) 1 − α ˉ t = α t 1 (用了 α ˉ t − 1 / α ˉ t = 1 / α t \sqrt{\bar\alpha_{t-1}}/\sqrt{\bar\alpha_t} = 1/\sqrt{\alpha_t} α ˉ t − 1 / α ˉ t = 1/ α t )。ε \varepsilon ε 的系数:− α t ( 0 ) 1 − α ˉ t / α ˉ t = − 1 − α t α t 1 − α ˉ 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}} − α t ( 0 ) 1 − α ˉ t / α ˉ t = − α t 1 − α ˉ t 1 − α t 。合起来即得。
练习 5(q ( x t ) q(x_t) q ( x t ) 什么时候变成单峰)。 数据只有两个点 ±1(各一半)。q ( x t ) q(x_t) q ( x t ) 是什么?t t t 多大时它变成单峰?(提示:两个等权重、等方差的高斯 N ( ± m , s 2 ) \mathcal N(\pm m, s^2) N ( ± m , s 2 ) 的混合,当且仅当 m ≤ s m \le s m ≤ s 时是单峰。)
参考答案
q ( x t ) = 1 2 N ( α ˉ t , 1 − α ˉ t ) + 1 2 N ( − α ˉ 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) q ( x t ) = 2 1 N ( α ˉ t , 1 − α ˉ t ) + 2 1 N ( − α ˉ t , 1 − α ˉ t ) 。单峰当且仅当 α ˉ t ≤ 1 − α ˉ t \sqrt{\bar\alpha_t} \le \sqrt{1-\bar\alpha_t} α ˉ t ≤ 1 − α ˉ t ,即 α ˉ t ≤ 1 / 2 \bar\alpha_t \le 1/2 α ˉ t ≤ 1/2 。线性调度下第一次满足是 t = 260 t = 260 t = 260 (01 第 2 部分)。之后的反向步要从一个单峰分布里”分出”两个峰,靠的是均值对 x t x_t x t 的非线性依赖。
练习 6(三种权重)。 推导选项 B 的损失 ∥ x 0 − 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 ∥ x 0 − x ^ 0 ∥ 2 = α ˉ t 1 − α ˉ t ∥ ε − ε ^ ∥ 2 ,并解释为什么它在 t = 1000 t = 1000 t = 1000 时的权重高达 2.5 万。
参考答案
x ^ 0 = ( x t − 1 − α ˉ t ε ^ ) / α ˉ t \hat x_0 = (x_t - \sqrt{1-\bar\alpha_t}\,\hat\varepsilon)/\sqrt{\bar\alpha_t} x ^ 0 = ( x t − 1 − α ˉ t ε ^ ) / α ˉ t ,x 0 = ( x t − 1 − α ˉ t ε ) / α ˉ t x_0 = (x_t - \sqrt{1-\bar\alpha_t}\,\varepsilon)/\sqrt{\bar\alpha_t} x 0 = ( x t − 1 − α ˉ t ε ) / α ˉ t ,相减得 x 0 − x ^ 0 = 1 − α ˉ t α ˉ t ( ε ^ − ε ) x_0 - \hat x_0 = \frac{\sqrt{1-\bar\alpha_t}}{\sqrt{\bar\alpha_t}}(\hat\varepsilon - \varepsilon) x 0 − x ^ 0 = α ˉ t 1 − α ˉ t ( ε ^ − ε ) ,平方即得。t = 1000 t = 1000 t = 1000 时 α ˉ t = 4 × 10 − 5 \bar\alpha_t = 4\times10^{-5} α ˉ t = 4 × 1 0 − 5 ,1 / α ˉ t ≈ 25000 1/\bar\alpha_t \approx 25000 1/ α ˉ t ≈ 25000 :x t x_t x t 里只剩 0.6% 的原图,噪声估计的一点点误差被放大 160 倍变成 x 0 x_0 x 0 的误差。
练习 7(只有 8 个训练点)。 解释 02 第 4 部分的结果:为什么”对训练集最优”的去噪器只会复现训练点?如果改成 8000 个训练点,结果会变吗?
参考答案
训练目标是对训练集上的经验分布做回归,它的最优解是经验分布下的条件期望;用这个最优解(和 §4.2 中”精确反向”的论证一样)做 T T T 很大的采样,得到的正是经验分布本身——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 相比,扩散模型的隐变量有什么不同?
参考答案
x 1 , … , x T x_1, \ldots, x_T x 1 , … , x T 。和 GAN 的 z z z (32 维,比图像小得多)不同:(1) 每个隐变量都和图像一样大(784 维);(2) 有 T T T 组,形成一条马尔可夫链;(3) 编码器(前向过程)是固定的、不学;(4) 给定 x 0 x_0 x 0 ,隐变量的后验 q ( x 1 : T ∣ x 0 ) q(x_{1:T} \mid x_0) q ( x 1 : T ∣ 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 θ ( x t − 1 ∣ x t ) p_\theta(x_{t-1} \mid x_t) p θ ( x t − 1 ∣ x t ) 接近 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 ) “是对的?第 8 讲:
把 DDPM 的目标写成变分下界 (ELBO),逐项拆开,看清楚”预测噪声”其实是把下界的权重换成了 1;
在形状世界上训练 U-Net 扩散模型,和第 6 讲的 GAN 用同一套尺子比较;
采样一张图要几步?DDPM 跳步 vs DDIM;
从扩散模型走向 VAE:同样是隐变量 + 变分推断。