Lecture 13 · 得分模型(一):去噪得分匹配与朗之万动力学 · Score-Based Models I

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

课程源码 ZIP ↓

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

本篇目录

对应 Maps to:Stanford CS236 Deep Generative Models(Fall 2023,Stefano Ermon),Lecture 13 · 2023-11-08 · Score Based Models(slides:lecture 13.pptx)。 依据说明:本讲按原课 slides 的顺序展开:回顾概率分布的几种表示(似然模型 vs 隐式模型)→ 得分函数与得分模型 → 用 Fisher 散度做得分估计、得分匹配 → 得分匹配不可扩展 → 去噪得分匹配(推导、算法、优缺点、Tweedie 公式)→ 切片得分匹配(随机投影、雅可比–向量积)→ 用朗之万动力学从得分采样 → 三个陷阱:流形假设、低密度区域、模式之间混合太慢 → 加高斯噪声。slides 的很多图来自 Yang Song 的博客 Generative Modeling by Estimating Gradients of the Data Distribution(2021)和 Song & Ermon(NeurIPS 2019),本讲义也参考了这两份材料。“去噪目标 − Fisher 散度 = 常数”的精确数值验证、Tweedie 公式与贝叶斯后验均值的对照、去噪目标里信号占比随 σ 的变化、σ 的 U 形权衡、学到的得分在吸引域上的错误、学到的得分让链”错误地”越过低谷是本讲义补充的。凡是能和真相比较的地方都比较了:真实分布是高斯混合,加噪以后仍是高斯混合,任意噪声水平下的得分都能精确算出来。 配套代码 Code:code/lecture13/(PyTorch;共享模块 score.py + 4 个演示脚本,最长的约 95 秒) 预计阅读时间:3 小时(含运行代码)


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

0.1 学习目标 Learning goals

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

  1. 说清楚得分函数 ∇xlog⁡p(x)\nabla_x\log p(x) 为什么可以当作分布的一种表示:它丢掉的只有归一化常数;说出得分模型 sθ:Rd→Rds_\theta: \mathbb{R}^d \to \mathbb{R}^d 和能量模型的区别。
  2. 写出用 Fisher 散度估计得分的目标,解释为什么显式得分匹配里的 tr(∇xsθ)\mathrm{tr}(\nabla_x s_\theta) 不可扩展。
  3. 推导去噪得分匹配:匹配条件得分 −x~−xσ2-\frac{\tilde x - x}{\sigma^2} 与匹配加噪分布 qσq_\sigma 的得分只差一个常数;说出它的优点(便宜)和代价(只能学到 qσq_\sigma 的得分、σ\sigma 小时目标很吵)。
  4. 推导 Tweedie 公式 E[x∣x~]=x~+σ2∇log⁡qσ(x~)\mathbb{E}[x \mid \tilde x] = \tilde x + \sigma^2\nabla\log q_\sigma(\tilde x),理解”最优去噪器 = 得分”。
  5. 推导切片得分匹配,说明它为什么无偏、为什么只要一次反向传播。
  6. 用朗之万动力学从得分采样,说明步长、步数、噪声项各起什么作用。
  7. 复述并亲手复现三个陷阱:流形假设、低密度区域估计不准、模式之间混合太慢;理解”加高斯噪声”为什么能同时缓解它们。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面几讲再展开 Previewed only
第 12 讲:得分函数、Fisher 散度、得分匹配的分部积分、朗之万 MCMC多个噪声尺度、退火朗之万、NCSN(第 14 讲)
第 11 讲:能量模型、配分函数用随机微分方程加噪声、概率流 ODE(第 14、16 讲)
第 5 讲:高斯混合、后验 p(z∣x)p(z \mid x)扩散模型 = 去噪 = 得分(第 16 讲)
第 10 讲:切片 Wasserstein 距离(作为样本质量的度量)

0.3 本讲地图 Map

§1  回顾:表示一个分布的几种方式;得分函数是另一种表示                         ← 代码 01 第 1 部分
§2  得分估计:Fisher 散度、得分匹配,以及它为什么不可扩展                        ← 代码 02 第 1 部分
§3  去噪得分匹配:推导、算法、Tweedie 公式、σ 的权衡                            ← 代码 01 第 2–4 部分、代码 02 第 2–3 部分
§4  切片得分匹配:随机投影                                                     ← 代码 02 第 1–2 部分
§5  从得分到样本:朗之万动力学                                                 ← 代码 03
§6  三个陷阱,以及"加噪声"                                                    ← 代码 04
§7  2023 年之后
§8–12  小结、常见误区、练习、延伸阅读、下一讲预告

0.4 记号 Notation

符号含义
s(x)=∇xlog⁡p(x)s(x) = \nabla_x\log p(x)(Stein)得分函数:一个向量场
sθ(x)s_\theta(x)得分模型(得分网络),Rd→Rd\mathbb{R}^d \to \mathbb{R}^d
DF(p,q)=12Ep∥∇log⁡p−∇log⁡q∥2D_F(p, q) = \frac12\mathbb{E}_p\Vert\nabla\log p - \nabla\log q\Vert^2Fisher 散度
qσ(x~∣x)=N(x~;x,σ2I)q_\sigma(\tilde x \mid x) = \mathcal{N}(\tilde x; x, \sigma^2 I)加噪的条件分布;x~=x+σz\tilde x = x + \sigma z,z∼N(0,I)z \sim \mathcal{N}(0, I)
qσ(x~)=∫pdata(x)qσ(x~∣x) dxq_\sigma(\tilde x) = \int p_{\text{data}}(x)q_\sigma(\tilde x \mid x)\,dx加噪以后的(边缘)分布
vv切片得分匹配的随机投影方向
ϵ\epsilon朗之万的步长。本讲义写成 x←x+ϵ∇log⁡p+2ϵ ξx \leftarrow x + \epsilon\nabla\log p + \sqrt{2\epsilon}\,\xi(和第 11、12 讲一致);slides 写成 x←x+ϵ2∇log⁡p+ϵ ξx \leftarrow x + \frac{\epsilon}{2}\nabla\log p + \sqrt{\epsilon}\,\xi,只差一个 2 的因子

0.5 关于数字 · About the numbers

所有真实分布都是二维高斯混合(第 5 讲 toy2d.py):两个分开的高斯(权重 0.8 / 0.2、中心 (∓2,0)(\mp2, 0)、标准差 0.4,和第 12 讲相同)和双月牙(200 个小高斯沿两条弧线排开,标准差 0.15)。高斯混合加上高斯噪声还是高斯混合,所以 ∇log⁡qσ\nabla\log q_\sigma 对任何 σ\sigma 都能精确算出——学到的得分可以逐点和真相比较。训练都用同一个网络(2 → 128 × 3 → 2,SiLU)、Adam、固定种子的单次运行;和预想不同的结果记录在 代码 README 的”关于实验结果”里。计时的数字每次运行略有不同。


1. 回顾:表示一个分布的几种方式 · Representations of probability distributions

1.1 两大类

slides 开头把前 12 讲的模型分成两类:

  • 用概率密度(质量)函数表示:自回归模型(第 3 讲)、归一化流(第 7–8 讲)、隐变量模型 / VAE(第 5–6 讲)、能量模型(第 11–12 讲)。好处:可以用最大似然训练,原则清楚,还能比较模型的似然。代价:为了让 pθp_\theta 归一化,要么限制网络结构(自回归的顺序、流的可逆性),要么用替代目标(ELBO),要么面对算不出来的 Z(θ)Z(\theta)。
  • 用采样过程表示(隐式模型):GAN(第 9–10 讲)。好处:网络结构完全自由。代价:对抗训练不稳定、模式坍塌,也没有似然可以评估。

能量模型已经很接近”自由”了:pθ(x)=efθ(x)/Z(θ)p_\theta(x) = e^{f_\theta(x)}/Z(\theta),fθf_\theta 可以是任何网络。它唯一的麻烦是 Z(θ)Z(\theta)。第 12 讲发现:得分

∇xlog⁡pθ(x)=∇xfθ(x)−∇xlog⁡Z(θ)⏟=0\nabla_x\log p_\theta(x) = \nabla_x f_\theta(x) - \underbrace{\nabla_x\log Z(\theta)}_{=0}

和 ZZ 无关。本讲把这个想法推到底:干脆不要密度,直接表示得分。

1.2 得分函数是一种表示

直觉。 把 log⁡p(x)\log p(x) 想象成一片地形(山峰是高概率区域),得分就是每一点上”最陡的上坡方向”,长度是坡度。给你整张”坡度图”,你能把地形恢复出来——只差一个整体的高度(常数),而这个常数恰好由”概率积分为 1”唯一确定。

数值验证(代码 01 第 1 部分)。 两个高斯(0.8 / 0.2)的得分画成箭头图:箭头汇聚到两个模式的中心,中间有一条”分水岭”。沿一条直线对得分做线积分

∫abs(x)⋅dx=log⁡p(b)−log⁡p(a),\int_a^b s(x)\cdot dx = \log p(b) - \log p(a),

2001 个点的梯形公式和精确值的差在 10−510^{-5} 以下(三条路径:4.4×10−164.4\times10^{-16}、8.3×10−68.3\times10^{-6}、2.4×10−152.4\times10^{-15})。得分完整地决定了密度。

得分模型。 用一个神经网络 sθ:Rd→Rds_\theta: \mathbb{R}^d \to \mathbb{R}^d 直接输出一个向量场,不要求它是任何标量函数的梯度。能量模型输出一个数再对 xx 求导;得分模型直接输出 dd 个数——网络更自由,前向一次就得到得分,不用再反向传播。代价是:一个任意的向量场不一定是梯度场(不一定”保守”),也就不一定对应任何密度。代码 02 测了学到的网络离梯度场有多远:雅可比矩阵 ∇xsθ\nabla_x s_\theta 的反对称部分只占 5%–8%——没人强迫它,但数据把它推向了梯度场。

1.3 得分对模式权重很迟钝

同样的两个成分,把权重从 0.5 / 0.5 换成 0.8 / 0.2(代码 01 第 1 部分):

位置p(x)p(x)(0.8 / 0.2)s1s_1(0.8 / 0.2)s1s_1(0.5 / 0.5)差
(−2,0)(-2, 0) 左模式中心0.7960.00000.00003.6×10−213.6\times10^{-21}
(−1,0)(-1, 0)0.035−6.2500−6.25002.6×10−102.6\times10^{-10}
(0,0)(0, 0) 低谷3.7×10−63.7\times10^{-6}−7.50000.00007.5
(+1,0)(+1, 0)0.0087+6.2500+6.25001.0×10−91.0\times10^{-9}

为什么。 混合分布的得分是各成分得分按后验责任加权:∇log⁡p(x)=∑krk(x)∇log⁡pk(x)\nabla\log p(x) = \sum_k r_k(x)\nabla\log p_k(x),rk(x)=p(k∣x)r_k(x) = p(k \mid x)。在左模式附近 r1≈1r_1 \approx 1,得分就是左成分自己的得分,和权重 π1\pi_1 无关;只有在两个成分的责任都不可忽略的地方(低谷)权重才起作用。而低谷的密度只有 3.7×10−63.7\times10^{-6}——从数据学得分时,那里几乎没有样本。这是第 12 讲”Fisher 散度看不见权重”的另一种说法,也是 §6.3 第三个陷阱的根源。


2. 得分估计:得分匹配 · Score estimation by score matching

2.1 目标

给定 i.i.d. 样本 {x1,…,xN}∼pdata\{x_1, \dots, x_N\} \sim p_{\text{data}},想要 sθ(x)≈∇xlog⁡pdata(x)s_\theta(x) \approx \nabla_x\log p_{\text{data}}(x)。最自然的目标是平均的欧氏距离——Fisher 散度:

12Epdata[∥∇xlog⁡pdata(x)−sθ(x)∥22].\frac12\mathbb{E}_{p_{\text{data}}}\left[\Vert\nabla_x\log p_{\text{data}}(x) - s_\theta(x)\Vert_2^2\right].

问题是 ∇xlog⁡pdata\nabla_x\log p_{\text{data}} 未知。第 12 讲用分部积分把它消掉(Hyvärinen 2005):

Epdata[12∥sθ(x)∥22+tr(∇xsθ(x))]+常数.\mathbb{E}_{p_{\text{data}}}\left[\frac12\Vert s_\theta(x)\Vert_2^2 + \mathrm{tr}(\nabla_x s_\theta(x))\right] + \text{常数}.

能量模型里 sθ=∇xfθs_\theta = \nabla_x f_\theta,迹是 Hessian 的迹;得分模型里它是雅可比矩阵 ∇xsθ\nabla_x s_\theta 的迹。推导完全一样,只要求 sθs_\theta 可导、pdatap_{\text{data}} 在无穷远处衰减。

2.2 得分匹配不可扩展

tr(∇xsθ(x))=∑k=1d∂sθ,k∂xk\mathrm{tr}(\nabla_x s_\theta(x)) = \sum_{k=1}^d \frac{\partial s_{\theta,k}}{\partial x_k}。自动求导一次反向传播只能得到”一个标量对所有输入的梯度”,所以第 kk 个对角元需要对 sθ,ks_{\theta,k} 单独反向传播一次——O(d)O(d) 次反向传播。

代码 02 第 1 部分(MLP d→256→256→dd \to 256 \to 256 \to d,批量 128):

dd显式得分匹配切片得分匹配去噪得分匹配显式 / 切片
21.8 ms1.2 ms0.5 ms2×
3221.3 ms1.2 ms0.6 ms17×
12899.1 ms1.5 ms0.8 ms67×
512630 ms2.6 ms1.5 ms239×

(一次运行的计时,每次运行会差 10% 左右;d=512d = 512 时的比值在 240–260 倍之间。)显式得分匹配随 dd 线性变慢;一张 256×256256 \times 256 的彩色图有约 20 万维。slides 给出两条出路:去噪得分匹配和切片得分匹配。


3. 去噪得分匹配 · Denoising score matching

3.1 想法:去匹配一个加了噪声的分布

动机。 难点在于 ∇log⁡pdata\nabla\log p_{\text{data}} 未知、只能分部积分。换个目标:先给数据加一点噪声,x~=x+σz\tilde x = x + \sigma z,得到一个更平滑的分布 qσ(x~)=∫pdata(x)qσ(x~∣x)dxq_\sigma(\tilde x) = \int p_{\text{data}}(x)q_\sigma(\tilde x \mid x)dx,然后去估计 qσq_\sigma 的得分。σ\sigma 很小时 qσ≈pdataq_\sigma \approx p_{\text{data}}。好处在于:条件分布 qσ(x~∣x)=N(x~;x,σ2I)q_\sigma(\tilde x \mid x) = \mathcal{N}(\tilde x; x, \sigma^2 I) 的得分是已知的:

∇x~log⁡qσ(x~∣x)=−x~−xσ2=−zσ.\nabla_{\tilde x}\log q_\sigma(\tilde x \mid x) = -\frac{\tilde x - x}{\sigma^2} = -\frac{z}{\sigma}.

3.2 推导(slides 逐步写出)

12Ex~∼qσ[∥∇log⁡qσ(x~)−sθ(x~)∥2]=12Eqσ∥sθ∥2−Eqσ[∇log⁡qσ(x~)⊤sθ(x~)]+常数.\begin{aligned} &\frac12\mathbb{E}_{\tilde x \sim q_\sigma}\left[\Vert\nabla\log q_\sigma(\tilde x) - s_\theta(\tilde x)\Vert^2\right] \\ &= \frac12\mathbb{E}_{q_\sigma}\Vert s_\theta\Vert^2 - \mathbb{E}_{q_\sigma}\left[\nabla\log q_\sigma(\tilde x)^\top s_\theta(\tilde x)\right] + \text{常数}. \end{aligned}

关键是交叉项:

Eqσ[∇log⁡qσ(x~)⊤sθ(x~)]=∫qσ(x~)∇qσ(x~)qσ(x~)⊤sθ(x~) dx~=∫∇x~(∫pdata(x)qσ(x~∣x)dx)⊤sθ(x~) dx~=∬pdata(x)qσ(x~∣x)∇x~log⁡qσ(x~∣x)⊤sθ(x~) dx dx~=Ex,x~[∇x~log⁡qσ(x~∣x)⊤sθ(x~)].\begin{aligned} \mathbb{E}_{q_\sigma}\left[\nabla\log q_\sigma(\tilde x)^\top s_\theta(\tilde x)\right] &= \int q_\sigma(\tilde x)\frac{\nabla q_\sigma(\tilde x)}{q_\sigma(\tilde x)}^\top s_\theta(\tilde x)\,d\tilde x = \int \nabla_{\tilde x}\left(\int p_{\text{data}}(x)q_\sigma(\tilde x \mid x)dx\right)^\top s_\theta(\tilde x)\,d\tilde x \\ &= \iint p_{\text{data}}(x)q_\sigma(\tilde x \mid x)\nabla_{\tilde x}\log q_\sigma(\tilde x \mid x)^\top s_\theta(\tilde x)\,dx\,d\tilde x = \mathbb{E}_{x, \tilde x}\left[\nabla_{\tilde x}\log q_\sigma(\tilde x \mid x)^\top s_\theta(\tilde x)\right]. \end{aligned}

(第二步把 qσq_\sigma 写成积分、梯度移进积分号,第三步用 ∇q=q∇log⁡q\nabla q = q\nabla\log q。)代回去,再把与 θ\theta 无关的项补成平方:

12Eqσ∥∇log⁡qσ−sθ∥2=12Ex∼pdataEx~∼qσ(⋅∣x)∥sθ(x~)−∇x~log⁡qσ(x~∣x)∥2+常数\boxed{\frac12\mathbb{E}_{q_\sigma}\Vert\nabla\log q_\sigma - s_\theta\Vert^2 = \frac12\mathbb{E}_{x \sim p_{\text{data}}}\mathbb{E}_{\tilde x \sim q_\sigma(\cdot \mid x)}\left\Vert s_\theta(\tilde x) - \nabla_{\tilde x}\log q_\sigma(\tilde x \mid x)\right\Vert^2 + \text{常数}}

右边每一项都能算。对高斯噪声,目标就是 12E∥sθ(x+σz)+z/σ∥2\frac12\mathbb{E}\Vert s_\theta(x + \sigma z) + z/\sigma\Vert^2——不需要任何导数。

数值验证(代码 01 第 2 部分)。 一维两个高斯(0.8 / 0.2),在网格上把左右两边的积分都精确算出来(二重积分 ∬p(x)N(x~;x,σ2)(⋯ )2\iint p(x)\mathcal{N}(\tilde x; x, \sigma^2)(\cdots)^2),换五个毫不相干的 ss:

候选的 ss去噪目标(σ=0.5\sigma = 0.5)对 qσq_\sigma 的 Fisher 散度差值
s=0s = 02.0000001.1938440.806156
s=−xs = -x3.2050002.3988440.806156
s=3sin⁡xs = 3\sin x3.8807033.0745480.806156
干净数据的得分 ∇log⁡pdata\nabla\log p_{\text{data}}3.7905622.9844070.806156
加噪分布的得分 ∇log⁡qσ\nabla\log q_\sigma0.8061560.0000000.806156

差值五行完全相同,等于理论常数 12(d/σ2−E∥∇log⁡qσ∥2)=0.806156\frac12(d/\sigma^2 - \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2) = 0.806156(练习 2)。σ=0.1\sigma = 0.1 时常数是 47.058929,同样五行一致;此时干净数据的得分对 qσq_\sigma 的 Fisher 散度只有 0.0115——σ\sigma 小,qσq_\sigma 和 pdatap_{\text{data}} 的得分就接近。

3.3 算法与优缺点

slides 的算法:

  1. 取一批数据 {x1,…,xn}∼pdata\{x_1, \dots, x_n\} \sim p_{\text{data}};
  2. 加噪 x~i∼qσ(x~∣xi)\tilde x_i \sim q_\sigma(\tilde x \mid x_i),即 x~i=xi+σzi\tilde x_i = x_i + \sigma z_i;
  3. 估计去噪得分匹配损失的梯度:12n∑i∥sθ(x~i)+x~i−xiσ2∥2\frac{1}{2n}\sum_i\Vert s_\theta(\tilde x_i) + \frac{\tilde x_i - x_i}{\sigma^2}\Vert^2;
  4. 随机梯度下降。

优点:高维也很便宜(代码 02:d=512d = 512 时每步 1.5 ms);还附赠一个最优去噪器(§3.4)。缺点:学到的是 qσq_\sigma 的得分,不是干净数据的得分;想让 qσ≈pdataq_\sigma \approx p_{\text{data}} 就得让 σ\sigma 很小,而 σ\sigma 小时目标的方差爆炸(§3.5)。

名字的由来。 sθ(x~)≈−x~−xσ2s_\theta(\tilde x) \approx -\frac{\tilde x - x}{\sigma^2} 等价于 x~+σ2sθ(x~)≈x\tilde x + \sigma^2 s_\theta(\tilde x) \approx x:网络在学”从带噪的 x~\tilde x 猜出干净的 xx“——一个去噪器。Vincent(2011)正是从”去噪自编码器”出发发现了这个联系。

3.4 Tweedie 公式:最优去噪器就是得分

Ex∼p(x∣x~)[x]=x~+σ2∇x~log⁡qσ(x~).\mathbb{E}_{x \sim p(x \mid \tilde x)}[x] = \tilde x + \sigma^2\nabla_{\tilde x}\log q_\sigma(\tilde x).

证明(一行):∇x~qσ(x~)=∫p(x)∇x~N(x~;x,σ2I)dx=∫p(x)N(x~;x,σ2I)x−x~σ2dx\nabla_{\tilde x} q_\sigma(\tilde x) = \int p(x)\nabla_{\tilde x}\mathcal{N}(\tilde x; x, \sigma^2 I)dx = \int p(x)\mathcal{N}(\tilde x; x, \sigma^2 I)\frac{x - \tilde x}{\sigma^2}dx,两边除以 qσ(x~)q_\sigma(\tilde x) 就得到 ∇log⁡qσ(x~)=E[x∣x~]−x~σ2\nabla\log q_\sigma(\tilde x) = \frac{\mathbb{E}[x \mid \tilde x] - \tilde x}{\sigma^2}。

含义。 在均方误差意义下,最好的去噪器是后验均值 E[x∣x~]\mathbb{E}[x \mid \tilde x];Tweedie 公式说它可以由加噪分布的得分算出来。反过来,训练一个去噪器就是在学得分——第 16 讲的扩散模型”预测噪声”正是这件事。

数值验证(代码 01 第 3 部分,双月牙)。 高斯混合的后验均值可以不用得分、直接按贝叶斯公式算(每个成分的高斯后验均值按责任加权)。两种算法一致到 10−1410^{-14}:

σ\sigmaTweedie − 贝叶斯(最大差)E∥x~−x∥2\mathbb{E}\Vert\tilde x - x\Vert^2E∥E[x∣x~]−x∥2\mathbb{E}\Vert\mathbb{E}[x \mid \tilde x] - x\Vert^2log⁡pdata\log p_{\text{data}}:原样本 / 去噪结果
0.12.7×10−152.7\times10^{-15}0.02010.0170−1.82 / −1.66
0.31.8×10−151.8\times10^{-15}0.18030.1218−1.82 / −1.66
1.04.0×10−154.0\times10^{-15}2.02100.9069−1.81 / −3.85
3.01.6×10−141.6\times10^{-14}17.951.96−1.81 / −4.66

去噪结果不是样本。 后验均值是”平均的答案”:σ\sigma 小时它把点收缩到弧线的中心线上,比真实样本还集中(log⁡pdata\log p_{\text{data}} −1.66 > −1.82);σ=1\sigma = 1 时把点拉到两条弧线”中间”(−3.85),字符图里是一团夹在两条弧线之间的云。所以一步去噪不能生成数据。要从噪声走到数据,得用朗之万(§5),或者一串从大到小的噪声(第 14、16 讲)。

3.5 为什么 σ 不能太小

每个样本的训练目标 −z/σ-z/\sigma 可以拆成”真正的得分 ∇log⁡qσ(x~)\nabla\log q_\sigma(\tilde x)“加一个均值为零的噪声(它们的差在给定 x~\tilde x 的条件下均值为零,正是 Tweedie)。信号占多少?代码 01 第 4 部分(双月牙):

σ\sigmaE∥z/σ∥2=2/σ2\mathbb{E}\Vert z/\sigma\Vert^2 = 2/\sigma^2E∥∇log⁡qσ∥2\mathbb{E}\Vert\nabla\log q_\sigma\Vert^2信号占比去噪目标的最小值
1.02.01.1054.75%0.5
0.1200.131.3815.68%84.4
0.0120,007.746.030.23%9,980.8

σ→0\sigma \to 0 时 E∥∇log⁡qσ∥2\mathbb{E}\Vert\nabla\log q_\sigma\Vert^2 趋于 E∥∇log⁡pdata∥2\mathbb{E}\Vert\nabla\log p_{\text{data}}\Vert^2(有限),而目标的大小 d/σ2d/\sigma^2 发散。σ=0.01\sigma = 0.01 时 99.8% 是噪声,梯度估计几乎全是噪声;去噪目标的最小值本身也有近一万——训练曲线上的”损失”几乎全是不可消除的部分,看不出模型好坏。

3.6 实验:σ 的 U 形权衡

代码 02 第 3 部分:双月牙,同一个网络训练 2,000 步,只改 σ\sigma。“偏差下限”是即使学得完美也躲不掉的 12Ep∥∇log⁡qσ−∇log⁡p∥2\frac12\mathbb{E}_p\Vert\nabla\log q_\sigma - \nabla\log p\Vert^2(精确计算);sθ=0s_\theta = 0 时对 pdatap_{\text{data}} 的 Fisher 散度是 22.91。

σ\sigma偏差下限学到的 vs qσq_\sigma 的得分学到的 vs pdatap_{\text{data}} 的得分
0.010.00020.63421.046
0.020.00714.92815.543
0.050.2245.2295.983
0.12.1291.3783.718
0.29.3710.3619.740
0.519.7900.01520.538
1.021.7250.00222.287

第二列随 σ\sigma 增大(qσq_\sigma 离 pdatap_{\text{data}} 越来越远),第三列随 σ\sigma 减小(目标越来越吵,同样的步数学得越来越差)。我们关心的最后一列是两者的合成,呈 U 形,最好的 σ=0.1\sigma = 0.1 也只到 3.718(16%)。σ=0.01\sigma = 0.01 时网络几乎什么都没学到(21.0,接近 s=0s = 0 的 22.9)。单一的 σ\sigma 只能折中——第 14 讲用一串从大到小的 σ\sigma 同时拿到两边的好处。


4. 切片得分匹配 · Sliced score matching

4.1 想法:一维问题更容易

动机。 迹贵在要 dd 个方向的导数。slides 的思路:一维的问题容易——把高维向量场投影到随机方向 vv 上,只要求投影匹配:

12EpvEpdata[(v⊤∇xlog⁡pdata(x)−v⊤sθ(x))2].\frac12\mathbb{E}_{p_v}\mathbb{E}_{p_{\text{data}}}\left[\left(v^\top\nabla_x\log p_{\text{data}}(x) - v^\top s_\theta(x)\right)^2\right].

vv 取自一个简单分布(如 N(0,I)\mathcal{N}(0, I))。对每个方向分部积分(和 §2.1 一样),得到切片得分匹配(Song, Garg, Shi & Ermon 2019):

EpvEpdata[v⊤∇xsθ(x) v+12(v⊤sθ(x))2]+常数.\mathbb{E}_{p_v}\mathbb{E}_{p_{\text{data}}}\left[v^\top\nabla_x s_\theta(x)\,v + \frac12\left(v^\top s_\theta(x)\right)^2\right] + \text{常数}.

4.2 为什么只要一次反向传播

v⊤∇xsθ(x) vv^\top\nabla_x s_\theta(x)\,v:先算标量 v⊤sθ(x)v^\top s_\theta(x),对 xx 求一次梯度得到 ∇x(v⊤sθ)=(∇xsθ)⊤v\nabla_x(v^\top s_\theta) = (\nabla_x s_\theta)^\top v(向量–雅可比积),再和 vv 点乘。一次反向传播,和 dd 无关(slides 称之为”Jacobian-vector products are scalable”)。代码在 score.py 的 ssm_loss 里只有三行。

4.3 为什么无偏

Ev[v⊤Av]=Ev[tr(Avv⊤)]=tr(A E[vv⊤])=tr(A)\mathbb{E}_v[v^\top Av] = \mathbb{E}_v[\mathrm{tr}(Avv^\top)] = \mathrm{tr}(A\,\mathbb{E}[vv^\top]) = \mathrm{tr}(A),只要 E[vv⊤]=I\mathbb{E}[vv^\top] = I(高斯或 Rademacher 都行)。代码 02 第 1 部分:d=32d = 32,同一个网络、同一批数据,显式得分匹配的值是 0.0800;换 4,000 次随机方向,切片版本的平均是 0.0796±0.00040.0796 \pm 0.0004,方差缩减版(把 12(v⊤s)2\frac12(v^\top s)^2 换成它的期望 12∥s∥2\frac12\Vert s\Vert^2)是 0.0802±0.00040.0802 \pm 0.0004,都在一个标准误左右。单次估计的标准差约 0.027,方差缩减只帮了一点点(0.0275 → 0.0267)——这里的方差主要来自 v⊤Jvv^\top Jv 这一项(练习 4)。

slides 的算法:每个数据点取一个(或几个)随机方向,估计损失,随机梯度下降;方向越多方差越小。

4.4 三种方法的比较

代码 02 第 2 部分:双月牙,同一个网络、同样 2,000 步。

训练方法用时Fisher(对 pdatap_{\text{data}})相对误差Fisher(对 qσq_\sigma)
显式得分匹配5 秒1.5736.9%—
切片得分匹配3 秒2.57411.2%—
切片得分匹配(方差缩减)4 秒1.8508.1%—
去噪得分匹配 σ=0.05\sigma = 0.052 秒5.98326.1%5.229
去噪得分匹配 σ=0.1\sigma = 0.12 秒3.71816.2%1.378
去噪得分匹配 σ=0.3\sigma = 0.32 秒15.20866.4%0.114
  • 三种不加噪的方法学的是同一个目标(干净数据的得分)。显式最准;切片版本的随机方向带来额外的噪声,同样步数误差更大;方差缩减版居中。二维里显式得分匹配并不贵,切片的优势要在高维才显现(§2.2 的表)。
  • 去噪得分匹配学的是 qσq_\sigma 的得分:σ\sigma 越大,qσq_\sigma 越平滑、越好学(对 qσq_\sigma 的误差 5.2 → 1.4 → 0.1),但对 pdatap_{\text{data}} 的误差在 σ=0.3\sigma = 0.3 时最大。

slides 引用 Song et al.(2019)的实验:切片得分匹配的速度和去噪得分匹配一样不随维数变化,得分估计质量和去噪得分匹配相当,而且估计的是干净数据的得分。不过在后来的生成模型里,去噪得分匹配几乎完全胜出——它最便宜,而 §6 会看到”加噪声”本身就是我们想要的。


5. 从得分到样本:朗之万动力学 · Langevin dynamics sampling

5.1 算法

slides:只用得分就能从 p(x)p(x) 采样。

  1. 初始化 x0∼π(x)x^0 \sim \pi(x)(任何简单分布);
  2. 重复 xt+1←xt+ϵ2∇xlog⁡p(xt)+ϵ ztx^{t+1} \leftarrow x^t + \frac{\epsilon}{2}\nabla_x\log p(x^t) + \sqrt{\epsilon}\,z^t,zt∼N(0,I)z^t \sim \mathcal{N}(0, I),t=0,…,T−1t = 0, \dots, T-1;
  3. 若 ϵ→0\epsilon \to 0、T→∞T \to \infty,则 xT∼p(x)x^T \sim p(x)。

这就是第 11、12 讲的未调整朗之万 MCMC,只是现在把 ∇xlog⁡p\nabla_x\log p 换成学到的 sθ(x)s_\theta(x)。得分模型 = 学得分(§2–§4)+ 朗之万采样。 下面统一写成 x←x+ϵ s(x)+2ϵ ξx \leftarrow x + \epsilon\,s(x) + \sqrt{2\epsilon}\,\xi(ϵ\epsilon 是 slides 里的一半)。

直觉。 漂移项 ϵ s(x)\epsilon\,s(x) 让点往高概率处爬;噪声项 2ϵ ξ\sqrt{2\epsilon}\,\xi 让点到处乱走。两者恰好平衡时,点的分布停在 pp 上(第 12 讲:Fokker–Planck 方程的平稳解)。

5.2 实验:用精确的得分(代码 03 第 1 部分)

双月牙,5,000 条链,初始点在方框 [−3,3]×[−2,2][-3, 3] \times [-2, 2] 里均匀分布。指标:和 5,000 个新真实样本的切片 W1(两组独立真实样本之间约 0.028,这是”噪声底”)、样本的平均 log⁡pdata\log p_{\text{data}}(真实样本 −1.82)。

步长 ϵ\epsilon10 步100 步1,000 步
0.0010.291 / −7.310.165 / −1.890.095 / −1.85
0.010.161 / −2.000.094 / −1.960.032 / −1.99
0.020.146 / −2.220.044 / −2.210.050 / −2.22
0.050.249 / −5.300.259 / −5.260.257 / −5.31

(每格:切片 W1 / 平均 log⁡p\log p。)

  • 步子太小走不动:ϵ=0.001\epsilon = 0.001 时 1,000 步的”扩散距离”只有 2⋅0.001⋅1000≈1.4\sqrt{2 \cdot 0.001 \cdot 1000} \approx 1.4。
  • 有限步长有偏差:ϵ=0.02\epsilon = 0.02 混合得快,但停在一个比 ϵ=0.01\epsilon = 0.01 更高的 W1 上,样本略”胖”(第 12 讲 §2.3 的 ULA 偏差)。
  • 步子太大会震荡:弧线的宽度只有 s=0.15s = 0.15,第 12 讲练习 3 的稳定性条件 ϵ<2s2=0.045\epsilon < 2s^2 = 0.045 被 ϵ=0.05\epsilon = 0.05 打破,链在垂直于弧线的方向上来回跳,平均 log⁡p\log p 只有 −5.3。步长受最窄的方向限制——高维图像里,最窄的方向往往窄得多。

5.3 实验:用学到的得分(代码 03 第 2 部分)

ϵ=0.01\epsilon = 0.01、1,000 步,比较精确得分和代码 02 里学到的几个网络:

用哪个得分切片 W1平均 log⁡p\log p远离数据的样本上弧的比例(真实 50%)
精确的 ∇log⁡pdata\nabla\log p_{\text{data}}0.018−1.950.5%49.6%
精确的 ∇log⁡q0.1\nabla\log q_{0.1}0.031−2.181.5%50.2%
精确的 ∇log⁡q0.3\nabla\log q_{0.3}0.058−3.7015.9%50.2%
学到的:显式得分匹配0.180−2.020.9%56.2%
学到的:去噪 σ=0.1\sigma = 0.10.320−2.272.8%36.1%
学到的:去噪 σ=0.3\sigma = 0.30.083−3.6915.7%50.3%
  • 去噪得分采出的是加噪分布的样本:精确的 ∇log⁡q0.3\nabla\log q_{0.3} 和学到的去噪得分(σ=0.3\sigma = 0.3)给出几乎相同的结果——弧线明显变粗、16% 的样本远离数据。网络学对了,只是学的是 qσq_\sigma(§3.3 的”缺点”)。
  • 局部对、全局错:学到的显式得分和去噪得分(σ=0.1\sigma = 0.1)采出的样本局部形状都不错(远离数据的样本只有 1%–3%),切片 W1 却大得多——两条弧线的比例错了(56%、36%)。比例由两条弧线之间低密度区域里的得分决定(链一开始被推向哪边、之后怎样在两条弧线之间往来),而那里恰恰学得最差,得分匹配又对权重最不敏感(§1.3)。σ=0.3\sigma = 0.3 的噪声把两条弧线”连”了起来,那片区域有了训练数据,比例反而对了。这是 §6 第 2、3 个陷阱的预演。
  • 最后一步 Tweedie 去噪 x+σ2sθ(x)x + \sigma^2 s_\theta(x) 让平均 log⁡p\log p 回升(σ=0.3\sigma = 0.3:−3.69 → −1.82),切片 W1 却没有变好(0.083 → 0.091):后验均值把点拉向中心线,并不恢复 pdatap_{\text{data}} 的形状(§3.4)。

5.4 噪声项是必需的

代码 03 第 3 部分:去掉 2ϵ ξ\sqrt{2\epsilon}\,\xi,朗之万变成梯度上升 x←x+ϵ∇log⁡p(x)x \leftarrow x + \epsilon\nabla\log p(x)。1,000 步后平均 log⁡p\log p 高达 −1.26(比真实样本 −1.82 高得多),但 5,000 个点只剩 834 个不同的位置(精度 0.01),挤在弧线的”山脊”上,切片 W1 0.180;有噪声的朗之万是 0.023。朗之万是采样,不是优化:噪声项保证样本铺满整个分布,而不是只找到众数。


6. 三个陷阱 · Pitfalls

slides(来自 Song & Ermon 2019)列出了”得分匹配 + 朗之万”在真实数据上失败的三个原因。

6.1 陷阱一:流形假设

流形假设(manifold hypothesis):真实世界的数据(如图像)集中在高维空间中的一个低维流形上。一张 256×256256 \times 256 的照片有约 20 万个像素值,但”像照片的”图像只占其中极小的一部分,自由度远少于 20 万。

为什么是问题。 在流形之外 pdata=0p_{\text{data}} = 0,log⁡pdata=−∞\log p_{\text{data}} = -\infty,得分没有定义;而得分匹配要求 pdatap_{\text{data}} 有处处可微的正密度。slides 展示了 Song & Ermon 的实验:在 CIFAR-10 上用切片得分匹配训练,损失来回跳、不收敛;给数据加上很小的高斯噪声 N(0,0.0001)\mathcal{N}(0, 0.0001) 以后损失就收敛了。

复现(代码 04 第 1 部分)。 数据在半径 1.5 的圆周上,加厚度为 τ\tau 的高斯噪声。厚度为 τ\tau 的圆环沿半径方向的得分约为 −(r−R)/τ2-(r - R)/\tau^2,所以得分匹配的最优值约为 −12E∥∇log⁡p∥2≈−12τ2-\frac12\mathbb{E}\Vert\nabla\log p\Vert^2 \approx -\frac{1}{2\tau^2};τ=0\tau = 0 时是 −∞-\infty。

方法厚度 τ\tau第 1–400 步801–1,2001,601–2,000理论最优值
显式得分匹配0(严格在圆上)−2,891−39,971−88,478−∞-\infty
显式得分匹配0.001−2,811−34,704−70,140≈ −500,000
显式得分匹配0.01−1,238−4,421−4,773≈ −5,000
显式得分匹配0.1−36.4−49.7−49.9≈ −50
去噪得分匹配 σ=0.1\sigma = 0.10(严格在圆上)75.150.951.0≈ 50

(每个数字是那 400 步损失的平均。)τ=0\tau = 0 时网络把指向圆周的得分越拉越陡,损失一路下降、没有停下来的迹象;τ=0.001\tau = 0.001 在 2,000 步内的表现几乎一样——对一个有限的网络,“非常薄”和”严格在流形上”一样糟。τ=0.01\tau = 0.01、0.10.1 的损失停在理论值附近。同样严格落在圆上的数据,去噪得分匹配的损失很快稳定在理论值 12σ2=50\frac{1}{2\sigma^2} = 50 附近(练习 8):加噪后的分布铺满整个平面,得分处处有定义、处处有限。

6.2 陷阱二:低密度区域估计不准

为什么。 得分匹配的目标是 Epdata[⋯ ]\mathbb{E}_{p_{\text{data}}}[\cdots],误差只在数据出现的地方被惩罚。高维空间里,数据占据的区域只是很小一部分;朗之万从一个随便的初始分布出发,最先经过的恰恰是低密度区域。slides 的图:数据密度、真实得分、估计的得分——只在两个模式附近,估计的得分和真实得分一致。

复现(代码 04 第 2 部分)。 双月牙上用显式得分匹配训练的网络(和代码 02 相同),在方框 [−3,3]×[−2,2][-3, 3] \times [-2, 2] 的格点上按真实密度分组:

区域占面积数据质量∥\Vert真实得分∥\Vert∥\Vert误差∥\Vert相对误差方向余弦被送到另一条弧线
p≥0.1p \geq 0.1(弧线上)16.6%0.83134.91.00.23+0.9010.0%
0.01≤p<0.10.01 \leq p < 0.115.3%0.157112.92.10.17+0.9582.1%
10−4≤p<0.0110^{-4} \leq p < 0.0118.3%0.011621.04.40.20+0.9483.0%
10−8≤p<10−410^{-8} \leq p < 10^{-4}19.9%0.000131.96.70.20+0.9193.3%
p<10−8p < 10^{-8}(远离数据)29.9%0.000051.713.30.25+0.92312.3%

(最后一列:从这个格点出发沿得分做梯度上升,精确得分和学到的得分把它送到了不同的弧线上——两者的”分水岭”不一致。)

如实地说:绝对误差随着离开数据迅速变大(1 → 13),但相对误差和方向余弦在各区域差别不大——远处的真实得分很简单(大致指向数据),平滑的网络外推得还可以。这个二维例子比高维图像”仁慈”得多。错误藏在细节里:远离数据的格点里有约八分之一被送到了错误的弧线上,弧线上一个都没有。分水岭画在低密度区域里,正是学得最差的地方——§5.3 两条弧线比例错误的原因之一。

6.3 陷阱三:模式之间混合太慢

为什么。 设 p(x)=πp1(x)+(1−π)p2(x)p(x) = \pi p_1(x) + (1 - \pi)p_2(x),p1p_1、p2p_2 的支撑不相交(分别在 AA、BB 上)。那么在 AA 上 ∇log⁡p(x)=∇log⁡(πp1(x))=∇log⁡p1(x)\nabla\log p(x) = \nabla\log(\pi p_1(x)) = \nabla\log p_1(x),在 BB 上是 ∇log⁡p2(x)\nabla\log p_2(x)——得分完全不依赖 π\pi。得分匹配学不到 π\pi;用得分做朗之万,链也”看不见” π\pi。slides 的图:i.i.d. 样本里两个模式的比例正确,朗之万样本的比例错误。现实中支撑不会严格不相交,但只要低谷足够深,结论几乎一样(§1.3)。

复现(代码 04 第 3 部分)。 两个高斯,真实权重左 0.8 / 右 0.2;ϵ=0.01\epsilon = 0.01,2,000 条链。从左模式中心到中间低谷,log⁡p\log p 下降 12.3(低谷密度是中心的 5×10−65\times10^{-6} 倍)。

得分初始点初始左边比例1,000 步后10,000 步后换过边的链
精确的得分方框里均匀0.5040.5100.5101.2%
精确的得分真实分布0.7990.7990.7980.2%
学到的得分方框里均匀0.5040.5490.67220.0%
学到的得分真实分布0.7990.8070.8498.0%
  • 精确的得分:从方框均匀出发,左边比例约等于”落在左边吸引域的初始点比例”(约一半),1 万步之后几乎不变;从真实分布出发则保持 0.8。朗之万没有把分布弄错,它只是无法在有限时间内纠正错误的初始比例。
  • 学到的得分:低谷里的得分学得不准,反而有 20% 的链越过了低谷——但越过的方向由学错的得分决定:从完美的初始化出发,左边比例也从 0.80 漂到了 0.85。混合得快不等于混合到对的分布。

6.4 一个办法同时缓解三个陷阱:加高斯噪声

回头看三个陷阱:

  1. 流形假设:数据没有填满空间 → 加噪声以后,qσq_\sigma 铺满整个空间,得分处处有定义(§6.1 的去噪得分匹配);
  2. 低密度区域:那里没有训练样本 → 加大噪声以后,样本扩散到原来的低密度区域,那里有了训练信号;
  3. 混合太慢:模式之间有深谷 → 加大噪声以后,模式之间被填平、连成一片,链可以自由往来。

但 §3.6 已经看到:噪声大,学到的就是一个很模糊的分布。解决办法是用多个噪声尺度:先在大噪声下采样(模式连通、比例正确),再逐渐减小噪声(细节越来越准)。代码 04 第 3 部分最后预演了这个退火朗之万:10 个噪声尺度 σ\sigma 从 3 到 0.05,用精确的加噪得分,每个尺度 10 步时左边比例 0.757,100 步时 0.789(真实 0.8)——远好于普通朗之万的 0.51。这是第 14 讲的主题。


7. 2023 年之后 · Since 2023

  • 去噪得分匹配成了生成模型的标准目标。 扩散模型的”预测噪声”损失就是加权的去噪得分匹配(第 16 讲);本讲的 Tweedie 公式是其中”预测 x0x_0“与”预测得分”互相换算的桥梁。
  • 得分当作梯度信号。 DreamFusion(Poole et al., ICLR 2023)的 score distillation sampling 用一个预训练二维扩散模型的得分去优化三维场景的参数——不需要采样,只用得分指明”怎样让渲染出来的图更像真的”。
  • Tweedie 公式与逆问题。 Diffusion Posterior Sampling(Chung et al., ICLR 2023)等方法用 Tweedie 公式先估计 E[x0∣xt]\mathbb{E}[x_0 \mid x_t],再据此施加观测约束(去模糊、补全、超分辨率),把一个无条件的得分模型变成条件采样器。
  • 流形假设与泛化。 Kadkhodaie, Guth, Simoncelli & Mallat(ICLR 2024 杰出论文奖)发现训练数据足够多时,两个用不重叠数据训练的去噪网络会学到几乎相同的得分——它们在泛化而不是记忆;Stanczuk et al.(ICML 2024)展示了训练好的得分模型在小噪声下的得分”编码”了数据流形的内在维数:得分垂直于流形、沿着流形的分量很小。本讲 §6.1 的圆周实验是这个现象的最简单版本。
  • 得分还是能量? Salimans & Ho(2021)比较了直接输出得分和输出能量再求导两种参数化,样本质量相近;但在需要组合多个模型、用 MCMC 校正的场合(第 11 讲 §7 的 Reduce, Reuse, Recycle,Du et al. ICML 2023),能量参数化更方便。

8. 小结 · Summary

  1. 得分是一种表示:∇xlog⁡p\nabla_x\log p 决定了密度(只差常数 ZZ)。得分模型直接用网络输出向量场,不需要归一化、不需要可逆、不需要对抗训练。代价:得分对分开模式的权重几乎不敏感。
  2. 得分匹配最小化 Fisher 散度,分部积分后要算 tr(∇xsθ)\mathrm{tr}(\nabla_x s_\theta)——dd 次反向传播,不可扩展(d=512d = 512 时约是切片版本的 250 倍)。
  3. 去噪得分匹配:12E∥sθ(x+σz)+z/σ∥2\frac12\mathbb{E}\Vert s_\theta(x + \sigma z) + z/\sigma\Vert^2 = 对 qσq_\sigma 的 Fisher 散度 + 常数(代码里五个不同的 ss 差值相同到六位小数)。便宜,但学到的是 qσq_\sigma;σ\sigma 小则目标吵,σ\sigma 大则偏差大,精度对 σ\sigma 呈 U 形。
  4. Tweedie 公式:E[x∣x~]=x~+σ2∇log⁡qσ(x~)\mathbb{E}[x \mid \tilde x] = \tilde x + \sigma^2\nabla\log q_\sigma(\tilde x)——最优去噪器就是得分;去噪结果是平均答案,不是样本。
  5. 切片得分匹配:随机投影,E[v⊤Jv]=trJ\mathbb{E}[v^\top Jv] = \mathrm{tr}J,一次反向传播,无偏,估计的是干净数据的得分,但多了方向的噪声。
  6. 朗之万动力学把得分变成样本:步长受最窄方向限制(ϵ<2s2\epsilon < 2s^2),噪声项必不可少。
  7. 三个陷阱:流形上得分无定义(损失没有下界);低密度区域得分不准(分水岭画错);模式之间混合太慢(比例由初始点决定)。加高斯噪声同时缓解三者,多个噪声尺度兼顾精度——第 14 讲。

9. 常见误区 · Common pitfalls

  1. “得分模型就是能量模型换了个名字。” 能量模型输出标量 fθf_\theta,得分是它的梯度(一定是保守场);得分模型直接输出向量场,不保证对应任何密度。两者训练目标可以相同,但参数化、计算代价(得分模型不用对 xx 求导就得到得分)和能做的事情(能量模型可以比较两个点的相对概率)不同。
  2. “去噪得分匹配学到的是数据的得分。” 学到的是 qσq_\sigma 的得分(§3.2);用它采样得到的是加噪数据(§5.3)。只有 σ→0\sigma \to 0 才趋于数据的得分,而那时目标的方差趋于无穷(§3.5)。
  3. “去噪得分匹配的损失越低模型越好,可以跨 σ 比较。” 损失的最小值是 12(d/σ2−E∥∇log⁡qσ∥2)\frac12(d/\sigma^2 - \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2),随 σ\sigma 剧烈变化(σ=0.01\sigma = 0.01 时近一万)。只有减去这个常数之后才可比;同一个 σ\sigma 下损失的大部分也是不可消除的噪声。
  4. “Tweedie 去噪可以直接生成样本。” 它给的是后验均值:σ\sigma 大时落在模式之间,σ\sigma 小时比真实分布还集中(§3.4)。
  5. “切片得分匹配有偏,因为只看了一个方向。” 每个方向是迹的无偏估计(E[vv⊤]=I\mathbb{E}[vv^\top] = I);它只是方差更大。
  6. “朗之万步长越小越准。” 偏差变小,但混合变慢(ϵ=0.001\epsilon = 0.001 时 1,000 步还没走到);太大又会在最窄的方向上发散(ϵ=0.05\epsilon = 0.05)。
  7. “学到的得分在大部分地方方向都对,所以采样没问题。” 双月牙上学到的得分方向余弦平均在 0.9 以上,采样时两条弧线的比例却错了(56%、36%)。比例由低密度区域里的少数细节决定。
  8. “朗之万链混合得快就说明采样正确。” §6.3:学到的得分让 20% 的链越过低谷,但把比例推向了错误的 0.85。

10. 练习 · Exercises

练习 1(高斯与高斯混合的得分) (a) 求 N(μ,Σ)\mathcal{N}(\mu, \Sigma) 的得分。(b) 证明高斯混合的得分 ∇log⁡p(x)=∑krk(x)∇log⁡N(x;μk,Σk)\nabla\log p(x) = \sum_kr_k(x)\nabla\log\mathcal{N}(x; \mu_k, \Sigma_k),rk(x)=p(k∣x)r_k(x) = p(k \mid x)。(c) 各向同性 Σk=vkI\Sigma_k = v_kI 时化简,并和 score.py 的快速通道对照。

参考答案

(a) −Σ−1(x−μ)-\Sigma^{-1}(x - \mu):指向均值,离得越远越大。(b) ∇log⁡p=∑kπk∇Nk∑jπjNj=∑kπkNk∑jπjNj∇log⁡Nk=∑krk∇log⁡Nk\nabla\log p = \frac{\sum_k\pi_k\nabla\mathcal{N}_k}{\sum_j\pi_j\mathcal{N}_j} = \sum_k\frac{\pi_k\mathcal{N}_k}{\sum_j\pi_j\mathcal{N}_j}\nabla\log\mathcal{N}_k = \sum_kr_k\nabla\log\mathcal{N}_k。(c) ∑krk(x)μk−xvk\sum_kr_k(x)\frac{\mu_k - x}{v_k}:每个成分把 xx 拉向自己的中心,拉力按责任加权、除以方差。代码里 rv = r / v; rv @ means - x * rv.sum(1) 就是这个式子。(b) 也说明了 §1.3:在 r1≈1r_1 \approx 1 的地方,权重 π1\pi_1 只通过 rkr_k 进入,而 rkr_k 已经饱和。

练习 2(去噪目标的常数) 证明 §3.2 的常数等于 12(E∥∇x~log⁡qσ(x~∣x)∥2−E∥∇log⁡qσ(x~)∥2)\frac12\left(\mathbb{E}\Vert\nabla_{\tilde x}\log q_\sigma(\tilde x \mid x)\Vert^2 - \mathbb{E}\Vert\nabla\log q_\sigma(\tilde x)\Vert^2\right),高斯噪声下即 12(d/σ2−E∥∇log⁡qσ∥2)\frac12(d/\sigma^2 - \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2)。它为什么总是非负?什么时候等于零?

参考答案

去噪目标 =12E∥s∥2−E[s⊤g]+12E∥g∥2= \frac12\mathbb{E}\Vert s\Vert^2 - \mathbb{E}[s^\top g] + \frac12\mathbb{E}\Vert g\Vert^2(gg 是条件得分),Fisher =12E∥s∥2−E[s⊤∇log⁡qσ]+12E∥∇log⁡qσ∥2= \frac12\mathbb{E}\Vert s\Vert^2 - \mathbb{E}[s^\top\nabla\log q_\sigma] + \frac12\mathbb{E}\Vert\nabla\log q_\sigma\Vert^2,交叉项相等(§3.2),差就是 12(E∥g∥2−E∥∇log⁡qσ∥2)\frac12(\mathbb{E}\Vert g\Vert^2 - \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2)。由 Tweedie,∇log⁡qσ(x~)=E[g∣x~]\nabla\log q_\sigma(\tilde x) = \mathbb{E}[g \mid \tilde x],所以差 =12E∥g−E[g∣x~]∥2≥0= \frac12\mathbb{E}\Vert g - \mathbb{E}[g \mid \tilde x]\Vert^2 \geq 0——条件方差。等于零当且仅当 gg 由 x~\tilde x 唯一决定,即 xx 由 x~\tilde x 唯一决定:数据集只有一个点时(练习 5)。代码 01:σ=0.5\sigma = 0.5 时 0.806156。

练习 3(Tweedie 公式与二阶版本) (a) 按 §3.4 证明 Tweedie 公式。(b) 再求一次导数,证明 Cov[x∣x~]=σ2I+σ4∇2log⁡qσ(x~)\mathrm{Cov}[x \mid \tilde x] = \sigma^2 I + \sigma^4\nabla^2\log q_\sigma(\tilde x)。(c) 这对”去噪的不确定性”说了什么?

参考答案

(a) 见正文。(b) 对 σ2∇log⁡qσ=E[x∣x~]−x~\sigma^2\nabla\log q_\sigma = \mathbb{E}[x \mid \tilde x] - \tilde x 再对 x~\tilde x 求导:σ2∇2log⁡qσ=∇x~E[x∣x~]−I\sigma^2\nabla^2\log q_\sigma = \nabla_{\tilde x}\mathbb{E}[x \mid \tilde x] - I,而 ∇x~E[x∣x~]=1σ2Cov[x∣x~]\nabla_{\tilde x}\mathbb{E}[x \mid \tilde x] = \frac{1}{\sigma^2}\mathrm{Cov}[x \mid \tilde x](对后验 ∝p(x)e−∥x~−x∥2/2σ2\propto p(x)e^{-\Vert\tilde x - x\Vert^2/2\sigma^2} 求导,指数族的性质)。整理即得。(c) 得分的雅可比给出后验协方差:log⁡qσ\log q_\sigma 弯得越厉害(Hessian 越负),后验越确定。在两个模式之间,log⁡qσ\log q_\sigma 的 Hessian 接近 0 甚至为正,后验协方差大——去噪器”拿不准”该往哪边去,这正是后验均值落在中间的原因。

练习 4(切片估计的方差) 设 AA 是 d×dd \times d 矩阵,As=(A+A⊤)/2A_s = (A + A^\top)/2。(a) v∼N(0,I)v \sim \mathcal{N}(0, I) 时证明 Var(v⊤Av)=2∥As∥F2\mathrm{Var}(v^\top Av) = 2\Vert A_s\Vert_F^2。(b) vv 是 Rademacher 向量(每个分量 ±1 等概率)时证明 Var(v⊤Av)=2(∥As∥F2−∑iAii2)\mathrm{Var}(v^\top Av) = 2(\Vert A_s\Vert_F^2 - \sum_iA_{ii}^2)。(c) 哪种更好?

参考答案

(a) v⊤Av=v⊤Asvv^\top Av = v^\top A_sv;对角化 As=QΛQ⊤A_s = Q\Lambda Q^\top,u=Q⊤v∼N(0,I)u = Q^\top v \sim \mathcal{N}(0, I),v⊤Asv=∑iλiui2v^\top A_sv = \sum_i\lambda_iu_i^2,方差 ∑iλi2Var(ui2)=2∑λi2=2∥As∥F2\sum_i\lambda_i^2\mathrm{Var}(u_i^2) = 2\sum\lambda_i^2 = 2\Vert A_s\Vert_F^2。(b) v⊤Asv=∑iAii+∑i≠j(As)ijvivjv^\top A_sv = \sum_iA_{ii} + \sum_{i \neq j}(A_s)_{ij}v_iv_j,第一项是常数(vi2=1v_i^2 = 1),第二项的方差 =2∑i≠j(As)ij2= 2\sum_{i\neq j}(A_s)_{ij}^2。(c) Rademacher 总是不更差:对角元的贡献被精确消掉。这就是 Hutchinson 迹估计常用 Rademacher 的原因(第 14 讲的概率流 ODE 似然也会用到)。

练习 5(只有一个数据点) 数据集只有一个点 x0x_0。(a) qσq_\sigma 是什么?最优的 sθs_\theta 是什么?去噪目标的最小值是多少?(b) 用这个最优得分跑朗之万会得到什么?(c) 这对”去噪模型会不会背诵训练集”有什么启示?

参考答案

(a) qσ=N(x0,σ2I)q_\sigma = \mathcal{N}(x_0, \sigma^2I),最优得分 −(x~−x0)/σ2-(\tilde x - x_0)/\sigma^2,恰好等于条件得分 −z/σ-z/\sigma,目标最小值为 0(练习 2:条件方差为零)。(b) 朗之万采出 N(x0,σ2I)\mathcal{N}(x_0, \sigma^2I)——训练点加噪声。(c) 一般地,如果训练集是 NN 个点的经验分布,去噪得分匹配的全局最优解是经验分布加噪以后的得分,用它采样(σ→0\sigma \to 0)就会复现训练点:完美优化 = 背诵。实际的网络因为容量和归纳偏置达不到这个最优解,才会泛化(§7 的 Kadkhodaie et al.)。第 15 讲会讨论怎样检测背诵。

练习 6(得分的小偏差会把质量推到哪里) 设真实分布 p=N(0,1)p = \mathcal{N}(0, 1),学到的得分有一个常数偏差:sθ(x)=−x+cs_\theta(x) = -x + c。(a) 朗之万(ϵ→0\epsilon \to 0)的平稳分布是什么?(b) 如果偏差只出现在低密度区域:sθ(x)=−x+c⋅1[x>3]s_\theta(x) = -x + c\cdot\mathbb{1}[x > 3],平稳分布在 x>3x > 3 上的质量大约变成原来的多少倍?(c) 联系 §6.3 学到的得分让比例漂到 0.85。

参考答案

(a) sθ=∇(−x22+cx)s_\theta = \nabla(-\frac{x^2}{2} + cx),平稳分布 ∝e−x2/2+cx\propto e^{-x^2/2 + cx},即 N(c,1)\mathcal{N}(c, 1)。(b) 一维里任何得分都是某个函数的导数:log⁡p~(x)=−x22+c(x−3)+\log\tilde p(x) = -\frac{x^2}{2} + c(x - 3)_+。x>3x > 3 部分的质量 ∫3∞e−x2/2+c(x−3)dx\int_3^\infty e^{-x^2/2 + c(x - 3)}dx,对 c=1c = 1 大约是原来的 11−c/3\frac{1}{1 - c/3} 量级(尾部近似 e−3(x−3)e^{-3(x-3)},变成 e−2(x−3)e^{-2(x-3)}),即 1.5 倍——而且这部分质量在别的地方不会被”补偿”,只会在归一化时让所有其他地方等比例缩小。(c) 学到的得分在低谷里的偏差决定了”从一边流向另一边”的净流量;只要偏差偏向一边,长时间运行后比例就会向那一边漂。混合越快,漂得越快。

练习 7(跨越低谷要多久) 朗之万在势能 U=−log⁡pU = -\log p 上运动时,跨越高度为 ΔU\Delta U 的势垒的平均时间约为 ∝eΔU\propto e^{\Delta U}(Kramers 公式)。代码 04 的 ΔU=12.3\Delta U = 12.3。(a) 粗略估计”连续时间”里跨越一次需要多久(假设前置因子为 1)。(b) ϵ=0.01\epsilon = 0.01 时 1 万步对应多少连续时间?预测换过边的链的比例,并与代码的 1.2% 比较。

参考答案

(a) e12.3≈2.2×105e^{12.3} \approx 2.2\times10^5。(b) 1 万步 × 0.01 = 100 个时间单位,预测跨越一次的概率约 100/2.2×105≈0.05%100/2.2\times10^5 \approx 0.05\%。代码里精确得分从真实分布出发换过边的链是 0.2%,量级相近(前置因子、有限步长的偏差都会让实际数字大几倍);从方框均匀出发的 1.2% 主要来自一开始就在低谷附近、还没决定往哪边走的链。结论:要让比例在朗之万里”自己修正”,需要 10510^5 量级的时间——比实际能跑的长几千倍。

练习 8(圆环上的最优值) 数据是半径 RR 的圆周加 N(0,τ2I)\mathcal{N}(0, \tau^2I) 噪声,τ≪R\tau \ll R。(a) 粗略说明得分匹配的最优值 ≈−12τ2\approx -\frac{1}{2\tau^2}。(b) 对严格在圆周上的数据(τ=0\tau = 0),去噪得分匹配(噪声 σ≪R\sigma \ll R)的最优值是多少?与代码的 51.0 比较。(c) 为什么说 (b) 里的”噪声”既是问题的解决办法,也是新问题的来源?

参考答案

(a) 在每个点附近,密度沿半径方向近似 N(R,τ2)\mathcal{N}(R, \tau^2),沿切向近似均匀;得分 ≈−r−Rτ2r^\approx -\frac{r - R}{\tau^2}\hat r,E∥∇log⁡p∥2≈E[(r−R)2]/τ4=1/τ2\mathbb{E}\Vert\nabla\log p\Vert^2 \approx \mathbb{E}[(r-R)^2]/\tau^4 = 1/\tau^2,最优值 =−12E∥∇log⁡p∥2≈−12τ2= -\frac12\mathbb{E}\Vert\nabla\log p\Vert^2 \approx -\frac{1}{2\tau^2}。(b) qσq_\sigma 是厚度 σ\sigma 的圆环,E∥∇log⁡qσ∥2≈1/σ2\mathbb{E}\Vert\nabla\log q_\sigma\Vert^2 \approx 1/\sigma^2;最小值 =12(2/σ2−1/σ2)=12σ2=50= \frac12(2/\sigma^2 - 1/\sigma^2) = \frac{1}{2\sigma^2} = 50,代码 51.0(网络没有完全达到最优、以及曲率带来的小修正)。(c) 噪声让得分处处有定义(解决陷阱一),但学到的是一个厚度 σ\sigma 的圆环,不是圆周本身(§3.3 的缺点)。第 14 讲:先大噪声、再小噪声。

练习 9(不保守的向量场) 考虑向量场 s(x)=−x+αJxs(x) = -x + \alpha Jx,x∈R2x \in \mathbb{R}^2,J=(0−110)J = \begin{pmatrix}0 & -1\\1 & 0\end{pmatrix}(旋转 90°)。(a) 它是某个函数的梯度吗?(b) 用它跑朗之万(ϵ→0\epsilon \to 0),平稳分布是什么?(提示:检查 N(0,I)\mathcal{N}(0, I) 是否满足 Fokker–Planck 方程的平稳条件 ∇⋅(p s)=Δp\nabla\cdot(p\,s) = \Delta p。)(c) 这对”得分网络不一定保守”意味着什么?

参考答案

(a) 不是:雅可比 −I+αJ-I + \alpha J 不对称(梯度场的雅可比是 Hessian,必须对称)。(b) 令 p=N(0,I)p = \mathcal{N}(0, I),∇⋅(p(−x))=Δp\nabla\cdot(p(-x)) = \Delta p 正是标准正态的平稳条件;多出来的一项 ∇⋅(p αJx)=α(∇p⋅Jx+p ∇⋅(Jx))=α(−p x⊤Jx+0)=0\nabla\cdot(p\,\alpha Jx) = \alpha(\nabla p\cdot Jx + p\,\nabla\cdot(Jx)) = \alpha(-p\,x^\top Jx + 0) = 0(x⊤Jx=0x^\top Jx = 0,JJ 的散度为零)。所以平稳分布仍是 N(0,I)\mathcal{N}(0, I)——旋转部分只让链”绕圈”,不改变分布,甚至可能加快混合。(c) 不保守的部分不一定有害:只要它与 pp 的等高线”相切”(∇⋅(p 旋转项)=0\nabla\cdot(p\,\text{旋转项}) = 0),平稳分布不变。但一般的不保守误差会改变平稳分布,而且不对应任何密度。代码 02 测得学到的网络的反对称部分只占 5%–8%。

练习 10(动手:Rademacher 方向) 在 score.py 的 ssm_loss 里加一个选项,让 vv 取 Rademacher 向量(torch.randint(0, 2, …) * 2 - 1)。在代码 02 第 1 部分的无偏性检验里比较单次估计的标准差,并用练习 4 解释差别。预测:d=32d = 32 时,差别大还是小?

参考答案(预测的思路)

Rademacher 消掉了对角元 Aii2A_{ii}^2 的贡献。随机初始化的 MLP 的雅可比矩阵,对角元在 ∥As∥F2\Vert A_s\Vert_F^2 里占 dd 项、非对角元占 d(d−1)d(d-1) 项,d=32d = 32 时对角元只占约 3%(如果大小差不多),所以方差只会小一点点。若网络的雅可比接近对角(例如逐维独立的得分),Rademacher 的优势会大得多。具体数字以你的运行为准。


11. 延伸阅读 · Further reading

原课材料

得分匹配的三种形式

  • Hyvärinen, Estimation of Non-Normalized Statistical Models by Score Matching, JMLR 2005
  • Vincent, A Connection Between Score Matching and Denoising Autoencoders, Neural Computation 2011
  • Song, Garg, Shi & Ermon, Sliced Score Matching: A Scalable Approach to Density and Score Estimation, UAI 2019
  • Efron, Tweedie’s Formula and Selection Bias, JASA 2011(Tweedie 公式的历史与统计含义;最早见于 Robbins 1956)

得分模型与朗之万

  • Song & Ermon, Generative Modeling by Estimating Gradients of the Data Distribution, NeurIPS 2019(三个陷阱、NCSN、退火朗之万)
  • Roberts & Tweedie, Exponential Convergence of Langevin Distributions and Their Discrete Approximations, Bernoulli 1996
  • Salimans & Ho, Should EBMs Model the Energy or the Score?, ICLR 2021 EBM Workshop

2023 年之后

  • Poole, Jain, Barron & Mildenhall, DreamFusion: Text-to-3D using 2D Diffusion, ICLR 2023
  • Chung, Kim, Mccann, Klasky & Ye, Diffusion Posterior Sampling for General Noisy Inverse Problems, ICLR 2023
  • Kadkhodaie, Guth, Simoncelli & Mallat, Generalization in Diffusion Models Arises from Geometry-Adaptive Harmonic Representations, ICLR 2024
  • Stanczuk, Batzolis, Deveney & Schönlieb, Diffusion Models Encode the Intrinsic Dimension of Data Manifolds, ICML 2024

12. 下一讲预告 · Next lecture

本讲最后一个实验已经给出了答案的轮廓:加噪声能修好三个陷阱,但噪声大就不准;那就用一串从大到小的噪声。 第 14 讲(原课 Lecture 14,Score Based Models 续)把它做成一个完整的生成模型:

  • 噪声条件得分网络(NCSN):一个网络 sθ(x,σ)s_\theta(x, \sigma) 同时学所有噪声尺度的得分;训练目标是各尺度去噪得分匹配的加权和,权重 λ(σ)=σ2\lambda(\sigma) = \sigma^2;噪声尺度怎样选;
  • 退火朗之万动力学:从最大的噪声开始,逐级减小;为什么步长要 ∝σ2\propto\sigma^2;
  • 无穷多个噪声尺度:用随机微分方程(SDE)连续地给数据加噪声,反向 SDE 从噪声生成数据;预测–校正采样;
  • 概率流 ODE:同样的边缘分布、确定性的轨迹——精确的似然、更快的采样;
  • 可控生成:条件得分 = 无条件得分 + 分类器的梯度。
← 返回课程目录