基于能量的模型(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采样生成负样本,并通过同时压低正样本能量、抬高负样本能量来训练模型。这种框架在生成建模、异常检测、半监督学习等领域都有广泛应用。