对应 Maps to :Stanford CS236 Deep Generative Models (Fall 2023,Stefano Ermon),Lecture 12 · 2023-11-06 · Energy-Based Models (slides:cs236_lecture12.pdf,21 页)。
依据说明 :本讲按原课 slides 的顺序展开:回顾(比较容易、最大似然要采样)→ 从能量模型采样:Metropolis–Hastings 与细致平衡、未调整的朗之万 MCMC → 目标:不采样也能训练 → 得分函数 → Fisher 散度与得分匹配 → 分部积分(一维、多维)→ 得分匹配算法与迹的代价 → 回顾:KL 与 Fisher 两种距离 → 噪声对比估计:最优判别器、用判别器表示 p θ p_\theta p θ 、把 Z Z Z 当参数、log-sum-exp 技巧、算法 → NCE 与 GAN 的比较 → 流对比估计 → 对抗训练能量模型 → 结论。MH 转移矩阵的精确分析与混合时间、未调整朗之万偏差的闭式验证、MALA、混合速度随维数的标度、Fisher 散度对模式权重的盲点、“流 + 修正”的残差能量模型、五种训练方法在同一条件下的比较 是本讲义补充的。凡是能和真相比较的地方都比较了(小状态空间、一维网格、二维网格上的精确 log Z \log Z log Z )。
配套代码 Code :code/lecture12/ (PyTorch;4 个演示脚本,复用第 11 讲的 ebm.py,最长的约 75 秒)
预计阅读时间 :3.5 小时(含运行代码)
0. 本讲导航 · How to read this lecture
0.1 学习目标 Learning goals
学完这一讲,你应该能够:
证明 Metropolis–Hastings 满足细致平衡 、因此以 p θ p_\theta p θ 为平稳分布;说明混合速度由什么决定,为什么多峰和高维会让 MCMC 变慢;推导未调整朗之万 MCMC 在高斯目标上的偏差,知道 MALA 怎样消除它。
说出得分函数 ∇ x log p θ ( x ) = ∇ x f θ ( x ) \nabla_x\log p_\theta(x) = \nabla_x f_\theta(x) ∇ x log p θ ( x ) = ∇ x f θ ( x ) 为什么与 Z Z Z 无关;写出 Fisher 散度 ,用分部积分推导得分匹配 目标 E p data [ 1 2 ∥ ∇ x f θ ∥ 2 + t r ( ∇ x 2 f θ ) ] \mathbb{E}_{p_{\text{data}}}[\frac12\Vert\nabla_x f_\theta\Vert^2 + \mathrm{tr}(\nabla_x^2 f_\theta)] E p data [ 2 1 ∥ ∇ x f θ ∥ 2 + tr ( ∇ x 2 f θ )] ,说明它的计算代价和一个根本的盲点(模式权重)。
推导噪声对比估计 :最优判别器、把判别器参数化成 p θ p θ + p n \frac{p_\theta}{p_\theta + p_n} p θ + p n p θ 、把 Z Z Z 当参数时最优解里 Z Z Z 恰好是配分函数;知道噪声分布该怎么选。
比较 NCE 与 GAN;理解流对比估计和对抗训练能量模型的思路与困难。
把第 11、12 讲的训练方法放在一张表里:各自需要什么、在什么情况下失败。
0.2 先修与本讲范围 Prerequisites & scope
默认你已经会 Assumed 本讲只给直觉,后面几讲再展开 Previewed only 第 11 讲:能量模型、配分函数、对比散度、朗之万 MCMC 去噪得分匹配、切片得分匹配(第 13 讲) 第 9 讲:判别器、最优判别器 D ∗ = p / ( p + q ) D^* = p/(p+q) D ∗ = p / ( p + q ) 多个噪声尺度的得分模型、退火朗之万(第 13–14 讲) 第 7–8 讲:流模型(可采样、可算密度) 微积分:分部积分
0.3 本讲地图 Map
§1 回顾
§2 从能量模型采样:MH 与细致平衡;未调整的朗之万;维数与多峰 ← 代码 01
§3 得分匹配:得分函数、Fisher 散度、分部积分、算法、迹的代价、模式权重的盲点 ← 代码 02
§4 噪声对比估计:用分类训练能量模型;Z 作为参数;噪声怎么选;和 GAN 比较 ← 代码 03 第 1 部分
§5 流对比估计与对抗训练;"流 + 修正" ← 代码 03 第 2 部分
§6 结论:五种训练方法放在一起 ← 代码 04
§7 2023 年之后
§8–12 小结、常见误区、练习、延伸阅读、下一讲预告
0.4 记号 Notation
符号 含义 p θ ( x ) = e f θ ( x ) / Z ( θ ) p_\theta(x) = e^{f_\theta(x)}/Z(\theta) p θ ( x ) = e f θ ( x ) / Z ( θ ) 能量模型 T x → x ′ T_{x \to x'} T x → x ′ 马尔可夫链从 x x x 转移到 x ′ x' x ′ 的概率 s θ ( x ) = ∇ x log p θ ( x ) s_\theta(x) = \nabla_x\log p_\theta(x) s θ ( x ) = ∇ x log p θ ( x ) (Stein)得分函数 D F ( p , q ) = 1 2 E p ∥ ∇ x log p − ∇ x log q ∥ 2 D_F(p, q) = \frac12\mathbb{E}_p\Vert\nabla_x\log p - \nabla_x\log q\Vert^2 D F ( p , q ) = 2 1 E p ∥ ∇ x log p − ∇ x log q ∥ 2 Fisher 散度 p n ( x ) p_n(x) p n ( x ) NCE 的噪声分布(已知密度、容易采样) D θ , Z ( x ) = e f θ ( x ) e f θ ( x ) + Z p n ( x ) D_{\theta,Z}(x) = \frac{e^{f_\theta(x)}}{e^{f_\theta(x)} + Zp_n(x)} D θ , Z ( x ) = e f θ ( x ) + Z p n ( x ) e f θ ( x ) NCE 的判别器 q ϕ ( x ) q_\phi(x) q ϕ ( x ) 流对比估计 / 对抗训练里的流
0.5 关于数字 · About the numbers
代码 01 的小链有 21 个状态,转移矩阵、特征值、任意步之后的分布都能精确计算。代码 02 的一维部分在细网格上精确积分;二维部分和第 11 讲一样,用网格上精确的 log Z \log Z log Z 计算 KL。训练相关的数字来自固定种子的单次运行,几处对种子敏感、和预想不同的结果记录在 代码 README 的”关于实验结果”里。
1. 回顾 · Recap
slide 2:能量模型 p θ ( x ) = exp { f θ ( x ) } Z ( θ ) p_\theta(x) = \frac{\exp\{f_\theta(x)\}}{Z(\theta)} p θ ( x ) = Z ( θ ) e x p { f θ ( x )} 。Z ( θ ) Z(\theta) Z ( θ ) 难算,所以没有似然。比较两个点的概率很容易:p θ ( x ′ ) / p θ ( x ) = exp ( f θ ( x ′ ) − f θ ( x ) ) p_\theta(x')/p_\theta(x) = \exp(f_\theta(x') - f_\theta(x)) p θ ( x ′ ) / p θ ( x ) = exp ( f θ ( x ′ ) − f θ ( x )) 。最大似然训练 max θ { f θ ( x train ) − log Z ( θ ) } \max_\theta\{f_\theta(x_{\text{train}}) - \log Z(\theta)\} max θ { f θ ( x train ) − log Z ( θ )} ;对比散度
∇ θ f θ ( x train ) − ∇ θ log Z ( θ ) ≈ ∇ θ f θ ( x train ) − ∇ θ f θ ( x sample ) , x sample ∼ p θ ( x ) . \nabla_\theta f_\theta(x_{\text{train}}) - \nabla_\theta\log Z(\theta) \approx \nabla_\theta f_\theta(x_{\text{train}}) - \nabla_\theta f_\theta(x_{\text{sample}}), \quad x_{\text{sample}} \sim p_\theta(x). ∇ θ f θ ( x train ) − ∇ θ log Z ( θ ) ≈ ∇ θ f θ ( x train ) − ∇ θ f θ ( x sample ) , x sample ∼ p θ ( x ) .
第 11 讲的代码 04 留下一个教训:负样本来自 MCMC,而 MCMC 在分开的模式之间几乎不混合,于是 CD 学不到模式的相对权重,PCD 甚至失控。本讲先把采样讲清楚,再看两种不需要采样 的训练方法。
2. 从能量模型采样 · Sampling from EBMs
2.1 Metropolis–Hastings
slide 3:
x 0 ∼ π ( x ) x^0 \sim \pi(x) x 0 ∼ π ( x ) ;
对 t = 0 , 1 , … , T − 1 t = 0, 1, \dots, T-1 t = 0 , 1 , … , T − 1 :x ′ = x t + 噪声 x' = x^t + \text{噪声} x ′ = x t + 噪声 ;若 f θ ( x ′ ) ≥ f θ ( x t ) f_\theta(x') \geq f_\theta(x^t) f θ ( x ′ ) ≥ f θ ( x t ) ,x t + 1 = x ′ x^{t+1} = x' x t + 1 = x ′ ;若 f θ ( x ′ ) < f θ ( x t ) f_\theta(x') < f_\theta(x^t) f θ ( x ′ ) < f θ ( x t ) ,以概率 exp { f θ ( x ′ ) − f θ ( x t ) } \exp\{f_\theta(x') - f_\theta(x^t)\} exp { f θ ( x ′ ) − f θ ( x t )} 令 x t + 1 = x ′ x^{t+1} = x' x t + 1 = x ′ ,否则 x t + 1 = x t x^{t+1} = x^t x t + 1 = x t 。
性质 :理论上 x T x^T x T 在 T → ∞ T \to \infty T → ∞ 时收敛到 p θ ( x ) p_\theta(x) p θ ( x ) 。为什么? 它满足细致平衡 条件
p θ ( x ) T x → x ′ = p θ ( x ′ ) T x ′ → x , p_\theta(x)T_{x \to x'} = p_\theta(x')T_{x' \to x}, p θ ( x ) T x → x ′ = p θ ( x ′ ) T x ′ → x ,
T x → x ′ T_{x \to x'} T x → x ′ 是从 x x x 转移到 x ′ x' x ′ 的概率。于是如果 x t x^t x t 服从 p θ p_\theta p θ ,x t + 1 x^{t+1} x t + 1 也服从 p θ p_\theta p θ 。
证明 (对称提议 q ( x ′ ∣ x ) = q ( x ∣ x ′ ) q(x' \mid x) = q(x \mid x') q ( x ′ ∣ x ) = q ( x ∣ x ′ ) ):对 x ′ ≠ x x' \neq x x ′ = x ,T x → x ′ = q ( x ′ ∣ x ) min ( 1 , e f ( x ′ ) − f ( x ) ) T_{x \to x'} = q(x' \mid x)\min(1, e^{f(x') - f(x)}) T x → x ′ = q ( x ′ ∣ x ) min ( 1 , e f ( x ′ ) − f ( x ) ) 。不妨设 f ( x ′ ) < f ( x ) f(x') < f(x) f ( x ′ ) < f ( x ) ,则
p ( x ) T x → x ′ = e f ( x ) Z q ( x ′ ∣ x ) e f ( x ′ ) − f ( x ) = e f ( x ′ ) Z q ( x ′ ∣ x ) , p ( x ′ ) T x ′ → x = e f ( x ′ ) Z q ( x ∣ x ′ ) ⋅ 1. p(x)T_{x \to x'} = \frac{e^{f(x)}}{Z}q(x' \mid x)e^{f(x') - f(x)} = \frac{e^{f(x')}}{Z}q(x' \mid x), \qquad p(x')T_{x' \to x} = \frac{e^{f(x')}}{Z}q(x \mid x')\cdot 1. p ( x ) T x → x ′ = Z e f ( x ) q ( x ′ ∣ x ) e f ( x ′ ) − f ( x ) = Z e f ( x ′ ) q ( x ′ ∣ x ) , p ( x ′ ) T x ′ → x = Z e f ( x ′ ) q ( x ∣ x ′ ) ⋅ 1.
两者相等。细致平衡对 x x x 求和:∑ x p ( x ) T x → x ′ = ∑ x p ( x ′ ) T x ′ → x = p ( x ′ ) \sum_x p(x)T_{x \to x'} = \sum_x p(x')T_{x' \to x} = p(x') ∑ x p ( x ) T x → x ′ = ∑ x p ( x ′ ) T x ′ → x = p ( x ′ ) ——p p p 是平稳分布。(提议不对称时,接受概率要乘上 q ( x ∣ x ′ ) / q ( x ′ ∣ x ) q(x \mid x')/q(x' \mid x) q ( x ∣ x ′ ) / q ( x ′ ∣ x ) ,即 Hastings 的修正,练习 2。)
实践中需要大量迭代,收敛速度随维数指数地变慢 。
2.2 实验:一个可以精确分析的小链
代码 01 第 1 部分:21 个状态,提议”左右各一格”,把 MH 的转移矩阵 T T T 精确地写出来。细致平衡的误差在 10 − 17 10^{-17} 1 0 − 17 量级。收敛有多快 由 T T T 的第二大特征值 λ 2 \lambda_2 λ 2 决定:误差约按 λ 2 t \lambda_2^t λ 2 t 衰减,1 / ( 1 − λ 2 ) 1/(1 - \lambda_2) 1/ ( 1 − λ 2 ) 大致是混合需要的步数。
目标 低谷 p p p / 峰值 p p p λ 2 \lambda_2 λ 2 1 / ( 1 − λ 2 ) 1/(1 - \lambda_2) 1/ ( 1 − λ 2 ) TV@100 TV@1,000 TV@10,000 单峰 — 0.9028 10 0.000 0.000 0.000 双峰 6 / 14,σ 2 = 4 \sigma^2 = 4 σ 2 = 4 0.27 0.98735 79 0.180 0.000 0.000 双峰 5 / 15,σ 2 = 2 \sigma^2 = 2 σ 2 = 2 0.0039 0.99957 2,298 0.483 0.326 0.006 双峰 5 / 15,σ 2 = 1.5 \sigma^2 = 1.5 σ 2 = 1.5 0.00048 0.99993 14,180 0.497 0.467 0.247
(TV@t t t :从最左边的状态出发走 t t t 步后,分布和 p p p 的总变差距离。)低谷处的密度降到峰值的万分之五,混合就要上万步——大致和”低谷有多低”成反比,因为每次跨越都要连续接受一串”往下走”的提议。在混合之前,TV 停在 0.5 附近:质量全在左峰,右峰还没分到。第 11 讲代码 04 的低谷比峰值低 3,800 倍。
2.3 未调整的朗之万 MCMC
slide 4:
x 0 ∼ π ( x ) x^0 \sim \pi(x) x 0 ∼ π ( x ) ;
对 t = 0 , 1 , … , T − 1 t = 0, 1, \dots, T-1 t = 0 , 1 , … , T − 1 :z t ∼ N ( 0 , I ) z^t \sim \mathcal{N}(0, I) z t ∼ N ( 0 , I ) ,x t + 1 = x t + ϵ ∇ x log p θ ( x ) ∣ x = x t + 2 ϵ z t x^{t+1} = x^t + \epsilon\nabla_x\log p_\theta(x)|_{x = x^t} + \sqrt{2\epsilon}z^t x t + 1 = x t + ϵ ∇ x log p θ ( x ) ∣ x = x t + 2 ϵ z t 。
性质 :x T x^T x T 在 T → ∞ T \to \infty T → ∞ 且 ϵ → 0 \epsilon \to 0 ϵ → 0 时收敛到 p θ ( x ) p_\theta(x) p θ ( x ) 的样本;对连续的能量模型 ∇ x log p θ ( x ) = ∇ x f θ ( x ) \nabla_x\log p_\theta(x) = \nabla_x f_\theta(x) ∇ x log p θ ( x ) = ∇ x f θ ( x ) ;收敛随维数增长而变慢。高维空间中采样收敛很慢,因而非常昂贵,可对比散度在每一次训练迭代里都需要采样。
"ϵ → 0 \epsilon \to 0 ϵ → 0 "不是一句客套话。代码 01 第 2 部分取目标 N ( 0 , 1 ) \mathcal{N}(0, 1) N ( 0 , 1 ) :更新是 x ′ = ( 1 − ϵ ) x + 2 ϵ ξ x' = (1 - \epsilon)x + \sqrt{2\epsilon}\xi x ′ = ( 1 − ϵ ) x + 2 ϵ ξ ,平稳方差 v v v 满足 v = ( 1 − ϵ ) 2 v + 2 ϵ v = (1-\epsilon)^2v + 2\epsilon v = ( 1 − ϵ ) 2 v + 2 ϵ ,解得
v = 1 1 − ϵ / 2 ≠ 1. v = \frac{1}{1 - \epsilon/2} \neq 1. v = 1 − ϵ /2 1 = 1.
步长 ϵ \epsilon ϵ ULA 理论方差 ULA 实测 MALA 实测 MALA 接受率 0.1 1.0526 1.0516 0.9947 99.3% 0.5 1.3333 1.3308 0.9997 92.1% 1.0 2.0000 1.9978 0.9999 78.4% 1.5 4.0000 3.9963 1.0004 63.3%
未调整的 朗之万(ULA)的平稳分布不是目标分布,偏差随步长增大。MALA (Metropolis-adjusted Langevin)把朗之万的一步当作 MH 的提议 再做一次接受 / 拒绝(提议不对称,要用 Hastings 修正),偏差被精确消除;代价是 ϵ \epsilon ϵ 大时接受率下降。
2.4 维数与多峰
代码 01 第 3 部分:d d d 维标准高斯,步长按理论最优尺度设置(随机游走 MH 的步长 ∝ d − 1 / 2 \propto d^{-1/2} ∝ d − 1/2 ,MALA 的 ∝ d − 1 / 3 \propto d^{-1/3} ∝ d − 1/3 ;Roberts & Rosenthal),每一步的有效样本数(ESS/步,1 = 每步一个独立样本):
d d d 1 4 16 64 256 随机游走 MH 0.2305 0.0762 0.0208 0.0063 0.0023 MALA 0.8300 0.4350 0.2273 0.1259 0.0737
随机游走 MH 每步的效率约按 1 / d 1/d 1/ d 下降;利用梯度(得分)的 MALA 下降得慢得多。这还只是一个各向同性的高斯。
代码 01 第 4 部分:二维两个高斯(( ± 2 , 0 ) (\pm2, 0) ( ± 2 , 0 ) ,σ = 0.4),200 条 MH 链都从左峰出发,各跑 5,000 步:
提议步长 0.1 0.4 1.0 2.5 4.0 接受率 87.6% 55.3% 22.1% 6.2% 3.1% 最后在左边的比例(应为 0.5) 1.00 0.97 0.47 0.41 0.54 每条链跨模式的次数 0.0 0.0 4.6 35.9 32.9
步长小,局部走得好、从不跨模式;步长和两峰距离相当时跨得最多,可 94% 以上的提议被拒绝。没有一个步长同时做到”局部走得好”和”跨得过去” ——这是多峰分布难采样的根源,也是第 13 讲”多个噪声尺度”的出发点。
3. 得分匹配 · Score matching
3.1 目标:不采样也能训练
slide 5:今天的目标:不需要采样的训练 ——得分匹配、噪声对比估计、对抗训练。
3.2 得分函数
slide 6:能量模型 log p θ ( x ) = f θ ( x ) − log Z ( θ ) \log p_\theta(x) = f_\theta(x) - \log Z(\theta) log p θ ( x ) = f θ ( x ) − log Z ( θ ) 。(Stein)得分函数 :
s θ ( x ) : = ∇ x log p θ ( x ) = ∇ x f θ ( x ) − ∇ x log Z ( θ ) ⏟ = 0 = ∇ x f θ ( x ) . s_\theta(x) := \nabla_x\log p_\theta(x) = \nabla_x f_\theta(x) - \underbrace{\nabla_x\log Z(\theta)}_{=0} = \nabla_x f_\theta(x). s θ ( x ) := ∇ x log p θ ( x ) = ∇ x f θ ( x ) − = 0 ∇ x log Z ( θ ) = ∇ x f θ ( x ) .
例子:高斯 p θ ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 p_\theta(x) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}} p θ ( x ) = 2 π σ 1 e − 2 σ 2 ( x − μ ) 2 ,s θ ( x ) = − x − μ σ 2 s_\theta(x) = -\frac{x - \mu}{\sigma^2} s θ ( x ) = − σ 2 x − μ ;Gamma p θ ( x ) = β α Γ ( α ) x α − 1 e − β x p_\theta(x) = \frac{\beta^\alpha}{\Gamma(\alpha)}x^{\alpha-1}e^{-\beta x} p θ ( x ) = Γ ( α ) β α x α − 1 e − β x ,s θ ( x ) = α − 1 x − β s_\theta(x) = \frac{\alpha - 1}{x} - \beta s θ ( x ) = x α − 1 − β 。slide 6 的图把 p θ ( x ) p_\theta(x) p θ ( x ) 和 s θ ( x ) s_\theta(x) s θ ( x ) 画在一起:得分是一个向量场,指向密度增加最快的方向。
代码 02 第 1 部分用自动求导核对了这两个公式,并把 log p \log p log p 加上 123.4(相当于换了一个 Z Z Z )——得分完全不变。
3.3 Fisher 散度与得分匹配
slide 7:观察 :s θ ( x ) = ∇ x log p θ ( x ) s_\theta(x) = \nabla_x\log p_\theta(x) s θ ( x ) = ∇ x log p θ ( x ) 与配分函数 Z ( θ ) Z(\theta) Z ( θ ) 无关。p ( x ) p(x) p ( x ) 和 q ( x ) q(x) q ( x ) 之间的 Fisher 散度 :
D F ( p , q ) : = 1 2 E x ∼ p [ ∥ ∇ x log p ( x ) − ∇ x log q ( x ) ∥ 2 2 ] . D_F(p, q) := \frac12\mathbb{E}_{x \sim p}\left[\Vert\nabla_x\log p(x) - \nabla_x\log q(x)\Vert_2^2\right]. D F ( p , q ) := 2 1 E x ∼ p [ ∥ ∇ x log p ( x ) − ∇ x log q ( x ) ∥ 2 2 ] .
得分匹配 :最小化 p data ( x ) p_{\text{data}}(x) p data ( x ) 与能量模型 p θ ( x ) ∝ exp { f θ ( x ) } p_\theta(x) \propto \exp\{f_\theta(x)\} p θ ( x ) ∝ exp { f θ ( x )} 之间的 Fisher 散度,
1 2 E x ∼ p data [ ∥ ∇ x log p data ( x ) − ∇ x f θ ( x ) ∥ 2 2 ] . \frac12\mathbb{E}_{x \sim p_{\text{data}}}\left[\Vert\nabla_x\log p_{\text{data}}(x) - \nabla_x f_\theta(x)\Vert_2^2\right]. 2 1 E x ∼ p data [ ∥ ∇ x log p data ( x ) − ∇ x f θ ( x ) ∥ 2 2 ] .
问题 :∇ x log p data ( x ) \nabla_x\log p_{\text{data}}(x) ∇ x log p data ( x ) 未知,只有样本。
3.4 分部积分
slide 8(一维):
1 2 E p data [ ( ∇ x log p data − ∇ x log p θ ) 2 ] = 1 2 ∫ p data ( ∇ x log p data ) 2 + 1 2 ∫ p data ( ∇ x log p θ ) 2 − ∫ p data ∇ x log p data ∇ x log p θ . \frac12\mathbb{E}_{p_{\text{data}}}[(\nabla_x\log p_{\text{data}} - \nabla_x\log p_\theta)^2] = \frac12\int p_{\text{data}}(\nabla_x\log p_{\text{data}})^2 + \frac12\int p_{\text{data}}(\nabla_x\log p_\theta)^2 - \int p_{\text{data}}\nabla_x\log p_{\text{data}}\nabla_x\log p_\theta. 2 1 E p data [( ∇ x log p data − ∇ x log p θ ) 2 ] = 2 1 ∫ p data ( ∇ x log p data ) 2 + 2 1 ∫ p data ( ∇ x log p θ ) 2 − ∫ p data ∇ x log p data ∇ x log p θ .
用分部积分 ∫ f ′ g = f g − ∫ g ′ f \int f'g = fg - \int g'f ∫ f ′ g = f g − ∫ g ′ f 处理交叉项:
− ∫ p data 1 p data ∇ x p data ∇ x log p θ d x = − p data ∇ x log p θ ∣ − ∞ ∞ ⏟ = 0 + ∫ p data ∇ x 2 log p θ d x . -\int p_{\text{data}}\frac{1}{p_{\text{data}}}\nabla_x p_{\text{data}}\nabla_x\log p_\theta\,dx = -\underbrace{p_{\text{data}}\nabla_x\log p_\theta\Big|_{-\infty}^{\infty}}_{=0} + \int p_{\text{data}}\nabla_x^2\log p_\theta\,dx. − ∫ p data p data 1 ∇ x p data ∇ x log p θ d x = − = 0 p data ∇ x log p θ − ∞ ∞ + ∫ p data ∇ x 2 log p θ d x .
注意:需要假设 p data p_{\text{data}} p data 衰减得足够快,x → ± ∞ x \to \pm\infty x → ± ∞ 时 p data ( x ) → 0 p_{\text{data}}(x) \to 0 p data ( x ) → 0 (练习 4 是一个不满足的例子)。
slide 9:于是
1 2 E p data [ ( ∇ x log p data − ∇ x log p θ ) 2 ] = 1 2 ∫ p data ( ∇ x log p data ) 2 ⏟ 与 θ 无关 + E p data [ 1 2 ( ∇ x log p θ ) 2 + ∇ x 2 log p θ ] . \frac12\mathbb{E}_{p_{\text{data}}}[(\nabla_x\log p_{\text{data}} - \nabla_x\log p_\theta)^2] = \underbrace{\frac12\int p_{\text{data}}(\nabla_x\log p_{\text{data}})^2}_{\text{与 }\theta\text{ 无关}} + \mathbb{E}_{p_{\text{data}}}\left[\frac12(\nabla_x\log p_\theta)^2 + \nabla_x^2\log p_\theta\right]. 2 1 E p data [( ∇ x log p data − ∇ x log p θ ) 2 ] = 与 θ 无关 2 1 ∫ p data ( ∇ x log p data ) 2 + E p data [ 2 1 ( ∇ x log p θ ) 2 + ∇ x 2 log p θ ] .
多维(分部积分即高斯散度定理):
1 2 E p data [ ∥ ∇ x log p data − ∇ x log p θ ∥ 2 2 ] = E p data [ 1 2 ∥ ∇ x log p θ ( x ) ∥ 2 2 + t r ( ∇ x 2 log p θ ( x ) ⏟ log p θ 的 Hessian ) ] + 常数 . \frac12\mathbb{E}_{p_{\text{data}}}[\Vert\nabla_x\log p_{\text{data}} - \nabla_x\log p_\theta\Vert_2^2] = \mathbb{E}_{p_{\text{data}}}\left[\frac12\Vert\nabla_x\log p_\theta(x)\Vert_2^2 + \mathrm{tr}\big(\underbrace{\nabla_x^2\log p_\theta(x)}_{\log p_\theta\text{ 的 Hessian}}\big)\right] + \text{常数}. 2 1 E p data [ ∥ ∇ x log p data − ∇ x log p θ ∥ 2 2 ] = E p data 2 1 ∥ ∇ x log p θ ( x ) ∥ 2 2 + tr ( l o g p θ 的 Hessian ∇ x 2 log p θ ( x ) ) + 常数 .
代码 02 第 2 部分在一维网格上数值验证了这个等式(p data = 0.7 N ( − 2 , 0.5 2 ) + 0.3 N ( 2 , 0.5 2 ) p_{\text{data}} = 0.7\,\mathcal{N}(-2, 0.5^2) + 0.3\,\mathcal{N}(2, 0.5^2) p data = 0.7 N ( − 2 , 0. 5 2 ) + 0.3 N ( 2 , 0. 5 2 ) ,模型是单个高斯):
模型 N ( μ , σ 2 ) \mathcal{N}(\mu, \sigma^2) N ( μ , σ 2 ) Fisher 散度(用真实得分) 得分匹配目标(只用 p p p ) 差 ( − 0.8 , 1.9 ) (-0.8, 1.9) ( − 0.8 , 1.9 ) 1.858629 −0.138504 1.997134 ( 0 , 1 ) (0, 1) ( 0 , 1 ) 3.122134 1.125000 1.997134 ( − 2 , 0.5 ) (-2, 0.5) ( − 2 , 0.5 ) 38.397134 36.400000 1.997134 ( 1 , 3 ) (1, 3) ( 1 , 3 ) 1.928306 −0.068827 1.997134
差是同一个常数 1 2 E p [ ( ∇ log p ) 2 ] \frac12\mathbb{E}_p[(\nabla\log p)^2] 2 1 E p [( ∇ log p ) 2 ] 。顺便:单个高斯的 Fisher 最优解是 μ = E p [ x ] \mu = \mathbb{E}_p[x] μ = E p [ x ] 、σ 2 = V a r p [ x ] \sigma^2 = \mathrm{Var}_p[x] σ 2 = Var p [ x ] (练习 5)——和最大似然相同。
3.5 算法与代价
slide 10:
采样一个小批量 { x 1 , … , x n } ∼ p data ( x ) \{x_1, \dots, x_n\} \sim p_{\text{data}}(x) { x 1 , … , x n } ∼ p data ( x ) ;
用经验平均估计得分匹配损失
1 n ∑ i = 1 n [ 1 2 ∥ ∇ x log p θ ( x i ) ∥ 2 2 + t r ( ∇ x 2 log p θ ( x i ) ) ] = 1 n ∑ i = 1 n [ 1 2 ∥ ∇ x f θ ( x i ) ∥ 2 2 + t r ( ∇ x 2 f θ ( x i ) ) ] ; \frac1n\sum_{i=1}^n\left[\frac12\Vert\nabla_x\log p_\theta(x_i)\Vert_2^2 + \mathrm{tr}(\nabla_x^2\log p_\theta(x_i))\right] = \frac1n\sum_{i=1}^n\left[\frac12\Vert\nabla_x f_\theta(x_i)\Vert_2^2 + \mathrm{tr}(\nabla_x^2 f_\theta(x_i))\right]; n 1 ∑ i = 1 n [ 2 1 ∥ ∇ x log p θ ( x i ) ∥ 2 2 + tr ( ∇ x 2 log p θ ( x i )) ] = n 1 ∑ i = 1 n [ 2 1 ∥ ∇ x f θ ( x i ) ∥ 2 2 + tr ( ∇ x 2 f θ ( x i )) ] ;
随机梯度下降;
不需要从能量模型采样!
注意 :对大模型,计算 Hessian 的迹 t r ( ∇ x 2 log p θ ( x ) ) \mathrm{tr}(\nabla_x^2\log p_\theta(x)) tr ( ∇ x 2 log p θ ( x )) 一般非常昂贵。去噪得分匹配(Vincent 2011)和切片得分匹配(Song et al. 2019)——下一讲详细讲。
代码 02 第 5 部分:自动求导算迹要对每一维各做一次反向传播。输入维数 d = 2 , 8 , 32 , 128 d = 2, 8, 32, 128 d = 2 , 8 , 32 , 128 时,完整的得分匹配分别是”只算 1 2 ∥ ∇ f ∥ 2 \frac12\Vert\nabla f\Vert^2 2 1 ∥∇ f ∥ 2 “的 3.5、10.0、36.8、138.4 倍——线性增长,而一张 256×256 的彩色图 d ≈ 20 d \approx 20 d ≈ 20 万。
slide 11 回顾了训练能量模型的两种距离:KL 散度 = 最大似然 (对比散度 ∇ θ f θ ( x data ) − f θ ( x sample ) \nabla_\theta f_\theta(x_{\text{data}}) - f_\theta(x_{\text{sample}}) ∇ θ f θ ( x data ) − f θ ( x sample ) );Fisher 散度 = 得分匹配 (1 2 E p data ∥ ∇ x log p data − ∇ x f θ ∥ 2 \frac12\mathbb{E}_{p_{\text{data}}}\Vert\nabla_x\log p_{\text{data}} - \nabla_x f_\theta\Vert^2 2 1 E p data ∥ ∇ x log p data − ∇ x f θ ∥ 2 )。
3.6 Fisher 散度的盲点
得分是一个局部 的量:它只描述密度在每个点附近怎样变化。“两个分开的模式各占多少质量”是一个全局 的量。代码 02 第 3 部分:p = 0.8 N ( − 2 , 0.5 2 ) + 0.2 N ( 2 , 0.5 2 ) p = 0.8\,\mathcal{N}(-2, 0.5^2) + 0.2\,\mathcal{N}(2, 0.5^2) p = 0.8 N ( − 2 , 0. 5 2 ) + 0.2 N ( 2 , 0. 5 2 ) ,q q q 用同样的两个成分 、只换权重:
q q q 的左边权重0.8 0.5 0.2 0.01 Fisher 散度 D F ( p , q ) D_F(p, q) D F ( p , q ) 0 6.6e−4 3.0e−3 2.2e−2 D K L ( p ∥ q ) D_{\mathrm{KL}}(p \Vert q) D KL ( p ∥ q ) 0 0.193 0.832 3.185
在每个模式内部,∇ log q ≈ − ( x − μ k ) / σ 2 \nabla\log q \approx -(x - \mu_k)/\sigma^2 ∇ log q ≈ − ( x − μ k ) / σ 2 只由那个成分决定、和权重无关;两者只在两峰之间的低谷里不同,而那里 p p p 几乎为零,Fisher 散度的权重 p ( x ) p(x) p ( x ) 把差别抹掉了(练习 6)。
代码 02 第 4 部分(二维能量模型,各 2,000 步):
数据 训练方法 用时 KL x 1 < 0 x_1 < 0 x 1 < 0 的质量(真实)两个高斯 0.5 / 0.5 精确最大似然 15 秒 0.027 0.608(0.499) 得分匹配 3 秒 0.113 0.722(0.499) 两个高斯 0.8 / 0.2 精确最大似然 15 秒 0.005 0.777(0.798) 得分匹配 3 秒 1.277 1.000 (0.798)双月牙 精确最大似然 14 秒 0.034 0.514(0.499) 得分匹配 3 秒 0.072 0.443(0.499)
得分匹配快得多(不采样、不算 Z Z Z ),在连通的双月牙上和精确最大似然接近;两个分开的模式上,每个模式的形状学得很好,权重却随训练漂移(0.8 / 0.2 时全部质量到了左边,等权时也偏到 0.72)。和第 11 讲的 CD 是同一个失败,原因不同 :CD 是采样器跨不过去,得分匹配是目标函数本身不在乎。第 13 讲称之为得分模型的”第三个陷阱”,并用多个噪声尺度来缓解。
4. 噪声对比估计 · Noise contrastive estimation
4.1 用分类学密度
slide 12:通过和一个噪声分布 对比来学习能量模型。
数据分布 p data ( x ) p_{\text{data}}(x) p data ( x ) ;
噪声分布 p n ( x ) p_n(x) p n ( x ) :应该能解析地计算密度、容易采样 ;
训练一个判别器 D θ ( x ) ∈ [ 0 , 1 ] D_\theta(x) \in [0, 1] D θ ( x ) ∈ [ 0 , 1 ] 区分数据样本和噪声样本:
max θ E x ∼ p data [ log D θ ( x ) ] + E x ∼ p n [ log ( 1 − D θ ( x ) ) ] . \max_\theta\mathbb{E}_{x \sim p_{\text{data}}}[\log D_\theta(x)] + \mathbb{E}_{x \sim p_n}[\log(1 - D_\theta(x))]. max θ E x ∼ p data [ log D θ ( x )] + E x ∼ p n [ log ( 1 − D θ ( x ))] .
最优判别器 D θ ∗ ( x ) = p data ( x ) p data ( x ) + p n ( x ) D_\theta^*(x) = \frac{p_{\text{data}}(x)}{p_{\text{data}}(x) + p_n(x)} D θ ∗ ( x ) = p data ( x ) + p n ( x ) p data ( x ) (第 9 讲 §3.6)。
slide 13:如果把判别器参数化成
D θ ( x ) = p θ ( x ) p θ ( x ) + p n ( x ) D_\theta(x) = \frac{p_\theta(x)}{p_\theta(x) + p_n(x)} D θ ( x ) = p θ ( x ) + p n ( x ) p θ ( x )
呢?最优判别器满足 p θ ∗ ( x ) p θ ∗ ( x ) + p n ( x ) = p data ( x ) p data ( x ) + p n ( x ) \frac{p_{\theta^*}(x)}{p_{\theta^*}(x) + p_n(x)} = \frac{p_{\text{data}}(x)}{p_{\text{data}}(x) + p_n(x)} p θ ∗ ( x ) + p n ( x ) p θ ∗ ( x ) = p data ( x ) + p n ( x ) p data ( x ) ——训练判别器的同时,我们隐式地学到了 p θ ∗ ( x ) ≈ p data ( x ) p_{\theta^*}(x) \approx p_{\text{data}}(x) p θ ∗ ( x ) ≈ p data ( x ) 。它特别适合 p θ p_\theta p θ 只定义到一个归一化常数的情形(能量模型)。等价地,
p θ ∗ ( x ) = p n ( x ) D θ ∗ ( x ) 1 − D θ ∗ ( x ) = p data ( x ) . p_{\theta^*}(x) = \frac{p_n(x)D_{\theta^*}(x)}{1 - D_{\theta^*}(x)} = p_{\text{data}}(x). p θ ∗ ( x ) = 1 − D θ ∗ ( x ) p n ( x ) D θ ∗ ( x ) = p data ( x ) .
分类器被用来修正 p n p_n p n 的密度估计 ,可以用来改进一个基础生成模型(Boosted Generative Models,Grover et al. 2018)——§5.1 的”流 + 修正”就是这个想法。
4.2 把 Z 当参数
slide 14:能量模型 p θ ( x ) = e f θ ( x ) / Z ( θ ) p_\theta(x) = e^{f_\theta(x)}/Z(\theta) p θ ( x ) = e f θ ( x ) / Z ( θ ) 的约束 Z ( θ ) = ∫ e f θ ( x ) d x Z(\theta) = \int e^{f_\theta(x)}dx Z ( θ ) = ∫ e f θ ( x ) d x 很难满足。办法 :用一个额外的可训练参数 Z Z Z 来建模 Z ( θ ) Z(\theta) Z ( θ ) ,不 显式地要求 Z = ∫ e f θ Z = \int e^{f_\theta} Z = ∫ e f θ :
p θ , Z ( x ) = e f θ ( x ) Z . p_{\theta,Z}(x) = \frac{e^{f_\theta(x)}}{Z}. p θ , Z ( x ) = Z e f θ ( x ) .
用 NCE 训练,最优参数 θ ∗ , Z ∗ \theta^*, Z^* θ ∗ , Z ∗ 满足 p θ ∗ , Z ∗ ( x ) = e f θ ∗ ( x ) Z ∗ = p data ( x ) p_{\theta^*,Z^*}(x) = \frac{e^{f_{\theta^*}(x)}}{Z^*} = p_{\text{data}}(x) p θ ∗ , Z ∗ ( x ) = Z ∗ e f θ ∗ ( x ) = p data ( x ) 。最优的 Z ∗ Z^* Z ∗ 就是正确的配分函数 ,因为
∫ e f θ ∗ ( x ) Z ∗ d x = ∫ p data ( x ) d x = 1 ⟹ Z ∗ = ∫ e f θ ∗ ( x ) d x . \int\frac{e^{f_{\theta^*}(x)}}{Z^*}dx = \int p_{\text{data}}(x)\,dx = 1 \implies Z^* = \int e^{f_{\theta^*}(x)}dx. ∫ Z ∗ e f θ ∗ ( x ) d x = ∫ p data ( x ) d x = 1 ⟹ Z ∗ = ∫ e f θ ∗ ( x ) d x .
为什么最大似然不能这样做?因为似然 f θ ( x ) − log Z f_\theta(x) - \log Z f θ ( x ) − log Z 对 Z Z Z 单调递减——把 Z Z Z 当自由参数时,最大似然会让 Z → 0 Z \to 0 Z → 0 。NCE 的分类目标里 Z Z Z 同时出现在”数据”和”噪声”两侧,太小或太大都会让分类变差,所以有一个有限的最优值。
4.3 目标与算法
slide 15:判别器
D θ , Z ( x ) = e f θ ( x ) / Z e f θ ( x ) / Z + p n ( x ) = e f θ ( x ) e f θ ( x ) + p n ( x ) Z . D_{\theta,Z}(x) = \frac{e^{f_\theta(x)}/Z}{e^{f_\theta(x)}/Z + p_n(x)} = \frac{e^{f_\theta(x)}}{e^{f_\theta(x)} + p_n(x)Z}. D θ , Z ( x ) = e f θ ( x ) / Z + p n ( x ) e f θ ( x ) / Z = e f θ ( x ) + p n ( x ) Z e f θ ( x ) .
NCE 训练:max θ , Z E x ∼ p data [ log D θ , Z ( x ) ] + E x ∼ p n [ log ( 1 − D θ , Z ( x ) ) ] \max_{\theta,Z}\mathbb{E}_{x \sim p_{\text{data}}}[\log D_{\theta,Z}(x)] + \mathbb{E}_{x \sim p_n}[\log(1 - D_{\theta,Z}(x))] max θ , Z E x ∼ p data [ log D θ , Z ( x )] + E x ∼ p n [ log ( 1 − D θ , Z ( x ))] ,等价地
max θ , Z E x ∼ p data [ f θ ( x ) − log ( e f θ ( x ) + Z p n ( x ) ) ] + E x ∼ p n [ log ( Z p n ( x ) ) − log ( e f θ ( x ) + Z p n ( x ) ) ] . \max_{\theta,Z}\mathbb{E}_{x \sim p_{\text{data}}}\left[f_\theta(x) - \log(e^{f_\theta(x)} + Zp_n(x))\right] + \mathbb{E}_{x \sim p_n}\left[\log(Zp_n(x)) - \log(e^{f_\theta(x)} + Zp_n(x))\right]. max θ , Z E x ∼ p data [ f θ ( x ) − log ( e f θ ( x ) + Z p n ( x )) ] + E x ∼ p n [ log ( Z p n ( x )) − log ( e f θ ( x ) + Z p n ( x )) ] .
数值稳定的 log-sum-exp 技巧 :log ( e f θ ( x ) + Z p n ( x ) ) = l o g s u m e x p ( f θ ( x ) , log Z + log p n ( x ) ) \log(e^{f_\theta(x)} + Zp_n(x)) = \mathrm{logsumexp}(f_\theta(x), \log Z + \log p_n(x)) log ( e f θ ( x ) + Z p n ( x )) = logsumexp ( f θ ( x ) , log Z + log p n ( x )) 。
slide 16:采样一批数据 x 1 , … , x n ∼ p data x_1, \dots, x_n \sim p_{\text{data}} x 1 , … , x n ∼ p data 、一批噪声 y 1 , … , y n ∼ p n y_1, \dots, y_n \sim p_n y 1 , … , y n ∼ p n ,估计
1 n ∑ i = 1 n [ f θ ( x i ) − l o g s u m e x p ( f θ ( x i ) , log Z + log p n ( x i ) ) + log Z + log p n ( y i ) − l o g s u m e x p ( f θ ( y i ) , log Z + log p n ( y i ) ) ] , \frac1n\sum_{i=1}^n\left[f_\theta(x_i) - \mathrm{logsumexp}(f_\theta(x_i), \log Z + \log p_n(x_i)) + \log Z + \log p_n(y_i) - \mathrm{logsumexp}(f_\theta(y_i), \log Z + \log p_n(y_i))\right], n 1 ∑ i = 1 n [ f θ ( x i ) − logsumexp ( f θ ( x i ) , log Z + log p n ( x i )) + log Z + log p n ( y i ) − logsumexp ( f θ ( y i ) , log Z + log p n ( y i )) ] ,
对 θ \theta θ 和 Z Z Z 做随机梯度上升。不需要从能量模型采样!
4.4 噪声怎么选?
代码 03 第 1 部分(能量网络 64 × 2,3,000 步):
数据 噪声 KL x 1 < 0 x_1 < 0 x 1 < 0 的质量(真实)学到的 / 真实 log Z 分类准确率 两个高斯 0.8 / 0.2 宽高斯 N ( 0 , 3 2 I ) \mathcal{N}(0, 3^2I) N ( 0 , 3 2 I ) 0.193 0.522(0.800) +0.086 / −0.467 92% 矩匹配的高斯 0.016 0.757 +0.055 / +0.058 77% 太窄的高斯 N ( 0 , 0.5 2 I ) \mathcal{N}(0, 0.5^2I) N ( 0 , 0. 5 2 I ) 1.093 0.546 +0.122 / +1.529 97% 较弱的流(4 层 RealNVP) 0.009 0.778 +0.057 / +0.023 52% 双月牙 宽高斯 0.105 0.502(0.501) +0.190 / +0.301 92% 矩匹配的高斯 0.067 0.433 +0.133 / +0.278 79% 太窄的高斯 60.127 0.000 +0.169 / +61.299 87% 较弱的流 0.068 0.490 +0.007 / +0.023 62%
NCE 能学到模式的相对权重 (矩匹配噪声 0.76、流噪声 0.78)——CD 和得分匹配都做不到。噪声样本同时覆盖两个模式,判别器”看得见”全局,不依赖任何链在模式之间跨越。
宽噪声这次没学对 (0.52):数据点上 D ≈ 1 D \approx 1 D ≈ 1 早已饱和,只有少数恰好落进模式里的噪声样本提供”两个模式该多高”的信号——统计效率低(换一个数据种子时它学到了 0.85)。
太窄的噪声彻底失败 :数据大多落在噪声密度几乎为零的地方,判别器只要学会”离中心远就是数据”,能量函数在那里得不到约束。
学到的 log Z \log Z log Z 只有在噪声合适时才准;理论上最优解里两者相等,有限训练下是近似。
slide 18 的总结:噪声分布既要能算密度 、又要能高效采样 ;我们希望分类任务尽可能难 ,即 p n p_n p n 接近 p data p_{\text{data}} p data (但不完全相同)。Gutmann & Hyvärinen 证明,NCE 的统计效率随噪声接近数据而提高。
4.5 NCE 与 GAN
slide 17:
相同 :都训练一个判别器、用交叉熵做二分类;都不需要似然(能量模型的似然本来就不可算)。
不同 :GAN 需要对抗训练(极小极大优化),NCE 不需要;NCE 需要噪声分布的似然 ,GAN 只需要能从先验高效采样;NCE 训练的是一个能量模型 ,GAN 训练的是一个确定性的采样器 。
还可以补一句:NCE 的噪声是固定的,所以优化是一个普通的最大化问题,没有第 9 讲的振荡和模式坍塌;代价是噪声必须事先选好——§4.4 表明这并不容易。
5. 流对比估计与对抗训练 · Flow contrastive estimation & adversarial training
5.1 用流做噪声
slide 18(Gao et al. 2020):流对比估计 ——用一个归一化流 p n , ϕ ( x ) p_{n,\phi}(x) p n , ϕ ( x ) 参数化噪声分布(流既能算密度、又能采样,正好满足 NCE 的两个要求),判别器
D θ , Z , ϕ ( x ) = e f θ ( x ) e f θ ( x ) + p n , ϕ ( x ) Z , D_{\theta,Z,\phi}(x) = \frac{e^{f_\theta(x)}}{e^{f_\theta(x)} + p_{n,\phi}(x)Z}, D θ , Z , ϕ ( x ) = e f θ ( x ) + p n , ϕ ( x ) Z e f θ ( x ) ,
并训练流去最小化 D J S ( p data , p n , ϕ ) D_{\mathrm{JS}}(p_{\text{data}}, p_{n,\phi}) D JS ( p data , p n , ϕ ) :
min ϕ max θ , Z E x ∼ p data [ log D θ , Z , ϕ ( x ) ] + E x ∼ p n , ϕ [ log ( 1 − D θ , Z , ϕ ( x ) ) ] . \min_\phi\max_{\theta,Z}\mathbb{E}_{x \sim p_{\text{data}}}[\log D_{\theta,Z,\phi}(x)] + \mathbb{E}_{x \sim p_{n,\phi}}[\log(1 - D_{\theta,Z,\phi}(x))]. min ϕ max θ , Z E x ∼ p data [ log D θ , Z , ϕ ( x )] + E x ∼ p n , ϕ [ log ( 1 − D θ , Z , ϕ ( x ))] .
流扮演了 GAN 里生成器的角色,让分类始终保持困难。slide 19 是 FCE 在 SVHN、CIFAR-10、CelebA 上的样本。
代码 03 第 2 部分以同一个较弱的流为起点,比较几种用法:
数据 方法 能量模型的 KL x 1 < 0 x_1 < 0 x 1 < 0 的质量学到的 / 真实 log Z 流最后的 KL 两个高斯 0.8 / 0.2 流本身(最大似然) 0.039 0.801 — — 流 + 修正 (f = log p 流 + g f = \log p_{\text{流}} + g f = log p 流 + g ,NCE)0.016 0.794 +0.068 / +0.069 (不变) 流对比估计 0.013 0.766 +0.040 / +0.128 0.032 对抗训练(§5.2) 0.509 0.353 — 0.140 双月牙 流本身 0.287 0.502 — — 流 + 修正 0.064 0.475 +0.077 / +0.065 (不变) 流对比估计 0.104 0.458 +0.042 / +0.060 0.328 对抗训练 0.777 0.495 — 0.823
流 + 修正 (slide 13 的 p n D / ( 1 − D ) p_nD/(1-D) p n D / ( 1 − D ) ,写成能量模型就是 f θ = log p n + g θ f_\theta = \log p_n + g_\theta f θ = log p n + g θ ):能量网络只需要学”数据比流多 / 少多少”这个比值 ,KL 比流本身小一半以上,学到的 log Z \log Z log Z 几乎精确。噪声已经接近数据时,剩下的修正很简单。
流对比估计 :能量模型学得不错;流本身几乎没变好(双月牙上反而从 0.287 变成 0.328)——它的任务是”让分类变难”(最小化 JS,像 GAN 的生成器),不是拟合似然。
一个附带的教训(README 第 4 条):直接拿一个很好 的流当噪声、而能量网络要从头学整个 log p \log p log p 时,双月牙上的 NCE 反而更差——分类太难、信号太弱。让能量模型只学残差 才是用好一个强基础模型的方式。
5.2 对抗训练能量模型
slide 20:用一个变分分布 q ϕ ( x ) q_\phi(x) q ϕ ( x ) 给对数似然一个上界 :
E p data [ log p θ ( x ) ] = E p data [ f θ ( x ) ] − log Z ( θ ) = E p data [ f θ ( x ) ] − log ∫ q ϕ ( x ) e f θ ( x ) q ϕ ( x ) d x ≤ E p data [ f θ ( x ) ] − ∫ q ϕ ( x ) log e f θ ( x ) q ϕ ( x ) d x = E p data [ f θ ( x ) ] − E q ϕ [ f θ ( x ) ] − H ( q ϕ ( x ) ) . \begin{aligned}
\mathbb{E}_{p_{\text{data}}}[\log p_\theta(x)] &= \mathbb{E}_{p_{\text{data}}}[f_\theta(x)] - \log Z(\theta) = \mathbb{E}_{p_{\text{data}}}[f_\theta(x)] - \log\int q_\phi(x)\frac{e^{f_\theta(x)}}{q_\phi(x)}dx \\
&\leq \mathbb{E}_{p_{\text{data}}}[f_\theta(x)] - \int q_\phi(x)\log\frac{e^{f_\theta(x)}}{q_\phi(x)}dx = \mathbb{E}_{p_{\text{data}}}[f_\theta(x)] - \mathbb{E}_{q_\phi}[f_\theta(x)] - H(q_\phi(x)).
\end{aligned} E p data [ log p θ ( x )] = E p data [ f θ ( x )] − log Z ( θ ) = E p data [ f θ ( x )] − log ∫ q ϕ ( x ) q ϕ ( x ) e f θ ( x ) d x ≤ E p data [ f θ ( x )] − ∫ q ϕ ( x ) log q ϕ ( x ) e f θ ( x ) d x = E p data [ f θ ( x )] − E q ϕ [ f θ ( x )] − H ( q ϕ ( x )) .
(Jensen:− log -\log − log 是凸的,− log E q [ ⋅ ] ≤ E q [ − log ⋅ ] -\log\mathbb{E}_q[\cdot] \leq \mathbb{E}_q[-\log\cdot] − log E q [ ⋅ ] ≤ E q [ − log ⋅ ] 。)对抗训练 :
max θ min ϕ E p data [ f θ ( x ) ] − E q ϕ [ f θ ( x ) ] − H ( q ϕ ( x ) ) . \max_\theta\min_\phi\;\mathbb{E}_{p_{\text{data}}}[f_\theta(x)] - \mathbb{E}_{q_\phi}[f_\theta(x)] - H(q_\phi(x)). max θ min ϕ E p data [ f θ ( x )] − E q ϕ [ f θ ( x )] − H ( q ϕ ( x )) .
对 ϕ \phi ϕ 最小化等价于最小化 D K L ( q ϕ ∥ p θ ) D_{\mathrm{KL}}(q_\phi \Vert p_\theta) D KL ( q ϕ ∥ p θ ) (上界在 q ϕ = p θ q_\phi = p_\theta q ϕ = p θ 时变紧);对 θ \theta θ 最大化则是”用 q ϕ q_\phi q ϕ 的样本当负样本”的对比散度。对 q ϕ q_\phi q ϕ 有什么要求? 能采样、能算熵(所以流很合适),还要足够灵活、训练得足够好。
代码 03 里这一条最难调:每次能量模型更新后流只追 1 次时直接发散(KL 30 以上);追 10 次、能量模型用很小的学习率才勉强稳定,但左边的质量仍在 0.84 → 0.90 → 0.35 之间摆动,1,500 步后不如其他方法(上表)。原因和第 9 讲一样:这是一个极小极大问题;而且 q ϕ q_\phi q ϕ 用反向 KL 追能量模型,天然倾向于只覆盖一部分模式,上界并不紧。
6. 结论 · Conclusion
slide 21:
能量模型是非常灵活的概率模型,配分函数不可算。
采样难,通常需要迭代的 MCMC。
计算似然难;比较 两个点的似然 / 概率是可算的。
最大似然训练用对比散度,每次训练迭代都要采样。
不采样的训练:得分匹配 。
不采样的训练:噪声对比估计 ,附带一个配分函数的估计。
不采样的训练:对抗优化 。
参考:Yang Song & Durk Kingma, How to Train Your Energy-Based Models 。
代码 04 在完全相同的条件下(能量网络 64 × 2、同样的初始化、2,000 步、Adam lr = 3e-3)把它们放在一起:
数据 训练方法 需要什么 用时 KL x 1 < 0 x_1 < 0 x 1 < 0 的质量(真实)最重的格子 两个高斯 0.8 / 0.2 精确最大似然(网格 log Z) Z Z Z (数值积分)14 秒 0.018 0.756(0.799) 0.5% CD-10 MCMC 样本 6 秒 0.712 0.997 0.6% PCD-10 MCMC 样本 6 秒 17.000 0.000 0.8% 得分匹配 ∇ x 2 f \nabla_x^2 f ∇ x 2 f (d d d 次反向传播)4 秒 0.644 0.996 0.6% NCE(矩匹配噪声) 已知密度的噪声 1 秒 0.023 0.847 0.6% 双月牙 精确最大似然 15 秒 0.031 0.504(0.500) 0.2% CD-10 6 秒 1,747,647 0.000 100% PCD-10 6 秒 173,728 1.000 100% 得分匹配 4 秒 0.091 0.602 0.3% NCE 1 秒 0.064 0.459 0.3%
(“最重的格子” = 网格 1 万个格子中质量最大的那个;健康的模型不到 1%。)
两个分开的模式:只有 NCE 接近正确的权重。CD、得分匹配把质量放到了左边,PCD 全放到了右边——三种方法以不同的原因犯了同一个错误。
双月牙:得分匹配和 NCE 都和精确最大似然在同一个量级;CD-10 和 PCD-10 坍塌了 :f f f 在某一点比其他地方高出几万甚至上百万,一个格子拿走了全部质量。CD 的尖峰在下弧外侧一点点的地方——从数据出发的短链很少走到那里,f f f 被抬高以后没有样本去把它压下来,越长越高。同样的学习率在两个高斯上没有坍塌——基于采样的训练对数据形状和超参数都很敏感。
没有一种方法在所有情形下都最好。 第 13 讲的得分模型直接学 ∇ x log p \nabla_x\log p ∇ x log p ,并用”多个噪声尺度”同时缓解得分匹配的两个问题:迹的代价(去噪得分匹配)和模式权重(退火的朗之万)。
7. 2023 年之后 · Since 2023
NCE 的后代无处不在。 对比表示学习里的 InfoNCE(CPC、SimCLR、CLIP)是 NCE 的多类别版本:把”数据 vs 噪声”变成”正确的配对 vs 一批错误的配对”。SigLIP(Zhai et al., ICCV 2023)把 CLIP 的 softmax 损失换回逐对的 sigmoid(二分类) 损失——又回到了 slide 12 的原始形式,并发现它在大批量下更省内存、效果更好。
残差能量模型 + NCE 修正大模型。 §5.1 的”流 + 修正”有一个直接的语言模型版本:以一个预训练的语言模型为噪声 / 基础模型,用 NCE 训练一个能量函数修正它(Residual EBM,Deng et al. 2020);Energy-Based Diffusion Language Models (Xu et al., ICLR 2025)把同样的思路用在离散扩散语言模型上,用能量函数修正扩散模型逐 token 独立去噪带来的误差(第 18 讲的离散扩散)。
得分匹配成了主角。 去噪得分匹配(下一讲)几乎是今天所有扩散模型的训练目标;本讲的显式得分匹配因为迹太贵,主要用于低维问题和理论分析。
MCMC 没有消失。 组合多个扩散模型、或者在推理时加约束时,常用 MALA、HMC 这类带 Metropolis 校正的采样器修正”直接把得分相加”的偏差(第 11 讲 §7 的 Reduce, Reuse, Recycle )——本讲 §2.3 的 ULA vs MALA 正是其中的道理。
8. 小结 · Summary
MH :只用 f f f 的差,满足细致平衡 → p θ p_\theta p θ 是平稳分布;混合速度由 λ 2 \lambda_2 λ 2 决定,低谷越深越慢(小链实验:低谷降到峰值的 0.05% 时要 1.4 万步)。未调整的朗之万 有 O ( ϵ ) O(\epsilon) O ( ϵ ) 偏差(高斯目标:方差 1 / ( 1 − ϵ / 2 ) 1/(1 - \epsilon/2) 1/ ( 1 − ϵ /2 ) ),MALA 用 MH 校正消除它。随机游走 MH 每步效率约按 1 / d 1/d 1/ d 下降,MALA 慢得多;多峰时没有一个步长同时做到局部走得好、跨得过去。
得分匹配 :得分 ∇ x f θ \nabla_x f_\theta ∇ x f θ 与 Z Z Z 无关;最小化 Fisher 散度,分部积分把 ∇ log p data \nabla\log p_{\text{data}} ∇ log p data 消掉,得到 E [ 1 2 ∥ ∇ f ∥ 2 + t r ∇ 2 f ] \mathbb{E}[\frac12\Vert\nabla f\Vert^2 + \mathrm{tr}\nabla^2 f] E [ 2 1 ∥∇ f ∥ 2 + tr ∇ 2 f ] ——只需要数据、不采样。代价:迹要 d d d 次反向传播。盲点:Fisher 散度对分开模式的权重几乎不敏感(KL 3.2 nat 时 Fisher 只有 0.022),所以学不到相对权重。
NCE :把判别器参数化成 e f e f + Z p n \frac{e^f}{e^f + Zp_n} e f + Z p n e f ,最优时 e f / Z = p data e^f/Z = p_{\text{data}} e f / Z = p data 且 Z Z Z 是真正的配分函数。能学到模式权重(噪声覆盖全局);噪声太宽统计效率低,太窄则失败;以一个流为基础、只学残差时效果最好、log Z \log Z log Z 最准。
NCE vs GAN :都是分类;NCE 的噪声固定(无极小极大)但需要噪声的密度。流对比估计 让流对抗地充当噪声;对抗训练 给似然一个上界,但极小极大优化难以稳定。
同一条件下的比较:精确最大似然只在低维可行;CD / PCD 可能学错权重甚至坍塌成尖峰;得分匹配快但看不见权重;NCE 在这两个例子里最稳。没有万能的方法。
9. 常见误区 · Common pitfalls
“MCMC 迟早会收敛,所以多跑几步就行。” “迟早”可能是上万甚至上亿步(§2.2);而且未调整的朗之万即使跑无穷久也有偏差(§2.3)。
“朗之万的步长越小越好。” 偏差变小,但混合变慢;MALA 才能在较大步长下保持无偏。
“得分匹配和最大似然等价。” 两者的最优解在模型族包含真实分布时相同(对单个高斯也相同,§3.4),但一般情况下优化的是不同的散度——在分开的模式上差别巨大(§3.6)。
“得分匹配不需要任何假设。” 分部积分要求 p data p_{\text{data}} p data 在边界处趋于零(练习 4);还要求 f θ f_\theta f θ 二阶可导。
“NCE 学到的 Z Z Z 就是精确的配分函数。” 只在最优解处成立;有限训练下,噪声不合适时偏差可达 0.5(§4.4)。
“噪声越接近数据越好,所以直接用最好的模型当噪声。” 如果能量网络要从头学整个 log p \log p log p ,太像数据的噪声会让分类信号太弱;更好的做法是让能量模型只学相对于噪声的残差(§5.1)。
“NCE 就是 GAN。” 判别器的形式和损失相同,但 NCE 的噪声固定、需要噪声的密度、学的是能量模型;GAN 的生成器在变、只需要采样、学的是采样器(§4.5)。
“不采样的方法总比 CD 好。” 得分匹配同样学不到模式权重;对抗训练同样需要极小极大。各有各的失败方式(§6)。
10. 练习 · Exercises
练习 1(细致平衡 ⇒ 平稳)
证明:若转移核满足 p ( x ) T x → x ′ = p ( x ′ ) T x ′ → x p(x)T_{x \to x'} = p(x')T_{x' \to x} p ( x ) T x → x ′ = p ( x ′ ) T x ′ → x 对所有 x , x ′ x, x' x , x ′ 成立,则 p p p 是平稳分布。反过来,平稳分布一定满足细致平衡吗?
参考答案
∑ x p ( x ) T x → x ′ = ∑ x p ( x ′ ) T x ′ → x = p ( x ′ ) ∑ x T x ′ → x = p ( x ′ ) \sum_xp(x)T_{x \to x'} = \sum_xp(x')T_{x' \to x} = p(x')\sum_xT_{x' \to x} = p(x') ∑ x p ( x ) T x → x ′ = ∑ x p ( x ′ ) T x ′ → x = p ( x ′ ) ∑ x T x ′ → x = p ( x ′ ) 。反过来不一定:细致平衡是”每一对状态之间的流量平衡”,平稳只要求”每个状态的总流入 = 总流出”。例如在一个环上总是顺时针走一步的链,均匀分布是平稳分布,但 p ( x ) T x → x + 1 > 0 = p ( x + 1 ) T x + 1 → x p(x)T_{x \to x+1} > 0 = p(x+1)T_{x+1 \to x} p ( x ) T x → x + 1 > 0 = p ( x + 1 ) T x + 1 → x 。MH 构造的是满足更强条件(细致平衡、可逆)的链。
练习 2(Hastings 修正与 MALA)
提议 q ( x ′ ∣ x ) q(x' \mid x) q ( x ′ ∣ x ) 不对称时,证明接受概率 α = min ( 1 , e f ( x ′ ) q ( x ∣ x ′ ) e f ( x ) q ( x ′ ∣ x ) ) \alpha = \min\left(1, \frac{e^{f(x')}q(x \mid x')}{e^{f(x)}q(x' \mid x)}\right) α = min ( 1 , e f ( x ) q ( x ′ ∣ x ) e f ( x ′ ) q ( x ∣ x ′ ) ) 满足细致平衡。MALA 的提议是 q ( x ′ ∣ x ) = N ( x ′ ; x + ϵ ∇ f ( x ) , 2 ϵ I ) q(x' \mid x) = \mathcal{N}(x'; x + \epsilon\nabla f(x), 2\epsilon I) q ( x ′ ∣ x ) = N ( x ′ ; x + ϵ ∇ f ( x ) , 2 ϵ I ) ,写出 log q ( x ∣ x ′ ) q ( x ′ ∣ x ) \log\frac{q(x \mid x')}{q(x' \mid x)} log q ( x ′ ∣ x ) q ( x ∣ x ′ ) 。
参考答案
不妨设比值 < 1:p ( x ) q ( x ′ ∣ x ) α = e f ( x ) Z q ( x ′ ∣ x ) e f ( x ′ ) q ( x ∣ x ′ ) e f ( x ) q ( x ′ ∣ x ) = e f ( x ′ ) Z q ( x ∣ x ′ ) p(x)q(x' \mid x)\alpha = \frac{e^{f(x)}}{Z}q(x' \mid x)\frac{e^{f(x')}q(x \mid x')}{e^{f(x)}q(x' \mid x)} = \frac{e^{f(x')}}{Z}q(x \mid x') p ( x ) q ( x ′ ∣ x ) α = Z e f ( x ) q ( x ′ ∣ x ) e f ( x ) q ( x ′ ∣ x ) e f ( x ′ ) q ( x ∣ x ′ ) = Z e f ( x ′ ) q ( x ∣ x ′ ) ,而反方向接受概率为 1,p ( x ′ ) q ( x ∣ x ′ ) ⋅ 1 p(x')q(x \mid x')\cdot 1 p ( x ′ ) q ( x ∣ x ′ ) ⋅ 1 相同。MALA:log q ( x ∣ x ′ ) q ( x ′ ∣ x ) = − ∥ x − x ′ − ϵ ∇ f ( x ′ ) ∥ 2 4 ϵ + ∥ x ′ − x − ϵ ∇ f ( x ) ∥ 2 4 ϵ \log\frac{q(x \mid x')}{q(x' \mid x)} = -\frac{\Vert x - x' - \epsilon\nabla f(x')\Vert^2}{4\epsilon} + \frac{\Vert x' - x - \epsilon\nabla f(x)\Vert^2}{4\epsilon} log q ( x ′ ∣ x ) q ( x ∣ x ′ ) = − 4 ϵ ∥ x − x ′ − ϵ ∇ f ( x ′ ) ∥ 2 + 4 ϵ ∥ x ′ − x − ϵ ∇ f ( x ) ∥ 2 (代码 01 ula_mala 里的 log_q_bwd − log_q_fwd)。
练习 3(ULA 的偏差)
目标 N ( 0 , s 2 ) \mathcal{N}(0, s^2) N ( 0 , s 2 ) ,ULA 更新 x ′ = x − ϵ s 2 x + 2 ϵ ξ x' = x - \frac{\epsilon}{s^2}x + \sqrt{2\epsilon}\xi x ′ = x − s 2 ϵ x + 2 ϵ ξ 。求平稳方差,并说明 ϵ \epsilon ϵ 多大时链会发散。
参考答案
v = ( 1 − ϵ / s 2 ) 2 v + 2 ϵ ⇒ v = 2 ϵ 1 − ( 1 − ϵ / s 2 ) 2 = s 2 1 − ϵ / ( 2 s 2 ) v = (1 - \epsilon/s^2)^2v + 2\epsilon \Rightarrow v = \frac{2\epsilon}{1 - (1 - \epsilon/s^2)^2} = \frac{s^2}{1 - \epsilon/(2s^2)} v = ( 1 − ϵ / s 2 ) 2 v + 2 ϵ ⇒ v = 1 − ( 1 − ϵ / s 2 ) 2 2 ϵ = 1 − ϵ / ( 2 s 2 ) s 2 。s = 1 s = 1 s = 1 时即代码 01 的 1 / ( 1 − ϵ / 2 ) 1/(1 - \epsilon/2) 1/ ( 1 − ϵ /2 ) 。需要 ∣ 1 − ϵ / s 2 ∣ < 1 |1 - \epsilon/s^2| < 1 ∣1 − ϵ / s 2 ∣ < 1 ,即 ϵ < 2 s 2 \epsilon < 2s^2 ϵ < 2 s 2 ;ϵ ≥ 2 s 2 \epsilon \geq 2s^2 ϵ ≥ 2 s 2 时方差发散。高维里 s s s 取最窄方向的尺度——这就是 ULA 的步长受”最尖的那个方向”限制的原因。
练习 4(分部积分的边界条件)
p data p_{\text{data}} p data 是 [ 0 , ∞ ) [0, \infty) [ 0 , ∞ ) 上的指数分布 λ e − λ x \lambda e^{-\lambda x} λ e − λ x ,模型 p θ ( x ) = θ e − θ x p_\theta(x) = \theta e^{-\theta x} p θ ( x ) = θ e − θ x 。(a) 计算真正的 Fisher 散度。(b) 计算”得分匹配目标”E [ 1 2 s θ 2 + s θ ′ ] \mathbb{E}[\frac12 s_\theta^2 + s_\theta'] E [ 2 1 s θ 2 + s θ ′ ] 并求它的最小值点。两者一致吗?问题出在哪里?
参考答案
(a) 两个得分都是常数:s data = − λ s_{\text{data}} = -\lambda s data = − λ ,s θ = − θ s_\theta = -\theta s θ = − θ ,D F = 1 2 ( θ − λ ) 2 D_F = \frac12(\theta - \lambda)^2 D F = 2 1 ( θ − λ ) 2 ,最小在 θ = λ \theta = \lambda θ = λ 。(b) 1 2 θ 2 + 0 \frac12\theta^2 + 0 2 1 θ 2 + 0 ,最小在 θ = 0 \theta = 0 θ = 0 ——错了。分部积分的边界项 − p data ( x ) s θ ( x ) ∣ 0 ∞ = p data ( 0 ) s θ ( 0 ) = − λ θ ≠ 0 -p_{\text{data}}(x)s_\theta(x)|_0^\infty = p_{\text{data}}(0)s_\theta(0) = -\lambda\theta \neq 0 − p data ( x ) s θ ( x ) ∣ 0 ∞ = p data ( 0 ) s θ ( 0 ) = − λ θ = 0 :p data p_{\text{data}} p data 在边界 0 处不为零。补上边界项后目标变成 1 2 θ 2 − λ θ \frac12\theta^2 - \lambda\theta 2 1 θ 2 − λ θ ,最小在 θ = λ \theta = \lambda θ = λ ,正确。有界支撑的数据需要修改过的得分匹配(Hyvärinen 2007 对非负数据的版本)。
练习 5(单个高斯的得分匹配解)
模型 N ( μ , σ 2 ) \mathcal{N}(\mu, \sigma^2) N ( μ , σ 2 ) ,证明得分匹配目标 E p [ ( x − μ ) 2 2 σ 4 − 1 σ 2 ] \mathbb{E}_p[\frac{(x-\mu)^2}{2\sigma^4} - \frac{1}{\sigma^2}] E p [ 2 σ 4 ( x − μ ) 2 − σ 2 1 ] 的最小值点是 μ = E p [ x ] \mu = \mathbb{E}_p[x] μ = E p [ x ] 、σ 2 = V a r p [ x ] \sigma^2 = \mathrm{Var}_p[x] σ 2 = Var p [ x ] 。
参考答案
对 μ \mu μ :− E [ ( x − μ ) ] / σ 4 = 0 ⇒ μ = E [ x ] -\mathbb{E}[(x - \mu)]/\sigma^4 = 0 \Rightarrow \mu = \mathbb{E}[x] − E [( x − μ )] / σ 4 = 0 ⇒ μ = E [ x ] 。代入,目标 = V 2 σ 4 − 1 σ 2 = \frac{V}{2\sigma^4} - \frac{1}{\sigma^2} = 2 σ 4 V − σ 2 1 (V = V a r [ x ] V = \mathrm{Var}[x] V = Var [ x ] );令 u = 1 / σ 2 u = 1/\sigma^2 u = 1/ σ 2 ,目标 = V 2 u 2 − u = \frac{V}{2}u^2 - u = 2 V u 2 − u ,最小在 u = 1 / V u = 1/V u = 1/ V ,即 σ 2 = V \sigma^2 = V σ 2 = V 。和最大似然(矩匹配)相同——代码 02 第 2 部分的 ( − 0.8 , 1.9 ) (-0.8, 1.9) ( − 0.8 , 1.9 ) 。
练习 6(Fisher 散度为什么看不见权重)
设 p = w N ( − a , σ 2 ) + ( 1 − w ) N ( a , σ 2 ) p = w\mathcal{N}(-a, \sigma^2) + (1-w)\mathcal{N}(a, \sigma^2) p = w N ( − a , σ 2 ) + ( 1 − w ) N ( a , σ 2 ) ,q q q 是同样的成分、权重 w ′ w' w ′ 。粗略地论证:当 a / σ → ∞ a/\sigma \to \infty a / σ → ∞ 时 D F ( p , q ) → 0 D_F(p, q) \to 0 D F ( p , q ) → 0 ,而 D K L ( p ∥ q ) → w log w w ′ + ( 1 − w ) log 1 − w 1 − w ′ D_{\mathrm{KL}}(p \Vert q) \to w\log\frac{w}{w'} + (1 - w)\log\frac{1-w}{1-w'} D KL ( p ∥ q ) → w log w ′ w + ( 1 − w ) log 1 − w ′ 1 − w 。
参考答案
在左峰附近 ∇ log p = − x + a σ 2 + O ( e − 2 a x / σ 2 ) \nabla\log p = -\frac{x + a}{\sigma^2} + O(e^{-2ax/\sigma^2}) ∇ log p = − σ 2 x + a + O ( e − 2 a x / σ 2 ) 的修正项来自右峰的贡献,对 q q q 也一样,差值是指数小的;只有在 x ≈ 0 x \approx 0 x ≈ 0 (两峰之间)两者的得分才有 O ( a / σ 2 ) O(a/\sigma^2) O ( a / σ 2 ) 量级的差别,而那里 p ( x ) ≈ e − a 2 / ( 2 σ 2 ) p(x) \approx e^{-a^2/(2\sigma^2)} p ( x ) ≈ e − a 2 / ( 2 σ 2 ) 指数小。所以 D F D_F D F 被一个 e − a 2 / ( 2 σ 2 ) ⋅ p o l y ( a / σ ) e^{-a^2/(2\sigma^2)}\cdot\mathrm{poly}(a/\sigma) e − a 2 / ( 2 σ 2 ) ⋅ poly ( a / σ ) 的因子压制,趋于 0。KL 则是两个”几乎不重叠的成分”之间权重的 KL,即两点分布 ( w , 1 − w ) (w, 1-w) ( w , 1 − w ) 与 ( w ′ , 1 − w ′ ) (w', 1-w') ( w ′ , 1 − w ′ ) 的 KL——与 a a a 无关。代码 02 第 3 部分(a / σ = 4 a/\sigma = 4 a / σ = 4 ):w ′ = 0.2 w' = 0.2 w ′ = 0.2 时 KL 0.83(两点 KL 的值是 0.832),Fisher 只有 0.003。
练习 7(NCE 的最优 Z)
按 slide 14 的论证证明:若存在 θ ∗ \theta^* θ ∗ 使 e f θ ∗ ∝ p data e^{f_{\theta^*}} \propto p_{\text{data}} e f θ ∗ ∝ p data ,则 NCE 目标的全局最优解满足 Z ∗ = ∫ e f θ ∗ Z^* = \int e^{f_{\theta^*}} Z ∗ = ∫ e f θ ∗ 。再说明:如果把 Z Z Z 当作自由参数代入最大似然 目标 E [ f θ ( x ) ] − log Z \mathbb{E}[f_\theta(x)] - \log Z E [ f θ ( x )] − log Z ,会发生什么?
参考答案
NCE 目标是”数据 vs 噪声”的二分类交叉熵,在判别器可以取任意函数时的最大值点是 D ∗ = p data p data + p n D^* = \frac{p_{\text{data}}}{p_{\text{data}} + p_n} D ∗ = p data + p n p data ;参数化后 D θ , Z = e f θ / Z e f θ / Z + p n D_{\theta,Z} = \frac{e^{f_\theta}/Z}{e^{f_\theta}/Z + p_n} D θ , Z = e f θ / Z + p n e f θ / Z ,要等于 D ∗ D^* D ∗ 就必须 e f θ / Z = p data e^{f_\theta}/Z = p_{\text{data}} e f θ / Z = p data (对所有 p n > 0 p_n > 0 p n > 0 的点),两边积分得 Z = ∫ e f θ Z = \int e^{f_\theta} Z = ∫ e f θ 。最大似然里 Z Z Z 只以 − log Z -\log Z − log Z 出现,单调递减:最大化会让 Z → 0 Z \to 0 Z → 0 、目标 → + ∞ \to +\infty → + ∞ ——似然只有在 Z Z Z 被约束为真正的配分函数时才有意义,而 NCE 的目标对 Z Z Z 自带”两侧的惩罚”。
练习 8(对抗训练的上界)
验证 slide 20 的不等式,并证明:对固定的 θ \theta θ ,min ϕ \min_\phi min ϕ 等价于 min ϕ D K L ( q ϕ ∥ p θ ) \min_\phi D_{\mathrm{KL}}(q_\phi \Vert p_\theta) min ϕ D KL ( q ϕ ∥ p θ ) ,且最小值处上界等于 E p data [ log p θ ] \mathbb{E}_{p_{\text{data}}}[\log p_\theta] E p data [ log p θ ] 。
参考答案
E q [ f θ ] + H ( q ) = E q [ f θ − log q ] = E q [ log p θ q ] + log Z = log Z − D K L ( q ∥ p θ ) ≤ log Z \mathbb{E}_q[f_\theta] + H(q) = \mathbb{E}_q[f_\theta - \log q] = \mathbb{E}_q[\log\frac{p_\theta}{q}] + \log Z = \log Z - D_{\mathrm{KL}}(q \Vert p_\theta) \leq \log Z E q [ f θ ] + H ( q ) = E q [ f θ − log q ] = E q [ log q p θ ] + log Z = log Z − D KL ( q ∥ p θ ) ≤ log Z 。所以上界 = E p data [ f θ ] − log Z + D K L ( q ∥ p θ ) = E p data [ log p θ ] + D K L ( q ∥ p θ ) = \mathbb{E}_{p_{\text{data}}}[f_\theta] - \log Z + D_{\mathrm{KL}}(q \Vert p_\theta) = \mathbb{E}_{p_{\text{data}}}[\log p_\theta] + D_{\mathrm{KL}}(q \Vert p_\theta) = E p data [ f θ ] − log Z + D KL ( q ∥ p θ ) = E p data [ log p θ ] + D KL ( q ∥ p θ ) 。对 ϕ \phi ϕ 最小化就是最小化反向 KL,q = p θ q = p_\theta q = p θ 时取等号。反向 KL 是模式寻找的(第 4 讲),所以实践中 q q q 常常只盖住 p θ p_\theta p θ 的一部分,上界不紧——代码 03 中对抗训练的振荡与此有关。
练习 9(流 + 修正)
设基础模型 p n p_n p n 是一个流,能量模型写成 f θ ( x ) = log p n ( x ) + g θ ( x ) f_\theta(x) = \log p_n(x) + g_\theta(x) f θ ( x ) = log p n ( x ) + g θ ( x ) 。(a) NCE 的判别器 D θ , Z D_{\theta,Z} D θ , Z 变成什么?(b) 若 p n = p data p_n = p_{\text{data}} p n = p data ,最优的 g θ g_\theta g θ 和 Z Z Z 是什么?(c) 为什么这比”f θ f_\theta f θ 从头学、p n p_n p n 只当噪声”更容易?
参考答案
(a) D = p n e g p n e g + Z p n = σ ( g θ ( x ) − log Z ) D = \frac{p_ne^{g}}{p_ne^{g} + Zp_n} = \sigma(g_\theta(x) - \log Z) D = p n e g + Z p n p n e g = σ ( g θ ( x ) − log Z ) ——p n p_n p n 被约掉了,判别器只依赖残差 g g g 。(b) 最优时 p n e g / Z = p data = p n p_ne^g/Z = p_{\text{data}} = p_n p n e g / Z = p data = p n ,所以 g ≡ log Z g \equiv \log Z g ≡ log Z ,可以取 g = 0 g = 0 g = 0 、Z = 1 Z = 1 Z = 1 。(c) 能量网络只需要表示 log p data p n \log\frac{p_{\text{data}}}{p_n} log p n p data ——当基础模型已经不错时,这是一个平缓、接近常数的函数;而”从头学”要表示整个 log p data \log p_{\text{data}} log p data ,同时分类信号又很弱(噪声接近数据)。代码 03:流 + 修正把双月牙上的 KL 从 0.287 降到 0.064。
练习 10(动手:换一种噪声)
在 03_nce.py 第 1 部分加一种噪声:数据的核密度估计 (比如 500 个训练点、带宽 0.3 的高斯混合)。预测它和矩匹配的高斯、流噪声相比会怎样,然后运行验证。
参考答案(预测的思路)
核密度估计在两个模式上都有质量、权重也接近 0.8 / 0.2,所以应该能学对权重;它比矩匹配的高斯更接近数据,分类更难、NCE 更高效。但带宽 0.3 时 KDE 比真实分布宽,能量模型要学的 log p data \log p_{\text{data}} log p data 仍是完整的(不是残差);若同时改成”KDE + 修正”(练习 9),效果应该更好。具体数字以你的运行为准。
11. 延伸阅读 · Further reading
原课材料
MCMC
Metropolis et al., Equation of State Calculations by Fast Computing Machines , 1953;Hastings, Monte Carlo Sampling Methods Using Markov Chains and Their Applications , Biometrika 1970
Roberts & Tweedie, Exponential Convergence of Langevin Distributions and Their Discrete Approximations , Bernoulli 1996(ULA 与 MALA)
Roberts & Rosenthal, Optimal Scaling for Various Metropolis–Hastings Algorithms , Statistical Science 2001
得分匹配与噪声对比估计
Hyvärinen, Estimation of Non-Normalized Statistical Models by Score Matching , JMLR 2005;Some Extensions of Score Matching , 2007(非负数据)
Gutmann & Hyvärinen, Noise-Contrastive Estimation: A New Estimation Principle for Unnormalized Statistical Models , AISTATS 2010
Grover, Song, Kapoor, Tran, Agarwal, Horvitz & Ermon, Bias Correction of Learned Generative Models using Likelihood-Free Importance Weighting , NeurIPS 2019;Grover & Ermon, Boosted Generative Models , AAAI 2018
Gao, Nijkamp, Kingma, Xu, Dai & Wu, Flow Contrastive Estimation of Energy-Based Models , CVPR 2020
Dai et al., Exponential Family Estimation via Adversarial Dynamics Embedding , NeurIPS 2019(对抗训练能量模型)
2023 年之后
Zhai, Mustafa, Kolesnikov & Beyer, Sigmoid Loss for Language Image Pre-Training (SigLIP), ICCV 2023
Deng, Bakhtin, Ott, Szlam & Ranzato, Residual Energy-Based Models for Text Generation , ICLR 2020;Xu et al., Energy-Based Diffusion Language Model for Text Generation , ICLR 2025
12. 下一讲预告 · Next lecture
得分匹配告诉我们:只要能估计 ∇ x log p ( x ) \nabla_x\log p(x) ∇ x log p ( x ) ,就能绕开 Z Z Z ,再用朗之万从它采样。第 13 讲(原课 Lecture 13,Score Based Models )把这个想法推到底——不再要求得分是某个能量函数的梯度 ,直接用一个神经网络输出向量场 s θ ( x ) ≈ ∇ x log p ( x ) s_\theta(x) \approx \nabla_x\log p(x) s θ ( x ) ≈ ∇ x log p ( x ) :
迹太贵怎么办:去噪得分匹配 (匹配加噪分布的得分,Tweedie 公式)和切片得分匹配 (随机投影 + 雅可比–向量积);
从得分到样本:朗之万 MCMC;
三个陷阱:流形假设、低密度区域估计不准、朗之万在模式之间混合太慢、权重错误 ——本讲 §3.6 和第 11 讲代码 04 已经见过这个陷阱;以及多个噪声尺度怎样同时解决它们。