尧图精选

能量模型与对比散度:从RBM到扩散模型的统一视角

🕒 发布时间:2026/10/1 7:38:21 📁 来源:尧图网络
第一次认真读 Hinton 在 2002 年那篇关于对比散度Contrastive Divergence的论文时我愣了很久全篇没有太多复杂公式核心思想却非常“物理”——从训练数据出发沿着马尔可夫链只烧几步就能近似模型分布下的采样。那会儿我刚从统计物理的视角转到机器学习看到“基于能量的模型Energy Based Model, EBM”这个说法时心里只有一个念头这不就是玻尔兹曼分布的复刻版吗后来我自己动手实现过受限玻尔兹曼机RBM、搞过带能量函数的生成模型也拿能量视角去理解扩散模型和对比学习才慢慢意识到什么叫“概率模型欠统计力学一套积分”。这篇文章想把 EBM 这条线从头捋一遍为什么能量函数能定义概率分布配分函数是怎么成为所有麻烦的源头最大似然训练为何总跟马尔可夫链纠缠以及现代深度学习里那些你天天用的模型有多少其实是换了马甲的 EBM。适合正在学生成模型、想做无监督表示学习、或者单纯想弄明白“玻尔兹曼机为什么重要”的朋友。1. 能量接口从统计力学把“数据分布”搬进机器学习1.1 伊辛模型最早也是最直观的 EBM物理里的伊辛模型Ising model大概是所有人接触 EBM 的第一个天然入口。假设二维格点上有一堆自旋每个自旋取值 (s_i \in {1,-1})系统能量一般写成[ E(\mathbf{s}) -J \sum_{\langle i,j\rangle} s_i s_j - h \sum_i s_i ](\langle i,j\rangle) 表示相邻点对(J) 是耦合强度(h) 是外场。系统处于某个自旋构型的概率由玻尔兹曼分布给出[ p(\mathbf{s}) \frac{1}{Z} \exp\left(-\frac{E(\mathbf{s})}{T}\right) ]其中 (Z \sum_{\mathbf{s}} \exp(-E(\mathbf{s})/T)) 就是配分函数(T) 是温度。这个分布有个很直观的性格能量越低的构型出现概率越大但具体大到什么程度取决于温度和其他构型的相对能量。把伊辛模型里的“自旋构型 (\mathbf{s})”换成“数据样本 (\mathbf{x})”把“能量函数 (E(\mathbf{s}))”换成“带参数的神经网络 (E_\theta(\mathbf{x}))”再把“求和”换成“积分”你就得到了 EBM 的全部骨架[ p_\theta(\mathbf{x}) \frac{\exp(-E_\theta(\mathbf{x}))}{Z_\theta}, \quad Z_\theta \int \exp(-E_\theta(\mathbf{x})) d\mathbf{x} ]说白了EBM 不是一种全新的模型而是把概率密度函数强制写成“玻尔兹曼形式”。这里的 (E_\theta(\mathbf{x})) 不需要满足任何归一化条件它只要是一个能从输入映射到实数的函数就行。这给了建模很大的自由你不需要像自回归模型那样把概率分解成条件概率的乘积也不需要像归一化流那样构造可逆变换。你只需要负责设计一个合理的能量函数剩下的概率分布由物理规律帮你定义。1.2 为什么指数形式不只属于物理学有人会问概率密度为什么非得用指数形式自由能理论自然导致这种形式但机器学习里强制套用它有什么好处好处之一是“组合关系变得非常简洁”。多个变量联合建模时如果每个约束都以能量项方式叠加那么整体概率就是各个相互作用的乘积因子组合。比如你在图像上既想约束平滑性又想约束颜色分布能量函数直接写成几项相加即可转化到概率空间就是乘性耦合。这比直接规范化概率分布容易操作得多。好处之二是“相对比较友好”。概率值本身很小对数概率计算时能量函数可以直接作为打分函数score function使用。在很多任务里我们真正关心的不是估计绝对密度而是比较两个样本的似然谁高谁低。能量差 (E_\theta(x_1) - E_\theta(x_2)) 直接给出对数概率的相对大小不需要知道 (Z_\theta) 也能做很多判断这是后续所有训练技巧能成立的根本前提。1.3 配分函数一个算不出来的归一化常数却决定了训练的成败我在刚接触 EBM 时最容易犯的错误是不够重视配分函数。潜意识里觉得 (Z_\theta) 不过是个常数如果只做相对比较它甚至可以不出现。但真正训练的时候梯度里偏偏藏着一个对 (Z_\theta) 的求导而这个导数恰恰需要从 (p_\theta(\mathbf{x})) 采样才能估计。你避不开它。配分函数的麻烦在于维数灾难。假设每个像素有 256 个取值一张 (32 \times 32) 的灰度图就有 (256^{1024}) 种可能状态哪怕用再聪明的数值积分也不可能直接算。物理学家面对伊辛模型的时候同样无法精确计算二维以上系统的 (Z)于是转而发展出蒙特卡洛模拟、平均场近似等一系列手段。机器学习从中学到的等价物就是 MCMC 采样、变分推断和对比散度。理解 (Z_\theta) 的含义还可以帮助理解“欠拟合”和“过拟合”以外的第三种失败模式。如果能量函数中有某些区域的能量极低模型就会把大量概率质量压缩到非常狭窄的区域内生成样本会显得单一且分布极差如果能量函数的整体方差太小模型又会对不同输入一视同仁学不出有区分度的特征。操纵能量曲面、控制分布尖峰程度让这套体系训练稳定比拼网络架构更考验经验。2. 最大似然梯度让数据能量降下去让其它样本能量升上来2.1 正相与负相一场双向博弈如果直接对 EBM 做最大似然估计对数似然的梯度有一个漂亮而对称的形式。设训练样本为 (\mathbf{x})对数似然为[ \log p_\theta(\mathbf{x}) -E_\theta(\mathbf{x}) - \log Z_\theta ]对参数 (\theta) 求梯度第二项需要展开[ \nabla_\theta \log Z_\theta \frac{1}{Z_\theta}\int \exp(-E_\theta(\mathbf{x})) \left(-\nabla_\theta E_\theta(\mathbf{x})\right) d\mathbf{x} -\mathbb{E}{\mathbf{x} \sim p\theta}\left[\nabla_\theta E_\theta(\mathbf{x})\right] ]于是总梯度变成[ \nabla_\theta \log p_\theta(\mathbf{x}) -\nabla_\theta E_\theta(\mathbf{x})\mathbb{E}{\mathbf{x} \sim p\theta}\left[\nabla_\theta E_\theta(\mathbf{x})\right] ]这个式子可以拆成两项来理解第一项称为正相positive phase它在降低训练数据 (\mathbf{x}) 自身的能量相当于把训练样本所在位置的能量曲面往下压。第二项称为负相negative phase它在提升模型采样出来的 (\mathbf{x}) 的能量。由于 (\mathbf{x}) 是从当前模型分布采样的它的分布代表了模型认为“合理但不一定真实”的区域。抬高这些区域的能量本质上是在告诉模型别把概率浪费在会生成假样本的地方。正相和负相合在一起就是一个完整的拉锯过程。理想情况下当模型收敛时训练数据的能量和模型采样的平均能量达到某种平衡梯度期望为零。这个过程不需要显式计算配分函数 (Z_\theta)但要求我们能够从当前模型 (p_\theta(\mathbf{x})) 中采样这恰好是第二个大坑。从物理角度看正相像淬火降温时把系统推向能量更低的构型负相像在热浴中让系统探索状态空间。平衡状态下数据对应的低能区域与模型采样对应的低能区域精确重合模型就学到了真实分布。2.2 从模型采样一场看不见终点的马尔可夫链要求每个训练步都从 (p_\theta) 精确采样几乎不可能。在高维连续空间中哪怕能量函数形式很简单直接采样仍很难做到均匀覆盖。于是大家自然想到了 MCMC马尔可夫链蒙特卡洛。经典做法是用朗之万动力学[ \mathbf{x}{t1} \mathbf{x}t \frac{\epsilon}{2}\nabla\mathbf{x} \log p\theta(\mathbf{x}_t) \sqrt{\epsilon}, \mathbf{z}_t ]其中 (\mathbf{z}_t \sim \mathcal{N}(0, I))(\epsilon) 是步长。注意到[ \nabla_\mathbf{x} \log p_\theta(\mathbf{x}) -\nabla_\mathbf{x} E_\theta(\mathbf{x}) ]所以朗之万更新实际上只需要能量函数的梯度无需知道配分函数。这也是为什么今天许多基于能量的生成模型被称为“基于分数的模型”——分数函数就是 (-\nabla_\mathbf{x} E_\theta(\mathbf{x}))。问题是马尔可夫链需要很长时间才能混合到平稳分布。在训练的每个迭代里都跑到近似收敛算力上不现实。链会在前后几步间高度相关梯度估计方差很大训练很容易震荡甚至发散。我自己在早期实验里就吃过这个亏链烧 10000 步再更新参数一步就要跑好几分钟而且效果并没有比快速近似更好。于是 Hinton 提出了一个“偷懒”但极其有效的思想干脆让马尔可夫链从训练数据出发只前进 k 步用这个不精确的样本当负相估计。这直接促成了对比散度算法。2.3 从无向图到 RBM让条件采样变得可解要实现上面这种“短暂烧链”的工程方案最经典的载体是受限玻尔兹曼机Restricted Boltzmann MachineRBM。RBM 是一个二分无向图一侧是可见单元 (\mathbf{v})对应数据一侧是隐单元 (\mathbf{h})对应潜在特征。能量定义为[ E_\theta(\mathbf{v}, \mathbf{h}) -\mathbf{b}^T\mathbf{v} - \mathbf{c}^T\mathbf{h} - \mathbf{h}^T\mathbf{W}\mathbf{v} ]关键设计是“受限”二字可见单元之间没有边隐单元之间也没有边。这使得给定一边另一边的所有单元彼此条件独立[ p(h_j1|\mathbf{v}) \sigma\left(c_j \sum_i W_{ji}v_i\right) ][ p(v_i1|\mathbf{h}) \sigma\left(b_i \sum_j W_{ji}h_j\right) ]采样时只需要按位独立采样一次就能更新一整层。这让 CD-k 算法变得极其高效从训练样本 (\mathbf{v}_0) 出发交替采样隐层和可见层k 步后得到负样本 (\mathbf{v}_k)便可以用它近似计算梯度。RBM 是 EBMs 在神经网络时代的第一个主流代表也是后来深度信念网络Deep Belief Network的积木块。从统计力学角度看它相当于在可见层与隐层之间定义了一组耦合强度的相互作用的系统而训练就是在学习这些耦合参数使得低温区间的典型构型尽量匹配训练数据的经验分布。3. 实战中的 EBM 训练CD-k 近似、温度与数值稳定性3.1 对比散度的 k 步之惑对比散度CD-k的思想并不高深。以 RBM 为例训练目标可以写成[ \mathcal{L} E_\theta(\mathbf{v}0) - E\theta(\mathbf{v}_k) ]最小化这个目标等价于做最大似然梯度的近似更新符号方向与对数似然梯度相互匹配降低真实样本的能量提高短链采样样本的能量。这个目标计算起来很快也没有显式的配分函数。k 通常取 1 或者个位数训练节奏很快。不过这里要明确一个代价CD-k 的梯度有偏。(k) 越小偏差越大。特别是当数据分布和模型分布差距很大时短链只能翻出局部区域的负样本模型对远处高能量区域一无所知。这会导致训练出来的能量曲面出现“假性平坦”——只优化到了数据邻域附近远处形成大片能量低洼区采样时容易陷入其中。解决方式不外乎几种加大 (k)比如用 CD-10 甚至 CD-100训练更稳但更慢使用持续对比散度PCD维护一条从上一轮参数延续下来的全局链让链逐步逼近模型分布把训练数据与采样数据之间的差距专门分开监测如对比正相平均能量与负相平均能量。我在实践中体会CD-1 适合快速验证模型是否学得动真正上线生成任务时至少要保证在“全局马尔可夫链”或 PCD 的框架下训练否则容易生成出一堆看起来还行、但多样性很差的样本。3.2 朗之万动力学实际采样时的关键参数朗之万采样时最需要小心的两个参数是步长 (\epsilon) 和步数 (T)。如果步长太大采样轨迹会越过能量低谷甚至发散如果步长太小链在有限步内几乎不动采出的样本与初始值差别很小。标准做法是采用退火朗之万动力学Annealed Langevin Dynamics开始时用较大的步长和较高的温度让链快速探索随后逐步减小步长、降低温度让链稳定在低能量区域落地。温度这个参数在 EBM 里特别有意思。把玻尔兹曼分布写成[ p_\theta(\mathbf{x}) \frac{\exp(-E_\theta(\mathbf{x})/\tau)}{Z_\theta} ]温度 (\tau) 控制分布的尖锐程度。温度越低分布越集中在能量最低点附近采样多样化越差温度过高样本会显得粗糙质量下降。炼丹时经常需要把温度当作一个可调超参数来平衡生成质量和多样性。我的经验是从 (\tau1) 开始若发现生成样本重叠度高就调大到 2~5若发现样本过于模糊就降到 0.5 左右。实际实现中还要注意能量函数的尺度。如果能量网络输出的数值范围在几十甚至上百那么 (\exp(-E)) 会非常接近 0梯度流动不顺畅如果能量输出只在 ±0.1 之间分布又会太平坦难以形成有区分度的能量曲面。一个实操建议是给能量网络加上一个可学习的“温度缩放”系数或者从一开始就把网络输出层初始化为小方差、不加偏置让训练初期的能量尺度处于 1 附近。3.3 我在实现 EBM 时积累下来的检查清单做了几轮完整实验之后我把容易翻车的地方整理成了一个清单分享给打算上手的读者第一不要直接拿最终损失值当观测指标。CD-k 的损失数值是“正相能量减去负相能量”它只代表相对差距不代表概率密度拟合得好不好。更可靠的指标是分开记录正相平均能量和负相平均能量观察两者差距是否随训练收敛到某个稳定值。第二采样过程要分阶段调参。训练早期模型分布和真实分布差距很大主体链可能处处是能量高地这时短链负样本几乎不提供有用的模型信息。可以考虑先做若干轮“预热”固定能量网络用数据分布初始化链跑几十轮再启用对抗式梯度更新。第三对能量面做正则化。纯最大似然训练很容易让模型在某些区域能量骤降占用过多概率质量。常见做法包括给能量加二次正则项限制输出幅度或者引入谱范数约束让网络对输入的变化更平滑。平滑的能量面不仅采样时更稳定也能让隐空间边界更连续。第四记录并监控温度对样本的影响。在生成阶段做温度调参时注意样本平均能量与数据平均能量的比值。如果模型生成样本的能量远低于真实数据多半是能量面被过度压出凹陷需要回退温度并调整正则项。下面用一个表格对比几种常见训练 EBM 时的负相采样方案方便你按需选择方法负样本来源偏差方差特点CD-k从训练数据出发的短链偏差较大低快适合初训PCD持续维护的全局马尔可夫链偏差较小中等稳定适合精细训练对抗式负采样由另一个生成模型提供负样本偏差取决于生成器低训练复杂但能覆盖更多模式退火朗之万从噪声出发逐步收缩步长偏差小较高生成质量好但推理慢4. 从 Hopfield 到扩散模型能量视角在现代架构中的隐身4.1 现代连续 Hopfield能量最小值检索与注意力机制说起 EBM 的血脉传承不能跳过 Hopfield 网络。经典 Hopfield 网络把一个记忆样本定义为能量曲面的一个吸引子输入状态会沿能量下降方向演化最终收敛到某个记忆。它的能量函数形式[ E(\mathbf{s}) -\frac12 \mathbf{s}^T \mathbf{W} \mathbf{s} - \mathbf{b}^T \mathbf{s} ]看起来和 RBM 有点像区别在于 Hopfield 网络通常没有随机采样而是做确定性的能量下降处理的是联想记忆问题。后来研究者把离散二值状态扩展成连续状态又把容量扩大发现现代连续 Hopfield 网络在“从一组记忆向量中检索目标向量”时其检索更新公式与 Transformer 中的自注意力几乎一样。也就是说注意力机制可以理解为在能量曲面上做一步隐式检索Query 和 Key 的相似度高对应的 Value 就会在能量低洼处被提取出来。这对理解 EBM 的价值有多大它说明能量视角不仅适用于生成模型还适用于记忆和推理。你可能并不需要显式训练一个 EBM但只要你的模型在做相似度比较、在做检索、在从多个候选中挑一个最优输出它的内在逻辑就等价于能量函数的相对比较。正因如此很多研究者把对比学习的目标函数也统一到能量视角下解释。4.2 扩散模型去噪分数是负能量梯度的近亲扩散模型在近两年几乎是生成领域的默认选择看上去和能量模型关系不大前向过程不断加噪反向过程学习去噪。但如果你把去噪网络 (s_\theta(\mathbf{x},t)) 看成是“分数函数”的近似而分数函数本身是[ s_\theta(\mathbf{x},t) \approx \nabla_\mathbf{x} \log p_t(\mathbf{x}) ]这就等价于[ \nabla_\mathbf{x} \log p_t(\mathbf{x}) -\nabla_\mathbf{x} E(\mathbf{x}, t) ]所以扩散模型实际上在学一张随时间变化的能量曲面的负梯度。噪声水平 (t) 越小对应温度越低、能量曲面越锐利(t) 越大对应温度越高、曲面越平滑。采样时从纯噪声出发逐步去噪本质上就是在做一大段退火朗之万动力学只不过把每一步的分数函数显式建模出来。很多 EBM 采样难的问题到扩散模型里被换了一个方式缓解通过多步、不同噪声水平的复合能量曲面一步步把生成过程掰到数据流形上去。从 EBM 视角看扩散模型能解释一个重要现象扩散模型的生成多样性之所以远好于早期 GAN是因为它没有一个判别器只压在数据局部区域而是通过分数匹配在学习全局能量曲面的梯度覆盖范围更广。4.3 对比学习与表示学习归纳出的“能量的相对语义”最后要说的是对比学习。CLIP 这类模型的目标函数看起来跟能量模型八竿子打不着但如果你把“图像与文本匹配程度”写成负能量把 batch 内其他样本对看作负样本InfoNCE 损失就是在做“拉近匹配对能量、推远非匹配对能量”的操作[ \mathcal{L} -\log \frac{\exp(-E(\mathbf{x},\mathbf{y}_))}{\sum_j \exp(-E(\mathbf{x},\mathbf{y}_j))} ]分母里的求和项本质上就是在近似一个只针对负样本方向的配分函数。这解释了为什么对比学习目标函数里总是塞着很大的 batch size——batch 越大负样本越多配分函数的近似越准梯度越接近真实 EBM 梯度。换句话说CLIP 和很多以 Softmax 形式计算的度量学习损失都是 EBM 思想在判别任务上的投影。把这三部分连起来看我个人的结论是能量视角没有过时反而成了连接物理直觉、生成模型、注意力机制和表示学习的公共语言。理解能量曲面的形状如何被训练改变比记住某条具体公式更能帮助你解释新模型的成功与失败。5. 我自己在实际操作中踩过的三个坑第一部分讲完理论最后想分享几个我在实现 EBM 相关模型时的切身体会这些细节论文里很少写但直接影响实验成败。第一个坑能量函数的偏移不变性看起来人畜无害实际是数值炸弹。因为概率密度只跟能量差有关所以在训练过程中能量函数可以整体向上或向下平移梯度不受影响。但如果能量整体越来越大(\exp(-E)) 会直接下溢到 0模型输出的都是 NaN如果能量整体越来越小逻辑上概率集中但数值上溢出。我的做法是每个训练步对能量输出做一次中心化处理把当前 batch 的平均能量减掉纯粹优化相对差异避免无意义漂移。第二个坑短链采样虽然省时但不能无限压缩。我最早贪图训练速度尝试把 k 压到 1 并加大 batch size结果发现生成样本一直缩在训练样本附近几乎没有多样性。后来跟同事复盘意识到 CD-1 的负相采样的链根本来不及逃出数据邻域模型无法获知远处的能量面是否隆起于是训练出的能量面在远处塌陷成大片盆地生成多样性的上限被锁死。解决方式是换用 PCD 或至少每若干轮跑一次完整退火朗之万采样作为负相参照物。第三个坑采样步长和温度必须联动调整。单独加大步长或者单独降温度都会让采样质量先升后降。温度降低会让分布变锐但如果步长不变链很容易跳过能量极窄的低谷反而经常落在高能区域步长调太小时低温度下链又跑不动。后来我总结出一个土办法训练阶段固定温度 1用较大步长快速探索生成阶段再逐步退火同时每退一次温就减一次步长保持“温度/步长”大致成比例。这一套下来生成样本的质量和多样性都提升不少。EBM 的魅力在于它把很多看似无关的生成模型、表示学习、检索问题统摄进同一个物理框架。理解配分函数与能量曲面的关系就像握住了一把钥匙你再去看扩散模型的多步去噪、对比学习里的大 batch 负样本、注意力机制里的相似度检索都会觉得它们是同一件事的不同面孔。如果你也想动手实现一个基于能量的模型我的建议很简单从 RBM 的 CD-1 开始找手感再从朗之万采样和温度退火两个方向做深入优化最后把能量视角带入你最常见的模型里重新审视一遍。这个框架值得融进你的技术思维底层。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →