能量模型
本文最后更新于 2026年8月25日 下午
北京大学信息科学技术学院 生成模型基础(2025秋)的课程笔记
第八讲:Energy-based model
最近连日大雨,居家闲来无事,遂继续更新之,不想再鸽
这一章依旧是拓展内容,和物理关系不小,笔者看看还能记得多少()
何为能量模型
首先,我们可以比较显然地将一张图片视为某个概率分布
这只需要把每一个像素转化为灰度值,即可视为高维空间的分布
物理起源
能量模型最早来源于统计物理,用于描述系统状态的概率分布
系统状态$x$出现的概率为:
$p(x)=\dfrac{1}{Z}exp(-\dfrac{E(x)}{T})$
其中$E(x)$为能量函数,$T$为温度,$Z$为归一化常数
$Z= \int exp(-\dfrac{E(x)}{T}) dx$
由此公式,能量较低的状态出现概率较高
迁移到生成模型
对于生成模型,我们将能量函数替换为可学习的参数化函数
$p_\theta(x)=\dfrac{1}{Z(\theta)}exp(f_\theta(x))$,其中$Z(\theta)= \int exp(f_\theta(x)) dx$
这里$x$可以是输入的text/image/audio
能量函数被$f_\theta(x)$所替换,可以是神经网络
由此,可以将其视为对每个可能的$x$做一个softmax预测
为什么要用能量模型
概率分布需要满足$p(x) \ge 0$和归一化条件
很多函数类容易满足非负,但是归一化就不一定了
并且指数分布可以模拟许多尖锐的变化
即使$Z(\theta)$难以计算,模型仍然具备很强的表达能力
优点 :
- 非常灵活,对$f_\theta$几乎没有假设
- 无需计算$Z$即可比较两个样本之间相对概率
缺点:
- 采样和训练都很困难
- 高维空间计算积分更是困难
具体应用
首先一个非常简单的,上面也有提到
比如比较$x$和$x’$哪个出现概率更大,只需比较$f_\theta(x)$和$f_\theta(x’)$
此外还可以多个专家联合打分,建模为
$p_{\theta_1,\theta_2,\theta_3}=\dfrac{1}{Z}q_{\theta_1}(x)r_{\theta_2}(x)t_{\theta_3}(x)$
虽然每个单独专家是合法概率分布,但其乘积不一定是
这就体现出能量模型的好处,无脑归一化联合分布的概率即可
训练
依旧是经典的最大化对数似然函数
对$p_\theta(x)=\dfrac{1}{Z(\theta)}exp(f_\theta(x))$两边取自然对数
即为$max f_\theta(x_{train})-ln Z(\theta)$
对其取梯度,得到
$\nabla_\theta f_\theta(x_{train})-\dfrac{\nabla_\theta Z(\theta)}{Z(\theta)}$
其中$\nabla_\theta Z(\theta)=\nabla_\theta \int exp(f_\theta(x)) dx$
$=\int \nabla_\theta exp(f_\theta(x)) dx$
$=\int exp(f_\theta(x))\nabla_\theta f_\theta(x)dx$
带回原式,有
$\nabla_\theta f_\theta(x_{train})-\dfrac{\nabla_\theta Z(\theta)}{Z(\theta)}$
$=\nabla_\theta f_\theta(x_{train})-\dfrac{\int exp(f_\theta(x))\nabla_\theta f_\theta(x)dx}{Z(\theta)}$
$=\nabla_\theta f_\theta(x_{train})-\int p_\theta(x) \nabla_\theta f_\theta(x)dx$
$=\nabla_\theta f_\theta(x_{train})-E_{x \sim p_{model}}\nabla_\theta f_\theta(x)$
于是,我们训练的目的就是最大化上式
前一项很好理解,需要提高训练样本的得分
后一项则是防止$Z$持续增大,为模型生成的样本分配较低的评分
这种方法被称作contrastive divergence(对比散度)
对比学习
上面刚好提到了对比散度,这里我们简要介绍一下对比学习
对比学习是一种自监督学习方法,广泛用于cv任务
原理很简单,相似的对象特征表示也会相似,不同的对象反之
核心在于:采用数据增强技术生成相似对象对,采用随机采样生成不同对象对
上面是一个简单的例子
采样
MCMC
显然我们无法直接从$p_\theta(x)$中直接采样,但可以很容易地比较两个样本的采样概率大小
于是我们可以采取一种方法,称为Markov Chain Monte Carlo(MCMC)
本质是用马尔科夫链随机游走,逐步逼近真实分布
首先随机初始化$x^0$,$t=0$
然后令$x’=x^t+noise$
若$f_\theta(x’)>f_\theta(x^t)$,那么就令$x^{t+1}=x’$
否则以$exp(f_\theta(x’)-f_\theta(x^t))$的概率接受$x^{t+1}=x’$
由此当$t \rightarrow \infty$时,$x^t \sim p(x)$
Langevin sampling
利用score function
$\nabla_x logp_\theta(x)=\nabla_x (f_\theta(x)-log Z(\theta)=\nabla_x f_\theta(x)$
于是无需计算$Z(\theta)$即可得到score function
我们令$\pi(x)$为一个易于采样的先验分布,于是Langevin sampling如下
$x^0 \sim \pi(x)$
$x^{t+1} \sim x^t+\epsilon \nabla_x logp_\theta(x^t)+\sqrt{2\epsilon}z^t$,对于$t=0,1,…,T-1$
其中$z^t \sim N(0,1)$
若$\epsilon \rightarrow 0$,$T \rightarrow \infty$,则有$x^T \sim p_\theta(x)$