Lecture 14 · 得分模型(二):多尺度噪声、NCSN 与 SDE · Score-Based Models II

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

课程源码 ZIP ↓

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

本篇目录

对应 Maps to:Stanford CS236 Deep Generative Models(Fall 2023,Stefano Ermon),Lecture 14 · 2023-11-13 · Score Based Models(slides:lecture_14_comp.pptx;课表上写成 Energy Based Models,slides 内容是得分模型的后半)。 依据说明:本讲按原课 slides 的顺序展开:回顾得分模型与三个陷阱 → 加高斯噪声及其权衡 → 多尺度噪声 → 退火朗之万动力学及其与普通朗之万的比较 → 噪声条件得分网络(NCSN):训练目标、噪声尺度的选择、加权函数、训练算法、实验 → 无穷多个噪声尺度:用 SDE 扰动数据、反向 SDE、时间相关的得分模型、欧拉–丸山、预测–校正 → 概率流 ODE:精确似然、高效采样 → 可控生成(条件得分 = 无条件得分 + 分类器梯度;补全、上色、医学成像)。主要依据 Song & Ermon(NeurIPS 2019、NeurIPS 2020)、Song et al.(ICLR 2021,Score-Based Generative Modeling through SDEs)和 Yang Song 的博客。噪声尺度权衡的定量分析、比例在退火的哪一级被”冻结”、加权函数各级损失的量级、四种 NCSN 参数化的对比(包括 sθ(x)/σs_\theta(x)/\sigma 在二维里为什么失败)、VE 概率流 ODE 的先验失配偏差及 SDE 对它的鲁棒性、ODE 似然与真值的逐点对照、Hutchinson 估计在对角雅可比上精确是本讲义补充的。所有采样器都先用精确的得分测试(高斯混合在任意噪声水平、任意时刻都能精确写出),这样看到的误差全部来自采样器本身;再换成学到的得分。 配套代码 Code:code/lecture14/(PyTorch;共享模块 sde.py + 5 个演示脚本,复用第 13 讲的 score.py,最长的约 65 秒) 预计阅读时间:3.5 小时(含运行代码)


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

0.1 学习目标 Learning goals

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

  1. 说出加高斯噪声怎样缓解第 13 讲的三个陷阱,以及单一噪声尺度为什么只能折中。
  2. 写出退火朗之万动力学,解释步长为什么取 αi∝σi2\alpha_i \propto \sigma_i^2、模式比例是在哪一级被决定的。
  3. 写出噪声条件得分网络的训练目标,解释加权 λ(σ)=σ2\lambda(\sigma) = \sigma^2、最大噪声 σ1\sigma_1、相邻尺度之比 γ\gamma 怎样选,以及 γ\gamma 为什么和维数有关。
  4. 写出 VE、VP 两种前向 SDE 和反向 SDE,知道生成 = 解反向 SDE,会用欧拉–丸山法和预测–校正法采样。
  5. 由 Fokker–Planck 方程推出概率流 ODE,说明它为什么能给出精确似然、为什么能用更少的步数、以及它对先验失配为什么比 SDE 敏感。
  6. 用贝叶斯公式推导可控生成:条件得分 = 无条件得分 + 噪声条件分类器的梯度;知道”分类器引导权重”w>1w > 1 的效果。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面几讲再展开 Previewed only
第 13 讲:去噪得分匹配、Tweedie 公式、朗之万、三个陷阱DDPM、扩散模型 = 层级 VAE(第 16 讲)
第 7–8 讲:变量替换公式、归一化流无分类器引导、潜空间扩散、蒸馏(第 16 讲)
第 12 讲:未调整朗之万的稳定性条件 ϵ<2s2\epsilon < 2s^2用似然评估得分模型(第 15 讲)
微积分:常微分方程的数值解(欧拉法)严格的随机分析(伊藤积分)——只用直觉和离散化

0.3 本讲地图 Map

§1  回顾:三个陷阱;加高斯噪声及其权衡                                ← 代码 01 第 1 部分
§2  多尺度噪声:噪声尺度怎样选(σ_1、γ 与维数)                       ← 代码 01 第 2 部分
§3  NCSN:退火朗之万;噪声条件得分网络;加权函数;实验               ← 代码 02、03
§4  无穷多个噪声尺度:前向 SDE、反向 SDE、训练、预测–校正              ← 代码 04 第 1–2 部分
§5  概率流 ODE:确定性、可逆、精确似然、先验失配                       ← 代码 04 第 2–4 部分
§6  可控生成:条件得分 = 无条件得分 + 分类器梯度                       ← 代码 05
§7  2023 年之后
§8–12  小结、常见误区、练习、延伸阅读、下一讲预告

0.4 记号 Notation

符号含义
σ1>σ2>⋯>σL\sigma_1 > \sigma_2 > \dots > \sigma_L离散的噪声尺度(几何级数,相邻之比 γ\gamma)
sθ(x,σ)s_\theta(x, \sigma) / sθ(x,t)s_\theta(x, t)噪声条件 / 时间相关的得分模型
λ(σ)\lambda(\sigma) / λ(t)\lambda(t)各个噪声尺度的损失权重
dx=f(x,t)dt+g(t)dwdx = f(x, t)dt + g(t)dw前向 SDE;ff 漂移系数,gg 扩散系数,ww 布朗运动
pt(x)p_t(x)时刻 tt 的边缘分布;p0=pdatap_0 = p_{\text{data}},p1≈p_1 \approx 先验
VE:xt=x0+σtzx_t = x_0 + \sigma_t z方差爆炸 SDE,σt=σmin⁡(σmax⁡/σmin⁡)t\sigma_t = \sigma_{\min}(\sigma_{\max}/\sigma_{\min})^t
VP:xt=αˉtx0+1−αˉtzx_t = \sqrt{\bar\alpha_t}x_0 + \sqrt{1 - \bar\alpha_t}z方差保持 SDE,αˉt=e−∫0tβ(s)ds\bar\alpha_t = e^{-\int_0^t\beta(s)ds},β(t)=βmin⁡+t(βmax⁡−βmin⁡)\beta(t) = \beta_{\min} + t(\beta_{\max} - \beta_{\min})
f~=f−12g2∇log⁡pt\tilde f = f - \frac12g^2\nabla\log p_t概率流 ODE 的速度场
NFE采样时调用得分网络的次数(number of function evaluations)

0.5 关于数字 · About the numbers

数据和第 13 讲相同:两个高斯(左 0.8 / 右 0.2、中心 (∓2,0)(\mp2, 0)、标准差 0.4)、双月牙、8 个高斯的圆环。高斯混合经过 VE / VP 加噪后仍是高斯混合,所以任意时刻的 ptp_t、得分、散度都有闭式解;代码 02、04 和 05 第 1 部分全部用精确得分,结果里没有任何学习误差。“左边比例”的真实值是 0.800;切片 W1 是和真实样本的距离,噪声底约 0.02–0.03。训练相关的数字来自固定种子的单次运行;和预想不同的结果记录在 代码 README 的”关于实验结果”里。


1. 回顾:加高斯噪声 · Gaussian perturbation

1.1 三个陷阱,一个办法

第 13 讲的三个陷阱:(1) 数据落在低维流形上,得分在流形外没有定义;(2) 低密度区域没有训练样本,得分估计不准;(3) 模式之间有深谷,朗之万几乎不跨越,样本比例由初始点决定。slides 指出它们有一个共同的解药——给数据加高斯噪声:

  • 加噪后的分布 qσq_\sigma 铺满整个空间,得分处处有定义(第 13 讲 §6.1:严格在圆周上的数据,去噪得分匹配的损失稳定在 50);
  • 噪声把样本”扩散”到原来的低密度区域,那里有了训练信号;
  • 噪声把模式之间的低谷填平,链可以自由往来。

1.2 权衡:噪声大 vs 噪声小

slides 的”trade-off”:噪声大,以上三点都好,但 qσq_\sigma 离 pdatap_{\text{data}} 远(“数据质量”差);噪声小则反之。代码 01 第 1 部分把每一面都量了出来(两个高斯,全部精确计算,外加一个训练 1,500 步的去噪得分网络):

σ\sigmaDKL(pdata∥qσ)D_{\mathrm{KL}}(p_{\text{data}} \Vert q_\sigma)qσ>10−3q_\sigma > 10^{-3} 的面积低谷 / 模式中心朗之万的左边比例(qσq_\sigma 自己的)学到的得分在整个方框上的相对误差
0.050.00024.7%5.6×10−65.6\times10^{-6}0.497(0.801)13.70%
0.10.00125.5%9.7×10−69.7\times10^{-6}0.497(0.801)10.88%
0.30.08435.1%4.2×10−44.2\times10^{-4}0.519(0.801)5.95%
0.60.48261.5%2.7×10−22.7\times10^{-2}0.783(0.799)1.25%
1.01.11191.2%0.220.784(0.782)0.23%
2.02.164100.0%0.750.697(0.703)0.09%

从上往下:覆盖面积变大、低谷被填平、学到的得分在整个方框上越来越准,朗之万的比例从”初始点的比例”(约 0.5,链不混合)变成和 qσq_\sigma 自己的比例一致(σ≥0.6\sigma \geq 0.6,链自由来回)。但第二列同时变差:σ=1\sigma = 1 时 KL 已超过 1 nat,σ=2\sigma = 2 时 qσq_\sigma 自己的左边比例只有 0.70——两个模式糊在了一起。采样对了,采的却是一个太模糊的分布。没有一个 σ\sigma 能让所有列同时好。


2. 多尺度噪声 · Multi-scale noise perturbations

2.1 想法

既然大噪声负责”混合、覆盖”,小噪声负责”保真”,那就同时用一串噪声尺度 σ1>σ2>⋯>σL\sigma_1 > \sigma_2 > \dots > \sigma_L:得到一串逐渐变清晰的分布 qσ1,qσ2,…,qσL≈pdataq_{\sigma_1}, q_{\sigma_2}, \dots, q_{\sigma_L} \approx p_{\text{data}},分别估计它们的得分,采样时从最模糊的开始,一级级往清晰走(§3.1)。剩下的问题是:σ1\sigma_1 多大、σL\sigma_L 多小、中间分几级?

2.2 怎样选噪声尺度(Song & Ermon 2020)

slides 给出三条原则:

  1. 最大的噪声 σ1\sigma_1 ≈ 数据点之间的最大欧氏距离(技巧 1)。这样 qσ1q_{\sigma_1} 几乎分不清不同的数据点,朗之万可以在任意两个数据点之间来回——模式的比例在这一级附近被决定。代码 01:两个高斯 7.61、双月牙 5.25、圆环 5.61、像素世界(64 维)5.92;Song & Ermon 在 CIFAR-10 上用 σ1=50\sigma_1 = 50。
  2. 最小的噪声 σL\sigma_L 要足够小,小到 qσLq_{\sigma_L} 和数据看不出区别(图像上 0.01,像素值在 [0, 1] 时)。
  3. 相邻尺度要有足够的重叠(技巧 2):用几何级数 σi=σ1γ−(i−1)\sigma_i = \sigma_1\gamma^{-(i-1)},γ\gamma 满足

Φ(2d(γ−1)+3γ)−Φ(2d(γ−1)−3γ)≈0.5.\Phi\left(\sqrt{2d}(\gamma - 1) + 3\gamma\right) - \Phi\left(\sqrt{2d}(\gamma - 1) - 3\gamma\right) \approx 0.5.

这个式子从哪里来。 高维的高斯有一个反直觉的性质:x∼N(0,σ2Id)x \sim \mathcal{N}(0, \sigma^2I_d) 几乎都落在一个薄壳上,∥x∥\Vert x\Vert 近似服从 N(σd,σ2/2)\mathcal{N}(\sigma\sqrt d, \sigma^2/2)——半径 σd\sigma\sqrt d,厚度只有 σ/2\sigma/\sqrt2,相对厚度 ∝1/d\propto 1/\sqrt d(练习 1)。上式是”N(0,σi2I)\mathcal{N}(0, \sigma_i^2I) 的样本落进 N(0,σi−12I)\mathcal{N}(0, \sigma_{i-1}^2I) 那层壳的 ±3\pm3 个标准差以内”的概率。让它约为 0.5,相邻两级的高概率区域就有足够重叠,上一级的样本是下一级的好起点。

代码 01 第 2 部分(从 σ1=50\sigma_1 = 50 降到 σL=0.01\sigma_L = 0.01):

维数 dd例子γ\gamma蒙特卡洛的重叠需要的级数 LL
2二维玩具数据———
64像素世界 8×81.36080.47429
3,072CIFAR-101.03980.496220
12,28864×64×31.01950.503442
196,608256×256×31.00480.4901,778

维数越高,壳越薄,相邻尺度必须靠得越近。CIFAR-10 要两百多级(论文用了 232 级),256×256 的图要近两千级——“无穷多个噪声尺度”在高维里是自然而然的(§4)。二维里壳根本不薄(∥x∥\Vert x\Vert 的相对波动很大),这个准则失效:γ=10\gamma = 10 时公式给出的重叠仍接近 1,几级就够。蒙特卡洛的重叠和公式基本一致(d=64d = 64 时 0.474 vs 0.500,因为正态近似在低维有偏差)。


3. 噪声条件得分网络 · Noise Conditional Score Networks

3.1 退火朗之万动力学

slides 的算法(Song & Ermon 2019,算法 1):

初始化 x ~ 简单分布(如 N(0, σ_1² I))
for i = 1, …, L:                       # 噪声从大到小
    α_i = ε · σ_i² / σ_L²              # 步长随噪声尺度缩放
    for t = 1, …, T:
        x ← x + α_i s_θ(x, σ_i) + √(2α_i) z,  z ~ N(0, I)
返回 x

直觉。 想象在一片起伏的地形上找”按面积比例分布”的位置。直接在原地形上走,你会困在最近的山谷里。退火的做法是:先把地形”抹平”(大噪声),这时到处都连通,你按面积大小自然分布到各个区域;再一点点恢复地形的细节,每恢复一点,就在当前地形上走几步。比例在”地形还比较平”的时候就定下来了,之后只是雕刻细节。

3.2 实验:和普通朗之万比较(代码 02,精确得分)

两个高斯(0.8 / 0.2),σ\sigma 从 8(≈ 最大距离)到 0.05 的几何级数,初始点 N(0,82I)\mathcal{N}(0, 8^2I),ϵ=10−3\epsilon = 10^{-3}:

方法每级 T=10T = 10 步:左边比例 / 切片 W1每级 T=100T = 100 步
普通朗之万(只用 σL\sigma_L,同样的总步数)0.499 / 0.7560.499 / 0.753
退火,L=2L = 20.572 / 6.0620.547 / 3.576
退火,L=5L = 50.692 / 0.3390.764 / 0.097
退火,L=10L = 100.741 / 0.1640.784 / 0.050
退火,L=20L = 200.768 / 0.0930.792 / 0.031
  • 普通朗之万的比例由初始点决定(0.499),和 0.8 无关——第 13 讲的陷阱三。slides 的对比图(i.i.d. 样本 vs 普通朗之万 vs 退火朗之万)就是这件事。
  • 五级以上、每级 100 步,比例就接近 0.8;级数越多、步数越多越好。
  • L=2L = 2 失败得很彻底:从 8 直接跳到 0.05,最后一级的步长只有 α=ϵ=0.001\alpha = \epsilon = 0.001,离数据还很远的点 100 步也走不回来。中间的尺度既负责”按权重分配”,也负责”把点送近”。

为什么步长要 ∝σ2\propto \sigma^2(代码 02 第 2 部分)。 σ\sigma 远大于数据的宽度时 qσ≈N(⋅,σ2I)q_\sigma \approx \mathcal{N}(\cdot, \sigma^2I),得分 ∥s∥∝1/σ\Vert s\Vert \propto 1/\sigma。一步里漂移和噪声的比例 α∥s∥2α∝ασ\frac{\alpha\Vert s\Vert}{\sqrt{2\alpha}} \propto \frac{\sqrt\alpha}{\sigma},取 α∝σ2\alpha \propto \sigma^2 它就不随 σ\sigma 变(Song & Ermon 2019 §4.3):

步长方案漂移/噪声:σ1=8\sigma_1 = 8σ5=0.79\sigma_5 = 0.79σ10=0.05\sigma_{10} = 0.05左边比例切片 W1
αi=ϵσi2/σL2\alpha_i = \epsilon\sigma_i^2/\sigma_L^2(NCSN)0.440.660.060.7850.052
常数 α=ϵ\alpha = \epsilon0.000.180.150.5130.869
常数 α=ϵσ12/σL2\alpha = \epsilon\sigma_1^2/\sigma_L^20.44发散发散—发散

常数小步长:大噪声几级里漂移几乎为零,链只是原地扩散,没有起到”按权重重新分配”的作用;常数大步长:小噪声几级里步子远超分布的宽度(第 12 讲的 ϵ<2s2\epsilon < 2s^2),直接发散。如实地说:σ\sigma 小于数据本身的宽度(0.4)以后,qσ≈pdataq_\sigma \approx p_{\text{data}},得分不再随 1/σ1/\sigma 增长,比例掉到 0.06——这个二维例子的数据铺满一块面积。图像数据落在低维流形上,垂直于流形的方向上得分一直 ∝1/σ\propto 1/\sigma,论证在那里更准。

比例是在哪一级定下来的(代码 02 第 3 部分)。 L=10L = 10、T=100T = 100,每一级结束时:

σi\sigma_i8.04.552.591.470.840.480.27…0.05
样本的左边比例0.5560.5810.6310.7170.7760.7900.792…0.792
qσiq_{\sigma_i} 自己的0.5590.6020.6650.7430.7900.8000.801…0.799
低谷 / 左模式中心0.990.970.870.530.127×10−37\times10^{-3}2×10−42\times10^{-4}…6×10−66\times10^{-6}

大噪声时 qσq_\sigma 只有一个宽峰,样本跟着它走;σ\sigma 在 1.5 到 0.5 之间低谷一级比一级深,qσq_\sigma 的比例升到 0.80,样本也跟着升,但总落后一点;σ<0.5\sigma < 0.5 以后低谷深到 10−310^{-3} 以下,比例被冻结在 0.792。关键的是中间那几级:比例只能在低谷还浅的时候调整——这就是”相邻尺度要重叠”的意义。

3.3 一个网络学所有尺度的得分

slides:“Joint score estimation via noise conditional score networks”。不为每个 σi\sigma_i 单独训练网络,而是训练一个以 σ\sigma 为输入的网络 sθ(x,σ)s_\theta(x, \sigma),目标是各级去噪得分匹配的加权平均:

1L∑i=1Lλ(σi) Epdata(x)Ez∼N(0,I)[∥sθ(x+σiz,σi)+zσi∥22].\frac{1}{L}\sum_{i=1}^L\lambda(\sigma_i)\,\mathbb{E}_{p_{\text{data}}(x)}\mathbb{E}_{z \sim \mathcal{N}(0, I)}\left[\left\Vert s_\theta(x + \sigma_iz, \sigma_i) + \frac{z}{\sigma_i}\right\Vert_2^2\right].

训练算法(slides):取一批数据;每个样本均匀地随机选一个噪声尺度编号 ii;采样高斯噪声;计算加权的去噪损失;随机梯度下降。和第 13 讲相比只多了一件事:每个样本随机选一个噪声水平。原始 NCSN 用 RefineNet 架构和条件实例归一化把 σ\sigma 注入网络;后来普遍用 U-Net 加噪声 / 时间的嵌入(第 16 讲)。

加权函数 λ(σ)=σ2\lambda(\sigma) = \sigma^2。 不同噪声尺度的损失大小差别极大(代码 03 第 1 部分,精确计算):

σ\sigmaE∥∇log⁡qσ∥2\mathbb{E}\Vert\nabla\log q_\sigma\Vert^2λ=1\lambda = 1 时损失的最小值λ=σ2\lambda = \sigma^2 时损失的最小值
8.00.0312.75×10−42.75\times10^{-4}0.018
1.470.7080.1060.231
0.278.5409.300.685
0.0512.3283940.985

不加权时,σ=0.05\sigma = 0.05 那一级的损失比 σ=8\sigma = 8 大六个数量级——梯度几乎全来自最小的噪声,大噪声的几级几乎没被训练。乘上 σ2\sigma^2 以后目标变成 12∥σsθ+z∥2\frac12\Vert\sigma s_\theta + z\Vert^2,z∼N(0,I)z \sim \mathcal{N}(0, I),每一级都是 O(1)O(1)(练习 2)。slides 的说法:“choose λ(σ)=σ2\lambda(\sigma) = \sigma^2“,理由是经验上 ∥sθ(x,σ)∥∝1/σ\Vert s_\theta(x, \sigma)\Vert \propto 1/\sigma。

3.4 实验:四种做法(代码 03)

同一个 MLP(128 × 3)、8,000 步、10 个噪声尺度(8 → 0.05)。“相对误差”是在 qσq_\sigma 的样本上 E∥sθ−∇log⁡qσ∥2/E∥∇log⁡qσ∥2\mathbb{E}\Vert s_\theta - \nabla\log q_\sigma\Vert^2 / \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2:

数据做法σ=8\sigma = 8σ=1.53\sigma = 1.53σ=0.29\sigma = 0.29σ=0.05\sigma = 0.05
两个高斯NCSN:sθ(x,σ)s_\theta(x, \sigma),λ=σ2\lambda = \sigma^20.0090.0030.0420.052
两个高斯sθ(x,σ)s_\theta(x, \sigma),不加权0.7240.0380.0260.054
两个高斯不给网络 σ\sigma:sθ(x)s_\theta(x)0.4390.5540.8300.863
两个高斯NCSNv2:sθ(x)/σs_\theta(x)/\sigma,λ=σ2\lambda = \sigma^20.1250.1300.1422.283
双月牙NCSN0.0100.0060.1560.513
  • 加权的 NCSN 在大、中噪声上很准,最小几级差一些(小噪声的目标里信号占比小,第 13 讲 §3.5);双月牙更难。
  • 不加权时 σ=8\sigma = 8 的误差是 72%:大噪声没有被训练。
  • 不给网络 σ\sigma,一个向量场要同时扮演十个得分,哪一级都学不好。
  • sθ(x)/σs_\theta(x)/\sigma 在这里失败(最小一级 2.28,比什么都不学还差)。这是 NCSNv2 的技巧 3:网络不输入 σ\sigma,输出除以 σ\sigma。它要求网络从 xx 本身看出噪声有多大——高维里 ∥x~∥≈σd\Vert\tilde x\Vert \approx \sigma\sqrt d 几乎精确地透露了 σ\sigma(§2.2 的薄壳),网络做得到;二维里 ∥x~∥\Vert\tilde x\Vert 的波动和它本身一样大,看不出来。技巧是为图像设计的,换到低维要重新检验。

用学到的 NCSN 采样(退火朗之万,L=10L = 10、T=100T = 100、ϵ=10−3\epsilon = 10^{-3},4,000 条链):

数据得分模式比例切片 W1
两个高斯NCSN(加权)左 0.7580.142
两个高斯不加权左 0.8620.137
两个高斯不给 σ\sigma左 0.6404.463
两个高斯sθ(x)/σs_\theta(x)/\sigma左 0.9640.492
双月牙NCSN(加权)上弧 0.5210.059
两个高斯(对照)精确的加噪得分左 0.7830.095
双月牙(对照)精确的加噪得分上弧 0.4800.061

学到的 NCSN 比第 13 讲的单一尺度 + 普通朗之万(0.5–0.67)好得多,双月牙上和精确得分一样好。但两个高斯上仍不如精确得分:比例在中间几级定下来,那几级得分的小误差(4%)直接变成比例的误差;不加权的版本比例反而偏到 0.862——误差集中在大噪声,方向不受控制。学得不准的得分,退火也救不回来。

3.5 原论文的结果

Song & Ermon(2019)报告 NCSN 在 CIFAR-10 上 Inception Score 8.87、FID 25.32——第一次让基于得分的模型在样本质量上和 GAN 相当,而且不需要对抗训练。NCSNv2(2020)用上面的技巧把分辨率推到 256×256(LSUN、FFHQ)。slides 展示了这些样本和退火过程中样本逐级变清晰的动图。


4. 无穷多个噪声尺度:SDE · Score-based generative modeling with SDEs

4.1 用随机过程扰动数据

动机。 §2.2 已经看到高维需要成百上千个噪声尺度;而且级数越多,退火越好(§3.2)。那就把级数推到极限:让噪声随一个连续的时间 t∈[0,1]t \in [0, 1] 变大。t=0t = 0 是数据,t=1t = 1 是几乎纯噪声;中间的每个时刻对应一个噪声尺度。描述”随时间连续加噪声”的数学工具是随机微分方程(SDE):

dx=f(x,t) dt+g(t) dw.dx = f(x, t)\,dt + g(t)\,dw.

不必害怕伊藤积分——把它理解成离散的小步:xt+Δt=xt+f(xt,t)Δt+g(t)Δt zx_{t+\Delta t} = x_t + f(x_t, t)\Delta t + g(t)\sqrt{\Delta t}\,z,z∼N(0,I)z \sim \mathcal{N}(0, I)。ff 是确定性的漂移,gg 控制每一步加多少噪声。Δt→0\Delta t \to 0 的极限就是 SDE。

slides 的两个例子(代码 sde.py):

  • VE(方差爆炸)SDE:dx=d[σ2(t)]dtdwdx = \sqrt{\frac{d[\sigma^2(t)]}{dt}}dw,σ(t)=σmin⁡(σmax⁡/σmin⁡)t\sigma(t) = \sigma_{\min}(\sigma_{\max}/\sigma_{\min})^t。不缩放数据,只往上加噪声,xt=x0+σt2−σmin⁡2 zx_t = x_0 + \sqrt{\sigma_t^2 - \sigma_{\min}^2}\,z。它是 NCSN 的连续极限。
  • VP(方差保持)SDE:dx=−12β(t)x dt+β(t) dwdx = -\frac12\beta(t)x\,dt + \sqrt{\beta(t)}\,dw。一边把数据缩向 0,一边加噪声,xt=αˉtx0+1−αˉt zx_t = \sqrt{\bar\alpha_t}x_0 + \sqrt{1 - \bar\alpha_t}\,z(练习 4)。它是 DDPM(第 16 讲)的连续极限。

代码 04 第 1 部分:VE 的噪声标准差从 0 涨到 10,低谷在 t≈0.75t \approx 0.75 被填平;VP 在 t=1t = 1 时数据只剩 αˉ≈0.007\sqrt{\bar\alpha} \approx 0.007 倍,总方差保持在 1 附近。p1p_1 和采样用的先验之间的 KL(先验失配):VE(σmax⁡=10\sigma_{\max} = 10)0.0072、VE(σmax⁡=3\sigma_{\max} = 3)0.0995、VP(βmax⁡=20\beta_{\max} = 20)0.0000、VP(βmax⁡=5\beta_{\max} = 5)0.0624 nat。

4.2 反转 SDE

Anderson(1982)的定理:前向 SDE 的时间反转仍是一个 SDE,

dx=[f(x,t)−g(t)2∇xlog⁡pt(x)]dt+g(t) dwˉ,dx = \left[f(x, t) - g(t)^2\nabla_x\log p_t(x)\right]dt + g(t)\,d\bar w,

其中 dtdt 是负的时间增量(从 t=1t = 1 走到 0),wˉ\bar w 是反向的布朗运动。唯一未知的就是每个时刻的得分 ∇xlog⁡pt(x)\nabla_x\log p_t(x)——而我们知道怎样估计得分。

为什么多出的是这一项(启发式推导,练习 5)。 前向一小步 x′=x+fΔt+gΔtzx' = x + f\Delta t + g\sqrt{\Delta t}z,所以 p(x′∣x)=N(x′;x+fΔt,g2Δt I)p(x' \mid x) = \mathcal{N}(x'; x + f\Delta t, g^2\Delta t\,I)。反过来,由贝叶斯公式 p(x∣x′)∝p(x′∣x)pt(x)p(x \mid x') \propto p(x' \mid x)p_t(x)。Δt\Delta t 很小时 xx 离 x′x' 很近,把 log⁡pt(x)\log p_t(x) 在 x′x' 附近展开到一阶:log⁡pt(x)≈log⁡pt(x′)+∇log⁡pt(x′)⊤(x−x′)\log p_t(x) \approx \log p_t(x') + \nabla\log p_t(x')^\top(x - x')。乘到高斯上、配方,得到 p(x∣x′)≈N(x;x′−fΔt+g2Δt∇log⁡pt(x′),g2Δt I)p(x \mid x') \approx \mathcal{N}\left(x; x' - f\Delta t + g^2\Delta t\nabla\log p_t(x'), g^2\Delta t\,I\right)——均值多了一项 g2Δt∇log⁡ptg^2\Delta t\nabla\log p_t:往回走时,除了撤销漂移,还要往概率高的地方偏一点,偏多少由得分决定。

4.3 训练与采样

训练:时间相关的得分模型 sθ(x,t)s_\theta(x, t),目标是连续版本的加权去噪得分匹配

Et∼U(0,1)[λ(t) Ex0Ext∣x0∥sθ(xt,t)−∇xtlog⁡p0t(xt∣x0)∥2],\mathbb{E}_{t \sim \mathcal{U}(0, 1)}\left[\lambda(t)\,\mathbb{E}_{x_0}\mathbb{E}_{x_t \mid x_0}\left\Vert s_\theta(x_t, t) - \nabla_{x_t}\log p_{0t}(x_t \mid x_0)\right\Vert^2\right],

和 NCSN 完全一样,只是噪声水平从 LL 个离散值变成 [0,1][0, 1] 上的均匀分布;λ(t)∝1/E∥∇log⁡p0t(xt∣x0)∥2\lambda(t) \propto 1/\mathbb{E}\Vert\nabla\log p_{0t}(x_t \mid x_0)\Vert^2(=σt2= \sigma_t^2,对应 λ=σ2\lambda = \sigma^2)。Song et al.(2021b)还证明:取 λ(t)=g(t)2\lambda(t) = g(t)^2 时这个目标是负对数似然的上界——“似然加权”(第 16 讲会从 ELBO 的角度再看到它)。

采样:用数值方法解反向 SDE。

  • 欧拉–丸山法(slides):x←x−[f(x,t)−g(t)2sθ(x,t)]Δt+g(t)Δt zx \leftarrow x - [f(x, t) - g(t)^2s_\theta(x, t)]\Delta t + g(t)\sqrt{\Delta t}\,z,t←t−Δtt \leftarrow t - \Delta t。
  • 预测–校正(predictor–corrector,slides):每一步先用 SDE 求解器”预测”到下一个时刻,再用几步朗之万”校正”——朗之万只需要当前时刻的得分,正好可用,它把样本往 ptp_t 上再拉一拉。校正的步长 ϵ=2(r∥z∥/∥s∥)2\epsilon = 2(r\Vert z\Vert/\Vert s\Vert)^2 让漂移/噪声比固定为信噪比 rr(代码用 r=0.16r = 0.16,Song et al. 在 CIFAR-10 VE 上的值)。

4.4 实验:采样器 × 步数(代码 04 第 2 部分,精确得分)

每格:左边比例 / 切片 W1(NFE)。

SDENN反向 SDE预测–校正概率流 ODE(欧拉)概率流 ODE(Heun)
VE100.662 / 0.347(10)0.674 / 0.315(20)0.995 / 0.729(10)0.770 / 0.135(20)
VE300.790 / 0.012(30)0.793 / 0.019(60)0.832 / 0.204(30)0.771 / 0.085(60)
VE3000.797 / 0.018(300)0.795 / 0.018(600)0.776 / 0.076(300)0.771 / 0.084(600)
VP100.782 / 0.178(10)0.779 / 0.099(20)0.781 / 0.041(10)0.798 / 0.033(20)
VP300.801 / 0.047(30)0.796 / 0.034(60)0.791 / 0.019(30)0.798 / 0.026(60)
VP3000.799 / 0.028(300)0.801 / 0.028(600)0.797 / 0.025(300)0.798 / 0.026(600)
  • 步数足够多时,它们解的是同一组边缘分布,都接近真实分布——除了 VE 的概率流 ODE,它停在 0.771 不动(§5.3 解释)。
  • 步数少时差别很大:VP 上 ODE 用 Heun 20 次 NFE 就到了 0.798 / 0.033,反向 SDE 10 步还差得远;VE 上 10 步时所有方法都不行,欧拉 ODE 最差(0.995)。
  • 预测–校正比纯反向 SDE 稍好,代价是 NFE 翻倍。

slides 引用的结果:Song et al.(2021)用 VE SDE + 预测–校正在 CIFAR-10 上 FID 2.20、Inception Score 9.89,并第一次用得分模型生成了 1024×1024 的人脸。


5. 概率流 ODE · Probability flow ODE

5.1 把 SDE 变成 ODE

推导。 SDE 的边缘分布 ptp_t 满足 Fokker–Planck 方程

∂pt∂t=−∇⋅(fpt)+12g2Δpt.\frac{\partial p_t}{\partial t} = -\nabla\cdot(f p_t) + \frac12g^2\Delta p_t.

用 Δpt=∇⋅(pt∇log⁡pt)\Delta p_t = \nabla\cdot(p_t\nabla\log p_t) 把第二项改写,得到

∂pt∂t=−∇⋅([f−12g2∇log⁡pt]pt).\frac{\partial p_t}{\partial t} = -\nabla\cdot\left(\left[f - \frac12g^2\nabla\log p_t\right]p_t\right).

这是一个连续性方程:概率质量像不可压缩的流体一样,沿着速度场 f~=f−12g2∇log⁡pt\tilde f = f - \frac12g^2\nabla\log p_t 流动,不需要任何随机性。所以确定性的 ODE

dxdt=f(x,t)−12g(t)2∇xlog⁡pt(x)\frac{dx}{dt} = f(x, t) - \frac12g(t)^2\nabla_x\log p_t(x)

在每个时刻都有和 SDE 相同的边缘分布 ptp_t(练习 6 用一维高斯验证)。把得分换成 sθ(x,t)s_\theta(x, t),从先验采一个点,倒着解这个 ODE,就得到一个样本。

5.2 确定性、可逆:一个连续的归一化流(代码 04 第 3 部分)

ODE 没有随机性:同一个初始噪声解两次,结果的差是 0。它把每个数据点映射到一个确定的”隐变量”(t=1t = 1 的噪声),反过来也一样——它就是一个连续时间的归一化流(第 7–8 讲),只是”可逆网络”变成了 ODE 的流。VP、Heun,数据 → 噪声 → 数据的平均往返误差:20 步 3.8×10−33.8\times10^{-3}、100 步 3.7×10−53.7\times10^{-5}、500 步 3.0×10−73.0\times10^{-7};编码的分布接近先验 N(0,I)\mathcal{N}(0, I)。slides 称之为”uniquely identifiable encoding”:不同的模型只要学到同样的得分,就给出同样的编码。

5.3 一个意外:ODE 对先验失配很敏感

§4.4 里 VE 的概率流 ODE 停在 0.771,步数再多也不变——不是离散化误差。代码 04 让它分别从先验和真实的 p1p_1 出发(N=100N = 100):

VE反向 SDE:从先验从真实 p1p_1概率流 ODE:从先验从真实 p1p_1
σmax⁡=3\sigma_{\max} = 30.753 / 0.1130.805 / 0.0430.709 / 0.2910.796 / 0.020
σmax⁡=10\sigma_{\max} = 100.801 / 0.0350.808 / 0.0490.771 / 0.0840.801 / 0.028
σmax⁡=30\sigma_{\max} = 300.803 / 0.0360.803 / 0.0370.787 / 0.0260.800 / 0.026

从真实的 p1p_1 出发,ODE 完全正确;σmax⁡\sigma_{\max} 越大、失配越小,偏差越小。σmax⁡=10\sigma_{\max} = 10 时先验 N(0,100I)\mathcal{N}(0, 100I) 忽略了数据本身约 4 的方差,KL 只有 0.007 nat,却让 ODE 的比例偏了 0.03。反向 SDE 对小的失配几乎不敏感:每一步注入的噪声和得分的拉力会逐渐”忘掉”初始分布的误差;ODE 是确定性的映射,初始分布错多少,终点就跟着错多少(练习 8)。失配很大时(σmax⁡=3\sigma_{\max} = 3)SDE 也受影响,但比 ODE 好。这和 Karras et al.(2022)的经验一致:随机采样器对各种误差更鲁棒,确定性采样器更快。

5.4 精确似然(代码 04 第 4 部分)

既然是连续归一化流,就能算似然。第 7 讲的变量替换公式 log⁡p(x)=log⁡p(z)+log⁡∣det⁡∂z/∂x∣\log p(x) = \log p(z) + \log|\det\partial z/\partial x| 在连续时间里变成瞬时变量替换公式(Chen et al. 2018):沿着轨迹,

dlog⁡pt(xt)dt=−∇x⋅f~(xt,t)⇒log⁡p0(x0)=log⁡p1(x1)+∫01∇x⋅f~(xt,t) dt\frac{d\log p_t(x_t)}{dt} = -\nabla_x\cdot\tilde f(x_t, t) \quad\Rightarrow\quad \log p_0(x_0) = \log p_1(x_1) + \int_0^1\nabla_x\cdot\tilde f(x_t, t)\,dt

(练习 7)。离散的 log⁡∣det⁡J∣\log|\det J| 变成了沿轨迹对散度(雅可比的迹)的积分。代码同时积分 xx 和累计的散度(RK4):

SDERK4 步数做法∣\lvertODE − 真值∣\rvert 的平均
VE20 / 50 / 200精确散度,真实的 p1p_15.7×10−45.7\times10^{-4} / 1.4×10−51.4\times10^{-5} / 5.2×10−85.2\times10^{-8}
VE200精确散度,先验代替 p1p_11.0×10−11.0\times10^{-1}
VP20 / 50 / 200精确散度,真实的 p1p_12.0×10−42.0\times10^{-4} / 2.9×10−62.9\times10^{-6} / 8.2×10−98.2\times10^{-9}
VP200精确散度,先验代替 p1p_16.5×10−36.5\times10^{-3}

概率流 ODE 确实是一个精确的密度模型:和真值一致到 10−810^{-8}——尽管得分模型训练时从没算过似然。用先验代替真实的 p1p_1,误差来自先验失配。slides 引用 Song et al.(2021):CIFAR-10 上 2.99 bits/dim,当时的最好成绩。

高维里的散度。 精确散度要 dd 次反向传播(第 13 讲 §2.2)。实际用 Hutchinson 估计 ∇⋅s≈v⊤(∇s)v\nabla\cdot s \approx v^\top(\nabla s)v——第 13 讲切片得分匹配的同一个想法。每条轨迹固定一个随机的 vv(FFJORD 的做法),VP、RK4 200 步、1,000 个点:

数据方向单点的平均绝对误差单点估计的标准差1,000 个点平均值的误差(5 次中最大)
两个高斯高斯 vv8.3279.7350.6957
两个高斯Rademacher vv0.0000.0000.0000
8 个高斯的圆环高斯 vv7.9339.2980.7265
8 个高斯的圆环Rademacher vv0.7670.7440.0511

同一个 vv 在整条轨迹上的误差不会互相抵消,所以单点误差可以有好几个 nat;它是无偏的,对 1,000 个点平均后降到零点几 nat。Rademacher 方向在两个高斯上完全精确:两个中心只在 x1x_1 方向上不同,得分的雅可比是对角的,而 v⊤Dv=∑iDiivi2=trDv^\top Dv = \sum_iD_{ii}v_i^2 = \mathrm{tr}D 恰好没有误差(第 13 讲练习 4:方差只来自非对角元)。圆环上雅可比不是对角的,Rademacher 也有误差,但比高斯方向小一个数量级。

5.5 更快的采样

ODE 比 SDE 光滑,可以用高阶、自适应步长的求解器(slides:用 RK45 只要几十到几百次 NFE)。§4.4 的表里 Heun(二阶)同样的 NFE 下明显比欧拉准。这条路后来发展成 DDIM、DPM-Solver、蒸馏和一致性模型(第 16 讲、§7)。


6. 可控生成 · Controllable generation

6.1 贝叶斯公式

想从 p(x∣y)p(x \mid y) 采样(yy 是类别、文字、一张模糊的照片……)。由贝叶斯公式 pt(x∣y)=pt(x)pt(y∣x)/p(y)p_t(x \mid y) = p_t(x)p_t(y \mid x)/p(y),取对数再对 xx 求梯度,p(y)p(y) 消失:

∇xlog⁡pt(x∣y)=∇xlog⁡pt(x)+∇xlog⁡pt(y∣x).\nabla_x\log p_t(x \mid y) = \nabla_x\log p_t(x) + \nabla_x\log p_t(y \mid x).

一个无条件的得分模型 + 一个噪声条件的”前向模型” pt(y∣xt)p_t(y \mid x_t),就能做条件生成——不需要重新训练得分模型。slides 列举的应用:类别条件生成(yy 是类别,pt(y∣x)p_t(y \mid x) 是在加噪图像上训练的分类器)、图像补全(yy 是观测到的像素)、上色(yy 是灰度图)、以及医学成像(yy 是稀疏的 CT / MRI 测量,Song et al. 2022)。后几种的 p(y∣x)p(y \mid x) 是已知的物理过程,不需要训练。

6.2 实验(代码 05,8 个高斯的圆环,目标:只生成 0 号)

精确的 pt(y∣x)p_t(y \mid x),在梯度前乘一个权重 ww(VP 反向 SDE,500 步):

权重0 号的比例0 号样本的标准差(真实 0.25)离所有模式都很远的比例
w=0w = 0(无条件)14.6%0.2561.5%
w=1w = 1(精确的条件分布)99.9%0.2491.1%
w=2w = 2100.0%0.2350.9%
w=5w = 5100.0%0.2301.4%
w=20w = 20100.0%0.2284.3%

w=1w = 1 时得分恰好是 ∇log⁡pt(x∣y)\nabla\log p_t(x \mid y),样本几乎全是 0 号、形状也对。w>1w > 1(分类器引导,Dhariwal & Nichol 2021)大致相当于从 ∝p(x)p(y∣x)w\propto p(x)p(y \mid x)^w 采样(练习 9 说明为什么只是”大致”):样本更”像”0 号——离其他类别越远越好,0 号模式靠近邻居的那一侧被削掉,标准差变小;ww 很大时还会把样本推出数据区域。这是保真度 vs 多样性的权衡,第 16 讲的无分类器引导是同一个现象。

学出来的分类器:在加噪数据上训练(知道 tt)vs 只在干净数据上训练。每格:准确率 / 平均置信度。

tt贝叶斯最优知道噪声的分类器只见过干净数据的分类器
0.099.8% / 1.0099.7% / 0.9899.8% / 1.00
0.347.9% / 0.4747.4% / 0.4747.5% / 0.92
0.716.7% / 0.1515.6% / 0.1616.7% / 0.89

用它们做引导(w=1w = 1):精确 99.9%(标准差 0.249)、知道噪声 97.2%(0.246)、只见过干净数据 100.0%(0.238)。

如实地说:原计划想展示”只见过干净数据的分类器会失败”,但这里它的准确率和知道噪声的分类器一样——8 个模式按角度区分,VP 的”缩小 + 各向同性噪声”不改变角度上的最优决策,干净数据上学到的”按角度切开”在加噪输入上仍然对(代码 README 记录了另一个尝试:内外两圈,结果也只差一点)。它错在置信度:t=0.7t = 0.7 时贝叶斯最优只有 0.15 的把握,它却是 0.89,梯度偏大,相当于在大噪声时偷偷用了 w>1w > 1(标准差 0.238,接近精确分类器 w=2w = 2 的 0.235)。在高维图像上,加噪图像远离干净图像的分布,干净数据上训练的分类器给出的梯度几乎没有意义,所以 slides 和 Dhariwal & Nichol 都要求分类器在每个噪声水平上训练。二维的平滑 MLP 外推得太好,复现不出这种失败。训练一个噪声条件分类器很麻烦——这是第 16 讲无分类器引导的动机。


7. 2023 年之后 · Since 2023

  • 设计空间被系统地清理了。 EDM(Karras, Aittala, Aila & Laine, NeurIPS 2022)把 VE、VP 等统一成 σ(t)=t\sigma(t) = t 的 ODE,配合网络的预条件(让网络的输入输出都是单位方差,和本讲的 λ=σ2\lambda = \sigma^2、sθ/σs_\theta/\sigma 是同一类考虑)和 Heun 采样器,CIFAR-10 上 35 次 NFE 达到 FID 1.79;EDM2(CVPR 2024)把同样的思路推到 ImageNet 512。
  • 一步生成:一致性模型。 Song, Dhariwal, Chen & Sutskever(ICML 2023)训练一个网络把概率流 ODE 轨迹上的任意一点直接映射到轨迹的起点,于是一步就能从噪声得到样本;后续的改进(Song & Dhariwal, ICLR 2024;sCM, Lu & Song, ICLR 2025)把一步、两步采样的质量推到接近多步扩散。§5.2 的”确定性、可逆”正是它的前提。
  • 直接学 ODE 的速度场:流匹配。 Flow Matching(Lipman et al., ICLR 2023)和 Rectified Flow(Liu et al., ICLR 2023)不再从 SDE 推出 ODE,而是直接回归一个把噪声搬到数据的速度场;Stable Diffusion 3(Esser et al., ICML 2024)用的就是 rectified flow。本仓库的 MIT6.S184 讲义从这个角度系统讲解。
  • 更快的 ODE 求解器。 DPM-Solver / DPM-Solver++(Lu et al., NeurIPS 2022)利用 VP ODE 的半线性结构,10–20 步就能得到好样本;UniPC(Zhao et al., NeurIPS 2023)等进一步改进。§4.4 里”Heun 比欧拉好”是这条路的第一步。
  • 逆问题与条件生成。 §6 的”无条件得分 + 前向模型的梯度”在医学成像、天文、地球物理里被广泛使用;Diffusion Posterior Sampling(Chung et al., ICLR 2023)用 Tweedie 公式近似难算的 pt(y∣xt)p_t(y \mid x_t)。

8. 小结 · Summary

  1. 加高斯噪声同时缓解三个陷阱,但单一 σ\sigma 只能折中:噪声大则覆盖好、混合好、得分准,但分布模糊(代码 01:KL 从 0 涨到 2.2 nat)。
  2. 多尺度噪声:σ1\sigma_1 ≈ 数据点之间的最大距离;几何级数,相邻尺度的薄壳重叠约 50%,γ\gamma 随维数趋于 1(CIFAR-10:γ≈1.04\gamma \approx 1.04、两百多级)。
  3. 退火朗之万:从大噪声到小噪声,步长 ∝σ2\propto\sigma^2。比例在中间几级(低谷还浅时)被决定,之后被冻结;L≥5L \geq 5 时比例接近 0.8,普通朗之万停在 0.5。
  4. NCSN:一个网络 sθ(x,σ)s_\theta(x, \sigma),各级去噪得分匹配加权 λ=σ2\lambda = \sigma^2(否则各级损失差六个数量级)。sθ(x)/σs_\theta(x)/\sigma 依赖高维的薄壳,二维里失败。
  5. SDE:dx=f dt+g dwdx = f\,dt + g\,dw 连续加噪;反向 SDE 只多一项 −g2∇log⁡pt-g^2\nabla\log p_t;训练是时间连续的加权去噪得分匹配;采样用欧拉–丸山、预测–校正。
  6. 概率流 ODE:x˙=f−12g2∇log⁡pt\dot x = f - \frac12g^2\nabla\log p_t,边缘分布与 SDE 相同;确定性、可逆、能算精确似然(代码里与真值一致到 10−810^{-8})、能用高阶求解器加速;但对先验失配比 SDE 敏感。
  7. 可控生成:∇log⁡pt(x∣y)=∇log⁡pt(x)+∇log⁡pt(y∣x)\nabla\log p_t(x \mid y) = \nabla\log p_t(x) + \nabla\log p_t(y \mid x);w>1w > 1 用多样性换保真度;分类器必须在加噪输入上有意义。

9. 常见误区 · Common pitfalls

  1. “噪声尺度越多越好,所以随便取一个很小的 γ\gamma。” 级数多意味着采样慢(每级 TT 步);准则是”相邻尺度刚好有足够重叠”。二维里几级就够,高维里需要成百上千级。
  2. “退火朗之万的步长取常数就行。” 常数小步长在大噪声几级里走不动、比例定不下来;常数大步长在小噪声几级里发散(§3.2)。
  3. “不加权的去噪损失更’自然’。” 各级损失差几个数量级,大噪声几乎没被训练(代码 03:σ=8\sigma = 8 的误差 72%),而比例恰恰在大、中噪声几级决定。
  4. “NCSNv2 的技巧放之四海而皆准。” sθ(x)/σs_\theta(x)/\sigma 依赖高维薄壳透露 σ\sigma;二维里失败(§3.4)。技巧都有适用条件。
  5. “概率流 ODE 和反向 SDE 只是两种等价的采样方法。” 边缘分布相同,但 ODE 是确定性映射:没法”忘掉”先验失配和得分误差(§5.3),换来的是可逆、可算似然、步数少。
  6. “概率流 ODE 给的似然是下界 / 近似。” 给定得分模型,它是 ODE 定义的那个分布的精确似然(误差只来自数值积分和先验);它和数据真实似然的差距来自得分模型本身的误差。
  7. “Hutchinson 估计有偏,所以似然不准。” 它对散度是无偏的;误差是方差,可以用更多测试点或更多方向压下去(代码 04:单点几个 nat,1,000 点平均零点几 nat)。
  8. “分类器引导权重 ww 越大越好。” ww 大样本更”典型”,但多样性下降、最后还会被推出数据区域(§6.2 w=20w = 20)。

10. 练习 · Exercises

练习 1(高维高斯的薄壳) x∼N(0,σ2Id)x \sim \mathcal{N}(0, \sigma^2I_d)。(a) 求 E∥x∥2\mathbb{E}\Vert x\Vert^2 和 Var∥x∥2\mathrm{Var}\Vert x\Vert^2。(b) 用 delta 方法说明 dd 大时 ∥x∥≈N(σd,σ2/2)\Vert x\Vert \approx \mathcal{N}(\sigma\sqrt d, \sigma^2/2)。(c) 由此推出 §2.2 的重叠公式。

参考答案

(a) ∥x∥2=σ2χd2\Vert x\Vert^2 = \sigma^2\chi^2_d,均值 dσ2d\sigma^2,方差 2dσ42d\sigma^4。(b) ∥x∥=∥x∥2\Vert x\Vert = \sqrt{\Vert x\Vert^2},在均值处一阶展开:∥x∥≈σd+∥x∥2−dσ22σd\Vert x\Vert \approx \sigma\sqrt d + \frac{\Vert x\Vert^2 - d\sigma^2}{2\sigma\sqrt d},方差 2dσ44σ2d=σ22\frac{2d\sigma^4}{4\sigma^2d} = \frac{\sigma^2}{2}。(c) x∼N(0,σi2I)x \sim \mathcal{N}(0, \sigma_i^2I) 时 ∥x∥≈N(σid,σi2/2)\Vert x\Vert \approx \mathcal{N}(\sigma_i\sqrt d, \sigma_i^2/2);σi−1=γσi\sigma_{i-1} = \gamma\sigma_i 那层壳的 ±3\pm3 个标准差区间是 [γσid−3γσi/2,γσid+3γσi/2][\gamma\sigma_i\sqrt d - 3\gamma\sigma_i/\sqrt2, \gamma\sigma_i\sqrt d + 3\gamma\sigma_i/\sqrt2]。标准化:γσid±3γσi/2−σidσi/2=2d(γ−1)±3γ\frac{\gamma\sigma_i\sqrt d \pm 3\gamma\sigma_i/\sqrt2 - \sigma_i\sqrt d}{\sigma_i/\sqrt2} = \sqrt{2d}(\gamma - 1) \pm 3\gamma。概率即 Φ(2d(γ−1)+3γ)−Φ(2d(γ−1)−3γ)\Phi(\sqrt{2d}(\gamma-1) + 3\gamma) - \Phi(\sqrt{2d}(\gamma-1) - 3\gamma)。

练习 2(加权函数) (a) 证明 E∥∇x~log⁡qσ(x~∣x)∥2=d/σ2\mathbb{E}\Vert\nabla_{\tilde x}\log q_\sigma(\tilde x \mid x)\Vert^2 = d/\sigma^2。(b) 说明 λ(σ)=σ2\lambda(\sigma) = \sigma^2 时每一级的损失可以写成 12E∥σsθ(x~,σ)+z∥2\frac12\mathbb{E}\Vert\sigma s_\theta(\tilde x, \sigma) + z\Vert^2,最小值在 [0,d/2][0, d/2] 之间。(c) 用第 13 讲练习 2 解释代码 03 第 1 部分最后一列为什么随 σ\sigma 增大而减小。

参考答案

(a) 条件得分是 −z/σ-z/\sigma,E∥z∥2/σ2=d/σ2\mathbb{E}\Vert z\Vert^2/\sigma^2 = d/\sigma^2。(b) σ2⋅12∥s+z/σ∥2=12∥σs+z∥2\sigma^2\cdot\frac12\Vert s + z/\sigma\Vert^2 = \frac12\Vert\sigma s + z\Vert^2。最小值 =12(d−σ2E∥∇log⁡qσ∥2)= \frac12(d - \sigma^2\mathbb{E}\Vert\nabla\log q_\sigma\Vert^2);由第 13 讲练习 2 它是条件方差,非负;又不超过 12E∥z∥2=d/2\frac12\mathbb{E}\Vert z\Vert^2 = d/2。(c) 这个最小值等于 12E∥z−E[z∣x~]∥2\frac12\mathbb{E}\Vert z - \mathbb{E}[z \mid \tilde x]\Vert^2(因为 σ∇log⁡qσ(x~)=−E[z∣x~]\sigma\nabla\log q_\sigma(\tilde x) = -\mathbb{E}[z \mid \tilde x],Tweedie):从 x~\tilde x 猜 zz 的不确定性。σ\sigma 大时数据可以忽略,x~≈σz\tilde x \approx \sigma z,zz 几乎由 x~\tilde x 决定,最小值 → 0(σ=8\sigma = 8:0.018);σ\sigma 远小于数据的宽度时,在 σ\sigma 的尺度上数据分布几乎是平的,给定 x~\tilde x 后 xx 在 x~\tilde x 周围仍有 σ\sigma 量级的不确定,z∣x~z \mid \tilde x 近似 N(0,I)\mathcal{N}(0, I),最小值 → d/2=1d/2 = 1(σ=0.05\sigma = 0.05:0.985)。

练习 3(步长 ∝ σ²) 设 qσ=N(0,σ2Id)q_\sigma = \mathcal{N}(0, \sigma^2I_d)。(a) 计算 E∥αs(x)∥2/E∥2αz∥2\mathbb{E}\Vert\alpha s(x)\Vert^2 / \mathbb{E}\Vert\sqrt{2\alpha}z\Vert^2。(b) 取 α=ϵσ2/σL2\alpha = \epsilon\sigma^2/\sigma_L^2,证明它与 σ\sigma 无关。(c) 用第 12 讲的 ULA 偏差说明:ϵ\epsilon 固定时,各级的相对偏差也相同。

参考答案

(a) s(x)=−x/σ2s(x) = -x/\sigma^2,E∥αs∥2=α2d/σ2\mathbb{E}\Vert\alpha s\Vert^2 = \alpha^2d/\sigma^2;E∥2αz∥2=2αd\mathbb{E}\Vert\sqrt{2\alpha}z\Vert^2 = 2\alpha d。比值 =α2σ2= \frac{\alpha}{2\sigma^2}。(b) =ϵ2σL2= \frac{\epsilon}{2\sigma_L^2}。(c) 第 12 讲:目标方差 s2s^2、步长 α\alpha 的 ULA 平稳方差是 s21−α/(2s2)\frac{s^2}{1 - \alpha/(2s^2)}。这里 s2=σ2s^2 = \sigma^2,α/(2σ2)=ϵ/(2σL2)\alpha/(2\sigma^2) = \epsilon/(2\sigma_L^2) 与级数无关——每一级的相对偏差相同。

练习 4(解前向 SDE) (a) VE:dx=d[σ2]/dt dwdx = \sqrt{d[\sigma^2]/dt}\,dw,证明 xt−x0∼N(0,(σt2−σ02)I)x_t - x_0 \sim \mathcal{N}(0, (\sigma_t^2 - \sigma_0^2)I)。(b) VP:dx=−12βx dt+β dwdx = -\frac12\beta x\,dt + \sqrt\beta\,dw,证明 xt=αˉtx0+1−αˉtzx_t = \sqrt{\bar\alpha_t}x_0 + \sqrt{1 - \bar\alpha_t}z,αˉt=e−∫0tβ\bar\alpha_t = e^{-\int_0^t\beta}。(提示:考虑 y=x/αˉty = x/\sqrt{\bar\alpha_t}。)(c) 若 x0x_0 的协方差是 II,VP 下 xtx_t 的协方差是多少?这解释了”方差保持”这个名字。

参考答案

(a) 独立高斯增量的方差相加:∫0td[σ2]dsds=σt2−σ02\int_0^t\frac{d[\sigma^2]}{ds}ds = \sigma_t^2 - \sigma_0^2。(b) y=x/αˉty = x/\sqrt{\bar\alpha_t},ddtαˉt−1/2=12βαˉt−1/2\frac{d}{dt}\bar\alpha_t^{-1/2} = \frac12\beta\bar\alpha_t^{-1/2},所以 dy=αˉt−1/2(dx+12βx dt)=αˉt−1/2β dwdy = \bar\alpha_t^{-1/2}(dx + \frac12\beta x\,dt) = \bar\alpha_t^{-1/2}\sqrt\beta\,dw——纯噪声,方差 ∫0tβ/αˉs ds=1/αˉt−1\int_0^t\beta/\bar\alpha_s\,ds = 1/\bar\alpha_t - 1。于是 xt=αˉt(x0+1/αˉt−1 z)=αˉtx0+1−αˉt zx_t = \sqrt{\bar\alpha_t}(x_0 + \sqrt{1/\bar\alpha_t - 1}\,z) = \sqrt{\bar\alpha_t}x_0 + \sqrt{1 - \bar\alpha_t}\,z。(c) αˉtI+(1−αˉt)I=I\bar\alpha_tI + (1 - \bar\alpha_t)I = I。代码 04 第 1 部分:两个高斯的方差约为 4 和 0.16,不是 1,所以 VP 下总方差”保持在 1 附近”只是近似。

练习 5(反向 SDE 的启发式推导) 按 §4.2 的思路,写出 p(x∣x′)p(x \mid x') 的配方过程,并说明为什么误差是 O(Δt)O(\Delta t) 量级可以忽略。

参考答案

log⁡p(x∣x′)=−∥x′−x−fΔt∥22g2Δt+log⁡pt(x)+C\log p(x \mid x') = -\frac{\Vert x' - x - f\Delta t\Vert^2}{2g^2\Delta t} + \log p_t(x) + C。把 log⁡pt(x)≈log⁡pt(x′)+∇log⁡pt(x′)⊤(x−x′)\log p_t(x) \approx \log p_t(x') + \nabla\log p_t(x')^\top(x - x') 代入,关于 xx 的二次型 −12g2Δt∥x−(x′−fΔt)∥2+∇log⁡pt⊤x-\frac{1}{2g^2\Delta t}\Vert x - (x' - f\Delta t)\Vert^2 + \nabla\log p_t^\top x,配方得均值 x′−fΔt+g2Δt∇log⁡pt(x′)x' - f\Delta t + g^2\Delta t\nabla\log p_t(x')、协方差 g2Δt Ig^2\Delta t\,I(这里也把 f(x)f(x) 近似为 f(x′)f(x'))。被忽略的项:log⁡pt\log p_t 的二阶项 12(x−x′)⊤∇2log⁡pt(x−x′)\frac12(x - x')^\top\nabla^2\log p_t(x - x'),而 ∥x−x′∥2=O(Δt)\Vert x - x'\Vert^2 = O(\Delta t),它对均值和协方差的修正都是 O(Δt2)O(\Delta t^2) 或 O(Δt)O(\Delta t) 乘以 Δt\Delta t——在 Δt→0\Delta t \to 0 时相对于主项可以忽略。严格的证明见 Anderson(1982)。

练习 6(一维高斯的概率流 ODE) 数据 p0=N(0,s2)p_0 = \mathcal{N}(0, s^2),VE SDE(σ0=0\sigma_0 = 0)。(a) 写出 ptp_t 和它的得分。(b) 写出概率流 ODE 并求解:证明 xt=x0s2+σt2/sx_t = x_0\sqrt{s^2 + \sigma_t^2}/s。(c) 验证 xtx_t 的分布确实是 ptp_t。

参考答案

(a) pt=N(0,s2+σt2)p_t = \mathcal{N}(0, s^2 + \sigma_t^2),得分 −x/(s2+σt2)-x/(s^2 + \sigma_t^2)。(b) dxdt=−12dσt2dt⋅−xs2+σt2=x2ddtlog⁡(s2+σt2)\frac{dx}{dt} = -\frac12\frac{d\sigma_t^2}{dt}\cdot\frac{-x}{s^2 + \sigma_t^2} = \frac{x}{2}\frac{d}{dt}\log(s^2 + \sigma_t^2),所以 log⁡xt−log⁡x0=12log⁡s2+σt2s2\log x_t - \log x_0 = \frac12\log\frac{s^2 + \sigma_t^2}{s^2}。(c) x0∼N(0,s2)x_0 \sim \mathcal{N}(0, s^2) 乘以常数 s2+σt2/s\sqrt{s^2 + \sigma_t^2}/s,方差变成 s2+σt2s^2 + \sigma_t^2。ODE 只是把分布”均匀拉伸”,每个点保持自己的相对位置——没有噪声,也没有交叉。

练习 7(瞬时变量替换公式) 由连续性方程 ∂tpt=−∇⋅(f~pt)\partial_tp_t = -\nabla\cdot(\tilde fp_t) 推出:沿着 ODE 的轨迹 ddtlog⁡pt(xt)=−∇⋅f~(xt,t)\frac{d}{dt}\log p_t(x_t) = -\nabla\cdot\tilde f(x_t, t)。再把它和第 7 讲的离散公式对照:一个小步 x′=x+Δtf~(x)x' = x + \Delta t\tilde f(x) 的 log⁡∣det⁡J∣\log|\det J| 是多少?

参考答案

ddtlog⁡pt(xt)=∂tpt+∇pt⋅x˙tpt=−∇⋅(f~pt)+∇pt⋅f~pt=−pt∇⋅f~pt=−∇⋅f~\frac{d}{dt}\log p_t(x_t) = \frac{\partial_tp_t + \nabla p_t\cdot\dot x_t}{p_t} = \frac{-\nabla\cdot(\tilde fp_t) + \nabla p_t\cdot\tilde f}{p_t} = \frac{-p_t\nabla\cdot\tilde f}{p_t} = -\nabla\cdot\tilde f。离散:J=I+Δt∇f~J = I + \Delta t\nabla\tilde f,log⁡det⁡J=trlog⁡(I+Δt∇f~)=Δt tr(∇f~)+O(Δt2)\log\det J = \mathrm{tr}\log(I + \Delta t\nabla\tilde f) = \Delta t\,\mathrm{tr}(\nabla\tilde f) + O(\Delta t^2)——每一小步的对数行列式就是 Δt\Delta t 乘以散度。把这些小步加起来就是积分。这也说明连续流的好处:不需要算行列式,只需要迹(还能用 Hutchinson 估计)。

练习 8(先验失配:ODE vs SDE) 接练习 6,但把 VP 换成 OU 过程以便有平稳分布:dx=−x dt+2 dwdx = -x\,dt + \sqrt2\,dw,数据 N(0,s2)\mathcal{N}(0, s^2)。从 TT 开始倒着走,初始点不是来自 pTp_T 而是来自 N(0,a2)\mathcal{N}(0, a^2)。(a) 概率流 ODE 的终点分布是什么?(b) 直觉上,反向 SDE 为什么能部分”忘掉”这个错误?

参考答案

(a) pt=N(0,vt)p_t = \mathcal{N}(0, v_t),vt=s2e−2t+1−e−2tv_t = s^2e^{-2t} + 1 - e^{-2t}。ODE 是线性的:xt∝vtx_t \propto \sqrt{v_t}(和练习 6 一样,ODE 只按 vt\sqrt{v_t} 等比例缩放),所以 x0=xT⋅s/vTx_0 = x_T\cdot s/\sqrt{v_T}。若 xT∼N(0,a2)x_T \sim \mathcal{N}(0, a^2),终点 ∼N(0,s2a2/vT)\sim \mathcal{N}(0, s^2a^2/v_T)——方差错了 a2/vTa^2/v_T 倍,原样保留。(b) 反向 SDE 的漂移 f−g2∇log⁡ptf - g^2\nabla\log p_t 里,得分项把样本往 ptp_t 的高密度区拉(一个”恢复力”),同时注入新的噪声;两者一起让样本的分布在每一步都向 ptp_t 收缩一点,初始误差随反向时间指数衰减(对 OU 过程可以显式算出衰减率)。代码 04:σmax⁡=10\sigma_{\max} = 10 时 SDE 0.801、ODE 0.771。

练习 9(分类器引导不是精确的”倾斜分布”) 记 p~0(x)∝p0(x)p(y∣x)w\tilde p_0(x) \propto p_0(x)p(y \mid x)^w。(a) t=0t = 0 时 ∇log⁡p~0=∇log⁡p0+w∇log⁡p(y∣x)\nabla\log\tilde p_0 = \nabla\log p_0 + w\nabla\log p(y \mid x)。(b) 但 t>0t > 0 时,p~0\tilde p_0 加噪后的分布 p~t\tilde p_t 的得分一般不等于 ∇log⁡pt+w∇log⁡pt(y∣x)\nabla\log p_t + w\nabla\log p_t(y \mid x)。用一个两点分布的例子说明。(c) 这对”w>1w > 1 时到底在采什么分布”意味着什么?

参考答案

(a) 直接求导。(b) 设 p0p_0 是两点 {−1,+1}\{-1, +1\} 各 1/2,yy 的似然 p(y∣x=+1)=0.9p(y \mid x = +1) = 0.9、p(y∣x=−1)=0.1p(y \mid x = -1) = 0.1。p~0\tilde p_0 的权重 ∝(0.9w,0.1w)\propto (0.9^w, 0.1^w);加噪后 p~t\tilde p_t 是两个高斯按这个权重混合。而 pt(y∣xt)=∑xp(x∣xt)p(y∣x)p_t(y \mid x_t) = \sum_xp(x \mid x_t)p(y \mid x) 是后验平均的似然,它的 ww 次方不等于”先取 ww 次方再加噪”:log⁡∑xrx(xt)p(y∣x)\log\sum_xr_x(x_t)p(y\mid x) 乘以 ww ≠ log⁡∑xrx(xt)p(y∣x)w\log\sum_xr_x(x_t)p(y\mid x)^w 减去一个常数。只有 w=1w = 1 时两者一致(贝叶斯公式精确成立)。(c) w≠1w \neq 1 时,引导后的反向过程每个时刻的”得分”不对应任何一个分布族的得分,最终的样本分布没有简单的闭式描述;它在经验上像”更尖的 p(x∣y)p(x \mid y)“,但不是精确的 p(x)p(y∣x)wp(x)p(y \mid x)^w。无分类器引导(第 16 讲)有同样的问题。

练习 10(动手:换一个 β 调度) 在 04_sde.py 第 2 部分加一组 VPSDE(0.1, 5.0)(第 1 部分算过它的先验失配 0.0624 nat)。预测:反向 SDE 和概率流 ODE 哪个受影响更大?再试试从真实的 p1p_1 出发。

参考答案(预测的思路)

βmax⁡=5\beta_{\max} = 5 时 αˉ1=e−0.1−2.45≈0.078\bar\alpha_1 = e^{-0.1 - 2.45} \approx 0.078,p1p_1 里还残留 0.078≈0.28\sqrt{0.078} \approx 0.28 倍的数据——两个模式在 x1=∓0.56x_1 = \mp0.56 处,和先验 N(0,I)\mathcal{N}(0, I) 有可见的差别。按 §5.3,ODE 应该明显偏(比例往 0.5 靠、形状变差),反向 SDE 也会受影响但小一些;从真实 p1p_1 出发两者都应该恢复。具体数字以你的运行为准。


11. 延伸阅读 · Further reading

原课材料

NCSN 与 SDE

  • Song & Ermon, Generative Modeling by Estimating Gradients of the Data Distribution, NeurIPS 2019(NCSN、退火朗之万)
  • Song & Ermon, Improved Techniques for Training Score-Based Generative Models, NeurIPS 2020(NCSNv2:噪声尺度的选择、sθ/σs_\theta/\sigma、EMA)
  • Song, Sohl-Dickstein, Kingma, Kumar, Ermon & Poole, Score-Based Generative Modeling through Stochastic Differential Equations, ICLR 2021(杰出论文奖)
  • Song, Durkan, Murray & Ermon, Maximum Likelihood Training of Score-Based Diffusion Models, NeurIPS 2021(似然加权 λ=g2\lambda = g^2)
  • Anderson, Reverse-Time Diffusion Equation Models, Stochastic Processes and their Applications 1982
  • Chen, Rubanova, Bettencourt & Duvenaud, Neural Ordinary Differential Equations, NeurIPS 2018;Grathwohl et al., FFJORD, ICLR 2019(瞬时变量替换、Hutchinson 估计)
  • Dhariwal & Nichol, Diffusion Models Beat GANs on Image Synthesis, NeurIPS 2021(分类器引导)
  • Song, Shen, Xing & Ermon, Solving Inverse Problems in Medical Imaging with Score-Based Generative Models, ICLR 2022

2023 年之后

  • Karras, Aittala, Aila & Laine, Elucidating the Design Space of Diffusion-Based Generative Models, NeurIPS 2022;Karras et al., Analyzing and Improving the Training Dynamics of Diffusion Models, CVPR 2024
  • Song, Dhariwal, Chen & Sutskever, Consistency Models, ICML 2023;Song & Dhariwal, Improved Techniques for Training Consistency Models, ICLR 2024
  • Lipman, Chen, Ben-Hamu, Nickel & Le, Flow Matching for Generative Modeling, ICLR 2023;Liu, Gong & Liu, Flow Straight and Fast: Rectified Flow, ICLR 2023;Esser et al., Scaling Rectified Flow Transformers for High-Resolution Image Synthesis, ICML 2024
  • Lu, Zhou, Bao, Chen, Li & Zhu, DPM-Solver, NeurIPS 2022

12. 下一讲预告 · Next lecture

第 9–14 讲介绍了一大堆模型,各有各的长处:有的样本好、有的似然好、有的学到了有用的表示。到底怎样判断一个生成模型”好”? 第 15 讲(原课 Lecture 15,Evaluation of Generative Models)是全课的期中小结:

  • 密度估计与压缩:测试集似然、bits/dim;似然算不出来时怎么办——核密度估计(以及它在高维的失败)、隐变量模型的重要性采样;
  • 样本质量:人工评价、Inception Score、FID、KID,以及文生图的评价;
  • 表示的质量:聚类、重构、解耦;
  • 本讲的概率流 ODE 让得分模型也能报告 bits/dim——但”似然好”和”样本好”是两回事。
← 返回课程目录