对应 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
学完这一讲,你应该能够:
说清楚得分函数 ∇ x log p ( x ) \nabla_x\log p(x) ∇ x log p ( x ) 为什么可以当作分布的一种表示:它丢掉的只有归一化常数;说出得分模型 s θ : R d → R d s_\theta: \mathbb{R}^d \to \mathbb{R}^d s θ : R d → R d 和能量模型的区别。
写出用 Fisher 散度估计得分的目标,解释为什么显式得分匹配里的 t r ( ∇ x s θ ) \mathrm{tr}(\nabla_x s_\theta) tr ( ∇ x s θ ) 不可扩展。
推导去噪得分匹配 :匹配条件得分 − x ~ − x σ 2 -\frac{\tilde x - x}{\sigma^2} − σ 2 x ~ − x 与匹配加噪分布 q σ q_\sigma q σ 的得分只差一个常数;说出它的优点(便宜)和代价(只能学到 q σ q_\sigma q σ 的得分、σ \sigma σ 小时目标很吵)。
推导 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) E [ x ∣ x ~ ] = x ~ + σ 2 ∇ log q σ ( x ~ ) ,理解”最优去噪器 = 得分”。
推导切片得分匹配 ,说明它为什么无偏、为什么只要一次反向传播。
用朗之万动力学 从得分采样,说明步长、步数、噪声项各起什么作用。
复述并亲手复现三个陷阱 :流形假设、低密度区域估计不准、模式之间混合太慢;理解”加高斯噪声”为什么能同时缓解它们。
0.2 先修与本讲范围 Prerequisites & scope
默认你已经会 Assumed 本讲只给直觉,后面几讲再展开 Previewed only 第 12 讲:得分函数、Fisher 散度、得分匹配的分部积分、朗之万 MCMC 多个噪声尺度、退火朗之万、NCSN(第 14 讲) 第 11 讲:能量模型、配分函数 用随机微分方程加噪声、概率流 ODE(第 14、16 讲) 第 5 讲:高斯混合、后验 p ( z ∣ x ) p(z \mid x) p ( z ∣ 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 ) = ∇ x log p ( x ) s(x) = \nabla_x\log p(x) s ( x ) = ∇ x log p ( x ) (Stein)得分函数:一个向量场 s θ ( x ) s_\theta(x) s θ ( x ) 得分模型(得分网络),R d → R d \mathbb{R}^d \to \mathbb{R}^d R d → R d D F ( p , q ) = 1 2 E p ∥ ∇ log p − ∇ log q ∥ 2 D_F(p, q) = \frac12\mathbb{E}_p\Vert\nabla\log p - \nabla\log q\Vert^2 D F ( p , q ) = 2 1 E p ∥∇ log p − ∇ log q ∥ 2 Fisher 散度 q σ ( x ~ ∣ x ) = N ( x ~ ; x , σ 2 I ) q_\sigma(\tilde x \mid x) = \mathcal{N}(\tilde x; x, \sigma^2 I) q σ ( x ~ ∣ x ) = N ( x ~ ; x , σ 2 I ) 加噪的条件分布;x ~ = x + σ z \tilde x = x + \sigma z x ~ = x + σ z ,z ∼ N ( 0 , I ) z \sim \mathcal{N}(0, I) z ∼ N ( 0 , I ) q σ ( x ~ ) = ∫ p data ( x ) q σ ( x ~ ∣ x ) d x q_\sigma(\tilde x) = \int p_{\text{data}}(x)q_\sigma(\tilde x \mid x)\,dx q σ ( x ~ ) = ∫ p data ( x ) q σ ( x ~ ∣ x ) d x 加噪以后的(边缘)分布 v v v 切片得分匹配的随机投影方向 ϵ \epsilon ϵ 朗之万的步长。本讲义写成 x ← x + ϵ ∇ log p + 2 ϵ ξ x \leftarrow x + \epsilon\nabla\log p + \sqrt{2\epsilon}\,\xi x ← x + ϵ ∇ log p + 2 ϵ ξ (和第 11、12 讲一致);slides 写成 x ← x + ϵ 2 ∇ log p + ϵ ξ x \leftarrow x + \frac{\epsilon}{2}\nabla\log p + \sqrt{\epsilon}\,\xi x ← x + 2 ϵ ∇ log p + ϵ ξ ,只差一个 2 的因子
0.5 关于数字 · About the numbers
所有真实分布都是二维高斯混合(第 5 讲 toy2d.py):两个分开的高斯(权重 0.8 / 0.2、中心 ( ∓ 2 , 0 ) (\mp2, 0) ( ∓ 2 , 0 ) 、标准差 0.4,和第 12 讲相同)和双月牙(200 个小高斯沿两条弧线排开,标准差 0.15)。高斯混合加上高斯噪声还是高斯混合,所以 ∇ log q σ \nabla\log q_\sigma ∇ log q σ 对任何 σ \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 p θ 归一化,要么限制网络结构(自回归的顺序、流的可逆性),要么用替代目标(ELBO),要么面对算不出来的 Z ( θ ) Z(\theta) Z ( θ ) 。
用采样过程表示 (隐式模型):GAN(第 9–10 讲)。好处:网络结构完全自由。代价:对抗训练不稳定、模式坍塌,也没有似然可以评估。
能量模型已经很接近”自由”了:p θ ( x ) = e f θ ( x ) / Z ( θ ) p_\theta(x) = e^{f_\theta(x)}/Z(\theta) p θ ( x ) = e f θ ( x ) / Z ( θ ) ,f θ f_\theta f θ 可以是任何网络。它唯一的麻烦是 Z ( θ ) Z(\theta) Z ( θ ) 。第 12 讲发现:得分
∇ x log p θ ( x ) = ∇ x f θ ( x ) − ∇ x log Z ( θ ) ⏟ = 0 \nabla_x\log p_\theta(x) = \nabla_x f_\theta(x) - \underbrace{\nabla_x\log Z(\theta)}_{=0} ∇ x log p θ ( x ) = ∇ x f θ ( x ) − = 0 ∇ x log Z ( θ )
和 Z Z Z 无关。本讲把这个想法推到底:干脆不要密度,直接表示得分。
1.2 得分函数是一种表示
直觉。 把 log p ( x ) \log p(x) log p ( x ) 想象成一片地形(山峰是高概率区域),得分就是每一点上”最陡的上坡方向”,长度是坡度。给你整张”坡度图”,你能把地形恢复出来——只差一个整体的高度(常数),而这个常数恰好由”概率积分为 1”唯一确定。
数值验证(代码 01 第 1 部分)。 两个高斯(0.8 / 0.2)的得分画成箭头图:箭头汇聚到两个模式的中心,中间有一条”分水岭”。沿一条直线对得分做线积分
∫ a b s ( x ) ⋅ d x = log p ( b ) − log p ( a ) , \int_a^b s(x)\cdot dx = \log p(b) - \log p(a), ∫ a b s ( x ) ⋅ d x = log p ( b ) − log p ( a ) ,
2001 个点的梯形公式和精确值的差在 10 − 5 10^{-5} 1 0 − 5 以下(三条路径:4.4 × 10 − 16 4.4\times10^{-16} 4.4 × 1 0 − 16 、8.3 × 10 − 6 8.3\times10^{-6} 8.3 × 1 0 − 6 、2.4 × 10 − 15 2.4\times10^{-15} 2.4 × 1 0 − 15 )。得分完整地决定了密度。
得分模型。 用一个神经网络 s θ : R d → R d s_\theta: \mathbb{R}^d \to \mathbb{R}^d s θ : R d → R d 直接输出一个向量场,不要求它是任何标量函数的梯度 。能量模型输出一个数再对 x x x 求导;得分模型直接输出 d d d 个数——网络更自由,前向一次就得到得分,不用再反向传播。代价是:一个任意的向量场不一定是梯度场(不一定”保守”),也就不一定对应任何密度。代码 02 测了学到的网络离梯度场有多远:雅可比矩阵 ∇ x s θ \nabla_x s_\theta ∇ x s θ 的反对称部分只占 5%–8%——没人强迫它,但数据把它推向了梯度场。
1.3 得分对模式权重很迟钝
同样的两个成分,把权重从 0.5 / 0.5 换成 0.8 / 0.2(代码 01 第 1 部分):
位置 p ( x ) p(x) p ( x ) (0.8 / 0.2)s 1 s_1 s 1 (0.8 / 0.2)s 1 s_1 s 1 (0.5 / 0.5)差 ( − 2 , 0 ) (-2, 0) ( − 2 , 0 ) 左模式中心0.796 0.0000 0.0000 3.6 × 10 − 21 3.6\times10^{-21} 3.6 × 1 0 − 21 ( − 1 , 0 ) (-1, 0) ( − 1 , 0 ) 0.035 −6.2500 −6.2500 2.6 × 10 − 10 2.6\times10^{-10} 2.6 × 1 0 − 10 ( 0 , 0 ) (0, 0) ( 0 , 0 ) 低谷3.7 × 10 − 6 3.7\times10^{-6} 3.7 × 1 0 − 6 −7.5000 0.0000 7.5 ( + 1 , 0 ) (+1, 0) ( + 1 , 0 ) 0.0087 +6.2500 +6.2500 1.0 × 10 − 9 1.0\times10^{-9} 1.0 × 1 0 − 9
为什么。 混合分布的得分是各成分得分按后验责任加权:∇ log p ( x ) = ∑ k r k ( x ) ∇ log p k ( x ) \nabla\log p(x) = \sum_k r_k(x)\nabla\log p_k(x) ∇ log p ( x ) = ∑ k r k ( x ) ∇ log p k ( x ) ,r k ( x ) = p ( k ∣ x ) r_k(x) = p(k \mid x) r k ( x ) = p ( k ∣ x ) 。在左模式附近 r 1 ≈ 1 r_1 \approx 1 r 1 ≈ 1 ,得分就是左成分自己的得分,和权重 π 1 \pi_1 π 1 无关 ;只有在两个成分的责任都不可忽略的地方(低谷)权重才起作用。而低谷的密度只有 3.7 × 10 − 6 3.7\times10^{-6} 3.7 × 1 0 − 6 ——从数据学得分时,那里几乎没有样本。这是第 12 讲”Fisher 散度看不见权重”的另一种说法,也是 §6.3 第三个陷阱的根源。
2. 得分估计:得分匹配 · Score estimation by score matching
2.1 目标
给定 i.i.d. 样本 { x 1 , … , x N } ∼ p data \{x_1, \dots, x_N\} \sim p_{\text{data}} { x 1 , … , x N } ∼ p data ,想要 s θ ( x ) ≈ ∇ x log p data ( x ) s_\theta(x) \approx \nabla_x\log p_{\text{data}}(x) s θ ( x ) ≈ ∇ x log p data ( x ) 。最自然的目标是平均的欧氏距离——Fisher 散度 :
1 2 E p data [ ∥ ∇ x log p data ( x ) − s θ ( x ) ∥ 2 2 ] . \frac12\mathbb{E}_{p_{\text{data}}}\left[\Vert\nabla_x\log p_{\text{data}}(x) - s_\theta(x)\Vert_2^2\right]. 2 1 E p data [ ∥ ∇ x log p data ( x ) − s θ ( x ) ∥ 2 2 ] .
问题是 ∇ x log p data \nabla_x\log p_{\text{data}} ∇ x log p data 未知。第 12 讲用分部积分把它消掉(Hyvärinen 2005):
E p data [ 1 2 ∥ s θ ( x ) ∥ 2 2 + t r ( ∇ x s θ ( x ) ) ] + 常数 . \mathbb{E}_{p_{\text{data}}}\left[\frac12\Vert s_\theta(x)\Vert_2^2 + \mathrm{tr}(\nabla_x s_\theta(x))\right] + \text{常数}. E p data [ 2 1 ∥ s θ ( x ) ∥ 2 2 + tr ( ∇ x s θ ( x )) ] + 常数 .
能量模型里 s θ = ∇ x f θ s_\theta = \nabla_x f_\theta s θ = ∇ x f θ ,迹是 Hessian 的迹;得分模型里它是雅可比矩阵 ∇ x s θ \nabla_x s_\theta ∇ x s θ 的迹。推导完全一样,只要求 s θ s_\theta s θ 可导、p data p_{\text{data}} p data 在无穷远处衰减。
2.2 得分匹配不可扩展
t r ( ∇ x s θ ( x ) ) = ∑ k = 1 d ∂ s θ , k ∂ x k \mathrm{tr}(\nabla_x s_\theta(x)) = \sum_{k=1}^d \frac{\partial s_{\theta,k}}{\partial x_k} tr ( ∇ x s θ ( x )) = ∑ k = 1 d ∂ x k ∂ s θ , k 。自动求导一次反向传播只能得到”一个标量对所有输入的梯度”,所以第 k k k 个对角元需要对 s θ , k s_{\theta,k} s θ , k 单独反向传播一次——O ( d ) O(d) O ( d ) 次反向传播 。
代码 02 第 1 部分(MLP d → 256 → 256 → d d \to 256 \to 256 \to d d → 256 → 256 → d ,批量 128):
d d d 显式得分匹配 切片得分匹配 去噪得分匹配 显式 / 切片 2 1.8 ms 1.2 ms 0.5 ms 2× 32 21.3 ms 1.2 ms 0.6 ms 17× 128 99.1 ms 1.5 ms 0.8 ms 67× 512 630 ms 2.6 ms 1.5 ms 239×
(一次运行的计时,每次运行会差 10% 左右;d = 512 d = 512 d = 512 时的比值在 240–260 倍之间。)显式得分匹配随 d d d 线性变慢;一张 256 × 256 256 \times 256 256 × 256 的彩色图有约 20 万维。slides 给出两条出路:去噪得分匹配 和切片得分匹配 。
3. 去噪得分匹配 · Denoising score matching
3.1 想法:去匹配一个加了噪声的分布
动机。 难点在于 ∇ log p data \nabla\log p_{\text{data}} ∇ log p data 未知、只能分部积分。换个目标:先给数据加一点噪声,x ~ = x + σ z \tilde x = x + \sigma z x ~ = x + σ z ,得到一个更平滑的分布 q σ ( x ~ ) = ∫ p data ( x ) q σ ( x ~ ∣ x ) d x q_\sigma(\tilde x) = \int p_{\text{data}}(x)q_\sigma(\tilde x \mid x)dx q σ ( x ~ ) = ∫ p data ( x ) q σ ( x ~ ∣ x ) d x ,然后去估计 q σ q_\sigma q σ 的得分。σ \sigma σ 很小时 q σ ≈ p data q_\sigma \approx p_{\text{data}} q σ ≈ p data 。好处在于:条件分布 q σ ( x ~ ∣ x ) = N ( x ~ ; x , σ 2 I ) q_\sigma(\tilde x \mid x) = \mathcal{N}(\tilde x; x, \sigma^2 I) q σ ( x ~ ∣ x ) = N ( x ~ ; x , σ 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}. ∇ x ~ log q σ ( x ~ ∣ x ) = − σ 2 x ~ − x = − σ z .
3.2 推导(slides 逐步写出)
1 2 E x ~ ∼ q σ [ ∥ ∇ log q σ ( x ~ ) − s θ ( x ~ ) ∥ 2 ] = 1 2 E q σ ∥ s θ ∥ 2 − E q σ [ ∇ 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} 2 1 E x ~ ∼ q σ [ ∥∇ log q σ ( x ~ ) − s θ ( x ~ ) ∥ 2 ] = 2 1 E q σ ∥ s θ ∥ 2 − E q σ [ ∇ log q σ ( x ~ ) ⊤ s θ ( x ~ ) ] + 常数 .
关键是交叉项:
E q σ [ ∇ log q σ ( x ~ ) ⊤ s θ ( x ~ ) ] = ∫ q σ ( x ~ ) ∇ q σ ( x ~ ) q σ ( x ~ ) ⊤ s θ ( x ~ ) d x ~ = ∫ ∇ x ~ ( ∫ p data ( x ) q σ ( x ~ ∣ x ) d x ) ⊤ s θ ( x ~ ) d x ~ = ∬ p data ( x ) q σ ( x ~ ∣ x ) ∇ x ~ log q σ ( x ~ ∣ x ) ⊤ s θ ( x ~ ) d x d x ~ = E x , 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} E q σ [ ∇ log q σ ( x ~ ) ⊤ s θ ( x ~ ) ] = ∫ q σ ( x ~ ) q σ ( x ~ ) ∇ q σ ( x ~ ) ⊤ s θ ( x ~ ) d x ~ = ∫ ∇ x ~ ( ∫ p data ( x ) q σ ( x ~ ∣ x ) d x ) ⊤ s θ ( x ~ ) d x ~ = ∬ p data ( x ) q σ ( x ~ ∣ x ) ∇ x ~ log q σ ( x ~ ∣ x ) ⊤ s θ ( x ~ ) d x d x ~ = E x , x ~ [ ∇ x ~ log q σ ( x ~ ∣ x ) ⊤ s θ ( x ~ ) ] .
(第二步把 q σ q_\sigma q σ 写成积分、梯度移进积分号,第三步用 ∇ q = q ∇ log q \nabla q = q\nabla\log q ∇ q = q ∇ log q 。)代回去,再把与 θ \theta θ 无关的项补成平方:
1 2 E q σ ∥ ∇ log q σ − s θ ∥ 2 = 1 2 E x ∼ p data E x ~ ∼ 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{常数}} 2 1 E q σ ∥∇ log q σ − s θ ∥ 2 = 2 1 E x ∼ p data E x ~ ∼ q σ ( ⋅ ∣ x ) ∥ s θ ( x ~ ) − ∇ x ~ log q σ ( x ~ ∣ x ) ∥ 2 + 常数
右边每一项都能算。对高斯噪声,目标就是 1 2 E ∥ s θ ( x + σ z ) + z / σ ∥ 2 \frac12\mathbb{E}\Vert s_\theta(x + \sigma z) + z/\sigma\Vert^2 2 1 E ∥ s θ ( x + σ z ) + z / σ ∥ 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 ∬ p ( x ) N ( x ~ ; x , σ 2 ) ( ⋯ ) 2 ),换五个毫不相干的 s s s :
候选的 s s s 去噪目标(σ = 0.5 \sigma = 0.5 σ = 0.5 ) 对 q σ q_\sigma q σ 的 Fisher 散度 差值 s = 0 s = 0 s = 0 2.000000 1.193844 0.806156 s = − x s = -x s = − x 3.205000 2.398844 0.806156 s = 3 sin x s = 3\sin x s = 3 sin x 3.880703 3.074548 0.806156 干净数据的得分 ∇ log p data \nabla\log p_{\text{data}} ∇ log p data 3.790562 2.984407 0.806156 加噪分布的得分 ∇ log q σ \nabla\log q_\sigma ∇ log q σ 0.806156 0.000000 0.806156
差值五行完全相同,等于理论常数 1 2 ( d / σ 2 − E ∥ ∇ log q σ ∥ 2 ) = 0.806156 \frac12(d/\sigma^2 - \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2) = 0.806156 2 1 ( d / σ 2 − E ∥∇ log q σ ∥ 2 ) = 0.806156 (练习 2)。σ = 0.1 \sigma = 0.1 σ = 0.1 时常数是 47.058929,同样五行一致;此时干净数据的得分对 q σ q_\sigma q σ 的 Fisher 散度只有 0.0115——σ \sigma σ 小,q σ q_\sigma q σ 和 p data p_{\text{data}} p data 的得分就接近。
3.3 算法与优缺点
slides 的算法:
取一批数据 { x 1 , … , x n } ∼ p data \{x_1, \dots, x_n\} \sim p_{\text{data}} { x 1 , … , x n } ∼ p data ;
加噪 x ~ i ∼ q σ ( x ~ ∣ x i ) \tilde x_i \sim q_\sigma(\tilde x \mid x_i) x ~ i ∼ q σ ( x ~ ∣ x i ) ,即 x ~ i = x i + σ z i \tilde x_i = x_i + \sigma z_i x ~ i = x i + σ z i ;
估计去噪得分匹配损失的梯度:1 2 n ∑ i ∥ s θ ( x ~ i ) + x ~ i − x i σ 2 ∥ 2 \frac{1}{2n}\sum_i\Vert s_\theta(\tilde x_i) + \frac{\tilde x_i - x_i}{\sigma^2}\Vert^2 2 n 1 ∑ i ∥ s θ ( x ~ i ) + σ 2 x ~ i − x i ∥ 2 ;
随机梯度下降。
优点 :高维也很便宜(代码 02:d = 512 d = 512 d = 512 时每步 1.5 ms);还附赠一个最优去噪器(§3.4)。缺点 :学到的是 q σ q_\sigma q σ 的得分,不是干净数据的得分 ;想让 q σ ≈ p data q_\sigma \approx p_{\text{data}} q σ ≈ p data 就得让 σ \sigma σ 很小,而 σ \sigma σ 小时目标的方差爆炸(§3.5)。
名字的由来。 s θ ( x ~ ) ≈ − x ~ − x σ 2 s_\theta(\tilde x) \approx -\frac{\tilde x - x}{\sigma^2} s θ ( x ~ ) ≈ − σ 2 x ~ − x 等价于 x ~ + σ 2 s θ ( x ~ ) ≈ x \tilde x + \sigma^2 s_\theta(\tilde x) \approx x x ~ + σ 2 s θ ( x ~ ) ≈ x :网络在学”从带噪的 x ~ \tilde x x ~ 猜出干净的 x x x “——一个去噪器 。Vincent(2011)正是从”去噪自编码器”出发发现了这个联系。
3.4 Tweedie 公式:最优去噪器就是得分
E x ∼ 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). E x ∼ p ( x ∣ x ~ ) [ x ] = x ~ + σ 2 ∇ x ~ log q σ ( x ~ ) .
证明 (一行):∇ x ~ q σ ( x ~ ) = ∫ p ( x ) ∇ x ~ N ( x ~ ; x , σ 2 I ) d x = ∫ p ( x ) N ( x ~ ; x , σ 2 I ) x − x ~ σ 2 d x \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 ∇ x ~ q σ ( x ~ ) = ∫ p ( x ) ∇ x ~ N ( x ~ ; x , σ 2 I ) d x = ∫ p ( x ) N ( x ~ ; x , σ 2 I ) σ 2 x − x ~ d x ,两边除以 q σ ( x ~ ) q_\sigma(\tilde x) q σ ( 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} ∇ log q σ ( x ~ ) = σ 2 E [ x ∣ x ~ ] − x ~ 。
含义。 在均方误差意义下,最好的去噪器是后验均值 E [ x ∣ x ~ ] \mathbb{E}[x \mid \tilde x] E [ x ∣ x ~ ] ;Tweedie 公式说它可以由加噪分布的得分算出来。反过来,训练一个去噪器就是在学得分 ——第 16 讲的扩散模型”预测噪声”正是这件事。
数值验证(代码 01 第 3 部分,双月牙)。 高斯混合的后验均值可以不用得分、直接按贝叶斯公式算(每个成分的高斯后验均值按责任加权)。两种算法一致到 10 − 14 10^{-14} 1 0 − 14 :
σ \sigma σ Tweedie − 贝叶斯(最大差) E ∥ x ~ − x ∥ 2 \mathbb{E}\Vert\tilde x - x\Vert^2 E ∥ x ~ − x ∥ 2 E ∥ E [ x ∣ x ~ ] − x ∥ 2 \mathbb{E}\Vert\mathbb{E}[x \mid \tilde x] - x\Vert^2 E ∥ E [ x ∣ x ~ ] − x ∥ 2 log p data \log p_{\text{data}} log p data :原样本 / 去噪结果0.1 2.7 × 10 − 15 2.7\times10^{-15} 2.7 × 1 0 − 15 0.0201 0.0170 −1.82 / −1.66 0.3 1.8 × 10 − 15 1.8\times10^{-15} 1.8 × 1 0 − 15 0.1803 0.1218 −1.82 / −1.66 1.0 4.0 × 10 − 15 4.0\times10^{-15} 4.0 × 1 0 − 15 2.0210 0.9069 −1.81 / −3.85 3.0 1.6 × 10 − 14 1.6\times10^{-14} 1.6 × 1 0 − 14 17.95 1.96 −1.81 / −4.66
去噪结果不是样本。 后验均值是”平均的答案”:σ \sigma σ 小时它把点收缩到弧线的中心线上,比真实样本还集中(log p data \log p_{\text{data}} log p data −1.66 > −1.82);σ = 1 \sigma = 1 σ = 1 时把点拉到两条弧线”中间”(−3.85),字符图里是一团夹在两条弧线之间的云。所以一步去噪不能生成数据 。要从噪声走到数据,得用朗之万(§5),或者一串从大到小的噪声(第 14、16 讲)。
3.5 为什么 σ 不能太小
每个样本的训练目标 − z / σ -z/\sigma − z / σ 可以拆成”真正的得分 ∇ log q σ ( x ~ ) \nabla\log q_\sigma(\tilde x) ∇ log q σ ( x ~ ) “加一个均值为零的噪声(它们的差在给定 x ~ \tilde x x ~ 的条件下均值为零,正是 Tweedie)。信号占多少?代码 01 第 4 部分(双月牙):
σ \sigma σ E ∥ z / σ ∥ 2 = 2 / σ 2 \mathbb{E}\Vert z/\sigma\Vert^2 = 2/\sigma^2 E ∥ z / σ ∥ 2 = 2/ σ 2 E ∥ ∇ log q σ ∥ 2 \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2 E ∥∇ log q σ ∥ 2 信号占比 去噪目标的最小值 1.0 2.0 1.10 54.75% 0.5 0.1 200.1 31.38 15.68% 84.4 0.01 20,007.7 46.03 0.23% 9,980.8
σ → 0 \sigma \to 0 σ → 0 时 E ∥ ∇ log q σ ∥ 2 \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2 E ∥∇ log q σ ∥ 2 趋于 E ∥ ∇ log p data ∥ 2 \mathbb{E}\Vert\nabla\log p_{\text{data}}\Vert^2 E ∥∇ log p data ∥ 2 (有限),而目标的大小 d / σ 2 d/\sigma^2 d / σ 2 发散。σ = 0.01 \sigma = 0.01 σ = 0.01 时 99.8% 是噪声,梯度估计几乎全是噪声;去噪目标的最小值本身也有近一万——训练曲线上的”损失”几乎全是不可消除的部分,看不出模型好坏。
3.6 实验:σ 的 U 形权衡
代码 02 第 3 部分:双月牙,同一个网络训练 2,000 步,只改 σ \sigma σ 。“偏差下限”是即使学得完美也躲不掉的 1 2 E p ∥ ∇ log q σ − ∇ log p ∥ 2 \frac12\mathbb{E}_p\Vert\nabla\log q_\sigma - \nabla\log p\Vert^2 2 1 E p ∥∇ log q σ − ∇ log p ∥ 2 (精确计算);s θ = 0 s_\theta = 0 s θ = 0 时对 p data p_{\text{data}} p data 的 Fisher 散度是 22.91。
σ \sigma σ 偏差下限 学到的 vs q σ q_\sigma q σ 的得分 学到的 vs p data p_{\text{data}} p data 的得分 0.01 0.000 20.634 21.046 0.02 0.007 14.928 15.543 0.05 0.224 5.229 5.983 0.1 2.129 1.378 3.718 0.2 9.371 0.361 9.740 0.5 19.790 0.015 20.538 1.0 21.725 0.002 22.287
第二列随 σ \sigma σ 增大(q σ q_\sigma q σ 离 p data p_{\text{data}} p data 越来越远),第三列随 σ \sigma σ 减小(目标越来越吵,同样的步数学得越来越差)。我们关心的最后一列是两者的合成,呈 U 形 ,最好的 σ = 0.1 \sigma = 0.1 σ = 0.1 也只到 3.718(16%)。σ = 0.01 \sigma = 0.01 σ = 0.01 时网络几乎什么都没学到(21.0,接近 s = 0 s = 0 s = 0 的 22.9)。单一的 σ \sigma σ 只能折中 ——第 14 讲用一串从大到小的 σ \sigma σ 同时拿到两边的好处。
4. 切片得分匹配 · Sliced score matching
4.1 想法:一维问题更容易
动机。 迹贵在要 d d d 个方向的导数。slides 的思路:一维的问题容易——把高维向量场投影到随机方向 v v v 上,只要求投影匹配:
1 2 E p v E p data [ ( v ⊤ ∇ x log p data ( 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]. 2 1 E p v E p data [ ( v ⊤ ∇ x log p data ( x ) − v ⊤ s θ ( x ) ) 2 ] .
v v v 取自一个简单分布(如 N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) )。对每个方向分部积分(和 §2.1 一样),得到切片得分匹配 (Song, Garg, Shi & Ermon 2019):
E p v E p data [ v ⊤ ∇ x s θ ( x ) v + 1 2 ( 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{常数}. E p v E p data [ v ⊤ ∇ x s θ ( x ) v + 2 1 ( v ⊤ s θ ( x ) ) 2 ] + 常数 .
4.2 为什么只要一次反向传播
v ⊤ ∇ x s θ ( x ) v v^\top\nabla_x s_\theta(x)\,v v ⊤ ∇ x s θ ( x ) v :先算标量 v ⊤ s θ ( x ) v^\top s_\theta(x) v ⊤ s θ ( x ) ,对 x x x 求一次梯度得到 ∇ x ( v ⊤ s θ ) = ( ∇ x s θ ) ⊤ v \nabla_x(v^\top s_\theta) = (\nabla_x s_\theta)^\top v ∇ x ( v ⊤ s θ ) = ( ∇ x s θ ) ⊤ v (向量–雅可比积),再和 v v v 点乘。一次反向传播,和 d d d 无关 (slides 称之为”Jacobian-vector products are scalable”)。代码在 score.py 的 ssm_loss 里只有三行。
4.3 为什么无偏
E v [ v ⊤ A v ] = E v [ t r ( A v v ⊤ ) ] = t r ( A E [ v v ⊤ ] ) = t r ( 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 v [ v ⊤ A v ] = E v [ tr ( A v v ⊤ )] = tr ( A E [ v v ⊤ ]) = tr ( A ) ,只要 E [ v v ⊤ ] = I \mathbb{E}[vv^\top] = I E [ v v ⊤ ] = I (高斯或 Rademacher 都行)。代码 02 第 1 部分:d = 32 d = 32 d = 32 ,同一个网络、同一批数据,显式得分匹配的值是 0.0800;换 4,000 次随机方向,切片版本的平均是 0.0796 ± 0.0004 0.0796 \pm 0.0004 0.0796 ± 0.0004 ,方差缩减版(把 1 2 ( v ⊤ s ) 2 \frac12(v^\top s)^2 2 1 ( v ⊤ s ) 2 换成它的期望 1 2 ∥ s ∥ 2 \frac12\Vert s\Vert^2 2 1 ∥ s ∥ 2 )是 0.0802 ± 0.0004 0.0802 \pm 0.0004 0.0802 ± 0.0004 ,都在一个标准误左右。单次估计的标准差约 0.027,方差缩减只帮了一点点(0.0275 → 0.0267)——这里的方差主要来自 v ⊤ J v v^\top Jv v ⊤ J v 这一项(练习 4)。
slides 的算法:每个数据点取一个(或几个)随机方向,估计损失,随机梯度下降;方向越多方差越小。
4.4 三种方法的比较
代码 02 第 2 部分:双月牙,同一个网络、同样 2,000 步。
训练方法 用时 Fisher(对 p data p_{\text{data}} p data ) 相对误差 Fisher(对 q σ q_\sigma q σ ) 显式得分匹配 5 秒 1.573 6.9% — 切片得分匹配 3 秒 2.574 11.2% — 切片得分匹配(方差缩减) 4 秒 1.850 8.1% — 去噪得分匹配 σ = 0.05 \sigma = 0.05 σ = 0.05 2 秒 5.983 26.1% 5.229 去噪得分匹配 σ = 0.1 \sigma = 0.1 σ = 0.1 2 秒 3.718 16.2% 1.378 去噪得分匹配 σ = 0.3 \sigma = 0.3 σ = 0.3 2 秒 15.208 66.4% 0.114
三种不加噪的方法学的是同一个目标(干净数据的得分)。显式最准;切片版本的随机方向带来额外的噪声,同样步数误差更大;方差缩减版居中。二维里显式得分匹配并不贵,切片的优势要在高维才显现(§2.2 的表)。
去噪得分匹配学的是 q σ q_\sigma q σ 的得分:σ \sigma σ 越大,q σ q_\sigma q σ 越平滑、越好学(对 q σ q_\sigma q σ 的误差 5.2 → 1.4 → 0.1),但对 p data p_{\text{data}} p data 的误差在 σ = 0.3 \sigma = 0.3 σ = 0.3 时最大。
slides 引用 Song et al.(2019)的实验:切片得分匹配的速度和去噪得分匹配一样不随维数变化,得分估计质量和去噪得分匹配相当,而且估计的是干净数据的得分 。不过在后来的生成模型里,去噪得分匹配几乎完全胜出——它最便宜,而 §6 会看到”加噪声”本身就是我们想要的。
5. 从得分到样本:朗之万动力学 · Langevin dynamics sampling
5.1 算法
slides:只用得分就能从 p ( x ) p(x) p ( x ) 采样。
初始化 x 0 ∼ π ( x ) x^0 \sim \pi(x) x 0 ∼ π ( x ) (任何简单分布);
重复 x t + 1 ← x t + ϵ 2 ∇ x log p ( x t ) + ϵ z t x^{t+1} \leftarrow x^t + \frac{\epsilon}{2}\nabla_x\log p(x^t) + \sqrt{\epsilon}\,z^t x t + 1 ← x t + 2 ϵ ∇ x log p ( x t ) + ϵ z t ,z t ∼ N ( 0 , I ) z^t \sim \mathcal{N}(0, I) z t ∼ N ( 0 , I ) ,t = 0 , … , T − 1 t = 0, \dots, T-1 t = 0 , … , T − 1 ;
若 ϵ → 0 \epsilon \to 0 ϵ → 0 、T → ∞ T \to \infty T → ∞ ,则 x T ∼ p ( x ) x^T \sim p(x) x T ∼ p ( x ) 。
这就是第 11、12 讲的未调整朗之万 MCMC,只是现在把 ∇ x log p \nabla_x\log p ∇ x log p 换成学到的 s θ ( x ) s_\theta(x) s θ ( x ) 。得分模型 = 学得分(§2–§4)+ 朗之万采样。 下面统一写成 x ← x + ϵ s ( x ) + 2 ϵ ξ x \leftarrow x + \epsilon\,s(x) + \sqrt{2\epsilon}\,\xi x ← x + ϵ s ( x ) + 2 ϵ ξ (ϵ \epsilon ϵ 是 slides 里的一半)。
直觉。 漂移项 ϵ s ( x ) \epsilon\,s(x) ϵ s ( x ) 让点往高概率处爬;噪声项 2 ϵ ξ \sqrt{2\epsilon}\,\xi 2 ϵ ξ 让点到处乱走。两者恰好平衡时,点的分布停在 p p p 上(第 12 讲:Fokker–Planck 方程的平稳解)。
5.2 实验:用精确的得分(代码 03 第 1 部分)
双月牙,5,000 条链,初始点在方框 [ − 3 , 3 ] × [ − 2 , 2 ] [-3, 3] \times [-2, 2] [ − 3 , 3 ] × [ − 2 , 2 ] 里均匀分布。指标:和 5,000 个新真实样本的切片 W1(两组独立真实样本之间约 0.028,这是”噪声底”)、样本的平均 log p data \log p_{\text{data}} log p data (真实样本 −1.82)。
步长 ϵ \epsilon ϵ 10 步 100 步 1,000 步 0.001 0.291 / −7.31 0.165 / −1.89 0.095 / −1.85 0.01 0.161 / −2.00 0.094 / −1.96 0.032 / −1.990.02 0.146 / −2.22 0.044 / −2.21 0.050 / −2.22 0.05 0.249 / −5.30 0.259 / −5.26 0.257 / −5.31
(每格:切片 W1 / 平均 log p \log p log p 。)
步子太小走不动 :ϵ = 0.001 \epsilon = 0.001 ϵ = 0.001 时 1,000 步的”扩散距离”只有 2 ⋅ 0.001 ⋅ 1000 ≈ 1.4 \sqrt{2 \cdot 0.001 \cdot 1000} \approx 1.4 2 ⋅ 0.001 ⋅ 1000 ≈ 1.4 。
有限步长有偏差 :ϵ = 0.02 \epsilon = 0.02 ϵ = 0.02 混合得快,但停在一个比 ϵ = 0.01 \epsilon = 0.01 ϵ = 0.01 更高的 W1 上,样本略”胖”(第 12 讲 §2.3 的 ULA 偏差)。
步子太大会震荡 :弧线的宽度只有 s = 0.15 s = 0.15 s = 0.15 ,第 12 讲练习 3 的稳定性条件 ϵ < 2 s 2 = 0.045 \epsilon < 2s^2 = 0.045 ϵ < 2 s 2 = 0.045 被 ϵ = 0.05 \epsilon = 0.05 ϵ = 0.05 打破,链在垂直于弧线的方向上来回跳,平均 log p \log p log p 只有 −5.3。步长受最窄的方向 限制——高维图像里,最窄的方向往往窄得多。
5.3 实验:用学到的得分(代码 03 第 2 部分)
ϵ = 0.01 \epsilon = 0.01 ϵ = 0.01 、1,000 步,比较精确得分和代码 02 里学到的几个网络:
用哪个得分 切片 W1 平均 log p \log p log p 远离数据的样本 上弧的比例(真实 50%) 精确的 ∇ log p data \nabla\log p_{\text{data}} ∇ log p data 0.018 −1.95 0.5% 49.6% 精确的 ∇ log q 0.1 \nabla\log q_{0.1} ∇ log q 0.1 0.031 −2.18 1.5% 50.2% 精确的 ∇ log q 0.3 \nabla\log q_{0.3} ∇ log q 0.3 0.058 −3.70 15.9% 50.2% 学到的:显式得分匹配 0.180 −2.02 0.9% 56.2% 学到的:去噪 σ = 0.1 \sigma = 0.1 σ = 0.1 0.320 −2.27 2.8% 36.1% 学到的:去噪 σ = 0.3 \sigma = 0.3 σ = 0.3 0.083 −3.69 15.7% 50.3%
去噪得分采出的是加噪分布的样本 :精确的 ∇ log q 0.3 \nabla\log q_{0.3} ∇ log q 0.3 和学到的去噪得分(σ = 0.3 \sigma = 0.3 σ = 0.3 )给出几乎相同的结果——弧线明显变粗、16% 的样本远离数据。网络学对了,只是学的是 q σ q_\sigma q σ (§3.3 的”缺点”)。
局部对、全局错 :学到的显式得分和去噪得分(σ = 0.1 \sigma = 0.1 σ = 0.1 )采出的样本局部形状都不错(远离数据的样本只有 1%–3%),切片 W1 却大得多——两条弧线的比例错了 (56%、36%)。比例由两条弧线之间低密度区域里的得分决定(链一开始被推向哪边、之后怎样在两条弧线之间往来),而那里恰恰学得最差,得分匹配又对权重最不敏感(§1.3)。σ = 0.3 \sigma = 0.3 σ = 0.3 的噪声把两条弧线”连”了起来,那片区域有了训练数据,比例反而对了。这是 §6 第 2、3 个陷阱的预演。
最后一步 Tweedie 去噪 x + σ 2 s θ ( x ) x + \sigma^2 s_\theta(x) x + σ 2 s θ ( x ) 让平均 log p \log p log p 回升(σ = 0.3 \sigma = 0.3 σ = 0.3 :−3.69 → −1.82),切片 W1 却没有变好(0.083 → 0.091):后验均值把点拉向中心线,并不恢复 p data p_{\text{data}} p data 的形状(§3.4)。
5.4 噪声项是必需的
代码 03 第 3 部分:去掉 2 ϵ ξ \sqrt{2\epsilon}\,\xi 2 ϵ ξ ,朗之万变成梯度上升 x ← x + ϵ ∇ log p ( x ) x \leftarrow x + \epsilon\nabla\log p(x) x ← x + ϵ ∇ log p ( x ) 。1,000 步后平均 log p \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 × 256 256 \times 256 256 × 256 的照片有约 20 万个像素值,但”像照片的”图像只占其中极小的一部分,自由度远少于 20 万。
为什么是问题。 在流形之外 p data = 0 p_{\text{data}} = 0 p data = 0 ,log p data = − ∞ \log p_{\text{data}} = -\infty log p data = − ∞ ,得分没有定义 ;而得分匹配要求 p data p_{\text{data}} p data 有处处可微的正密度。slides 展示了 Song & Ermon 的实验:在 CIFAR-10 上用切片得分匹配训练,损失来回跳、不收敛;给数据加上很小的高斯噪声 N ( 0 , 0.0001 ) \mathcal{N}(0, 0.0001) N ( 0 , 0.0001 ) 以后损失就收敛了。
复现(代码 04 第 1 部分)。 数据在半径 1.5 的圆周上,加厚度为 τ \tau τ 的高斯噪声。厚度为 τ \tau τ 的圆环沿半径方向的得分约为 − ( r − R ) / τ 2 -(r - R)/\tau^2 − ( r − R ) / τ 2 ,所以得分匹配的最优值约为 − 1 2 E ∥ ∇ log p ∥ 2 ≈ − 1 2 τ 2 -\frac12\mathbb{E}\Vert\nabla\log p\Vert^2 \approx -\frac{1}{2\tau^2} − 2 1 E ∥∇ log p ∥ 2 ≈ − 2 τ 2 1 ;τ = 0 \tau = 0 τ = 0 时是 − ∞ -\infty − ∞ 。
方法 厚度 τ \tau τ 第 1–400 步 801–1,200 1,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.1 σ = 0.1 0(严格在圆上) 75.1 50.9 51.0 ≈ 50
(每个数字是那 400 步损失的平均。)τ = 0 \tau = 0 τ = 0 时网络把指向圆周的得分越拉越陡,损失一路下降、没有停下来的迹象;τ = 0.001 \tau = 0.001 τ = 0.001 在 2,000 步内的表现几乎一样——对一个有限的网络,“非常薄”和”严格在流形上”一样糟 。τ = 0.01 \tau = 0.01 τ = 0.01 、0.1 0.1 0.1 的损失停在理论值附近。同样严格落在圆上的数据,去噪得分匹配的损失很快稳定在理论值 1 2 σ 2 = 50 \frac{1}{2\sigma^2} = 50 2 σ 2 1 = 50 附近(练习 8):加噪后的分布铺满整个平面,得分处处有定义、处处有限。
6.2 陷阱二:低密度区域估计不准
为什么。 得分匹配的目标是 E p data [ ⋯ ] \mathbb{E}_{p_{\text{data}}}[\cdots] E p data [ ⋯ ] ,误差只在数据出现的地方被惩罚。高维空间里,数据占据的区域只是很小一部分;朗之万从一个随便的初始分布出发,最先经过的恰恰是低密度区域。slides 的图:数据密度、真实得分、估计的得分——只在两个模式附近,估计的得分和真实得分一致。
复现(代码 04 第 2 部分)。 双月牙上用显式得分匹配训练的网络(和代码 02 相同),在方框 [ − 3 , 3 ] × [ − 2 , 2 ] [-3, 3] \times [-2, 2] [ − 3 , 3 ] × [ − 2 , 2 ] 的格点上按真实密度分组:
区域 占面积 数据质量 ∥ \Vert ∥ 真实得分∥ \Vert ∥ ∥ \Vert ∥ 误差∥ \Vert ∥ 相对误差 方向余弦 被送到另一条弧线 p ≥ 0.1 p \geq 0.1 p ≥ 0.1 (弧线上)16.6% 0.8313 4.9 1.0 0.23 +0.901 0.0% 0.01 ≤ p < 0.1 0.01 \leq p < 0.1 0.01 ≤ p < 0.1 15.3% 0.1571 12.9 2.1 0.17 +0.958 2.1% 10 − 4 ≤ p < 0.01 10^{-4} \leq p < 0.01 1 0 − 4 ≤ p < 0.01 18.3% 0.0116 21.0 4.4 0.20 +0.948 3.0% 10 − 8 ≤ p < 10 − 4 10^{-8} \leq p < 10^{-4} 1 0 − 8 ≤ p < 1 0 − 4 19.9% 0.0001 31.9 6.7 0.20 +0.919 3.3% p < 10 − 8 p < 10^{-8} p < 1 0 − 8 (远离数据)29.9% 0.0000 51.7 13.3 0.25 +0.923 12.3%
(最后一列:从这个格点出发沿得分做梯度上升,精确得分和学到的得分把它送到了不同的弧线上——两者的”分水岭”不一致。)
如实地说 :绝对误差随着离开数据迅速变大(1 → 13),但相对误差和方向余弦在各区域差别不大——远处的真实得分很简单(大致指向数据),平滑的网络外推得还可以。这个二维例子比高维图像”仁慈”得多。错误藏在细节里:远离数据的格点里有约八分之一被送到了错误的弧线上,弧线上一个都没有。分水岭画在低密度区域里,正是学得最差的地方 ——§5.3 两条弧线比例错误的原因之一。
6.3 陷阱三:模式之间混合太慢
为什么。 设 p ( x ) = π p 1 ( x ) + ( 1 − π ) p 2 ( x ) p(x) = \pi p_1(x) + (1 - \pi)p_2(x) p ( x ) = π p 1 ( x ) + ( 1 − π ) p 2 ( x ) ,p 1 p_1 p 1 、p 2 p_2 p 2 的支撑不相交(分别在 A A A 、B B B 上)。那么在 A A A 上 ∇ log p ( x ) = ∇ log ( π p 1 ( x ) ) = ∇ log p 1 ( x ) \nabla\log p(x) = \nabla\log(\pi p_1(x)) = \nabla\log p_1(x) ∇ log p ( x ) = ∇ log ( π p 1 ( x )) = ∇ log p 1 ( x ) ,在 B B B 上是 ∇ log p 2 ( x ) \nabla\log p_2(x) ∇ log p 2 ( x ) ——得分完全不依赖 π \pi π 。得分匹配学不到 π \pi π ;用得分做朗之万,链也”看不见” π \pi π 。slides 的图:i.i.d. 样本里两个模式的比例正确,朗之万样本的比例错误。现实中支撑不会严格不相交,但只要低谷足够深,结论几乎一样(§1.3)。
复现(代码 04 第 3 部分)。 两个高斯,真实权重左 0.8 / 右 0.2;ϵ = 0.01 \epsilon = 0.01 ϵ = 0.01 ,2,000 条链。从左模式中心到中间低谷,log p \log p log p 下降 12.3(低谷密度是中心的 5 × 10 − 6 5\times10^{-6} 5 × 1 0 − 6 倍)。
得分 初始点 初始左边比例 1,000 步后 10,000 步后 换过边的链 精确的得分 方框里均匀 0.504 0.510 0.510 1.2% 精确的得分 真实分布 0.799 0.799 0.798 0.2% 学到的得分 方框里均匀 0.504 0.549 0.672 20.0% 学到的得分 真实分布 0.799 0.807 0.849 8.0%
精确的得分 :从方框均匀出发,左边比例约等于”落在左边吸引域的初始点比例”(约一半),1 万步之后几乎不变;从真实分布出发则保持 0.8。朗之万没有把分布弄错,它只是无法在有限时间内纠正错误的初始比例 。
学到的得分 :低谷里的得分学得不准,反而有 20% 的链越过了低谷——但越过的方向由学错的得分决定:从完美的初始化出发,左边比例也从 0.80 漂到了 0.85。混合得快不等于混合到对的分布。
6.4 一个办法同时缓解三个陷阱:加高斯噪声
回头看三个陷阱:
流形假设:数据没有填满空间 → 加噪声以后,q σ q_\sigma q σ 铺满整个空间 ,得分处处有定义(§6.1 的去噪得分匹配);
低密度区域:那里没有训练样本 → 加大噪声以后,样本扩散到原来的低密度区域 ,那里有了训练信号;
混合太慢:模式之间有深谷 → 加大噪声以后,模式之间被填平、连成一片 ,链可以自由往来。
但 §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 公式是其中”预测 x 0 x_0 x 0 “与”预测得分”互相换算的桥梁。
得分当作梯度信号。 DreamFusion(Poole et al., ICLR 2023)的 score distillation sampling 用一个预训练二维扩散模型的得分去优化三维场景的参数——不需要采样,只用得分指明”怎样让渲染出来的图更像真的”。
Tweedie 公式与逆问题。 Diffusion Posterior Sampling (Chung et al., ICLR 2023)等方法用 Tweedie 公式先估计 E [ x 0 ∣ x t ] \mathbb{E}[x_0 \mid x_t] E [ x 0 ∣ 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
得分是一种表示 :∇ x log p \nabla_x\log p ∇ x log p 决定了密度(只差常数 Z Z Z )。得分模型直接用网络输出向量场,不需要归一化、不需要可逆、不需要对抗训练。代价:得分对分开模式的权重几乎不敏感。
得分匹配 最小化 Fisher 散度,分部积分后要算 t r ( ∇ x s θ ) \mathrm{tr}(\nabla_x s_\theta) tr ( ∇ x s θ ) ——d d d 次反向传播,不可扩展(d = 512 d = 512 d = 512 时约是切片版本的 250 倍)。
去噪得分匹配 :1 2 E ∥ s θ ( x + σ z ) + z / σ ∥ 2 \frac12\mathbb{E}\Vert s_\theta(x + \sigma z) + z/\sigma\Vert^2 2 1 E ∥ s θ ( x + σ z ) + z / σ ∥ 2 = 对 q σ q_\sigma q σ 的 Fisher 散度 + 常数(代码里五个不同的 s s s 差值相同到六位小数)。便宜,但学到的是 q σ q_\sigma q σ ;σ \sigma σ 小则目标吵,σ \sigma σ 大则偏差大,精度对 σ \sigma σ 呈 U 形。
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) E [ x ∣ x ~ ] = x ~ + σ 2 ∇ log q σ ( x ~ ) ——最优去噪器就是得分;去噪结果是平均答案,不是样本。
切片得分匹配 :随机投影,E [ v ⊤ J v ] = t r J \mathbb{E}[v^\top Jv] = \mathrm{tr}J E [ v ⊤ J v ] = tr J ,一次反向传播,无偏,估计的是干净数据的得分,但多了方向的噪声。
朗之万动力学 把得分变成样本:步长受最窄方向限制(ϵ < 2 s 2 \epsilon < 2s^2 ϵ < 2 s 2 ),噪声项必不可少。
三个陷阱 :流形上得分无定义(损失没有下界);低密度区域得分不准(分水岭画错);模式之间混合太慢(比例由初始点决定)。加高斯噪声 同时缓解三者,多个噪声尺度兼顾精度——第 14 讲。
9. 常见误区 · Common pitfalls
“得分模型就是能量模型换了个名字。” 能量模型输出标量 f θ f_\theta f θ ,得分是它的梯度(一定是保守场);得分模型直接输出向量场,不保证对应任何密度。两者训练目标可以相同,但参数化、计算代价(得分模型不用对 x x x 求导就得到得分)和能做的事情(能量模型可以比较两个点的相对概率)不同。
“去噪得分匹配学到的是数据的得分。” 学到的是 q σ q_\sigma q σ 的得分(§3.2);用它采样得到的是加噪数据(§5.3)。只有 σ → 0 \sigma \to 0 σ → 0 才趋于数据的得分,而那时目标的方差趋于无穷(§3.5)。
“去噪得分匹配的损失越低模型越好,可以跨 σ 比较。” 损失的最小值是 1 2 ( d / σ 2 − E ∥ ∇ log q σ ∥ 2 ) \frac12(d/\sigma^2 - \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2) 2 1 ( d / σ 2 − E ∥∇ log q σ ∥ 2 ) ,随 σ \sigma σ 剧烈变化(σ = 0.01 \sigma = 0.01 σ = 0.01 时近一万)。只有减去这个常数之后才可比;同一个 σ \sigma σ 下损失的大部分也是不可消除的噪声。
“Tweedie 去噪可以直接生成样本。” 它给的是后验均值:σ \sigma σ 大时落在模式之间,σ \sigma σ 小时比真实分布还集中(§3.4)。
“切片得分匹配有偏,因为只看了一个方向。” 每个方向是迹的无偏估计(E [ v v ⊤ ] = I \mathbb{E}[vv^\top] = I E [ v v ⊤ ] = I );它只是方差更大。
“朗之万步长越小越准。” 偏差变小,但混合变慢(ϵ = 0.001 \epsilon = 0.001 ϵ = 0.001 时 1,000 步还没走到);太大又会在最窄的方向上发散(ϵ = 0.05 \epsilon = 0.05 ϵ = 0.05 )。
“学到的得分在大部分地方方向都对,所以采样没问题。” 双月牙上学到的得分方向余弦平均在 0.9 以上,采样时两条弧线的比例却错了(56%、36%)。比例由低密度区域里的少数细节决定。
“朗之万链混合得快就说明采样正确。” §6.3:学到的得分让 20% 的链越过低谷,但把比例推向了错误的 0.85。
10. 练习 · Exercises
练习 1(高斯与高斯混合的得分)
(a) 求 N ( μ , Σ ) \mathcal{N}(\mu, \Sigma) N ( μ , Σ ) 的得分。(b) 证明高斯混合的得分 ∇ log p ( x ) = ∑ k r k ( x ) ∇ log N ( x ; μ k , Σ k ) \nabla\log p(x) = \sum_kr_k(x)\nabla\log\mathcal{N}(x; \mu_k, \Sigma_k) ∇ log p ( x ) = ∑ k r k ( x ) ∇ log N ( x ; μ k , Σ k ) ,r k ( x ) = p ( k ∣ x ) r_k(x) = p(k \mid x) r k ( x ) = p ( k ∣ x ) 。(c) 各向同性 Σ k = v k I \Sigma_k = v_kI Σ k = v k I 时化简,并和 score.py 的快速通道对照。
参考答案
(a) − Σ − 1 ( x − μ ) -\Sigma^{-1}(x - \mu) − Σ − 1 ( x − μ ) :指向均值,离得越远越大。(b) ∇ log p = ∑ k π k ∇ N k ∑ j π j N j = ∑ k π k N k ∑ j π j N j ∇ log N k = ∑ k r k ∇ log N k \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 ∇ log p = ∑ j π j N j ∑ k π k ∇ N k = ∑ k ∑ j π j N j π k N k ∇ log N k = ∑ k r k ∇ log N k 。(c) ∑ k r k ( x ) μ k − x v k \sum_kr_k(x)\frac{\mu_k - x}{v_k} ∑ k r k ( x ) v k μ k − x :每个成分把 x x x 拉向自己的中心,拉力按责任加权、除以方差。代码里 rv = r / v; rv @ means - x * rv.sum(1) 就是这个式子。(b) 也说明了 §1.3:在 r 1 ≈ 1 r_1 \approx 1 r 1 ≈ 1 的地方,权重 π 1 \pi_1 π 1 只通过 r k r_k r k 进入,而 r k r_k r k 已经饱和。
练习 2(去噪目标的常数)
证明 §3.2 的常数等于 1 2 ( 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) 2 1 ( E ∥ ∇ x ~ log q σ ( x ~ ∣ x ) ∥ 2 − E ∥∇ log q σ ( x ~ ) ∥ 2 ) ,高斯噪声下即 1 2 ( d / σ 2 − E ∥ ∇ log q σ ∥ 2 ) \frac12(d/\sigma^2 - \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2) 2 1 ( d / σ 2 − E ∥∇ log q σ ∥ 2 ) 。它为什么总是非负?什么时候等于零?
参考答案
去噪目标 = 1 2 E ∥ s ∥ 2 − E [ s ⊤ g ] + 1 2 E ∥ g ∥ 2 = \frac12\mathbb{E}\Vert s\Vert^2 - \mathbb{E}[s^\top g] + \frac12\mathbb{E}\Vert g\Vert^2 = 2 1 E ∥ s ∥ 2 − E [ s ⊤ g ] + 2 1 E ∥ g ∥ 2 (g g g 是条件得分),Fisher = 1 2 E ∥ s ∥ 2 − E [ s ⊤ ∇ log q σ ] + 1 2 E ∥ ∇ 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 = 2 1 E ∥ s ∥ 2 − E [ s ⊤ ∇ log q σ ] + 2 1 E ∥∇ log q σ ∥ 2 ,交叉项相等(§3.2),差就是 1 2 ( E ∥ g ∥ 2 − E ∥ ∇ log q σ ∥ 2 ) \frac12(\mathbb{E}\Vert g\Vert^2 - \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2) 2 1 ( E ∥ g ∥ 2 − E ∥∇ log q σ ∥ 2 ) 。由 Tweedie,∇ log q σ ( x ~ ) = E [ g ∣ x ~ ] \nabla\log q_\sigma(\tilde x) = \mathbb{E}[g \mid \tilde x] ∇ log q σ ( x ~ ) = E [ g ∣ x ~ ] ,所以差 = 1 2 E ∥ g − E [ g ∣ x ~ ] ∥ 2 ≥ 0 = \frac12\mathbb{E}\Vert g - \mathbb{E}[g \mid \tilde x]\Vert^2 \geq 0 = 2 1 E ∥ g − E [ g ∣ x ~ ] ∥ 2 ≥ 0 ——条件方差。等于零当且仅当 g g g 由 x ~ \tilde x x ~ 唯一决定,即 x x x 由 x ~ \tilde x x ~ 唯一决定:数据集只有一个点时(练习 5)。代码 01:σ = 0.5 \sigma = 0.5 σ = 0.5 时 0.806156。
练习 3(Tweedie 公式与二阶版本)
(a) 按 §3.4 证明 Tweedie 公式。(b) 再求一次导数,证明 C o v [ x ∣ x ~ ] = σ 2 I + σ 4 ∇ 2 log q σ ( x ~ ) \mathrm{Cov}[x \mid \tilde x] = \sigma^2 I + \sigma^4\nabla^2\log q_\sigma(\tilde x) Cov [ x ∣ x ~ ] = σ 2 I + σ 4 ∇ 2 log q σ ( 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 σ 2 ∇ log q σ = E [ x ∣ x ~ ] − x ~ 再对 x ~ \tilde x x ~ 求导:σ 2 ∇ 2 log q σ = ∇ x ~ E [ x ∣ x ~ ] − I \sigma^2\nabla^2\log q_\sigma = \nabla_{\tilde x}\mathbb{E}[x \mid \tilde x] - I σ 2 ∇ 2 log q σ = ∇ x ~ E [ x ∣ x ~ ] − I ,而 ∇ x ~ E [ x ∣ x ~ ] = 1 σ 2 C o v [ x ∣ x ~ ] \nabla_{\tilde x}\mathbb{E}[x \mid \tilde x] = \frac{1}{\sigma^2}\mathrm{Cov}[x \mid \tilde x] ∇ x ~ E [ x ∣ x ~ ] = σ 2 1 Cov [ x ∣ x ~ ] (对后验 ∝ p ( x ) e − ∥ x ~ − x ∥ 2 / 2 σ 2 \propto p(x)e^{-\Vert\tilde x - x\Vert^2/2\sigma^2} ∝ p ( x ) e − ∥ x ~ − x ∥ 2 /2 σ 2 求导,指数族的性质)。整理即得。(c) 得分的雅可比给出后验协方差:log q σ \log q_\sigma log q σ 弯得越厉害(Hessian 越负),后验越确定。在两个模式之间,log q σ \log q_\sigma log q σ 的 Hessian 接近 0 甚至为正,后验协方差大——去噪器”拿不准”该往哪边去,这正是后验均值落在中间的原因。
练习 4(切片估计的方差)
设 A A A 是 d × d d \times d d × d 矩阵,A s = ( A + A ⊤ ) / 2 A_s = (A + A^\top)/2 A s = ( A + A ⊤ ) /2 。(a) v ∼ N ( 0 , I ) v \sim \mathcal{N}(0, I) v ∼ N ( 0 , I ) 时证明 V a r ( v ⊤ A v ) = 2 ∥ A s ∥ F 2 \mathrm{Var}(v^\top Av) = 2\Vert A_s\Vert_F^2 Var ( v ⊤ A v ) = 2∥ A s ∥ F 2 。(b) v v v 是 Rademacher 向量(每个分量 ±1 等概率)时证明 V a r ( v ⊤ A v ) = 2 ( ∥ A s ∥ F 2 − ∑ i A i i 2 ) \mathrm{Var}(v^\top Av) = 2(\Vert A_s\Vert_F^2 - \sum_iA_{ii}^2) Var ( v ⊤ A v ) = 2 ( ∥ A s ∥ F 2 − ∑ i A ii 2 ) 。(c) 哪种更好?
参考答案
(a) v ⊤ A v = v ⊤ A s v v^\top Av = v^\top A_sv v ⊤ A v = v ⊤ A s v ;对角化 A s = Q Λ Q ⊤ A_s = Q\Lambda Q^\top A s = Q Λ Q ⊤ ,u = Q ⊤ v ∼ N ( 0 , I ) u = Q^\top v \sim \mathcal{N}(0, I) u = Q ⊤ v ∼ N ( 0 , I ) ,v ⊤ A s v = ∑ i λ i u i 2 v^\top A_sv = \sum_i\lambda_iu_i^2 v ⊤ A s v = ∑ i λ i u i 2 ,方差 ∑ i λ i 2 V a r ( u i 2 ) = 2 ∑ λ i 2 = 2 ∥ A s ∥ F 2 \sum_i\lambda_i^2\mathrm{Var}(u_i^2) = 2\sum\lambda_i^2 = 2\Vert A_s\Vert_F^2 ∑ i λ i 2 Var ( u i 2 ) = 2 ∑ λ i 2 = 2∥ A s ∥ F 2 。(b) v ⊤ A s v = ∑ i A i i + ∑ i ≠ j ( A s ) i j v i v j v^\top A_sv = \sum_iA_{ii} + \sum_{i \neq j}(A_s)_{ij}v_iv_j v ⊤ A s v = ∑ i A ii + ∑ i = j ( A s ) ij v i v j ,第一项是常数(v i 2 = 1 v_i^2 = 1 v i 2 = 1 ),第二项的方差 = 2 ∑ i ≠ j ( A s ) i j 2 = 2\sum_{i\neq j}(A_s)_{ij}^2 = 2 ∑ i = j ( A s ) ij 2 。(c) Rademacher 总是不更差:对角元的贡献被精确消掉。这就是 Hutchinson 迹估计常用 Rademacher 的原因(第 14 讲的概率流 ODE 似然也会用到)。
练习 5(只有一个数据点)
数据集只有一个点 x 0 x_0 x 0 。(a) q σ q_\sigma q σ 是什么?最优的 s θ s_\theta s θ 是什么?去噪目标的最小值是多少?(b) 用这个最优得分跑朗之万会得到什么?(c) 这对”去噪模型会不会背诵训练集”有什么启示?
参考答案
(a) q σ = N ( x 0 , σ 2 I ) q_\sigma = \mathcal{N}(x_0, \sigma^2I) q σ = N ( x 0 , σ 2 I ) ,最优得分 − ( x ~ − x 0 ) / σ 2 -(\tilde x - x_0)/\sigma^2 − ( x ~ − x 0 ) / σ 2 ,恰好等于条件得分 − z / σ -z/\sigma − z / σ ,目标最小值为 0(练习 2:条件方差为零)。(b) 朗之万采出 N ( x 0 , σ 2 I ) \mathcal{N}(x_0, \sigma^2I) N ( x 0 , σ 2 I ) ——训练点加噪声。(c) 一般地,如果训练集是 N N N 个点的经验分布,去噪得分匹配的全局最优解 是经验分布加噪以后的得分,用它采样(σ → 0 \sigma \to 0 σ → 0 )就会复现训练点:完美优化 = 背诵。实际的网络因为容量和归纳偏置达不到这个最优解,才会泛化(§7 的 Kadkhodaie et al.)。第 15 讲会讨论怎样检测背诵。
练习 6(得分的小偏差会把质量推到哪里)
设真实分布 p = N ( 0 , 1 ) p = \mathcal{N}(0, 1) p = N ( 0 , 1 ) ,学到的得分有一个常数偏差:s θ ( x ) = − x + c s_\theta(x) = -x + c s θ ( x ) = − x + c 。(a) 朗之万(ϵ → 0 \epsilon \to 0 ϵ → 0 )的平稳分布是什么?(b) 如果偏差只出现在低密度区域:s θ ( x ) = − x + c ⋅ 1 [ x > 3 ] s_\theta(x) = -x + c\cdot\mathbb{1}[x > 3] s θ ( x ) = − x + c ⋅ 1 [ x > 3 ] ,平稳分布在 x > 3 x > 3 x > 3 上的质量大约变成原来的多少倍?(c) 联系 §6.3 学到的得分让比例漂到 0.85。
参考答案
(a) s θ = ∇ ( − x 2 2 + c x ) s_\theta = \nabla(-\frac{x^2}{2} + cx) s θ = ∇ ( − 2 x 2 + c x ) ,平稳分布 ∝ e − x 2 / 2 + c x \propto e^{-x^2/2 + cx} ∝ e − x 2 /2 + c x ,即 N ( c , 1 ) \mathcal{N}(c, 1) N ( c , 1 ) 。(b) 一维里任何得分都是某个函数的导数:log p ~ ( x ) = − x 2 2 + c ( x − 3 ) + \log\tilde p(x) = -\frac{x^2}{2} + c(x - 3)_+ log p ~ ( x ) = − 2 x 2 + c ( x − 3 ) + 。x > 3 x > 3 x > 3 部分的质量 ∫ 3 ∞ e − x 2 / 2 + c ( x − 3 ) d x \int_3^\infty e^{-x^2/2 + c(x - 3)}dx ∫ 3 ∞ e − x 2 /2 + c ( x − 3 ) d x ,对 c = 1 c = 1 c = 1 大约是原来的 1 1 − c / 3 \frac{1}{1 - c/3} 1 − c /3 1 量级(尾部近似 e − 3 ( x − 3 ) e^{-3(x-3)} e − 3 ( x − 3 ) ,变成 e − 2 ( x − 3 ) e^{-2(x-3)} e − 2 ( x − 3 ) ),即 1.5 倍——而且这部分质量在别的地方不会被”补偿”,只会在归一化时让所有其他地方等比例缩小。(c) 学到的得分在低谷里的偏差决定了”从一边流向另一边”的净流量;只要偏差偏向一边,长时间运行后比例就会向那一边漂。混合越快,漂得越快。
练习 7(跨越低谷要多久)
朗之万在势能 U = − log p U = -\log p U = − log p 上运动时,跨越高度为 Δ U \Delta U Δ U 的势垒的平均时间约为 ∝ e Δ U \propto e^{\Delta U} ∝ e Δ U (Kramers 公式)。代码 04 的 Δ U = 12.3 \Delta U = 12.3 Δ U = 12.3 。(a) 粗略估计”连续时间”里跨越一次需要多久(假设前置因子为 1)。(b) ϵ = 0.01 \epsilon = 0.01 ϵ = 0.01 时 1 万步对应多少连续时间?预测换过边的链的比例,并与代码的 1.2% 比较。
参考答案
(a) e 12.3 ≈ 2.2 × 10 5 e^{12.3} \approx 2.2\times10^5 e 12.3 ≈ 2.2 × 1 0 5 。(b) 1 万步 × 0.01 = 100 个时间单位,预测跨越一次的概率约 100 / 2.2 × 10 5 ≈ 0.05 % 100/2.2\times10^5 \approx 0.05\% 100/2.2 × 1 0 5 ≈ 0.05% 。代码里精确得分从真实分布出发换过边的链是 0.2%,量级相近(前置因子、有限步长的偏差都会让实际数字大几倍);从方框均匀出发的 1.2% 主要来自一开始就在低谷附近、还没决定往哪边走的链。结论:要让比例在朗之万里”自己修正”,需要 10 5 10^5 1 0 5 量级的时间——比实际能跑的长几千倍。
练习 8(圆环上的最优值)
数据是半径 R R R 的圆周加 N ( 0 , τ 2 I ) \mathcal{N}(0, \tau^2I) N ( 0 , τ 2 I ) 噪声,τ ≪ R \tau \ll R τ ≪ R 。(a) 粗略说明得分匹配的最优值 ≈ − 1 2 τ 2 \approx -\frac{1}{2\tau^2} ≈ − 2 τ 2 1 。(b) 对严格在圆周上的数据(τ = 0 \tau = 0 τ = 0 ),去噪得分匹配(噪声 σ ≪ R \sigma \ll R σ ≪ R )的最优值是多少?与代码的 51.0 比较。(c) 为什么说 (b) 里的”噪声”既是问题的解决办法,也是新问题的来源?
参考答案
(a) 在每个点附近,密度沿半径方向近似 N ( R , τ 2 ) \mathcal{N}(R, \tau^2) N ( R , τ 2 ) ,沿切向近似均匀;得分 ≈ − r − R τ 2 r ^ \approx -\frac{r - R}{\tau^2}\hat r ≈ − τ 2 r − R 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 E ∥∇ log p ∥ 2 ≈ E [( r − R ) 2 ] / τ 4 = 1/ τ 2 ,最优值 = − 1 2 E ∥ ∇ log p ∥ 2 ≈ − 1 2 τ 2 = -\frac12\mathbb{E}\Vert\nabla\log p\Vert^2 \approx -\frac{1}{2\tau^2} = − 2 1 E ∥∇ log p ∥ 2 ≈ − 2 τ 2 1 。(b) q σ q_\sigma q σ 是厚度 σ \sigma σ 的圆环,E ∥ ∇ log q σ ∥ 2 ≈ 1 / σ 2 \mathbb{E}\Vert\nabla\log q_\sigma\Vert^2 \approx 1/\sigma^2 E ∥∇ log q σ ∥ 2 ≈ 1/ σ 2 ;最小值 = 1 2 ( 2 / σ 2 − 1 / σ 2 ) = 1 2 σ 2 = 50 = \frac12(2/\sigma^2 - 1/\sigma^2) = \frac{1}{2\sigma^2} = 50 = 2 1 ( 2/ σ 2 − 1/ σ 2 ) = 2 σ 2 1 = 50 ,代码 51.0(网络没有完全达到最优、以及曲率带来的小修正)。(c) 噪声让得分处处有定义(解决陷阱一),但学到的是一个厚度 σ \sigma σ 的圆环,不是圆周本身(§3.3 的缺点)。第 14 讲:先大噪声、再小噪声。
练习 9(不保守的向量场)
考虑向量场 s ( x ) = − x + α J x s(x) = -x + \alpha Jx s ( x ) = − x + α J x ,x ∈ R 2 x \in \mathbb{R}^2 x ∈ R 2 ,J = ( 0 − 1 1 0 ) J = \begin{pmatrix}0 & -1\\1 & 0\end{pmatrix} J = ( 0 1 − 1 0 ) (旋转 90°)。(a) 它是某个函数的梯度吗?(b) 用它跑朗之万(ϵ → 0 \epsilon \to 0 ϵ → 0 ),平稳分布是什么?(提示:检查 N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) 是否满足 Fokker–Planck 方程的平稳条件 ∇ ⋅ ( p s ) = Δ p \nabla\cdot(p\,s) = \Delta p ∇ ⋅ ( p s ) = Δ p 。)(c) 这对”得分网络不一定保守”意味着什么?
参考答案
(a) 不是:雅可比 − I + α J -I + \alpha J − I + α J 不对称(梯度场的雅可比是 Hessian,必须对称)。(b) 令 p = N ( 0 , I ) p = \mathcal{N}(0, I) p = N ( 0 , I ) ,∇ ⋅ ( p ( − x ) ) = Δ p \nabla\cdot(p(-x)) = \Delta p ∇ ⋅ ( p ( − x )) = Δ p 正是标准正态的平稳条件;多出来的一项 ∇ ⋅ ( p α J x ) = α ( ∇ p ⋅ J x + p ∇ ⋅ ( J x ) ) = α ( − p x ⊤ J x + 0 ) = 0 \nabla\cdot(p\,\alpha Jx) = \alpha(\nabla p\cdot Jx + p\,\nabla\cdot(Jx)) = \alpha(-p\,x^\top Jx + 0) = 0 ∇ ⋅ ( p α J x ) = α ( ∇ p ⋅ J x + p ∇ ⋅ ( J x )) = α ( − p x ⊤ J x + 0 ) = 0 (x ⊤ J x = 0 x^\top Jx = 0 x ⊤ J x = 0 ,J J J 的散度为零)。所以平稳分布仍是 N ( 0 , I ) \mathcal{N}(0, I) N ( 0 , I ) ——旋转部分只让链”绕圈”,不改变分布,甚至可能加快混合。(c) 不保守的部分不一定有害:只要它与 p p p 的等高线”相切”(∇ ⋅ ( p 旋转项 ) = 0 \nabla\cdot(p\,\text{旋转项}) = 0 ∇ ⋅ ( p 旋转项 ) = 0 ),平稳分布不变。但一般的不保守误差会改变平稳分布,而且不对应任何密度。代码 02 测得学到的网络的反对称部分只占 5%–8%。
练习 10(动手:Rademacher 方向)
在 score.py 的 ssm_loss 里加一个选项,让 v v v 取 Rademacher 向量(torch.randint(0, 2, …) * 2 - 1)。在代码 02 第 1 部分的无偏性检验里比较单次估计的标准差,并用练习 4 解释差别。预测:d = 32 d = 32 d = 32 时,差别大还是小?
参考答案(预测的思路)
Rademacher 消掉了对角元 A i i 2 A_{ii}^2 A ii 2 的贡献。随机初始化的 MLP 的雅可比矩阵,对角元在 ∥ A s ∥ F 2 \Vert A_s\Vert_F^2 ∥ A s ∥ F 2 里占 d d d 项、非对角元占 d ( d − 1 ) d(d-1) d ( d − 1 ) 项,d = 32 d = 32 d = 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) s θ ( x , σ ) 同时学所有噪声尺度的得分;训练目标是各尺度去噪得分匹配的加权和,权重 λ ( σ ) = σ 2 \lambda(\sigma) = \sigma^2 λ ( σ ) = σ 2 ;噪声尺度怎样选;
退火朗之万动力学 :从最大的噪声开始,逐级减小;为什么步长要 ∝ σ 2 \propto\sigma^2 ∝ σ 2 ;
无穷多个噪声尺度 :用随机微分方程(SDE)连续地给数据加噪声,反向 SDE 从噪声生成数据;预测–校正采样;
概率流 ODE :同样的边缘分布、确定性的轨迹——精确的似然、更快的采样;
可控生成 :条件得分 = 无条件得分 + 分类器的梯度。