能量模型(EBM)的统计力学原理与训练实战
很多人第一次听到“能量模型”这个名字第一反应通常是能量不是物理里的概念吗跟概率分布有什么关系我当年读第一篇基于 Energy Based ModelEBM的论文时也卡在这一点上。后来放下公式去翻了统计力学的教材才真正看明白概率模型和统计力学之间有一条几乎是被原样搬过来的桥那就是玻尔兹曼分布。能量函数给每个样本打分配分函数做归一化分数越低概率越高——这套逻辑既是物理里的正则系综也是生成模型里的核心。这篇先不聊花哨的架构专心把 EBM 的统计力学底子讲清楚然后落到实际训练中那些跑断了腿才能摸出来的细节。1. 从统计力学到概率建模为什么能量函数能当概率用1.1 能量小、概率大玻尔兹曼分布的直觉统计力学处理的问题是一堆微观粒子不停运动我们没法追踪每个粒子的状态只能描述系统处于某个宏观状态的概率。经典正则系综给出了一个非常干净的形式[ p(x) \frac{1}{Z} \exp\left(-\frac{E(x)}{kT}\right) ]其中 (E(x)) 是系统的能量(T) 是温度(k) 是玻尔兹曼常数。温度不变时这个式子告诉我们一个非常直白的规律系统停留在某个状态的概率只取决于这个状态的能量能量越低概率越高。(Z \sum_x \exp(-E(x)/kT)) 做的就是归一化它把所有的“未归一化分数”换算成真正的概率让所有状态的概率加起来正好是 1。这个框架被机器学习借用时做了一件事直接令 (kT1)于是分布写成[ p_\theta(x) \frac{\exp(-E_\theta(x))}{Z_\theta} ]不同点在于物理能量是给定的而机器学习里的 (E_\theta(x)) 是带参数的我们希望靠数据把它学出来。如果某个样本在训练集里出现得多我们希望 (E_\theta(x)) 尽量低如果某个样本在现实中几乎不出现我们希望它的能量尽量高。整个 EBM 的训练本质上就是把物理里已经成熟的“能量—概率”对应关系变成一种能够拟合数据的参数化工具。这里要注意一个容易混淆的地方物理里的能量是系统真实存在的势能而机器学习里的“能量函数”只是一个名词借用实际上就是任意一个可以输出的标量函数函数值越小模型赋予样本的概率越高。换句话说EBM 没有直接把概率写出来而是先定义了能量再由能量间接定义概率。这种间接性既是它的灵活之处也是它训练时头疼的地方。1.2 配分函数 Z人人都知道它难算但还是要面对配分函数 (Z_\theta \sum_x \exp(-E_\theta(x))) 是整个框架里最扎心的一块。对离散变量理论上要对所有状态求和对连续变量要算无穷维积分而实际数据通常是高维图像、文本、音频这个求和或积分根本没法精确完成。即使拿一个只有 28×28 像素的灰度图来算可能的取值为 (256^{784}) 这个量级暴力枚举等于天方夜谭。但在统计力学里配分函数不仅是个归一化因子它还承载了系统的宏观信息。有了 (Z)可以算自由能 (F -\ln Z)可以微分得到平均能量、熵甚至能推出相变条件。在机器学习里虽然我们很少需要自由能的具体数值来指导物理判断但 (Z) 依然决定了模型的归一化是否正确。如果不考虑 (Z)训练时大概率会陷入一种病态模型只学会了降低所有样本的能量却不会区分真实样本和假样本因为降低训练集能量和升高非训练集能量之间没有一个天然的平衡点。许多初学者第一次跑 EBM 训练时看到能量一路狂跌、图像却一团糟问题往往就出在配分函数这块没有处理好。于是真正的工程问题变成了能不能不精确计算 (Z)也能把模型训好答案是能但要用一些近似手段最常见的就是对比散度和各种基于采样的估计方法。这部分放到后面单独展开。1.3 熵、自由能和噪声统计力学留给机器学习的三个礼物统计力学还有一个重要观点在没有外部约束时系统会自发趋向自由能最小的状态。自由能 (F U - TS)其中 (U) 是内能(S) 是熵(T) 是温度。低温下系统偏向能量低的整齐状态高温下熵占主导系统趋于混乱。这个“能量与熵竞争”的想法在生成模型中非常有用。比如目标分布可能包含多个峰比如数字 0 到 9 的类别峰单纯把能量调低会导致模型只压在一个峰上整个模型变成“只会生成一种数字”的疯子。熵项的作用就是让概率分布尽量铺开不要过早锁定到某个局部模式。现实中训练 EBM 时对负样本采集的随机性、对 Langevin 动力学中噪声项的选择本质上都是在控制这个“统计力学温度”。我印象很深的一点是第一次看到 EBM 的采样过程脑子里立刻浮现出“模拟退火”这个词。最早做优化的研究者用高温让系统广泛搜索再逐步降温让系统进入低能量状态而现代的基于梯度的 EBM 采样比如 Langevin MCMC依然带着这种物理味道每次迭代既沿着能量下降方向走又注入随机噪声噪声强度就像温度一样控制着探索与收敛的平衡。从这个角度理解 EBM会比单纯背公式舒服很多。2. 把能量模型写成概率模型EBM 的数学骨架2.1 从能量函数到概率分布的路径一个完整的 EBM 由两部分组成能量函数 (E_\theta(x)) 和配分函数 (Z_\theta)。我们真正想要的分布是 (p_\theta(x) \frac{1}{Z_\theta} \exp(-E_\theta(x)))。对于带隐藏变量的扩展形式比如受限玻尔兹曼机表达式变成[ p_\theta(v,h) \frac{\exp(-E_\theta(v,h))}{Z_\theta} ]我们关心的是可见变量 (v) 的边缘分布也就是把隐藏变量全积掉或者全加掉[ p_\theta(v) \sum_h \frac{\exp(-E_\theta(v,h))}{Z_\theta} \frac{\sum_h \exp(-E_\theta(v,h))}{Z_\theta} ]这个式子看着不复杂但工程上很微妙。好处是隐藏变量可以捕捉数据内部不直接可见的结构坏处是求和本身又是一重困难。经典的做法是选择一种能量函数使得对 (h) 的求和可以在解析上进行比如受限玻尔兹曼机就是这样设计的。对于一般的深度 EBM隐藏变量不再那么好求和这时候就需要依赖采样或者变分近似。如果你写过代码脑子里可以把这个过程拆成两步。第一步是前向计算输入一个样本 (x)算它的能量第二步是归一化算所有 (x) 的 (\exp(-E(x))) 的总和。第一步很便宜第二步贵得离谱。所以实际实现里从来不会显式计算分布而是把分布当成一个“只能采样、不能直接查表”的黑盒。2.2 对数似然梯度两个期望的拔河假设我们用最大似然来训练给定训练集 ({x_1,...,x_N})要最大化[ \frac{1}{N}\sum_{i1}^N \ln p_\theta(x_i) ]对这个目标求关于 (\theta) 的梯度经过几步代数运算会得到一个非常漂亮的形式[ \nabla_\theta \ln p_\theta(x) -\nabla_\theta E_\theta(x) \mathbb{E}{p\theta(x)}[\nabla_\theta E_\theta(x)] ]把训练集里的平均梯度再加进去整体就是[ -\mathbb{E}{p{\text{data}}}[\nabla_\theta E_\theta(x)] \mathbb{E}{p\theta}[\nabla_\theta E_\theta(x)] ]这个式子我每次写都会感叹一下整个最大似然训练变成了两个期望的拔河。第一项来自真实数据分布它试图拉低真实数据的能量第二项来自模型自身分布它试图拉高模型生成样本的能量。两个期望相等时梯度为零模型分布和真实数据分布在能量上达到某种均衡。但第二项里带着 (p_\theta(x))我们不知道 (Z_\theta)也就不知道这个分布。应对办法只有一个采样。用某种 MCMC 方法生成模型分布下的样本再拿这些样本去估计第二项。这就把训练问题转化成了采样质量和采样效率的问题。2.3 自由能与对数似然同一个硬币的两面统计力学里自由能 (F -\ln Z_\theta)机器学习里归一化因子 (Z_\theta) 被取对数后跟负对数似然就产生了直接联系。写出来更清楚[ -\ln p_\theta(x) E_\theta(x) \ln Z_\theta E_\theta(x) - F ]也就是说单样本的负对数似然等于它的能量减去系统自由能。自由能在这里充当了一个全局基准一个样本的能量单独看没有意义有意义的是它相对自由能高还是低。真实样本能量低所以负对数似然小非真实样本能量高负对数似然大。这件事对调参的启发是观察训练曲线时不要只看能量均值最好同时关注能量的分布。如果所有样本的能量都在下降但模型生成效果并没有改善很可能是模型在整体压低能量而不是在学习区分数据与噪声。正确的信号是训练数据的能量一路降低而样本能量从模型分布采样得到的维持在某个相对高的水平两者保持一定间距。这个间距实际上就近似于模型对真实数据和生成数据的判别能力。3. EBM 家族从 Hopfield 到 RBM 再到深度生成模型3.1 Hopfield 网络最早的基于能量的联想记忆严格说Hopfield 网络不算概率模型但它是把“能量函数”这个概念引入神经网络的先驱。它把二值神经元状态当成一个系统定义能量[ E(s) -\frac{1}{2}\sum_{i,j} w_{ij}s_i s_j - \sum_i b_i s_i ]如果把某个记忆模式写进网络的权重网络状态会自动演化到能量局部极小点从而“记起”存储的模式。从统计物理视角看这有点像伊辛模型里自旋组态在相互作用下形成有序相不同记忆模式就是不同的能量极小值。后来科学家发现可以把 Hopfield 网络的能量函数用于概率生成把 (p(s) \propto \exp(-E(s))) 当成概率那么网络不仅能回忆还能按照概率采样新状态。这个观念的直接产物就是玻尔兹曼机。从 Hopfield 到玻尔兹曼机有一个关键的转变系统从“用能量极小点做联想”变成“用整个能量地形做概率密度”。能量地形里的每一个凹陷对应概率分布中的一个峰。3.2 RBM 与 DBM隐藏单元的力量受限玻尔兹曼机RBM是 EBM 家族里最经典的成员它的可见单元 (v) 和隐藏单元 (h) 之间全连接内部不相连。能量函数定义为[ E(v,h) -b^T v - c^T h - h^T W v ]这个设计的高明之处在于给定可见单元每个隐藏单元的条件分布是独立的给定隐藏单元每个可见单元的条件分布也是独立的。于是对隐藏单元的求和可以解析完成极大地方便了训练和采样。RBM 可以堆叠成深度置信网络也可以扩展成层间全连接的深度玻尔兹曼机DBM。我从实际训练的角度说一句RBM 虽然简单但它包含 EBM 训练的全部核心难点包括负相采样、对比散度、学习率敏感等。把 RBM 调通的人再去学现代深度 EBM基本上只差一个“把能量函数换成深度网络”的心理建设。如果直接上手现代 EBM 而没练过 RBM碰到问题时会很难定位是采样问题还是能量函数表达能力问题那个排错成本要高很多。3.3 现代 EBM当能量函数变成一个深度网络近些年的 EBM 不再限制能量函数的具体形式直接把 (x) 丢进一个神经网络输出一个标量作为能量。这样做的优点是表达力强但缺点是配分函数的估计和采样更加困难。现代 EBM 常用的采样工具是随机梯度 Langevin 动力学SGLD[ x_{t1} x_t - \frac{\varepsilon}{2} \nabla_x E_\theta(x_t) \sqrt{\varepsilon} , z, \quad z \sim \mathcal{N}(0,I) ]这个迭代的关键是每次朝能量降低方向走一步同时加一个高斯噪声避免样本陷入局部极小。从统计力学角度看这个噪声项保证了马尔可夫链最终能够收敛到玻尔兹曼分布而不是单纯跑到最近的能量极小点。实际使用时至少要迭代几十步甚至几百步才能得到质量足够的负样本。现代 EBM 还有一个有趣的方向把能量函数用于分类。分类器最后一层不输出 softmax而是直接输出各类别能量然后 (p(y|x)\frac{\exp(-E_y(x))}{\sum_{y}\exp(-E_{y}(x))})。由于不一定需要生成数据训练起来可以规避一些采样困难。这也解释了为什么基于能量的方法在目前的不确定性估计、分布外检测里经常出现——能量天然给出了一个“置信度”的判断依据。4. 训练 EBM 的实用策略与踩坑经验4.1 对比散度与持久链负样本从哪来要估计对数似然梯度的第二项 (\mathbb{E}{p\theta}[\nabla_\theta E_\theta(x)])最朴素的方法是每步都从模型的玻尔兹曼分布采样但 MCMC 从随机初始化开始要烧很久。现实中几乎不会这么做。常见方案是 Hinton 提出的对比散度Contrastive DivergenceCD-k对每个训练样本 (x)用它本身作为马尔可夫链的起点跑 (k) 步采样得到的样本作为负样本。CD-k 之所以有效是因为训练样本往往是数据空间中的高概率区域从这个区域出发做几步 MCMC负样本通常会落在真实数据附近但没有那么合理的位置正好让模型学到“把靠近真实样本的假样本推开”。这里有个众所周知的坑CD-1 往往引入严重偏差因为链太短负样本分布跟真实模型分布差得远。更多时候CD-k 只是把目标函数变得好优化而不是真的在最大化原始似然。很多人戏称它是“近似优化一个我们不关心的函数但效果也不错”。另一个实用方案是持久对比散度PCD。它维护一条长期运行的马尔可夫链每轮训练都从上一轮链的末尾继续跑几步。这样负样本分布更接近当前模型分布理论上偏差更小但缺点是模型参数变化太快时链可能会跟不上模型导致采样分布混乱。我通常建议在任务初期先用 CD-k 粗调等损失曲线稳定后切换 PCD 精调这样既有速度又能提升最终质量。4.2 Langevin 采样实操步长、噪声和迭代次数如果你用现代 EBM 做图像生成Langevin 采样是绕不开的一环。这里有几个参数需要反复试步长 (\varepsilon)太大容易振荡甚至发散太小则采样慢。常见区间在 (0.01) 到 (0.2) 之间。噪声项通常取 (\sqrt{\varepsilon} z)噪声和步长绑定。如果噪声太小链会过早陷入局部极小如果噪声太大采样结果会很脏。迭代次数图像任务里从随机噪声到关键结构浮现往往需要几百步我实测 100 步以下效果通常很差。一个值得尝试的改进是 annealed Langevin dynamics也就是调低步长的“温度”逐渐降低噪声。最开始大步长、强噪声快速探索整个空间后期小步长、弱噪声慢慢细化细节。这比固定步长稳定得多曲线也不容易突然飞掉。另外实际负样本采样不仅用于训练也用于诊断。每训练一段时间把模型采样的图片可视化如果采样结果开始出现明显的伪影或重复图案说明链的步数不够或步长偏大。强烈建议在训练代码里写一个简单的采样可视化函数比盯 loss 曲线有用得多。4.3 常见问题速查表我踩过的坑下面把我在不同 EBM 训练任务里遇到的典型问题整理出来每个都配了排查思路。现象可能原因排查方法训练能量一直下降生成图片却是噪声负样本采样不充分模型只压低了整体能量增加 Langevin 步数调整步长检查负样本是否来自真实模型分布训练过程震荡loss 反复跳学习率太大负样本更新太慢调小学习率把优化器从 SGD 换成 Adam 并设置梯度裁剪生成图像只有少数几种模式MCMC 链没有充分探索模式坍缩增大噪声多个随机起点的并行链考虑 PCD降低批量内样本相关性能量函数输出 NaN能量计算里有除以接近 0 的量或梯度爆炸检查网络输出范围加梯度惩罚使用 layer normalization负样本能量与真实样本能量太接近判别力不足增大模型容量延长采样链把能量函数头调整为输出范围更合理的分布使用 CD 训练 RBM 时似然不稳定CD-k 的偏差且训练集 batch 过小增大 batch增加 CD 步数换成 PCD 或 AIS 评估这里单独提一下梯度惩罚。许多现代 EBM 在能量函数上对输入加 L2 正则或梯度惩罚目的是让能量函数的变化不要太过陡峭。太陡峭的能量函数会让 Langevin 动力学变得非常不稳定稍微一步就可能跨到深渊。这个技巧的统计力学类比也很直观粗糙的能量地形容易让系统被冻结在某个能量阱里而平滑的能量地形更容易被随机动力学搜索清楚。4.4 配分函数估计AIS 是怎么逼近 Z 的训练之外评估 EBM 也需要知道 (Z)来做对数似然比较。退火重要性采样Annealed Importance Sampling, AIS是一个可行方案。它的思路是把一个容易采样的分布比如 RBM 里的非条件独立高斯分布逐步“退火”到目标分布。中间过程定义一系列插值分布在每个中间层做重要性采样并累积权重最后得到一个 log Z 的估计。AIS 听起来抽象工程实现其实就是一串循环先定义中间分布序列然后跑 MCMC 得到每个阶段的样本再用概率比值更新重要性权重。实际运行时要控制的参数是中间层数量数量越多估计越准但耗时也线性增长。作为评估手段AIS 已经是很常用的标准作为训练手段因为成本太高很少直接用于每步参数的更新。一个印象深刻的教训AIS 的估计结果波动很大不同随机种子之间 logZ 能差好几个点。每次评估至少跑 20 次取平均否则你很难判断模型是真变好了还是采样运气好。5. 把统计力学思维带进日常建模坦白讲EBM 在很长一段时间里不是大多数人的第一选择因为训练起来比 VAE 和 GAN 都费事。但它提供了一个非常干净的建模视角如果你想表达一个概率分布不必先写概率而是先写能量。这在很多场景里更自然比如组合优化问题、结构化预测、物理系统建模等原本就存在“合理状态能量低、不合理状态能量高”的先验知识。我个人在实际操作中最受益的一点是理解了“归一化”这件事的代价。很多生成模型绕着走是因为配分函数太难算但真正的问题并不是我们要不要算它而是能不能用其他机制隐式地保证归一化正确。GAN 的做法是用判别器隐式逼近概率比Flow 模型的设计是让变换可逆从而 Z1VAE 是用变分下界绕开精确边缘似然。每种方法都是对“计算 Z”这个统计力学核心困难的正面或侧面回应。最后再分享一个我自己的操作建议尝试 EBM 时不要一上来就做高分辨率图像。先在二值 MNIST 上跑通一个简单的 RBM手工检查采样出的数字是不是能看再换成一个浅层全连接 EBM加上 Langevin 采样观察能量地形变化最后再进入深度结构和大规模数据。这个过程能帮你把“能量”和“概率”之间的直觉建立起来后面看论文和调模型都会顺很多。统计力学理论用在概率模型上不是换个名词唬人它是真的把一套关于平衡、熵、噪声的成熟思维送给了机器学习。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →