基于能量的模型(Energy-Based Models, EBMs)原理与能量函数设计
字数 3636 2025-12-08 09:13:44

基于能量的模型(Energy-Based Models, EBMs)原理与能量函数设计

基于能量的模型(EBMs)是一种通过能量函数来建模数据概率分布的生成模型。与传统直接输出概率的模型(如softmax)不同,EBMs首先为每个数据配置分配一个标量能量值,能量越低表示该配置的概率越高。其核心思想是:学习一个能量函数,使得观察到的数据(训练数据)对应的能量低,而未观察到的区域能量高。

一、核心概念与基本原理

  1. 能量函数定义: 给定一个数据点 \(\mathbf{x}\)(例如一张图片或一个句子),EBMs定义一个可学习的能量函数 \(E_{\theta}(\mathbf{x})\),其中 \(\theta\) 是模型参数。这个函数将数据点映射到一个实数值标量 \(E \in \mathbb{R}\)
  2. 能量与概率的关系: 能量值本身不是概率。通过玻尔兹曼分布(或称吉布斯分布),能量可以转化为概率分布:

\[ p_{\theta}(\mathbf{x}) = \frac{e^{-E_{\theta}(\mathbf{x})}}{Z(\theta)} \]

其中,$ Z(\theta) = \int e^{-E_{\theta}(\mathbf{x})} d\mathbf{x} $ 称为**配分函数**(Partition Function)。这个公式直观地表达了“低能量对应高概率”。配分函数 $ Z(\theta) $ 是一个归一化常数,确保所有可能数据点的概率之和为1。然而,对于复杂数据(如高维图像),$ Z(\theta) $ 通常是难以处理的(难以计算或积分)。
  1. EBMs的关键挑战: 直接最大化数据的对数似然 \(\log p_{\theta}(\mathbf{x})\) 会涉及到计算 \(\log Z(\theta)\) 的梯度,这需要对所有可能的数据配置进行积分,这在实践中是不可行的。因此,EBMs的训练需要绕开对 \(Z(\theta)\) 的直接计算。

二、EBMs的训练:对比散度与噪声对比估计

EBMs的训练核心是采用对比学习的思想:降低真实数据点的能量,同时提高“负样本”(非真实数据点)的能量。这里介绍两种主流训练方法。

步骤1:构建损失函数——对比散度
一个常用的方法是对比散度。其损失函数通常设计为:

\[\mathcal{L}(\theta) = \mathbb{E}_{\mathbf{x}^+ \sim p_{data}} [E_{\theta}(\mathbf{x}^+)] - \mathbb{E}_{\mathbf{x}^- \sim p_{\theta}} [E_{\theta}(\mathbf{x}^-)] \]

其中:

  • \(\mathbf{x}^+\) 是从真实数据分布 \(p_{data}\) 中采样的正样本(训练数据)。
  • \(\mathbf{x}^-\) 是从当前模型定义的分布 \(p_{\theta}\) 中采样的负样本

损失函数的直观解释: 最小化这个损失函数,意味着我们希望降低正样本的能量(第一项变小),同时提高负样本的能量(第二项是负能量期望,使其变大等价于最小化损失时,该项会驱动能量变高)。

关键问题: 如何从模型分布 \(p_{\theta}\) 中高效地采样出负样本 \(\mathbf{x}^-\)

步骤2:生成负样本——马尔可夫链蒙特卡洛
由于无法直接从 \(p_{\theta}\) 精确采样,我们使用马尔可夫链蒙特卡洛(MCMC)方法,特别是朗之万动力学(Langevin Dynamics)来近似采样。

朗之万动力学的更新公式为:

\[\mathbf{x}_{t} = \mathbf{x}_{t-1} - \frac{\lambda}{2} \nabla_{\mathbf{x}} E_{\theta}(\mathbf{x}_{t-1}) + \sqrt{\lambda} \epsilon_t, \quad \epsilon_t \sim \mathcal{N}(0, I) \]

其中:

  • \(\lambda\) 是步长。
  • \(\nabla_{\mathbf{x}} E_{\theta}(\mathbf{x})\) 是能量函数关于输入 \(\mathbf{x}\) 的梯度。注意,这个梯度方向是能量上升最快的方向。因为我们要采样低概率(高能量)区域,所以更新时沿着能量梯度的负方向(即 \(-\nabla_{\mathbf{x}} E_{\theta}\))移动,实际上是在向能量低(概率高)的区域移动
  • \(\epsilon_t\) 是高斯噪声,提供探索能力,避免陷入局部极小值。

采样过程: 我们从一个随机噪声 \(\mathbf{x}_0\) 开始,运行上述朗之万动力学公式 \(T\) 步。如果能量函数学得好,并且运行足够多步(\(T\) 很大),最终得到的 \(\mathbf{x}_T\) 可以近似看作是从 \(p_{\theta}(\mathbf{x})\) 中采样的样本。但在实践中,为了加速训练,通常只运行少数几步(例如 \(T=1\) ),这被称为短程MCMC,是“对比散度-1”(CD-1)算法的思想。尽管采样不精确,但经验证明它对训练EBMs是有效的。

步骤3:执行训练迭代
结合以上两步,EBMs的训练迭代可以总结为以下循环:

  1. 采样正样本: 从训练集中取一个批量数据 \(\{ \mathbf{x}_i^+ \}\)
  2. 生成负样本: 对每个正样本(或从一个噪声分布开始),运行几步(如 \(K\) 步)朗之万动力学,得到对应的负样本 \(\{ \mathbf{x}_i^- \}\)
  3. 计算损失: 计算对比损失 \(\mathcal{L} = \frac{1}{N} \sum_i (E_{\theta}(\mathbf{x}_i^+) - E_{\theta}(\mathbf{x}_i^-))\)
  4. 参数更新: 计算损失函数关于参数 \(\theta\) 的梯度 \(\nabla_{\theta} \mathcal{L}\),并使用梯度下降法(如Adam)更新 \(\theta\)
    • 梯度计算中,\(\nabla_{\theta} E_{\theta}(\mathbf{x}^+)\) 推动参数使正样本能量降低。
    • \(-\nabla_{\theta} E_{\theta}(\mathbf{x}^-)\) 推动参数使负样本能量升高。

另一种流行的训练方法是噪声对比估计(NCE),它将EBMs的学习问题构造成一个二分类问题(区分真实数据样本和噪声样本),但核心思想同样是对比。

三、能量函数的设计与实现

能量函数 \(E_{\theta}(\mathbf{x})\) 可以是任何输出为标量的可微分函数。常见的设计包括:

  • 基于距离的能量\(E_{\theta}(\mathbf{x}) = ||f_{\theta}(\mathbf{x})||^2\),其中 \(f_{\theta}\) 是一个神经网络。模型学会将数据映射到低范数的表示。
  • 基于自编码器的能量\(E_{\theta}(\mathbf{x}) = ||\mathbf{x} - D_{\theta}(E_{\phi}(\mathbf{x}))||^2\),即重建误差。其中 \(E_{\phi}\) 是编码器,\(D_{\theta}\) 是解码器。正常数据重建误差小(能量低),异常或未见数据重建误差大(能量高)。
  • 基于判别模型的能量: 对于一个分类模型,可以将最后一层softmax之前的“logits”取反或进行变换作为能量。例如, \(E_{\theta}(\mathbf{x}, y) = -f_{\theta}(\mathbf{x})[y]\),其中 \(f_{\theta}(\mathbf{x})[y]\) 是对应类别 \(y\) 的logit值。训练时,正确标签对应的能量低,错误标签对应的能量高。

总结:EBMs通过一个灵活的能量函数来隐式定义复杂的概率分布。其训练巧妙地避开了难以处理的配分函数,转而采用对比学习范式,利用MCMC采样生成负样本,并通过同时压低正样本能量、抬高负样本能量来训练模型。这种框架在生成建模、异常检测、半监督学习等领域都有广泛应用。

基于能量的模型(Energy-Based Models, EBMs)原理与能量函数设计 基于能量的模型(EBMs)是一种通过能量函数来建模数据概率分布的生成模型。与传统直接输出概率的模型(如softmax)不同,EBMs首先为每个数据配置分配一个标量能量值,能量越低表示该配置的概率越高。其核心思想是:学习一个能量函数,使得观察到的数据(训练数据)对应的能量低,而未观察到的区域能量高。 一、核心概念与基本原理 能量函数定义 : 给定一个数据点 \( \mathbf{x} \)(例如一张图片或一个句子),EBMs定义一个可学习的能量函数 \( E_ {\theta}(\mathbf{x}) \),其中 \( \theta \) 是模型参数。这个函数将数据点映射到一个实数值标量 \( E \in \mathbb{R} \)。 能量与概率的关系 : 能量值本身不是概率。通过玻尔兹曼分布(或称吉布斯分布),能量可以转化为概率分布: \[ p_ {\theta}(\mathbf{x}) = \frac{e^{-E_ {\theta}(\mathbf{x})}}{Z(\theta)} \] 其中,\( Z(\theta) = \int e^{-E_ {\theta}(\mathbf{x})} d\mathbf{x} \) 称为 配分函数 (Partition Function)。这个公式直观地表达了“低能量对应高概率”。配分函数 \( Z(\theta) \) 是一个归一化常数,确保所有可能数据点的概率之和为1。然而,对于复杂数据(如高维图像),\( Z(\theta) \) 通常是难以处理的(难以计算或积分)。 EBMs的关键挑战 : 直接最大化数据的对数似然 \( \log p_ {\theta}(\mathbf{x}) \) 会涉及到计算 \( \log Z(\theta) \) 的梯度,这需要对所有可能的数据配置进行积分,这在实践中是不可行的。因此,EBMs的训练需要绕开对 \( Z(\theta) \) 的直接计算。 二、EBMs的训练:对比散度与噪声对比估计 EBMs的训练核心是采用 对比学习 的思想:降低真实数据点的能量,同时提高“负样本”(非真实数据点)的能量。这里介绍两种主流训练方法。 步骤1:构建损失函数——对比散度 一个常用的方法是 对比散度 。其损失函数通常设计为: \[ \mathcal{L}(\theta) = \mathbb{E} {\mathbf{x}^+ \sim p {data}} [ E_ {\theta}(\mathbf{x}^+)] - \mathbb{E} {\mathbf{x}^- \sim p {\theta}} [ E_ {\theta}(\mathbf{x}^-) ] \] 其中: \( \mathbf{x}^+ \) 是从真实数据分布 \( p_ {data} \) 中采样的 正样本 (训练数据)。 \( \mathbf{x}^- \) 是从当前模型定义的分布 \( p_ {\theta} \) 中采样的 负样本 。 损失函数的直观解释 : 最小化这个损失函数,意味着我们希望 降低正样本的能量 (第一项变小),同时 提高负样本的能量 (第二项是负能量期望,使其变大等价于最小化损失时,该项会驱动能量变高)。 关键问题 : 如何从模型分布 \( p_ {\theta} \) 中高效地采样出负样本 \( \mathbf{x}^- \)? 步骤2:生成负样本——马尔可夫链蒙特卡洛 由于无法直接从 \( p_ {\theta} \) 精确采样,我们使用 马尔可夫链蒙特卡洛 (MCMC)方法,特别是 朗之万动力学 (Langevin Dynamics)来近似采样。 朗之万动力学的更新公式为: \[ \mathbf{x} {t} = \mathbf{x} {t-1} - \frac{\lambda}{2} \nabla_ {\mathbf{x}} E_ {\theta}(\mathbf{x}_ {t-1}) + \sqrt{\lambda} \epsilon_ t, \quad \epsilon_ t \sim \mathcal{N}(0, I) \] 其中: \( \lambda \) 是步长。 \( \nabla_ {\mathbf{x}} E_ {\theta}(\mathbf{x}) \) 是能量函数关于输入 \( \mathbf{x} \) 的梯度。注意,这个梯度方向是 能量上升最快的方向 。因为我们要采样低概率(高能量)区域,所以更新时沿着能量梯度的 负方向 (即 \( -\nabla_ {\mathbf{x}} E_ {\theta} \))移动,实际上是在 向能量低(概率高)的区域移动 。 \( \epsilon_ t \) 是高斯噪声,提供探索能力,避免陷入局部极小值。 采样过程 : 我们从一个随机噪声 \( \mathbf{x}_ 0 \) 开始,运行上述朗之万动力学公式 \( T \) 步。如果能量函数学得好,并且运行足够多步(\( T \) 很大),最终得到的 \( \mathbf{x} T \) 可以近似看作是从 \( p {\theta}(\mathbf{x}) \) 中采样的样本。但在实践中,为了加速训练,通常只运行少数几步(例如 \( T=1 \) ),这被称为 短程MCMC ,是“对比散度-1”(CD-1)算法的思想。尽管采样不精确,但经验证明它对训练EBMs是有效的。 步骤3:执行训练迭代 结合以上两步,EBMs的训练迭代可以总结为以下循环: 采样正样本 : 从训练集中取一个批量数据 \( \{ \mathbf{x}_ i^+ \} \)。 生成负样本 : 对每个正样本(或从一个噪声分布开始),运行几步(如 \( K \) 步)朗之万动力学,得到对应的负样本 \( \{ \mathbf{x}_ i^- \} \)。 计算损失 : 计算对比损失 \( \mathcal{L} = \frac{1}{N} \sum_ i (E_ {\theta}(\mathbf{x} i^+) - E {\theta}(\mathbf{x}_ i^-)) \)。 参数更新 : 计算损失函数关于参数 \( \theta \) 的梯度 \( \nabla_ {\theta} \mathcal{L} \),并使用梯度下降法(如Adam)更新 \( \theta \)。 梯度计算中,\( \nabla_ {\theta} E_ {\theta}(\mathbf{x}^+) \) 推动参数使正样本能量降低。 \( -\nabla_ {\theta} E_ {\theta}(\mathbf{x}^-) \) 推动参数使负样本能量升高。 另一种流行的训练方法是 噪声对比估计 (NCE),它将EBMs的学习问题构造成一个二分类问题(区分真实数据样本和噪声样本),但核心思想同样是对比。 三、能量函数的设计与实现 能量函数 \( E_ {\theta}(\mathbf{x}) \) 可以是任何输出为标量的可微分函数。常见的设计包括: 基于距离的能量 : \( E_ {\theta}(\mathbf{x}) = ||f_ {\theta}(\mathbf{x})||^2 \),其中 \( f_ {\theta} \) 是一个神经网络。模型学会将数据映射到低范数的表示。 基于自编码器的能量 : \( E_ {\theta}(\mathbf{x}) = ||\mathbf{x} - D_ {\theta}(E_ {\phi}(\mathbf{x}))||^2 \),即重建误差。其中 \( E_ {\phi} \) 是编码器,\( D_ {\theta} \) 是解码器。正常数据重建误差小(能量低),异常或未见数据重建误差大(能量高)。 基于判别模型的能量 : 对于一个分类模型,可以将最后一层softmax之前的“logits”取反或进行变换作为能量。例如, \( E_ {\theta}(\mathbf{x}, y) = -f_ {\theta}(\mathbf{x})[ y] \),其中 \( f_ {\theta}(\mathbf{x})[ y ] \) 是对应类别 \( y \) 的logit值。训练时,正确标签对应的能量低,错误标签对应的能量高。 总结 :EBMs通过一个灵活的能量函数来隐式定义复杂的概率分布。其训练巧妙地避开了难以处理的配分函数,转而采用对比学习范式,利用MCMC采样生成负样本,并通过同时压低正样本能量、抬高负样本能量来训练模型。这种框架在生成建模、异常检测、半监督学习等领域都有广泛应用。