Lecture 12 · 能量模型(二):MCMC、得分匹配与噪声对比估计 · Energy-Based Models II

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

课程源码 ZIP ↓

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

本篇目录

对应 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、把 ZZ 当参数、log-sum-exp 技巧、算法 → NCE 与 GAN 的比较 → 流对比估计 → 对抗训练能量模型 → 结论。MH 转移矩阵的精确分析与混合时间、未调整朗之万偏差的闭式验证、MALA、混合速度随维数的标度、Fisher 散度对模式权重的盲点、“流 + 修正”的残差能量模型、五种训练方法在同一条件下的比较是本讲义补充的。凡是能和真相比较的地方都比较了(小状态空间、一维网格、二维网格上的精确 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

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

  1. 证明 Metropolis–Hastings 满足细致平衡、因此以 pθp_\theta 为平稳分布;说明混合速度由什么决定,为什么多峰和高维会让 MCMC 变慢;推导未调整朗之万 MCMC 在高斯目标上的偏差,知道 MALA 怎样消除它。
  2. 说出得分函数 ∇xlog⁡pθ(x)=∇xfθ(x)\nabla_x\log p_\theta(x) = \nabla_x f_\theta(x) 为什么与 ZZ 无关;写出 Fisher 散度,用分部积分推导得分匹配目标 Epdata[12∥∇xfθ∥2+tr(∇x2fθ)]\mathbb{E}_{p_{\text{data}}}[\frac12\Vert\nabla_x f_\theta\Vert^2 + \mathrm{tr}(\nabla_x^2 f_\theta)],说明它的计算代价和一个根本的盲点(模式权重)。
  3. 推导噪声对比估计:最优判别器、把判别器参数化成 pθpθ+pn\frac{p_\theta}{p_\theta + p_n}、把 ZZ 当参数时最优解里 ZZ 恰好是配分函数;知道噪声分布该怎么选。
  4. 比较 NCE 与 GAN;理解流对比估计和对抗训练能量模型的思路与困难。
  5. 把第 11、12 讲的训练方法放在一张表里:各自需要什么、在什么情况下失败。

0.2 先修与本讲范围 Prerequisites & scope

默认你已经会 Assumed本讲只给直觉,后面几讲再展开 Previewed only
第 11 讲:能量模型、配分函数、对比散度、朗之万 MCMC去噪得分匹配、切片得分匹配(第 13 讲)
第 9 讲:判别器、最优判别器 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)=efθ(x)/Z(θ)p_\theta(x) = e^{f_\theta(x)}/Z(\theta)能量模型
Tx→x′T_{x \to x'}马尔可夫链从 xx 转移到 x′x' 的概率
sθ(x)=∇xlog⁡pθ(x)s_\theta(x) = \nabla_x\log p_\theta(x)(Stein)得分函数
DF(p,q)=12Ep∥∇xlog⁡p−∇xlog⁡q∥2D_F(p, q) = \frac12\mathbb{E}_p\Vert\nabla_x\log p - \nabla_x\log q\Vert^2Fisher 散度
pn(x)p_n(x)NCE 的噪声分布(已知密度、容易采样)
Dθ,Z(x)=efθ(x)efθ(x)+Zpn(x)D_{\theta,Z}(x) = \frac{e^{f_\theta(x)}}{e^{f_\theta(x)} + Zp_n(x)}NCE 的判别器
qϕ(x)q_\phi(x)流对比估计 / 对抗训练里的流

0.5 关于数字 · About the numbers

代码 01 的小链有 21 个状态,转移矩阵、特征值、任意步之后的分布都能精确计算。代码 02 的一维部分在细网格上精确积分;二维部分和第 11 讲一样,用网格上精确的 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)}。Z(θ)Z(\theta) 难算,所以没有似然。比较两个点的概率很容易:pθ(x′)/pθ(x)=exp⁡(fθ(x′)−fθ(x))p_\theta(x')/p_\theta(x) = \exp(f_\theta(x') - f_\theta(x))。最大似然训练 max⁡θ{fθ(xtrain)−log⁡Z(θ)}\max_\theta\{f_\theta(x_{\text{train}}) - \log Z(\theta)\};对比散度 ∇θfθ(xtrain)−∇θlog⁡Z(θ)≈∇θfθ(xtrain)−∇θfθ(xsample),xsample∼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).

第 11 讲的代码 04 留下一个教训:负样本来自 MCMC,而 MCMC 在分开的模式之间几乎不混合,于是 CD 学不到模式的相对权重,PCD 甚至失控。本讲先把采样讲清楚,再看两种不需要采样的训练方法。


2. 从能量模型采样 · Sampling from EBMs

2.1 Metropolis–Hastings

slide 3:

  1. x0∼π(x)x^0 \sim \pi(x);
  2. 对 t=0,1,…,T−1t = 0, 1, \dots, T-1:x′=xt+噪声x' = x^t + \text{噪声};若 fθ(x′)≥fθ(xt)f_\theta(x') \geq f_\theta(x^t),xt+1=x′x^{t+1} = x';若 fθ(x′)<fθ(xt)f_\theta(x') < f_\theta(x^t),以概率 exp⁡{fθ(x′)−fθ(xt)}\exp\{f_\theta(x') - f_\theta(x^t)\} 令 xt+1=x′x^{t+1} = x',否则 xt+1=xtx^{t+1} = x^t。

性质:理论上 xTx^T 在 T→∞T \to \infty 时收敛到 pθ(x)p_\theta(x)。为什么? 它满足细致平衡条件 pθ(x)Tx→x′=pθ(x′)Tx′→x,p_\theta(x)T_{x \to x'} = p_\theta(x')T_{x' \to x}, Tx→x′T_{x \to x'} 是从 xx 转移到 x′x' 的概率。于是如果 xtx^t 服从 pθp_\theta,xt+1x^{t+1} 也服从 pθp_\theta。

证明(对称提议 q(x′∣x)=q(x∣x′)q(x' \mid x) = q(x \mid x')):对 x′≠xx' \neq x,Tx→x′=q(x′∣x)min⁡(1,ef(x′)−f(x))T_{x \to x'} = q(x' \mid x)\min(1, e^{f(x') - f(x)})。不妨设 f(x′)<f(x)f(x') < f(x),则 p(x)Tx→x′=ef(x)Zq(x′∣x)ef(x′)−f(x)=ef(x′)Zq(x′∣x),p(x′)Tx′→x=ef(x′)Zq(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. 两者相等。细致平衡对 xx 求和:∑xp(x)Tx→x′=∑xp(x′)Tx′→x=p(x′)\sum_x p(x)T_{x \to x'} = \sum_x p(x')T_{x' \to x} = p(x')——pp 是平稳分布。(提议不对称时,接受概率要乘上 q(x∣x′)/q(x′∣x)q(x \mid x')/q(x' \mid x),即 Hastings 的修正,练习 2。)

实践中需要大量迭代,收敛速度随维数指数地变慢。

2.2 实验:一个可以精确分析的小链

代码 01 第 1 部分:21 个状态,提议”左右各一格”,把 MH 的转移矩阵 TT 精确地写出来。细致平衡的误差在 10−1710^{-17} 量级。收敛有多快由 TT 的第二大特征值 λ2\lambda_2 决定:误差约按 λ2t\lambda_2^t 衰减,1/(1−λ2)1/(1 - \lambda_2) 大致是混合需要的步数。

目标低谷 pp / 峰值 ppλ2\lambda_21/(1−λ2)1/(1 - \lambda_2)TV@100TV@1,000TV@10,000
单峰—0.9028100.0000.0000.000
双峰 6 / 14,σ2=4\sigma^2 = 40.270.98735790.1800.0000.000
双峰 5 / 15,σ2=2\sigma^2 = 20.00390.999572,2980.4830.3260.006
双峰 5 / 15,σ2=1.5\sigma^2 = 1.50.000480.9999314,1800.4970.4670.247

(TV@tt:从最左边的状态出发走 tt 步后,分布和 pp 的总变差距离。)低谷处的密度降到峰值的万分之五,混合就要上万步——大致和”低谷有多低”成反比,因为每次跨越都要连续接受一串”往下走”的提议。在混合之前,TV 停在 0.5 附近:质量全在左峰,右峰还没分到。第 11 讲代码 04 的低谷比峰值低 3,800 倍。

2.3 未调整的朗之万 MCMC

slide 4:

  1. x0∼π(x)x^0 \sim \pi(x);
  2. 对 t=0,1,…,T−1t = 0, 1, \dots, T-1:zt∼N(0,I)z^t \sim \mathcal{N}(0, I),xt+1=xt+ϵ∇xlog⁡pθ(x)∣x=xt+2ϵztx^{t+1} = x^t + \epsilon\nabla_x\log p_\theta(x)|_{x = x^t} + \sqrt{2\epsilon}z^t。

性质:xTx^T 在 T→∞T \to \infty 且 ϵ→0\epsilon \to 0 时收敛到 pθ(x)p_\theta(x) 的样本;对连续的能量模型 ∇xlog⁡pθ(x)=∇xfθ(x)\nabla_x\log p_\theta(x) = \nabla_x f_\theta(x);收敛随维数增长而变慢。高维空间中采样收敛很慢,因而非常昂贵,可对比散度在每一次训练迭代里都需要采样。

"ϵ→0\epsilon \to 0"不是一句客套话。代码 01 第 2 部分取目标 N(0,1)\mathcal{N}(0, 1):更新是 x′=(1−ϵ)x+2ϵξx' = (1 - \epsilon)x + \sqrt{2\epsilon}\xi,平稳方差 vv 满足 v=(1−ϵ)2v+2ϵv = (1-\epsilon)^2v + 2\epsilon,解得 v=11−ϵ/2≠1.v = \frac{1}{1 - \epsilon/2} \neq 1.

步长 ϵ\epsilonULA 理论方差ULA 实测MALA 实测MALA 接受率
0.11.05261.05160.994799.3%
0.51.33331.33080.999792.1%
1.02.00001.99780.999978.4%
1.54.00003.99631.000463.3%

未调整的朗之万(ULA)的平稳分布不是目标分布,偏差随步长增大。MALA(Metropolis-adjusted Langevin)把朗之万的一步当作 MH 的提议再做一次接受 / 拒绝(提议不对称,要用 Hastings 修正),偏差被精确消除;代价是 ϵ\epsilon 大时接受率下降。

2.4 维数与多峰

代码 01 第 3 部分:dd 维标准高斯,步长按理论最优尺度设置(随机游走 MH 的步长 ∝d−1/2\propto d^{-1/2},MALA 的 ∝d−1/3\propto d^{-1/3};Roberts & Rosenthal),每一步的有效样本数(ESS/步,1 = 每步一个独立样本):

dd141664256
随机游走 MH0.23050.07620.02080.00630.0023
MALA0.83000.43500.22730.12590.0737

随机游走 MH 每步的效率约按 1/d1/d 下降;利用梯度(得分)的 MALA 下降得慢得多。这还只是一个各向同性的高斯。

代码 01 第 4 部分:二维两个高斯((±2,0)(\pm2, 0),σ = 0.4),200 条 MH 链都从左峰出发,各跑 5,000 步:

提议步长0.10.41.02.54.0
接受率87.6%55.3%22.1%6.2%3.1%
最后在左边的比例(应为 0.5)1.000.970.470.410.54
每条链跨模式的次数0.00.04.635.932.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)。(Stein)得分函数: sθ(x):=∇xlog⁡pθ(x)=∇xfθ(x)−∇xlog⁡Z(θ)⏟=0=∇xfθ(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). 例子:高斯 pθ(x)=12πσe−(x−μ)22σ2p_\theta(x) = \frac{1}{\sqrt{2\pi}\sigma}e^{-\frac{(x-\mu)^2}{2\sigma^2}},sθ(x)=−x−μσ2s_\theta(x) = -\frac{x - \mu}{\sigma^2};Gamma pθ(x)=βαΓ(α)xα−1e−βxp_\theta(x) = \frac{\beta^\alpha}{\Gamma(\alpha)}x^{\alpha-1}e^{-\beta x},sθ(x)=α−1x−βs_\theta(x) = \frac{\alpha - 1}{x} - \beta。slide 6 的图把 pθ(x)p_\theta(x) 和 sθ(x)s_\theta(x) 画在一起:得分是一个向量场,指向密度增加最快的方向。

代码 02 第 1 部分用自动求导核对了这两个公式,并把 log⁡p\log p 加上 123.4(相当于换了一个 ZZ)——得分完全不变。

3.3 Fisher 散度与得分匹配

slide 7:观察:sθ(x)=∇xlog⁡pθ(x)s_\theta(x) = \nabla_x\log p_\theta(x) 与配分函数 Z(θ)Z(\theta) 无关。p(x)p(x) 和 q(x)q(x) 之间的 Fisher 散度: DF(p,q):=12Ex∼p[∥∇xlog⁡p(x)−∇xlog⁡q(x)∥22].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]. 得分匹配:最小化 pdata(x)p_{\text{data}}(x) 与能量模型 pθ(x)∝exp⁡{fθ(x)}p_\theta(x) \propto \exp\{f_\theta(x)\} 之间的 Fisher 散度, 12Ex∼pdata[∥∇xlog⁡pdata(x)−∇xfθ(x)∥22].\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].

问题:∇xlog⁡pdata(x)\nabla_x\log p_{\text{data}}(x) 未知,只有样本。

3.4 分部积分

slide 8(一维): 12Epdata[(∇xlog⁡pdata−∇xlog⁡pθ)2]=12∫pdata(∇xlog⁡pdata)2+12∫pdata(∇xlog⁡pθ)2−∫pdata∇xlog⁡pdata∇xlog⁡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. 用分部积分 ∫f′g=fg−∫g′f\int f'g = fg - \int g'f 处理交叉项: −∫pdata1pdata∇xpdata∇xlog⁡pθ dx=−pdata∇xlog⁡pθ∣−∞∞⏟=0+∫pdata∇x2log⁡pθ dx.-\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. 注意:需要假设 pdatap_{\text{data}} 衰减得足够快,x→±∞x \to \pm\infty 时 pdata(x)→0p_{\text{data}}(x) \to 0(练习 4 是一个不满足的例子)。

slide 9:于是 12Epdata[(∇xlog⁡pdata−∇xlog⁡pθ)2]=12∫pdata(∇xlog⁡pdata)2⏟与 θ 无关+Epdata[12(∇xlog⁡pθ)2+∇x2log⁡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]. 多维(分部积分即高斯散度定理): 12Epdata[∥∇xlog⁡pdata−∇xlog⁡pθ∥22]=Epdata[12∥∇xlog⁡pθ(x)∥22+tr(∇x2log⁡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{常数}.

代码 02 第 2 部分在一维网格上数值验证了这个等式(pdata=0.7 N(−2,0.52)+0.3 N(2,0.52)p_{\text{data}} = 0.7\,\mathcal{N}(-2, 0.5^2) + 0.3\,\mathcal{N}(2, 0.5^2),模型是单个高斯):

模型 N(μ,σ2)\mathcal{N}(\mu, \sigma^2)Fisher 散度(用真实得分)得分匹配目标(只用 pp)差
(−0.8,1.9)(-0.8, 1.9)1.858629−0.1385041.997134
(0,1)(0, 1)3.1221341.1250001.997134
(−2,0.5)(-2, 0.5)38.39713436.4000001.997134
(1,3)(1, 3)1.928306−0.0688271.997134

差是同一个常数 12Ep[(∇log⁡p)2]\frac12\mathbb{E}_p[(\nabla\log p)^2]。顺便:单个高斯的 Fisher 最优解是 μ=Ep[x]\mu = \mathbb{E}_p[x]、σ2=Varp[x]\sigma^2 = \mathrm{Var}_p[x](练习 5)——和最大似然相同。

3.5 算法与代价

slide 10:

  1. 采样一个小批量 {x1,…,xn}∼pdata(x)\{x_1, \dots, x_n\} \sim p_{\text{data}}(x);
  2. 用经验平均估计得分匹配损失 1n∑i=1n[12∥∇xlog⁡pθ(xi)∥22+tr(∇x2log⁡pθ(xi))]=1n∑i=1n[12∥∇xfθ(xi)∥22+tr(∇x2fθ(xi))];\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];
  3. 随机梯度下降;
  4. 不需要从能量模型采样!

注意:对大模型,计算 Hessian 的迹 tr(∇x2log⁡pθ(x))\mathrm{tr}(\nabla_x^2\log p_\theta(x)) 一般非常昂贵。去噪得分匹配(Vincent 2011)和切片得分匹配(Song et al. 2019)——下一讲详细讲。

代码 02 第 5 部分:自动求导算迹要对每一维各做一次反向传播。输入维数 d=2,8,32,128d = 2, 8, 32, 128 时,完整的得分匹配分别是”只算 12∥∇f∥2\frac12\Vert\nabla f\Vert^2“的 3.5、10.0、36.8、138.4 倍——线性增长,而一张 256×256 的彩色图 d≈20d \approx 20 万。

slide 11 回顾了训练能量模型的两种距离:KL 散度 = 最大似然(对比散度 ∇θfθ(xdata)−fθ(xsample)\nabla_\theta f_\theta(x_{\text{data}}) - f_\theta(x_{\text{sample}}));Fisher 散度 = 得分匹配(12Epdata∥∇xlog⁡pdata−∇xfθ∥2\frac12\mathbb{E}_{p_{\text{data}}}\Vert\nabla_x\log p_{\text{data}} - \nabla_x f_\theta\Vert^2)。

3.6 Fisher 散度的盲点

得分是一个局部的量:它只描述密度在每个点附近怎样变化。“两个分开的模式各占多少质量”是一个全局的量。代码 02 第 3 部分:p=0.8 N(−2,0.52)+0.2 N(2,0.52)p = 0.8\,\mathcal{N}(-2, 0.5^2) + 0.2\,\mathcal{N}(2, 0.5^2),qq 用同样的两个成分、只换权重:

qq 的左边权重0.80.50.20.01
Fisher 散度 DF(p,q)D_F(p, q)06.6e−43.0e−32.2e−2
DKL(p∥q)D_{\mathrm{KL}}(p \Vert q)00.1930.8323.185

在每个模式内部,∇log⁡q≈−(x−μk)/σ2\nabla\log q \approx -(x - \mu_k)/\sigma^2 只由那个成分决定、和权重无关;两者只在两峰之间的低谷里不同,而那里 pp 几乎为零,Fisher 散度的权重 p(x)p(x) 把差别抹掉了(练习 6)。

代码 02 第 4 部分(二维能量模型,各 2,000 步):

数据训练方法用时KLx1<0x_1 < 0 的质量(真实)
两个高斯 0.5 / 0.5精确最大似然15 秒0.0270.608(0.499)
得分匹配3 秒0.1130.722(0.499)
两个高斯 0.8 / 0.2精确最大似然15 秒0.0050.777(0.798)
得分匹配3 秒1.2771.000(0.798)
双月牙精确最大似然14 秒0.0340.514(0.499)
得分匹配3 秒0.0720.443(0.499)

得分匹配快得多(不采样、不算 ZZ),在连通的双月牙上和精确最大似然接近;两个分开的模式上,每个模式的形状学得很好,权重却随训练漂移(0.8 / 0.2 时全部质量到了左边,等权时也偏到 0.72)。和第 11 讲的 CD 是同一个失败,原因不同:CD 是采样器跨不过去,得分匹配是目标函数本身不在乎。第 13 讲称之为得分模型的”第三个陷阱”,并用多个噪声尺度来缓解。


4. 噪声对比估计 · Noise contrastive estimation

4.1 用分类学密度

slide 12:通过和一个噪声分布对比来学习能量模型。

  • 数据分布 pdata(x)p_{\text{data}}(x);
  • 噪声分布 pn(x)p_n(x):应该能解析地计算密度、容易采样;
  • 训练一个判别器 Dθ(x)∈[0,1]D_\theta(x) \in [0, 1] 区分数据样本和噪声样本: max⁡θEx∼pdata[log⁡Dθ(x)]+Ex∼pn[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))].
  • 最优判别器 Dθ∗(x)=pdata(x)pdata(x)+pn(x)D_\theta^*(x) = \frac{p_{\text{data}}(x)}{p_{\text{data}}(x) + p_n(x)}(第 9 讲 §3.6)。

slide 13:如果把判别器参数化成 Dθ(x)=pθ(x)pθ(x)+pn(x)D_\theta(x) = \frac{p_\theta(x)}{p_\theta(x) + p_n(x)} 呢?最优判别器满足 pθ∗(x)pθ∗(x)+pn(x)=pdata(x)pdata(x)+pn(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)≈pdata(x)p_{\theta^*}(x) \approx p_{\text{data}}(x)。它特别适合 pθp_\theta 只定义到一个归一化常数的情形(能量模型)。等价地, pθ∗(x)=pn(x)Dθ∗(x)1−Dθ∗(x)=pdata(x).p_{\theta^*}(x) = \frac{p_n(x)D_{\theta^*}(x)}{1 - D_{\theta^*}(x)} = p_{\text{data}}(x). 分类器被用来修正 pnp_n 的密度估计,可以用来改进一个基础生成模型(Boosted Generative Models,Grover et al. 2018)——§5.1 的”流 + 修正”就是这个想法。

4.2 把 Z 当参数

slide 14:能量模型 pθ(x)=efθ(x)/Z(θ)p_\theta(x) = e^{f_\theta(x)}/Z(\theta) 的约束 Z(θ)=∫efθ(x)dxZ(\theta) = \int e^{f_\theta(x)}dx 很难满足。办法:用一个额外的可训练参数 ZZ 来建模 Z(θ)Z(\theta),不显式地要求 Z=∫efθZ = \int e^{f_\theta}: pθ,Z(x)=efθ(x)Z.p_{\theta,Z}(x) = \frac{e^{f_\theta(x)}}{Z}. 用 NCE 训练,最优参数 θ∗,Z∗\theta^*, Z^* 满足 pθ∗,Z∗(x)=efθ∗(x)Z∗=pdata(x)p_{\theta^*,Z^*}(x) = \frac{e^{f_{\theta^*}(x)}}{Z^*} = p_{\text{data}}(x)。最优的 Z∗Z^* 就是正确的配分函数,因为 ∫efθ∗(x)Z∗dx=∫pdata(x) dx=1  ⟹  Z∗=∫efθ∗(x)dx.\int\frac{e^{f_{\theta^*}(x)}}{Z^*}dx = \int p_{\text{data}}(x)\,dx = 1 \implies Z^* = \int e^{f_{\theta^*}(x)}dx.

为什么最大似然不能这样做?因为似然 fθ(x)−log⁡Zf_\theta(x) - \log Z 对 ZZ 单调递减——把 ZZ 当自由参数时,最大似然会让 Z→0Z \to 0。NCE 的分类目标里 ZZ 同时出现在”数据”和”噪声”两侧,太小或太大都会让分类变差,所以有一个有限的最优值。

4.3 目标与算法

slide 15:判别器 Dθ,Z(x)=efθ(x)/Zefθ(x)/Z+pn(x)=efθ(x)efθ(x)+pn(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}. NCE 训练:max⁡θ,ZEx∼pdata[log⁡Dθ,Z(x)]+Ex∼pn[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⁡θ,ZEx∼pdata[fθ(x)−log⁡(efθ(x)+Zpn(x))]+Ex∼pn[log⁡(Zpn(x))−log⁡(efθ(x)+Zpn(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]. 数值稳定的 log-sum-exp 技巧:log⁡(efθ(x)+Zpn(x))=logsumexp(fθ(x),log⁡Z+log⁡pn(x))\log(e^{f_\theta(x)} + Zp_n(x)) = \mathrm{logsumexp}(f_\theta(x), \log Z + \log p_n(x))。

slide 16:采样一批数据 x1,…,xn∼pdatax_1, \dots, x_n \sim p_{\text{data}}、一批噪声 y1,…,yn∼pny_1, \dots, y_n \sim p_n,估计 1n∑i=1n[fθ(xi)−logsumexp(fθ(xi),log⁡Z+log⁡pn(xi))+log⁡Z+log⁡pn(yi)−logsumexp(fθ(yi),log⁡Z+log⁡pn(yi))],\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], 对 θ\theta 和 ZZ 做随机梯度上升。不需要从能量模型采样!

4.4 噪声怎么选?

代码 03 第 1 部分(能量网络 64 × 2,3,000 步):

数据噪声KLx1<0x_1 < 0 的质量(真实)学到的 / 真实 log Z分类准确率
两个高斯 0.8 / 0.2宽高斯 N(0,32I)\mathcal{N}(0, 3^2I)0.1930.522(0.800)+0.086 / −0.46792%
矩匹配的高斯0.0160.757+0.055 / +0.05877%
太窄的高斯 N(0,0.52I)\mathcal{N}(0, 0.5^2I)1.0930.546+0.122 / +1.52997%
较弱的流(4 层 RealNVP)0.0090.778+0.057 / +0.02352%
双月牙宽高斯0.1050.502(0.501)+0.190 / +0.30192%
矩匹配的高斯0.0670.433+0.133 / +0.27879%
太窄的高斯60.1270.000+0.169 / +61.29987%
较弱的流0.0680.490+0.007 / +0.02362%
  • NCE 能学到模式的相对权重(矩匹配噪声 0.76、流噪声 0.78)——CD 和得分匹配都做不到。噪声样本同时覆盖两个模式,判别器”看得见”全局,不依赖任何链在模式之间跨越。
  • 宽噪声这次没学对(0.52):数据点上 D≈1D \approx 1 早已饱和,只有少数恰好落进模式里的噪声样本提供”两个模式该多高”的信号——统计效率低(换一个数据种子时它学到了 0.85)。
  • 太窄的噪声彻底失败:数据大多落在噪声密度几乎为零的地方,判别器只要学会”离中心远就是数据”,能量函数在那里得不到约束。
  • 学到的 log⁡Z\log Z 只有在噪声合适时才准;理论上最优解里两者相等,有限训练下是近似。

slide 18 的总结:噪声分布既要能算密度、又要能高效采样;我们希望分类任务尽可能难,即 pnp_n 接近 pdatap_{\text{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):流对比估计——用一个归一化流 pn,ϕ(x)p_{n,\phi}(x) 参数化噪声分布(流既能算密度、又能采样,正好满足 NCE 的两个要求),判别器 Dθ,Z,ϕ(x)=efθ(x)efθ(x)+pn,ϕ(x)Z,D_{\theta,Z,\phi}(x) = \frac{e^{f_\theta(x)}}{e^{f_\theta(x)} + p_{n,\phi}(x)Z}, 并训练流去最小化 DJS(pdata,pn,ϕ)D_{\mathrm{JS}}(p_{\text{data}}, p_{n,\phi}): min⁡ϕmax⁡θ,ZEx∼pdata[log⁡Dθ,Z,ϕ(x)]+Ex∼pn,ϕ[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))]. 流扮演了 GAN 里生成器的角色,让分类始终保持困难。slide 19 是 FCE 在 SVHN、CIFAR-10、CelebA 上的样本。

代码 03 第 2 部分以同一个较弱的流为起点,比较几种用法:

数据方法能量模型的 KLx1<0x_1 < 0 的质量学到的 / 真实 log Z流最后的 KL
两个高斯 0.8 / 0.2流本身(最大似然)0.0390.801——
流 + 修正(f=log⁡p流+gf = \log p_{\text{流}} + g,NCE)0.0160.794+0.068 / +0.069(不变)
流对比估计0.0130.766+0.040 / +0.1280.032
对抗训练(§5.2)0.5090.353—0.140
双月牙流本身0.2870.502——
流 + 修正0.0640.475+0.077 / +0.065(不变)
流对比估计0.1040.458+0.042 / +0.0600.328
对抗训练0.7770.495—0.823
  • 流 + 修正(slide 13 的 pnD/(1−D)p_nD/(1-D),写成能量模型就是 fθ=log⁡pn+gθf_\theta = \log p_n + g_\theta):能量网络只需要学”数据比流多 / 少多少”这个比值,KL 比流本身小一半以上,学到的 log⁡Z\log Z 几乎精确。噪声已经接近数据时,剩下的修正很简单。
  • 流对比估计:能量模型学得不错;流本身几乎没变好(双月牙上反而从 0.287 变成 0.328)——它的任务是”让分类变难”(最小化 JS,像 GAN 的生成器),不是拟合似然。
  • 一个附带的教训(README 第 4 条):直接拿一个很好的流当噪声、而能量网络要从头学整个 log⁡p\log p 时,双月牙上的 NCE 反而更差——分类太难、信号太弱。让能量模型只学残差才是用好一个强基础模型的方式。

5.2 对抗训练能量模型

slide 20:用一个变分分布 qϕ(x)q_\phi(x) 给对数似然一个上界:

Epdata[log⁡pθ(x)]=Epdata[fθ(x)]−log⁡Z(θ)=Epdata[fθ(x)]−log⁡∫qϕ(x)efθ(x)qϕ(x)dx≤Epdata[fθ(x)]−∫qϕ(x)log⁡efθ(x)qϕ(x)dx=Epdata[fθ(x)]−Eqϕ[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}

(Jensen:−log⁡-\log 是凸的,−log⁡Eq[⋅]≤Eq[−log⁡⋅]-\log\mathbb{E}_q[\cdot] \leq \mathbb{E}_q[-\log\cdot]。)对抗训练: max⁡θmin⁡ϕ  Epdata[fθ(x)]−Eqϕ[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)). 对 ϕ\phi 最小化等价于最小化 DKL(qϕ∥pθ)D_{\mathrm{KL}}(q_\phi \Vert p_\theta)(上界在 qϕ=pθq_\phi = p_\theta 时变紧);对 θ\theta 最大化则是”用 qϕq_\phi 的样本当负样本”的对比散度。对 qϕq_\phi 有什么要求? 能采样、能算熵(所以流很合适),还要足够灵活、训练得足够好。

代码 03 里这一条最难调:每次能量模型更新后流只追 1 次时直接发散(KL 30 以上);追 10 次、能量模型用很小的学习率才勉强稳定,但左边的质量仍在 0.84 → 0.90 → 0.35 之间摆动,1,500 步后不如其他方法(上表)。原因和第 9 讲一样:这是一个极小极大问题;而且 qϕq_\phi 用反向 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)把它们放在一起:

数据训练方法需要什么用时KLx1<0x_1 < 0 的质量(真实)最重的格子
两个高斯 0.8 / 0.2精确最大似然(网格 log Z)ZZ(数值积分)14 秒0.0180.756(0.799)0.5%
CD-10MCMC 样本6 秒0.7120.9970.6%
PCD-10MCMC 样本6 秒17.0000.0000.8%
得分匹配∇x2f\nabla_x^2 f(dd 次反向传播)4 秒0.6440.9960.6%
NCE(矩匹配噪声)已知密度的噪声1 秒0.0230.8470.6%
双月牙精确最大似然15 秒0.0310.504(0.500)0.2%
CD-106 秒1,747,6470.000100%
PCD-106 秒173,7281.000100%
得分匹配4 秒0.0910.6020.3%
NCE1 秒0.0640.4590.3%

(“最重的格子” = 网格 1 万个格子中质量最大的那个;健康的模型不到 1%。)

  • 两个分开的模式:只有 NCE 接近正确的权重。CD、得分匹配把质量放到了左边,PCD 全放到了右边——三种方法以不同的原因犯了同一个错误。
  • 双月牙:得分匹配和 NCE 都和精确最大似然在同一个量级;CD-10 和 PCD-10 坍塌了:ff 在某一点比其他地方高出几万甚至上百万,一个格子拿走了全部质量。CD 的尖峰在下弧外侧一点点的地方——从数据出发的短链很少走到那里,ff 被抬高以后没有样本去把它压下来,越长越高。同样的学习率在两个高斯上没有坍塌——基于采样的训练对数据形状和超参数都很敏感。
  • 没有一种方法在所有情形下都最好。 第 13 讲的得分模型直接学 ∇xlog⁡p\nabla_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

  1. MH:只用 ff 的差,满足细致平衡 → pθp_\theta 是平稳分布;混合速度由 λ2\lambda_2 决定,低谷越深越慢(小链实验:低谷降到峰值的 0.05% 时要 1.4 万步)。未调整的朗之万有 O(ϵ)O(\epsilon) 偏差(高斯目标:方差 1/(1−ϵ/2)1/(1 - \epsilon/2)),MALA 用 MH 校正消除它。随机游走 MH 每步效率约按 1/d1/d 下降,MALA 慢得多;多峰时没有一个步长同时做到局部走得好、跨得过去。
  2. 得分匹配:得分 ∇xfθ\nabla_x f_\theta 与 ZZ 无关;最小化 Fisher 散度,分部积分把 ∇log⁡pdata\nabla\log p_{\text{data}} 消掉,得到 E[12∥∇f∥2+tr∇2f]\mathbb{E}[\frac12\Vert\nabla f\Vert^2 + \mathrm{tr}\nabla^2 f]——只需要数据、不采样。代价:迹要 dd 次反向传播。盲点:Fisher 散度对分开模式的权重几乎不敏感(KL 3.2 nat 时 Fisher 只有 0.022),所以学不到相对权重。
  3. NCE:把判别器参数化成 efef+Zpn\frac{e^f}{e^f + Zp_n},最优时 ef/Z=pdatae^f/Z = p_{\text{data}} 且 ZZ 是真正的配分函数。能学到模式权重(噪声覆盖全局);噪声太宽统计效率低,太窄则失败;以一个流为基础、只学残差时效果最好、log⁡Z\log Z 最准。
  4. NCE vs GAN:都是分类;NCE 的噪声固定(无极小极大)但需要噪声的密度。流对比估计让流对抗地充当噪声;对抗训练给似然一个上界,但极小极大优化难以稳定。
  5. 同一条件下的比较:精确最大似然只在低维可行;CD / PCD 可能学错权重甚至坍塌成尖峰;得分匹配快但看不见权重;NCE 在这两个例子里最稳。没有万能的方法。

9. 常见误区 · Common pitfalls

  1. “MCMC 迟早会收敛,所以多跑几步就行。” “迟早”可能是上万甚至上亿步(§2.2);而且未调整的朗之万即使跑无穷久也有偏差(§2.3)。
  2. “朗之万的步长越小越好。” 偏差变小,但混合变慢;MALA 才能在较大步长下保持无偏。
  3. “得分匹配和最大似然等价。” 两者的最优解在模型族包含真实分布时相同(对单个高斯也相同,§3.4),但一般情况下优化的是不同的散度——在分开的模式上差别巨大(§3.6)。
  4. “得分匹配不需要任何假设。” 分部积分要求 pdatap_{\text{data}} 在边界处趋于零(练习 4);还要求 fθf_\theta 二阶可导。
  5. “NCE 学到的 ZZ 就是精确的配分函数。” 只在最优解处成立;有限训练下,噪声不合适时偏差可达 0.5(§4.4)。
  6. “噪声越接近数据越好,所以直接用最好的模型当噪声。” 如果能量网络要从头学整个 log⁡p\log p,太像数据的噪声会让分类信号太弱;更好的做法是让能量模型只学相对于噪声的残差(§5.1)。
  7. “NCE 就是 GAN。” 判别器的形式和损失相同,但 NCE 的噪声固定、需要噪声的密度、学的是能量模型;GAN 的生成器在变、只需要采样、学的是采样器(§4.5)。
  8. “不采样的方法总比 CD 好。” 得分匹配同样学不到模式权重;对抗训练同样需要极小极大。各有各的失败方式(§6)。

10. 练习 · Exercises

练习 1(细致平衡 ⇒ 平稳) 证明:若转移核满足 p(x)Tx→x′=p(x′)Tx′→xp(x)T_{x \to x'} = p(x')T_{x' \to x} 对所有 x,x′x, x' 成立,则 pp 是平稳分布。反过来,平稳分布一定满足细致平衡吗?

参考答案

∑xp(x)Tx→x′=∑xp(x′)Tx′→x=p(x′)∑xTx′→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')。反过来不一定:细致平衡是”每一对状态之间的流量平衡”,平稳只要求”每个状态的总流入 = 总流出”。例如在一个环上总是顺时针走一步的链,均匀分布是平稳分布,但 p(x)Tx→x+1>0=p(x+1)Tx+1→xp(x)T_{x \to x+1} > 0 = p(x+1)T_{x+1 \to x}。MH 构造的是满足更强条件(细致平衡、可逆)的链。

练习 2(Hastings 修正与 MALA) 提议 q(x′∣x)q(x' \mid x) 不对称时,证明接受概率 α=min⁡(1,ef(x′)q(x∣x′)ef(x)q(x′∣x))\alpha = \min\left(1, \frac{e^{f(x')}q(x \mid x')}{e^{f(x)}q(x' \mid x)}\right) 满足细致平衡。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),写出 log⁡q(x∣x′)q(x′∣x)\log\frac{q(x \mid x')}{q(x' \mid x)}。

参考答案

不妨设比值 < 1:p(x)q(x′∣x)α=ef(x)Zq(x′∣x)ef(x′)q(x∣x′)ef(x)q(x′∣x)=ef(x′)Zq(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'),而反方向接受概率为 1,p(x′)q(x∣x′)⋅1p(x')q(x \mid x')\cdot 1 相同。MALA:log⁡q(x∣x′)q(x′∣x)=−∥x−x′−ϵ∇f(x′)∥24ϵ+∥x′−x−ϵ∇f(x)∥24ϵ\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}(代码 01 ula_mala 里的 log_q_bwd − log_q_fwd)。

练习 3(ULA 的偏差) 目标 N(0,s2)\mathcal{N}(0, s^2),ULA 更新 x′=x−ϵs2x+2ϵξx' = x - \frac{\epsilon}{s^2}x + \sqrt{2\epsilon}\xi。求平稳方差,并说明 ϵ\epsilon 多大时链会发散。

参考答案

v=(1−ϵ/s2)2v+2ϵ⇒v=2ϵ1−(1−ϵ/s2)2=s21−ϵ/(2s2)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)}。s=1s = 1 时即代码 01 的 1/(1−ϵ/2)1/(1 - \epsilon/2)。需要 ∣1−ϵ/s2∣<1|1 - \epsilon/s^2| < 1,即 ϵ<2s2\epsilon < 2s^2;ϵ≥2s2\epsilon \geq 2s^2 时方差发散。高维里 ss 取最窄方向的尺度——这就是 ULA 的步长受”最尖的那个方向”限制的原因。

练习 4(分部积分的边界条件) pdatap_{\text{data}} 是 [0,∞)[0, \infty) 上的指数分布 λe−λx\lambda e^{-\lambda x},模型 pθ(x)=θe−θxp_\theta(x) = \theta e^{-\theta x}。(a) 计算真正的 Fisher 散度。(b) 计算”得分匹配目标”E[12sθ2+sθ′]\mathbb{E}[\frac12 s_\theta^2 + s_\theta'] 并求它的最小值点。两者一致吗?问题出在哪里?

参考答案

(a) 两个得分都是常数:sdata=−λs_{\text{data}} = -\lambda,sθ=−θs_\theta = -\theta,DF=12(θ−λ)2D_F = \frac12(\theta - \lambda)^2,最小在 θ=λ\theta = \lambda。(b) 12θ2+0\frac12\theta^2 + 0,最小在 θ=0\theta = 0——错了。分部积分的边界项 −pdata(x)sθ(x)∣0∞=pdata(0)sθ(0)=−λθ≠0-p_{\text{data}}(x)s_\theta(x)|_0^\infty = p_{\text{data}}(0)s_\theta(0) = -\lambda\theta \neq 0:pdatap_{\text{data}} 在边界 0 处不为零。补上边界项后目标变成 12θ2−λθ\frac12\theta^2 - \lambda\theta,最小在 θ=λ\theta = \lambda,正确。有界支撑的数据需要修改过的得分匹配(Hyvärinen 2007 对非负数据的版本)。

练习 5(单个高斯的得分匹配解) 模型 N(μ,σ2)\mathcal{N}(\mu, \sigma^2),证明得分匹配目标 Ep[(x−μ)22σ4−1σ2]\mathbb{E}_p[\frac{(x-\mu)^2}{2\sigma^4} - \frac{1}{\sigma^2}] 的最小值点是 μ=Ep[x]\mu = \mathbb{E}_p[x]、σ2=Varp[x]\sigma^2 = \mathrm{Var}_p[x]。

参考答案

对 μ\mu:−E[(x−μ)]/σ4=0⇒μ=E[x]-\mathbb{E}[(x - \mu)]/\sigma^4 = 0 \Rightarrow \mu = \mathbb{E}[x]。代入,目标 =V2σ4−1σ2= \frac{V}{2\sigma^4} - \frac{1}{\sigma^2}(V=Var[x]V = \mathrm{Var}[x]);令 u=1/σ2u = 1/\sigma^2,目标 =V2u2−u= \frac{V}{2}u^2 - u,最小在 u=1/Vu = 1/V,即 σ2=V\sigma^2 = V。和最大似然(矩匹配)相同——代码 02 第 2 部分的 (−0.8,1.9)(-0.8, 1.9)。

练习 6(Fisher 散度为什么看不见权重) 设 p=wN(−a,σ2)+(1−w)N(a,σ2)p = w\mathcal{N}(-a, \sigma^2) + (1-w)\mathcal{N}(a, \sigma^2),qq 是同样的成分、权重 w′w'。粗略地论证:当 a/σ→∞a/\sigma \to \infty 时 DF(p,q)→0D_F(p, q) \to 0,而 DKL(p∥q)→wlog⁡ww′+(1−w)log⁡1−w1−w′D_{\mathrm{KL}}(p \Vert q) \to w\log\frac{w}{w'} + (1 - w)\log\frac{1-w}{1-w'}。

参考答案

在左峰附近 ∇log⁡p=−x+aσ2+O(e−2ax/σ2)\nabla\log p = -\frac{x + a}{\sigma^2} + O(e^{-2ax/\sigma^2}) 的修正项来自右峰的贡献,对 qq 也一样,差值是指数小的;只有在 x≈0x \approx 0(两峰之间)两者的得分才有 O(a/σ2)O(a/\sigma^2) 量级的差别,而那里 p(x)≈e−a2/(2σ2)p(x) \approx e^{-a^2/(2\sigma^2)} 指数小。所以 DFD_F 被一个 e−a2/(2σ2)⋅poly(a/σ)e^{-a^2/(2\sigma^2)}\cdot\mathrm{poly}(a/\sigma) 的因子压制,趋于 0。KL 则是两个”几乎不重叠的成分”之间权重的 KL,即两点分布 (w,1−w)(w, 1-w) 与 (w′,1−w′)(w', 1-w') 的 KL——与 aa 无关。代码 02 第 3 部分(a/σ=4a/\sigma = 4):w′=0.2w' = 0.2 时 KL 0.83(两点 KL 的值是 0.832),Fisher 只有 0.003。

练习 7(NCE 的最优 Z) 按 slide 14 的论证证明:若存在 θ∗\theta^* 使 efθ∗∝pdatae^{f_{\theta^*}} \propto p_{\text{data}},则 NCE 目标的全局最优解满足 Z∗=∫efθ∗Z^* = \int e^{f_{\theta^*}}。再说明:如果把 ZZ 当作自由参数代入最大似然目标 E[fθ(x)]−log⁡Z\mathbb{E}[f_\theta(x)] - \log Z,会发生什么?

参考答案

NCE 目标是”数据 vs 噪声”的二分类交叉熵,在判别器可以取任意函数时的最大值点是 D∗=pdatapdata+pnD^* = \frac{p_{\text{data}}}{p_{\text{data}} + p_n};参数化后 Dθ,Z=efθ/Zefθ/Z+pnD_{\theta,Z} = \frac{e^{f_\theta}/Z}{e^{f_\theta}/Z + p_n},要等于 D∗D^* 就必须 efθ/Z=pdatae^{f_\theta}/Z = p_{\text{data}}(对所有 pn>0p_n > 0 的点),两边积分得 Z=∫efθZ = \int e^{f_\theta}。最大似然里 ZZ 只以 −log⁡Z-\log Z 出现,单调递减:最大化会让 Z→0Z \to 0、目标 →+∞\to +\infty——似然只有在 ZZ 被约束为真正的配分函数时才有意义,而 NCE 的目标对 ZZ 自带”两侧的惩罚”。

练习 8(对抗训练的上界) 验证 slide 20 的不等式,并证明:对固定的 θ\theta,min⁡ϕ\min_\phi 等价于 min⁡ϕDKL(qϕ∥pθ)\min_\phi D_{\mathrm{KL}}(q_\phi \Vert p_\theta),且最小值处上界等于 Epdata[log⁡pθ]\mathbb{E}_{p_{\text{data}}}[\log p_\theta]。

参考答案

Eq[fθ]+H(q)=Eq[fθ−log⁡q]=Eq[log⁡pθq]+log⁡Z=log⁡Z−DKL(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。所以上界 =Epdata[fθ]−log⁡Z+DKL(q∥pθ)=Epdata[log⁡pθ]+DKL(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)。对 ϕ\phi 最小化就是最小化反向 KL,q=pθq = p_\theta 时取等号。反向 KL 是模式寻找的(第 4 讲),所以实践中 qq 常常只盖住 pθp_\theta 的一部分,上界不紧——代码 03 中对抗训练的振荡与此有关。

练习 9(流 + 修正) 设基础模型 pnp_n 是一个流,能量模型写成 fθ(x)=log⁡pn(x)+gθ(x)f_\theta(x) = \log p_n(x) + g_\theta(x)。(a) NCE 的判别器 Dθ,ZD_{\theta,Z} 变成什么?(b) 若 pn=pdatap_n = p_{\text{data}},最优的 gθg_\theta 和 ZZ 是什么?(c) 为什么这比”fθf_\theta 从头学、pnp_n 只当噪声”更容易?

参考答案

(a) D=pnegpneg+Zpn=σ(gθ(x)−log⁡Z)D = \frac{p_ne^{g}}{p_ne^{g} + Zp_n} = \sigma(g_\theta(x) - \log Z)——pnp_n 被约掉了,判别器只依赖残差 gg。(b) 最优时 pneg/Z=pdata=pnp_ne^g/Z = p_{\text{data}} = p_n,所以 g≡log⁡Zg \equiv \log Z,可以取 g=0g = 0、Z=1Z = 1。(c) 能量网络只需要表示 log⁡pdatapn\log\frac{p_{\text{data}}}{p_n}——当基础模型已经不错时,这是一个平缓、接近常数的函数;而”从头学”要表示整个 log⁡pdata\log p_{\text{data}},同时分类信号又很弱(噪声接近数据)。代码 03:流 + 修正把双月牙上的 KL 从 0.287 降到 0.064。

练习 10(动手:换一种噪声) 在 03_nce.py 第 1 部分加一种噪声:数据的核密度估计(比如 500 个训练点、带宽 0.3 的高斯混合)。预测它和矩匹配的高斯、流噪声相比会怎样,然后运行验证。

参考答案(预测的思路)

核密度估计在两个模式上都有质量、权重也接近 0.8 / 0.2,所以应该能学对权重;它比矩匹配的高斯更接近数据,分类更难、NCE 更高效。但带宽 0.3 时 KDE 比真实分布宽,能量模型要学的 log⁡pdata\log p_{\text{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

得分匹配告诉我们:只要能估计 ∇xlog⁡p(x)\nabla_x\log p(x),就能绕开 ZZ,再用朗之万从它采样。第 13 讲(原课 Lecture 13,Score Based Models)把这个想法推到底——不再要求得分是某个能量函数的梯度,直接用一个神经网络输出向量场 sθ(x)≈∇xlog⁡p(x)s_\theta(x) \approx \nabla_x\log p(x):

  • 迹太贵怎么办:去噪得分匹配(匹配加噪分布的得分,Tweedie 公式)和切片得分匹配(随机投影 + 雅可比–向量积);
  • 从得分到样本:朗之万 MCMC;
  • 三个陷阱:流形假设、低密度区域估计不准、朗之万在模式之间混合太慢、权重错误——本讲 §3.6 和第 11 讲代码 04 已经见过这个陷阱;以及多个噪声尺度怎样同时解决它们。
← 返回课程目录