对应 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 参数化的对比(包括 在二维里为什么失败)、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
学完这一讲,你应该能够:
- 说出加高斯噪声怎样缓解第 13 讲的三个陷阱,以及单一噪声尺度为什么只能折中。
- 写出退火朗之万动力学,解释步长为什么取 、模式比例是在哪一级被决定的。
- 写出噪声条件得分网络的训练目标,解释加权 、最大噪声 、相邻尺度之比 怎样选,以及 为什么和维数有关。
- 写出 VE、VP 两种前向 SDE 和反向 SDE,知道生成 = 解反向 SDE,会用欧拉–丸山法和预测–校正法采样。
- 由 Fokker–Planck 方程推出概率流 ODE,说明它为什么能给出精确似然、为什么能用更少的步数、以及它对先验失配为什么比 SDE 敏感。
- 用贝叶斯公式推导可控生成:条件得分 = 无条件得分 + 噪声条件分类器的梯度;知道”分类器引导权重” 的效果。
0.2 先修与本讲范围 Prerequisites & scope
| 默认你已经会 Assumed | 本讲只给直觉,后面几讲再展开 Previewed only |
|---|---|
| 第 13 讲:去噪得分匹配、Tweedie 公式、朗之万、三个陷阱 | DDPM、扩散模型 = 层级 VAE(第 16 讲) |
| 第 7–8 讲:变量替换公式、归一化流 | 无分类器引导、潜空间扩散、蒸馏(第 16 讲) |
| 第 12 讲:未调整朗之万的稳定性条件 | 用似然评估得分模型(第 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
| 符号 | 含义 |
|---|---|
| 离散的噪声尺度(几何级数,相邻之比 ) | |
| / | 噪声条件 / 时间相关的得分模型 |
| / | 各个噪声尺度的损失权重 |
| 前向 SDE; 漂移系数, 扩散系数, 布朗运动 | |
| 时刻 的边缘分布;, 先验 | |
| VE: | 方差爆炸 SDE, |
| VP: | 方差保持 SDE,, |
| 概率流 ODE 的速度场 | |
| NFE | 采样时调用得分网络的次数(number of function evaluations) |
0.5 关于数字 · About the numbers
数据和第 13 讲相同:两个高斯(左 0.8 / 右 0.2、中心 、标准差 0.4)、双月牙、8 个高斯的圆环。高斯混合经过 VE / VP 加噪后仍是高斯混合,所以任意时刻的 、得分、散度都有闭式解;代码 02、04 和 05 第 1 部分全部用精确得分,结果里没有任何学习误差。“左边比例”的真实值是 0.800;切片 W1 是和真实样本的距离,噪声底约 0.02–0.03。训练相关的数字来自固定种子的单次运行;和预想不同的结果记录在 代码 README 的”关于实验结果”里。
1. 回顾:加高斯噪声 · Gaussian perturbation
1.1 三个陷阱,一个办法
第 13 讲的三个陷阱:(1) 数据落在低维流形上,得分在流形外没有定义;(2) 低密度区域没有训练样本,得分估计不准;(3) 模式之间有深谷,朗之万几乎不跨越,样本比例由初始点决定。slides 指出它们有一个共同的解药——给数据加高斯噪声:
- 加噪后的分布 铺满整个空间,得分处处有定义(第 13 讲 §6.1:严格在圆周上的数据,去噪得分匹配的损失稳定在 50);
- 噪声把样本”扩散”到原来的低密度区域,那里有了训练信号;
- 噪声把模式之间的低谷填平,链可以自由往来。
1.2 权衡:噪声大 vs 噪声小
slides 的”trade-off”:噪声大,以上三点都好,但 离 远(“数据质量”差);噪声小则反之。代码 01 第 1 部分把每一面都量了出来(两个高斯,全部精确计算,外加一个训练 1,500 步的去噪得分网络):
| 的面积 | 低谷 / 模式中心 | 朗之万的左边比例( 自己的) | 学到的得分在整个方框上的相对误差 | ||
|---|---|---|---|---|---|
| 0.05 | 0.000 | 24.7% | 0.497(0.801) | 13.70% | |
| 0.1 | 0.001 | 25.5% | 0.497(0.801) | 10.88% | |
| 0.3 | 0.084 | 35.1% | 0.519(0.801) | 5.95% | |
| 0.6 | 0.482 | 61.5% | 0.783(0.799) | 1.25% | |
| 1.0 | 1.111 | 91.2% | 0.22 | 0.784(0.782) | 0.23% |
| 2.0 | 2.164 | 100.0% | 0.75 | 0.697(0.703) | 0.09% |
从上往下:覆盖面积变大、低谷被填平、学到的得分在整个方框上越来越准,朗之万的比例从”初始点的比例”(约 0.5,链不混合)变成和 自己的比例一致(,链自由来回)。但第二列同时变差: 时 KL 已超过 1 nat, 时 自己的左边比例只有 0.70——两个模式糊在了一起。采样对了,采的却是一个太模糊的分布。没有一个 能让所有列同时好。
2. 多尺度噪声 · Multi-scale noise perturbations
2.1 想法
既然大噪声负责”混合、覆盖”,小噪声负责”保真”,那就同时用一串噪声尺度 :得到一串逐渐变清晰的分布 ,分别估计它们的得分,采样时从最模糊的开始,一级级往清晰走(§3.1)。剩下的问题是: 多大、 多小、中间分几级?
2.2 怎样选噪声尺度(Song & Ermon 2020)
slides 给出三条原则:
- 最大的噪声 ≈ 数据点之间的最大欧氏距离(技巧 1)。这样 几乎分不清不同的数据点,朗之万可以在任意两个数据点之间来回——模式的比例在这一级附近被决定。代码 01:两个高斯 7.61、双月牙 5.25、圆环 5.61、像素世界(64 维)5.92;Song & Ermon 在 CIFAR-10 上用 。
- 最小的噪声 要足够小,小到 和数据看不出区别(图像上 0.01,像素值在 [0, 1] 时)。
- 相邻尺度要有足够的重叠(技巧 2):用几何级数 , 满足
这个式子从哪里来。 高维的高斯有一个反直觉的性质: 几乎都落在一个薄壳上, 近似服从 ——半径 ,厚度只有 ,相对厚度 (练习 1)。上式是” 的样本落进 那层壳的 个标准差以内”的概率。让它约为 0.5,相邻两级的高概率区域就有足够重叠,上一级的样本是下一级的好起点。
代码 01 第 2 部分(从 降到 ):
| 维数 | 例子 | 蒙特卡洛的重叠 | 需要的级数 | |
|---|---|---|---|---|
| 2 | 二维玩具数据 | — | — | — |
| 64 | 像素世界 8×8 | 1.3608 | 0.474 | 29 |
| 3,072 | CIFAR-10 | 1.0398 | 0.496 | 220 |
| 12,288 | 64×64×3 | 1.0195 | 0.503 | 442 |
| 196,608 | 256×256×3 | 1.0048 | 0.490 | 1,778 |
维数越高,壳越薄,相邻尺度必须靠得越近。CIFAR-10 要两百多级(论文用了 232 级),256×256 的图要近两千级——“无穷多个噪声尺度”在高维里是自然而然的(§4)。二维里壳根本不薄( 的相对波动很大),这个准则失效: 时公式给出的重叠仍接近 1,几级就够。蒙特卡洛的重叠和公式基本一致( 时 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), 从 8(≈ 最大距离)到 0.05 的几何级数,初始点 ,:
| 方法 | 每级 步:左边比例 / 切片 W1 | 每级 步 |
|---|---|---|
| 普通朗之万(只用 ,同样的总步数) | 0.499 / 0.756 | 0.499 / 0.753 |
| 退火, | 0.572 / 6.062 | 0.547 / 3.576 |
| 退火, | 0.692 / 0.339 | 0.764 / 0.097 |
| 退火, | 0.741 / 0.164 | 0.784 / 0.050 |
| 退火, | 0.768 / 0.093 | 0.792 / 0.031 |
- 普通朗之万的比例由初始点决定(0.499),和 0.8 无关——第 13 讲的陷阱三。slides 的对比图(i.i.d. 样本 vs 普通朗之万 vs 退火朗之万)就是这件事。
- 五级以上、每级 100 步,比例就接近 0.8;级数越多、步数越多越好。
- 失败得很彻底:从 8 直接跳到 0.05,最后一级的步长只有 ,离数据还很远的点 100 步也走不回来。中间的尺度既负责”按权重分配”,也负责”把点送近”。
为什么步长要 (代码 02 第 2 部分)。 远大于数据的宽度时 ,得分 。一步里漂移和噪声的比例 ,取 它就不随 变(Song & Ermon 2019 §4.3):
| 步长方案 | 漂移/噪声: | 左边比例 | 切片 W1 | ||
|---|---|---|---|---|---|
| (NCSN) | 0.44 | 0.66 | 0.06 | 0.785 | 0.052 |
| 常数 | 0.00 | 0.18 | 0.15 | 0.513 | 0.869 |
| 常数 | 0.44 | 发散 | 发散 | — | 发散 |
常数小步长:大噪声几级里漂移几乎为零,链只是原地扩散,没有起到”按权重重新分配”的作用;常数大步长:小噪声几级里步子远超分布的宽度(第 12 讲的 ),直接发散。如实地说: 小于数据本身的宽度(0.4)以后,,得分不再随 增长,比例掉到 0.06——这个二维例子的数据铺满一块面积。图像数据落在低维流形上,垂直于流形的方向上得分一直 ,论证在那里更准。
比例是在哪一级定下来的(代码 02 第 3 部分)。 、,每一级结束时:
| 8.0 | 4.55 | 2.59 | 1.47 | 0.84 | 0.48 | 0.27 | … | 0.05 | |
|---|---|---|---|---|---|---|---|---|---|
| 样本的左边比例 | 0.556 | 0.581 | 0.631 | 0.717 | 0.776 | 0.790 | 0.792 | … | 0.792 |
| 自己的 | 0.559 | 0.602 | 0.665 | 0.743 | 0.790 | 0.800 | 0.801 | … | 0.799 |
| 低谷 / 左模式中心 | 0.99 | 0.97 | 0.87 | 0.53 | 0.12 | … |
大噪声时 只有一个宽峰,样本跟着它走; 在 1.5 到 0.5 之间低谷一级比一级深, 的比例升到 0.80,样本也跟着升,但总落后一点; 以后低谷深到 以下,比例被冻结在 0.792。关键的是中间那几级:比例只能在低谷还浅的时候调整——这就是”相邻尺度要重叠”的意义。
3.3 一个网络学所有尺度的得分
slides:“Joint score estimation via noise conditional score networks”。不为每个 单独训练网络,而是训练一个以 为输入的网络 ,目标是各级去噪得分匹配的加权平均:
训练算法(slides):取一批数据;每个样本均匀地随机选一个噪声尺度编号 ;采样高斯噪声;计算加权的去噪损失;随机梯度下降。和第 13 讲相比只多了一件事:每个样本随机选一个噪声水平。原始 NCSN 用 RefineNet 架构和条件实例归一化把 注入网络;后来普遍用 U-Net 加噪声 / 时间的嵌入(第 16 讲)。
加权函数 。 不同噪声尺度的损失大小差别极大(代码 03 第 1 部分,精确计算):
| 时损失的最小值 | 时损失的最小值 | ||
|---|---|---|---|
| 8.0 | 0.031 | 0.018 | |
| 1.47 | 0.708 | 0.106 | 0.231 |
| 0.27 | 8.540 | 9.30 | 0.685 |
| 0.05 | 12.328 | 394 | 0.985 |
不加权时, 那一级的损失比 大六个数量级——梯度几乎全来自最小的噪声,大噪声的几级几乎没被训练。乘上 以后目标变成 ,,每一级都是 (练习 2)。slides 的说法:“choose “,理由是经验上 。
3.4 实验:四种做法(代码 03)
同一个 MLP(128 × 3)、8,000 步、10 个噪声尺度(8 → 0.05)。“相对误差”是在 的样本上 :
| 数据 | 做法 | ||||
|---|---|---|---|---|---|
| 两个高斯 | NCSN:, | 0.009 | 0.003 | 0.042 | 0.052 |
| 两个高斯 | ,不加权 | 0.724 | 0.038 | 0.026 | 0.054 |
| 两个高斯 | 不给网络 : | 0.439 | 0.554 | 0.830 | 0.863 |
| 两个高斯 | NCSNv2:, | 0.125 | 0.130 | 0.142 | 2.283 |
| 双月牙 | NCSN | 0.010 | 0.006 | 0.156 | 0.513 |
- 加权的 NCSN 在大、中噪声上很准,最小几级差一些(小噪声的目标里信号占比小,第 13 讲 §3.5);双月牙更难。
- 不加权时 的误差是 72%:大噪声没有被训练。
- 不给网络 ,一个向量场要同时扮演十个得分,哪一级都学不好。
- 在这里失败(最小一级 2.28,比什么都不学还差)。这是 NCSNv2 的技巧 3:网络不输入 ,输出除以 。它要求网络从 本身看出噪声有多大——高维里 几乎精确地透露了 (§2.2 的薄壳),网络做得到;二维里 的波动和它本身一样大,看不出来。技巧是为图像设计的,换到低维要重新检验。
用学到的 NCSN 采样(退火朗之万,、、,4,000 条链):
| 数据 | 得分 | 模式比例 | 切片 W1 |
|---|---|---|---|
| 两个高斯 | NCSN(加权) | 左 0.758 | 0.142 |
| 两个高斯 | 不加权 | 左 0.862 | 0.137 |
| 两个高斯 | 不给 | 左 0.640 | 4.463 |
| 两个高斯 | 左 0.964 | 0.492 | |
| 双月牙 | NCSN(加权) | 上弧 0.521 | 0.059 |
| 两个高斯 | (对照)精确的加噪得分 | 左 0.783 | 0.095 |
| 双月牙 | (对照)精确的加噪得分 | 上弧 0.480 | 0.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)。那就把级数推到极限:让噪声随一个连续的时间 变大。 是数据, 是几乎纯噪声;中间的每个时刻对应一个噪声尺度。描述”随时间连续加噪声”的数学工具是随机微分方程(SDE):
不必害怕伊藤积分——把它理解成离散的小步:,。 是确定性的漂移, 控制每一步加多少噪声。 的极限就是 SDE。
slides 的两个例子(代码 sde.py):
- VE(方差爆炸)SDE:,。不缩放数据,只往上加噪声,。它是 NCSN 的连续极限。
- VP(方差保持)SDE:。一边把数据缩向 0,一边加噪声,(练习 4)。它是 DDPM(第 16 讲)的连续极限。
代码 04 第 1 部分:VE 的噪声标准差从 0 涨到 10,低谷在 被填平;VP 在 时数据只剩 倍,总方差保持在 1 附近。 和采样用的先验之间的 KL(先验失配):VE()0.0072、VE()0.0995、VP()0.0000、VP()0.0624 nat。
4.2 反转 SDE
Anderson(1982)的定理:前向 SDE 的时间反转仍是一个 SDE,
其中 是负的时间增量(从 走到 0), 是反向的布朗运动。唯一未知的就是每个时刻的得分 ——而我们知道怎样估计得分。
为什么多出的是这一项(启发式推导,练习 5)。 前向一小步 ,所以 。反过来,由贝叶斯公式 。 很小时 离 很近,把 在 附近展开到一阶:。乘到高斯上、配方,得到 ——均值多了一项 :往回走时,除了撤销漂移,还要往概率高的地方偏一点,偏多少由得分决定。
4.3 训练与采样
训练:时间相关的得分模型 ,目标是连续版本的加权去噪得分匹配
和 NCSN 完全一样,只是噪声水平从 个离散值变成 上的均匀分布;(,对应 )。Song et al.(2021b)还证明:取 时这个目标是负对数似然的上界——“似然加权”(第 16 讲会从 ELBO 的角度再看到它)。
采样:用数值方法解反向 SDE。
- 欧拉–丸山法(slides):,。
- 预测–校正(predictor–corrector,slides):每一步先用 SDE 求解器”预测”到下一个时刻,再用几步朗之万”校正”——朗之万只需要当前时刻的得分,正好可用,它把样本往 上再拉一拉。校正的步长 让漂移/噪声比固定为信噪比 (代码用 ,Song et al. 在 CIFAR-10 VE 上的值)。
4.4 实验:采样器 × 步数(代码 04 第 2 部分,精确得分)
每格:左边比例 / 切片 W1(NFE)。
| SDE | 反向 SDE | 预测–校正 | 概率流 ODE(欧拉) | 概率流 ODE(Heun) | |
|---|---|---|---|---|---|
| VE | 10 | 0.662 / 0.347(10) | 0.674 / 0.315(20) | 0.995 / 0.729(10) | 0.770 / 0.135(20) |
| VE | 30 | 0.790 / 0.012(30) | 0.793 / 0.019(60) | 0.832 / 0.204(30) | 0.771 / 0.085(60) |
| VE | 300 | 0.797 / 0.018(300) | 0.795 / 0.018(600) | 0.776 / 0.076(300) | 0.771 / 0.084(600) |
| VP | 10 | 0.782 / 0.178(10) | 0.779 / 0.099(20) | 0.781 / 0.041(10) | 0.798 / 0.033(20) |
| VP | 30 | 0.801 / 0.047(30) | 0.796 / 0.034(60) | 0.791 / 0.019(30) | 0.798 / 0.026(60) |
| VP | 300 | 0.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 的边缘分布 满足 Fokker–Planck 方程
用 把第二项改写,得到
这是一个连续性方程:概率质量像不可压缩的流体一样,沿着速度场 流动,不需要任何随机性。所以确定性的 ODE
在每个时刻都有和 SDE 相同的边缘分布 (练习 6 用一维高斯验证)。把得分换成 ,从先验采一个点,倒着解这个 ODE,就得到一个样本。
5.2 确定性、可逆:一个连续的归一化流(代码 04 第 3 部分)
ODE 没有随机性:同一个初始噪声解两次,结果的差是 0。它把每个数据点映射到一个确定的”隐变量”( 的噪声),反过来也一样——它就是一个连续时间的归一化流(第 7–8 讲),只是”可逆网络”变成了 ODE 的流。VP、Heun,数据 → 噪声 → 数据的平均往返误差:20 步 、100 步 、500 步 ;编码的分布接近先验 。slides 称之为”uniquely identifiable encoding”:不同的模型只要学到同样的得分,就给出同样的编码。
5.3 一个意外:ODE 对先验失配很敏感
§4.4 里 VE 的概率流 ODE 停在 0.771,步数再多也不变——不是离散化误差。代码 04 让它分别从先验和真实的 出发():
| VE | 反向 SDE:从先验 | 从真实 | 概率流 ODE:从先验 | 从真实 |
|---|---|---|---|---|
| 0.753 / 0.113 | 0.805 / 0.043 | 0.709 / 0.291 | 0.796 / 0.020 | |
| 0.801 / 0.035 | 0.808 / 0.049 | 0.771 / 0.084 | 0.801 / 0.028 | |
| 0.803 / 0.036 | 0.803 / 0.037 | 0.787 / 0.026 | 0.800 / 0.026 |
从真实的 出发,ODE 完全正确; 越大、失配越小,偏差越小。 时先验 忽略了数据本身约 4 的方差,KL 只有 0.007 nat,却让 ODE 的比例偏了 0.03。反向 SDE 对小的失配几乎不敏感:每一步注入的噪声和得分的拉力会逐渐”忘掉”初始分布的误差;ODE 是确定性的映射,初始分布错多少,终点就跟着错多少(练习 8)。失配很大时()SDE 也受影响,但比 ODE 好。这和 Karras et al.(2022)的经验一致:随机采样器对各种误差更鲁棒,确定性采样器更快。
5.4 精确似然(代码 04 第 4 部分)
既然是连续归一化流,就能算似然。第 7 讲的变量替换公式 在连续时间里变成瞬时变量替换公式(Chen et al. 2018):沿着轨迹,
(练习 7)。离散的 变成了沿轨迹对散度(雅可比的迹)的积分。代码同时积分 和累计的散度(RK4):
| SDE | RK4 步数 | 做法 | ODE − 真值 的平均 |
|---|---|---|---|
| VE | 20 / 50 / 200 | 精确散度,真实的 | / / |
| VE | 200 | 精确散度,先验代替 | |
| VP | 20 / 50 / 200 | 精确散度,真实的 | / / |
| VP | 200 | 精确散度,先验代替 |
概率流 ODE 确实是一个精确的密度模型:和真值一致到 ——尽管得分模型训练时从没算过似然。用先验代替真实的 ,误差来自先验失配。slides 引用 Song et al.(2021):CIFAR-10 上 2.99 bits/dim,当时的最好成绩。
高维里的散度。 精确散度要 次反向传播(第 13 讲 §2.2)。实际用 Hutchinson 估计 ——第 13 讲切片得分匹配的同一个想法。每条轨迹固定一个随机的 (FFJORD 的做法),VP、RK4 200 步、1,000 个点:
| 数据 | 方向 | 单点的平均绝对误差 | 单点估计的标准差 | 1,000 个点平均值的误差(5 次中最大) |
|---|---|---|---|---|
| 两个高斯 | 高斯 | 8.327 | 9.735 | 0.6957 |
| 两个高斯 | Rademacher | 0.000 | 0.000 | 0.0000 |
| 8 个高斯的圆环 | 高斯 | 7.933 | 9.298 | 0.7265 |
| 8 个高斯的圆环 | Rademacher | 0.767 | 0.744 | 0.0511 |
同一个 在整条轨迹上的误差不会互相抵消,所以单点误差可以有好几个 nat;它是无偏的,对 1,000 个点平均后降到零点几 nat。Rademacher 方向在两个高斯上完全精确:两个中心只在 方向上不同,得分的雅可比是对角的,而 恰好没有误差(第 13 讲练习 4:方差只来自非对角元)。圆环上雅可比不是对角的,Rademacher 也有误差,但比高斯方向小一个数量级。
5.5 更快的采样
ODE 比 SDE 光滑,可以用高阶、自适应步长的求解器(slides:用 RK45 只要几十到几百次 NFE)。§4.4 的表里 Heun(二阶)同样的 NFE 下明显比欧拉准。这条路后来发展成 DDIM、DPM-Solver、蒸馏和一致性模型(第 16 讲、§7)。
6. 可控生成 · Controllable generation
6.1 贝叶斯公式
想从 采样( 是类别、文字、一张模糊的照片……)。由贝叶斯公式 ,取对数再对 求梯度, 消失:
一个无条件的得分模型 + 一个噪声条件的”前向模型” ,就能做条件生成——不需要重新训练得分模型。slides 列举的应用:类别条件生成( 是类别, 是在加噪图像上训练的分类器)、图像补全( 是观测到的像素)、上色( 是灰度图)、以及医学成像( 是稀疏的 CT / MRI 测量,Song et al. 2022)。后几种的 是已知的物理过程,不需要训练。
6.2 实验(代码 05,8 个高斯的圆环,目标:只生成 0 号)
精确的 ,在梯度前乘一个权重 (VP 反向 SDE,500 步):
| 权重 | 0 号的比例 | 0 号样本的标准差(真实 0.25) | 离所有模式都很远的比例 |
|---|---|---|---|
| (无条件) | 14.6% | 0.256 | 1.5% |
| (精确的条件分布) | 99.9% | 0.249 | 1.1% |
| 100.0% | 0.235 | 0.9% | |
| 100.0% | 0.230 | 1.4% | |
| 100.0% | 0.228 | 4.3% |
时得分恰好是 ,样本几乎全是 0 号、形状也对。(分类器引导,Dhariwal & Nichol 2021)大致相当于从 采样(练习 9 说明为什么只是”大致”):样本更”像”0 号——离其他类别越远越好,0 号模式靠近邻居的那一侧被削掉,标准差变小; 很大时还会把样本推出数据区域。这是保真度 vs 多样性的权衡,第 16 讲的无分类器引导是同一个现象。
学出来的分类器:在加噪数据上训练(知道 )vs 只在干净数据上训练。每格:准确率 / 平均置信度。
| 贝叶斯最优 | 知道噪声的分类器 | 只见过干净数据的分类器 | |
|---|---|---|---|
| 0.0 | 99.8% / 1.00 | 99.7% / 0.98 | 99.8% / 1.00 |
| 0.3 | 47.9% / 0.47 | 47.4% / 0.47 | 47.5% / 0.92 |
| 0.7 | 16.7% / 0.15 | 15.6% / 0.16 | 16.7% / 0.89 |
用它们做引导():精确 99.9%(标准差 0.249)、知道噪声 97.2%(0.246)、只见过干净数据 100.0%(0.238)。
如实地说:原计划想展示”只见过干净数据的分类器会失败”,但这里它的准确率和知道噪声的分类器一样——8 个模式按角度区分,VP 的”缩小 + 各向同性噪声”不改变角度上的最优决策,干净数据上学到的”按角度切开”在加噪输入上仍然对(代码 README 记录了另一个尝试:内外两圈,结果也只差一点)。它错在置信度: 时贝叶斯最优只有 0.15 的把握,它却是 0.89,梯度偏大,相当于在大噪声时偷偷用了 (标准差 0.238,接近精确分类器 的 0.235)。在高维图像上,加噪图像远离干净图像的分布,干净数据上训练的分类器给出的梯度几乎没有意义,所以 slides 和 Dhariwal & Nichol 都要求分类器在每个噪声水平上训练。二维的平滑 MLP 外推得太好,复现不出这种失败。训练一个噪声条件分类器很麻烦——这是第 16 讲无分类器引导的动机。
7. 2023 年之后 · Since 2023
- 设计空间被系统地清理了。 EDM(Karras, Aittala, Aila & Laine, NeurIPS 2022)把 VE、VP 等统一成 的 ODE,配合网络的预条件(让网络的输入输出都是单位方差,和本讲的 、 是同一类考虑)和 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 公式近似难算的 。
8. 小结 · Summary
- 加高斯噪声同时缓解三个陷阱,但单一 只能折中:噪声大则覆盖好、混合好、得分准,但分布模糊(代码 01:KL 从 0 涨到 2.2 nat)。
- 多尺度噪声: ≈ 数据点之间的最大距离;几何级数,相邻尺度的薄壳重叠约 50%, 随维数趋于 1(CIFAR-10:、两百多级)。
- 退火朗之万:从大噪声到小噪声,步长 。比例在中间几级(低谷还浅时)被决定,之后被冻结; 时比例接近 0.8,普通朗之万停在 0.5。
- NCSN:一个网络 ,各级去噪得分匹配加权 (否则各级损失差六个数量级)。 依赖高维的薄壳,二维里失败。
- SDE: 连续加噪;反向 SDE 只多一项 ;训练是时间连续的加权去噪得分匹配;采样用欧拉–丸山、预测–校正。
- 概率流 ODE:,边缘分布与 SDE 相同;确定性、可逆、能算精确似然(代码里与真值一致到 )、能用高阶求解器加速;但对先验失配比 SDE 敏感。
- 可控生成:; 用多样性换保真度;分类器必须在加噪输入上有意义。
9. 常见误区 · Common pitfalls
- “噪声尺度越多越好,所以随便取一个很小的 。” 级数多意味着采样慢(每级 步);准则是”相邻尺度刚好有足够重叠”。二维里几级就够,高维里需要成百上千级。
- “退火朗之万的步长取常数就行。” 常数小步长在大噪声几级里走不动、比例定不下来;常数大步长在小噪声几级里发散(§3.2)。
- “不加权的去噪损失更’自然’。” 各级损失差几个数量级,大噪声几乎没被训练(代码 03: 的误差 72%),而比例恰恰在大、中噪声几级决定。
- “NCSNv2 的技巧放之四海而皆准。” 依赖高维薄壳透露 ;二维里失败(§3.4)。技巧都有适用条件。
- “概率流 ODE 和反向 SDE 只是两种等价的采样方法。” 边缘分布相同,但 ODE 是确定性映射:没法”忘掉”先验失配和得分误差(§5.3),换来的是可逆、可算似然、步数少。
- “概率流 ODE 给的似然是下界 / 近似。” 给定得分模型,它是 ODE 定义的那个分布的精确似然(误差只来自数值积分和先验);它和数据真实似然的差距来自得分模型本身的误差。
- “Hutchinson 估计有偏,所以似然不准。” 它对散度是无偏的;误差是方差,可以用更多测试点或更多方向压下去(代码 04:单点几个 nat,1,000 点平均零点几 nat)。
- “分类器引导权重 越大越好。” 大样本更”典型”,但多样性下降、最后还会被推出数据区域(§6.2 )。
10. 练习 · Exercises
练习 1(高维高斯的薄壳) 。(a) 求 和 。(b) 用 delta 方法说明 大时 。(c) 由此推出 §2.2 的重叠公式。
参考答案
(a) ,均值 ,方差 。(b) ,在均值处一阶展开:,方差 。(c) 时 ; 那层壳的 个标准差区间是 。标准化:。概率即 。
练习 2(加权函数) (a) 证明 。(b) 说明 时每一级的损失可以写成 ,最小值在 之间。(c) 用第 13 讲练习 2 解释代码 03 第 1 部分最后一列为什么随 增大而减小。
参考答案
(a) 条件得分是 ,。(b) 。最小值 ;由第 13 讲练习 2 它是条件方差,非负;又不超过 。(c) 这个最小值等于 (因为 ,Tweedie):从 猜 的不确定性。 大时数据可以忽略,, 几乎由 决定,最小值 → 0(:0.018); 远小于数据的宽度时,在 的尺度上数据分布几乎是平的,给定 后 在 周围仍有 量级的不确定, 近似 ,最小值 → (:0.985)。
练习 3(步长 ∝ σ²) 设 。(a) 计算 。(b) 取 ,证明它与 无关。(c) 用第 12 讲的 ULA 偏差说明: 固定时,各级的相对偏差也相同。
参考答案
(a) ,;。比值 。(b) 。(c) 第 12 讲:目标方差 、步长 的 ULA 平稳方差是 。这里 , 与级数无关——每一级的相对偏差相同。
练习 4(解前向 SDE) (a) VE:,证明 。(b) VP:,证明 ,。(提示:考虑 。)(c) 若 的协方差是 ,VP 下 的协方差是多少?这解释了”方差保持”这个名字。
参考答案
(a) 独立高斯增量的方差相加:。(b) ,,所以 ——纯噪声,方差 。于是 。(c) 。代码 04 第 1 部分:两个高斯的方差约为 4 和 0.16,不是 1,所以 VP 下总方差”保持在 1 附近”只是近似。
练习 5(反向 SDE 的启发式推导) 按 §4.2 的思路,写出 的配方过程,并说明为什么误差是 量级可以忽略。
参考答案
。把 代入,关于 的二次型 ,配方得均值 、协方差 (这里也把 近似为 )。被忽略的项: 的二阶项 ,而 ,它对均值和协方差的修正都是 或 乘以 ——在 时相对于主项可以忽略。严格的证明见 Anderson(1982)。
练习 6(一维高斯的概率流 ODE) 数据 ,VE SDE()。(a) 写出 和它的得分。(b) 写出概率流 ODE 并求解:证明 。(c) 验证 的分布确实是 。
参考答案
(a) ,得分 。(b) ,所以 。(c) 乘以常数 ,方差变成 。ODE 只是把分布”均匀拉伸”,每个点保持自己的相对位置——没有噪声,也没有交叉。
练习 7(瞬时变量替换公式) 由连续性方程 推出:沿着 ODE 的轨迹 。再把它和第 7 讲的离散公式对照:一个小步 的 是多少?
参考答案
。离散:,——每一小步的对数行列式就是 乘以散度。把这些小步加起来就是积分。这也说明连续流的好处:不需要算行列式,只需要迹(还能用 Hutchinson 估计)。
练习 8(先验失配:ODE vs SDE) 接练习 6,但把 VP 换成 OU 过程以便有平稳分布:,数据 。从 开始倒着走,初始点不是来自 而是来自 。(a) 概率流 ODE 的终点分布是什么?(b) 直觉上,反向 SDE 为什么能部分”忘掉”这个错误?
参考答案
(a) ,。ODE 是线性的:(和练习 6 一样,ODE 只按 等比例缩放),所以 。若 ,终点 ——方差错了 倍,原样保留。(b) 反向 SDE 的漂移 里,得分项把样本往 的高密度区拉(一个”恢复力”),同时注入新的噪声;两者一起让样本的分布在每一步都向 收缩一点,初始误差随反向时间指数衰减(对 OU 过程可以显式算出衰减率)。代码 04: 时 SDE 0.801、ODE 0.771。
练习 9(分类器引导不是精确的”倾斜分布”) 记 。(a) 时 。(b) 但 时, 加噪后的分布 的得分一般不等于 。用一个两点分布的例子说明。(c) 这对” 时到底在采什么分布”意味着什么?
参考答案
(a) 直接求导。(b) 设 是两点 各 1/2, 的似然 、。 的权重 ;加噪后 是两个高斯按这个权重混合。而 是后验平均的似然,它的 次方不等于”先取 次方再加噪”: 乘以 ≠ 减去一个常数。只有 时两者一致(贝叶斯公式精确成立)。(c) 时,引导后的反向过程每个时刻的”得分”不对应任何一个分布族的得分,最终的样本分布没有简单的闭式描述;它在经验上像”更尖的 “,但不是精确的 。无分类器引导(第 16 讲)有同样的问题。
练习 10(动手:换一个 β 调度)
在 04_sde.py 第 2 部分加一组 VPSDE(0.1, 5.0)(第 1 部分算过它的先验失配 0.0624 nat)。预测:反向 SDE 和概率流 ODE 哪个受影响更大?再试试从真实的 出发。
参考答案(预测的思路)
时 , 里还残留 倍的数据——两个模式在 处,和先验 有可见的差别。按 §5.3,ODE 应该明显偏(比例往 0.5 靠、形状变差),反向 SDE 也会受影响但小一些;从真实 出发两者都应该恢复。具体数字以你的运行为准。
11. 延伸阅读 · Further reading
原课材料
- CS236 Fall 2023 Lecture 14 slides(
lecture_14_comp.pptx):https://deepgenerativemodels.github.io/syllabus.html - Yang Song, Generative Modeling by Estimating Gradients of the Data Distribution(博客,2021)
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:噪声尺度的选择、、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(似然加权 )
- 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——但”似然好”和”样本好”是两回事。