☰
能量模型与对比散度:从RBM到扩散模型的统一视角
2026/10/1 7:38:19 网站建设 项目流程

第一次认真读 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}{t+1} = \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 Machine,RBM)。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_j=1|\mathbf{v}) = \sigma\left(c_j + \sum_i W_{ji}v_i\right) ]

[ p(v_i=1|\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) 控制分布的尖锐程度。温度越低,分布越集中在能量最低点附近,采样多样化越差;温度过高,样本会显得粗糙,质量下降。炼丹时经常需要把温度当作一个可调超参数来平衡生成质量和多样性。我的经验是从 (\tau=1) 开始,若发现生成样本重叠度高,就调大到 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 开始找手感,再从朗之万采样和温度退火两个方向做深入优化,最后把能量视角带入你最常见的模型里重新审视一遍。这个框架值得融进你的技术思维底层。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询