ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

基于能量的模型(EBM)深度解析:从统计力学到生成模型训练实战

基于能量的模型(EBM)深度解析:从统计力学到生成模型训练实战 概率模型和统计力学这两个词放在一起乍看像两条平行线但真正做过生成模型的人都知道它们之间的桥梁就是基于能量的模型Energy Based ModelEBM。我最早接触EBM是在研究受限玻尔兹曼机的时候当时最直观的感受是原来一个概率分布可以不用显式写出归一化常数只靠一个能量函数就能定义出来。这个想法非常优雅但也给训练带来了不少麻烦。这篇内容我会把EBM的统计力学根基、核心数学框架、训练难点和实战技巧都梳理一遍适合正在学习生成模型、想做无监督学习或者对统计物理与机器学习交叉领域感兴趣的读者。1. 概率模型与统计力学的交汇点1.1 从配分函数说起统计力学给概率模型的礼物统计力学研究的是大量微观粒子组成的系统的宏观性质。在平衡态统计力学中一个系统处于某个微观状态的概率由玻尔兹曼分布给出p(x) (1/Z) * exp(-E(x)/T)其中E(x)是系统的能量T是温度Z是配分函数。配分函数这个名字听起来很抽象它的定义其实就是一个归一化常数要遍历所有可能的微观状态做求和或积分Z Σ_x exp(-E(x)/T)你可以把它理解为“系统所有可能状态的概率权重之和”。这个公式里的温度T很有意思温度高时系统倾向于均匀分布在各种状态上温度低时系统则倾向于集中在低能量状态附近。这跟机器学习里的softmax温度缩放几乎一模一样。机器学习领域从统计力学拿来的核心思想就是把“数据样本”看成“微观状态”把“数据分布”看成“统计力学中的平衡态分布”。假如我们能构造一个能量函数E(x)使得真实数据样本对应的能量低、非数据样本对应的能量高那么玻尔兹曼分布就会把概率质量集中在数据附近。这就是EBM的基本哲学不直接建模概率密度而是建模一个能反映数据“合理性”的能量标量。我在实际学习中最开始容易忽略的一点是Z通常不可计算。对于高维连续空间或者大规模离散状态空间遍历所有状态做归一化几乎不可能。这直接导致最大似然估计的梯度无法精确计算进而催生出了一大堆近似方法后面会详细展开。1.2 能量视角为什么重要比显式概率更优雅显式的概率生成模型比如混合高斯模型会直接写出p(x) Σ_k π_k N(x; μ_k, Σ_k)所有参数都明确出现在公式里归一化是自动满足的。这类模型数学上干净但表达能力的上限很受限——你要增加复杂度就得显式增加大量分量参数数量爆炸式增长。EBM选择了另一条路用一个参数化的能量函数E_θ(x)隐式地定义分布。只要E_θ(x)有足够强的表达能力比如深度神经网络p_θ(x)就能拟合非常复杂的分布。这里不需要对能量函数做任何约束它可以是任意实数值因为最终的概率是exp(-E_θ(x))再归一化天然保证非负。这个“无约束性”是EBM的巨大优势——你写模型时不需要费心设计保证归一化的结构只需要设计一个能反映数据合理性的打分函数即可。但代价就是配分函数Z_θ跟着参数θ变化训练时必须反复处理它。打个比方显式概率模型像直接画一条标准曲线来描述数据EBM像在数据区域挖坑、在非数据区域堆墙最后看哪个位置地势低哪里就是数据应该出现的区域。这种“地势”的表达方式非常灵活尤其适合图像、语音这类结构复杂的高维数据。2. 基于能量的模型EBM核心框架拆解2.1 能量函数与玻尔兹曼分布的推导逻辑前面提到玻尔兹曼分布现在细看它的推导逻辑。统计力学里有一个核心原理在恒定温度下系统达到热平衡时微观状态的概率与该状态的能量成指数衰减关系。用数学语言说如果用S表示系统的熵用E表示内能那么自由能F E - TS在平衡态取极小值。结合熵的定义S -Σ_x p(x) log p(x)在平均能量约束Σ_x p(x) E(x) ⟨E⟩下最大化熵拉格朗日乘子法直接导出p(x) (1/Z) * exp(-E(x)/T)这里拉格朗日乘子恰好对应1/T。整个过程非常干净也解释了为什么玻尔兹曼分布是给定平均能量时最“公平”的分布——它没有引入任何人为偏好。EBM完全沿用这个逻辑。我们定义p_θ(x) (1/Z_θ) * exp(-E_θ(x))其中θ是能量函数的参数。在实际的深度学习EBM里温度T通常被吸收到能量函数内部相当于缩放E所以不需要显式写出T。在生成图像时如果想控制采样多样性可以通过调节T实现高温采样偏向多样但质量略低低温采样偏向清晰但多样性下降这跟我在实践中的观察是一致的。需要区分一个细节EBM的能量函数输出的是标量不是向量。有些初学者会把判别模型的logits直接理解为能量这也没错——分类器的logits经过softmax后就是一类条件概率分布本质上就是EBM的特例。差别在于EBM的输入x是整个数据样本输出是一个标量分数这个分数越低代表样本越合理。2.2 三种基本构造从全可见到隐藏变量EBM的构造方式大体上有三类按从简单到复杂排序第一类是简单能量函数。直接令E_θ(x) f_θ(x)其中f_θ是任意神经网络输出标量。训练时用下面会讲到的对比散度或得分匹配来优化参数。这种方式在图像生成领域有代表性工作只要网络设计合理可以直接生成逼真图像它的优势是结构自由缺点是采样比较困难需要依赖朗之万动力学等MCMC方法。第二类是带隐藏变量的能量函数。最经典的例子是受限玻尔兹曼机RBME_θ(v, h) -a^T v - b^T h - v^T W h这里v是可见变量比如图像像素h是隐藏变量学习到的特征表示。因为隐藏变量的存在这种模型能表达可见变量之间复杂的非线性依赖关系。对于可观测数据x标准做法是对隐藏变量做边际化p_θ(x) (1/Z_θ) Σ_h exp(-E_θ(x, h))RBM的训练后来发展出对比散度算法在深度学习历史上写下了浓重的一笔。虽然现在很少直接堆叠RBM做深度模型但它的思想被大量后续工作沿用。第三类是条件能量模型。在输入条件y下定义能量E_θ(x, y)建模条件分布p_θ(x|y)。这在结构化预测、图像生成条件化任务里很常见。比如文本到图像生成就可以用条件EBM对图像打分。三类构造的共同点是能量函数必须能灵活体现数据结构和任务需求。我在实际设计新模型时第一件事不是选训练算法而是想清楚能量函数的“势能面”应该长什么样——哪些区域应该低能量哪些区域应该高能量这决定了模型能不能学出有意义的东西。2.3 关键运算对象配分函数、自由能、似然EBM整个理论框架围绕三个核心运算对象运转理解它们之间的勾稽关系特别重要。配分函数Z_θ是所有状态能量指数的积分或求和Z_θ ∫ exp(-E_θ(x)) dx在深度学习场景下这个积分几乎没有解析解。Z_θ的价值在于它把未归一化的分布转化为真正的概率分布但恰恰因为不可计算训练必须绕开它。自由能F_θ在统计力学里定义为F -T log Z。在EBM里如果把数据看作固定值可以定义给定可见变量后的自由能F_θ(x) -log Σ_h exp(-E_θ(x, h))这个量非常有用。RBM中计算自由能是训练和推理的基础。自由能低的样本更可能来自数据分布。异常检测就基于这个性质正常样本的自由能低异常样本的自由能高。对数似然log p_θ(x) -E_θ(x) - log Z_θ。注意如果存在隐藏变量则E_θ(x)要被自由能替换。对数似然是训练的目标函数但直接优化它需要知道log Z_θ的梯度这就牵扯出了训练的核心难点。3. 训练EBM的硬骨头概率归一化与采样3.1 最大似然估计为何这么难给定训练数据集{x_i}EBM的最大似然目标是max_θ (1/N) Σ_i log p_θ(x_i)对θ求梯度∇_θ log p_θ(x_i) -∇_θ E_θ(x_i) - ∇_θ log Z_θ第二项继续展开∇_θ log Z_θ (1/Z_θ) ∫ exp(-E_θ(x)) (-∇_θ E_θ(x)) dx E_{x ~ p_θ(x)}[-∇_θ E_θ(x)]合并之后得到一个非常优雅的形式∇_θ log p_θ(x_i) -∇_θ E_θ(x_i) E_{x ~ p_θ(x)}[∇_θ E_θ(x)]这个公式值得反复品味第一项是数据点的能量梯度作用是拉低真实样本的能量第二项是模型分布下的能量梯度期望作用是拉高模型生成样本的能量。训练过程就是在做一个动态平衡让数据分布下的能量越来越低让模型分布下的能量越来越高。难点恰恰在第二项。要估计模型分布下的期望就需要从当前p_θ(x)中采样。但p_θ(x)本身定义里含有不可计算的Z_θ直接采样是不可能的。因此只能用MCMC方法比如朗之万动力学、吉布斯采样近似采样而MCMC在高维空间可能收敛极慢导致梯度的第二项估计噪声很大。这就是EBM训练难的根本原因。我在实践中经常看到的现象是训练初期模型分布和目标分布差距很大MCMC采出来的样本质量很差导致梯度估计不准模型训练不稳定。这跟生成对抗网络GAN早期训练不稳定有些类似但EBM的噪声更大因为MCMC的随机性叠加在梯度估计上。3.2 对比散度CD与持续对比散度PCDHinton在2002年提出的对比散度算法Contrastive DivergenceCD是训练RBM和早期EBM的经典方法也是对最大似然梯度的一个巧妙近似。CD的核心思路不要从模型分布中采样来估计梯度第二项而是从训练数据点出发仅运行k步MCMC通常k1就够得到对比样本用这些对比样本近似模型分布。具体到RBM的训练取一个训练样本v_0。根据条件分布采样隐藏变量h_0 ~ p(h|v_0)。根据条件分布重构可见变量v_1 ~ p(v|h_0)。再采样h_1 ~ p(h|v_1)。用(v_0, h_0)和(v_1, h_1)的统计量差值更新权重。CD之所以有效是因为它与真实最大似然梯度之间有一个可证明的偏差但这个偏差在数据分布接近模型分布时会趋于零。它的效率高得惊人本质原因是MCMC链从数据点开始而不是从随机噪声开始——数据点已经在高概率区域附近几步吉布斯采样就能移动到模型比较认可的另一个高概率区从而给出有用的梯度方向。CD的一个著名变体是持续对比散度Persistent Contrastive DivergencePCD由Tieleman在2008年提出。PCD维护一组“持久链”这些链在整个训练过程中持续运行每次参数更新后不重置链的状态而是继续从上一轮的状态采样。这样模型分布缓慢变化时链能逐步跟上采样质量比每次都从数据点重启的CD更接近真实的模型分布。直接用CD训练深度EBM时我在实验中发现一个明显问题CD对学习率非常敏感学习率稍微调大一点梯度估计的偏差就会导致能量函数坍塌所有样本的能量都变得一样低。后来我用PCD配合较小的学习率稳定性明显改善。但PCD也有自己的坑持久链在训练中可能陷入某个单一模式导致模型生成的样本多样性不足。3.3 得分匹配与去噪得分匹配最大似然这条路因为MCMC采样不好走另一个思路是绕开配分函数直接让模型分布的“得分”score逼近数据分布的“得分”。得分是概率分布对输入的对数似然梯度s(x) ∇_x log p(x)这个量有意思的地方在于对于EBMs_θ(x) -∇_x E_θ(x)配分函数Z_θ是常数求梯度之后直接消失。这意味着我们可以完全避开可怕的配分函数来训练模型只要让模型定义的能量梯度匹配真实的得分。得分匹配的目标函数是J(θ) (1/2) E_{p_data(x)}[||s_θ(x) - s_data(x)||²]直接计算还需要知道真实得分但Hyvärinen在2005年证明了一个重要恒等式可以把上述目标转化为一个不需要真实得分的等价形式只依赖模型得分的雅可比迹。这个转化让得分匹配变成可操作的算法。后来Vincent提出去噪得分匹配Denoising Score MatchingDSM思路是先用高斯噪声扰动数据点再让模型预测扰动数据的得分也就是用噪声核的解析得分作为监督信号。DSM与去噪自编码器有直接联系实现非常简单这让得分匹配在深度学习时代重新焕发了生命力。这里必须提一个现代视角目前大火的各种扩散模型本质上就是在做EBM的得分匹配训练。扩散模型的前向过程逐步加噪反向过程用神经网络估计得分生成时用朗之万采样逐步去噪。可以说扩散模型是EBM理论在深度学习时代最成功的践行者。我在下面第4.3节会专门讨论这个联系。3.4 训练稳定性的实际经验训练EBM有点像走钢丝。我在大量实验后总结了几条维护稳定性的心得第一能量函数的架构不能太深太宽。能量函数输出是一个标量如果网络容量过大它很容易把训练样本的能量压到极低同时把其他区域的能量抬到极高形成非常尖锐的势能面这种势能面会让MCMC采样变得极难收敛。我个人建议在能量网络中加入合适的归一化层并且谨慎设置残差连接保证梯度顺畅。第二采样器的步数和步长要搭配好。朗之万动力学采样需要设置步长和噪声项步长太大采样发散步长太小又探索不动。我通常的做法是使用带退火的学习率调度前期大步长快速探索后期小步长精细逼近。在图像EBM里还常用Langevin的变体加入动量项来加速混合。第三对比样本的质量是训练效果的度量衡。如果训练过程中对比样本看起来越来越像真实样本说明模型在进步如果对比样本一直模糊不清或者停留在低质量区域多半是采样器没调好或者能量函数已经坍塌。我会定期把对比样本可视化这是一条非常实用的监控手段。第四梯度裁剪几乎是必需品。因为能量函数可以无界梯度偶尔会出现非常大的值一次异常更新就能毁掉整个训练过程。梯度裁剪的阈值我一般设在全局范数1到5之间视模型规模调整。4. EBM的经典家族与典型应用4.1 RBM与DBN历史上的敲门砖受限玻尔兹曼机是EBM家族最有历史地位的成员之一由Smolensky在1986年提出后来经Hinton等人推广。RBM用二部图结构约束可见变量v和隐藏变量h之间的连接只有可见层和隐藏层之间有连接同层之间没有连接。这个结构保证了给定一层时另一层的条件分布是独立的这使吉布斯采样变得极其高效。RBM的能量函数就是前面提到过的E(v, h) -a^T v - b^T h - v^T W h可视变量和隐藏变量都是二元时条件分布可以解析写出p(h_j1|v) σ(b_j Σ_i v_i W_ij) p(v_i1|h) σ(a_i Σ_j h_j W_ij)这两个式子让RBM的训练和推理变得非常可控。2006年前后Hinton提出深度信念网络DBN把多个RBM堆叠起来逐层预训练解决了深层网络初始化困难的问题打开了深度学习的序幕。虽然现在DBN本身已经不太常用但RBM的一切思想和经验都沉淀到了EBM的发展和扩散模型的实现中。我学习RBM时的最大体会是看懂RBM的训练过程就基本看懂了无监督特征提取的本质——隐藏层就是数据的稀疏表示重构误差就是衡量表示质量的标准。很多今天习以为常的概念比如自动编码器、预训练、表征学习在RBM中都有清晰的原始形态。4.2 现代深度EBM图像生成与异常检测随着深度网络成熟直接用深度神经网络作为能量函数成为了可能。一批工作展示了深度EBM在图像生成上的潜力比如用卷积网络定义能量函数配合朗之万采样生成图像凭借相对简单的结构就能生成低分辨率但清晰可见的图像。这类工作让“用EBM做生成模型”重新回到主流视野。深度EBM还有一个独特的优势可以在能量函数上做加法融合多个信息源。比如条件EBM可以用能量项组合来同时考虑图像内容和文本描述形式上比显式生成模型更灵活。这种组合性在异常检测和可信度评估任务中表现尤其突出。我在异常检测项目里用过一个深度EBM框架正常样本训练后能量分布在低值区域异常样本即使看起来跟正常样本很像能量也会偏高。与基于重构误差的方法相比EBM给出的能量分数有概率解释方便设置阈值而且不需要依赖大型网络结构越轻量的能量网络越好用。这是一个非常适合落地EBM的场景。另一个值得提的应用是数据分布外检测。分类器在碰到OOD样本时可能给出过度自信的概率但EBM可以把分类问题重构为能量模型用能量分数代替softmax置信度来区分分布的样本与分布外的样本效果通常比纯概率更可靠。这个方向由Colombo等人在多项研究里验证过实践中可以很容易在现有判别模型上改造实现。4.3 与扩散模型的隐秘联系扩散模型与EBM的关系我是在做生成实验时才彻底想明白的。扩散模型的前向过程通过多步加噪把数据分布逐步转化为高斯噪声对应的反向过程学习一个逆变换把噪声逐步恢复成数据。关键问题反向过程中神经网络在预测什么答案是神经网络实际上在预测得分函数s_θ(x, t)也就是EBM中的能量梯度。因为噪声扰动后的分布是一个已知的高斯卷积核与数据分布的卷积它的得分可以用噪声核的解析导数表达这样就能构造出训练目标。训练完成后生成过程就是用朗之万动力学在高斯分布下反复采样从高噪声开始逐级向低噪声退火最终得到清晰样本。换句话说扩散模型就是在不同噪声水平上训练一系列或一个共享参数的EBM能量梯度场。打破了直接训练单个EBM时的MCMC混合困难通过多尺度加噪把采样过程分解成一系列更简单的步骤每一步只需要局部去噪这极大地提高了训练和采样的稳定性。这个视角对工程实践有实际指导意义如果你的EBM训练总是不稳定可以试试借鉴扩散模型的思想把能量模型建模成多尺度或带噪声扰动的形式。我在一个降噪任务中试过在EBM目标里加入多尺度噪声扰动项收敛速度和生成质量都有明显提升。这说明理论上的联系不只是数学游戏而是能改写成具体算法收货的。5. 常见问题与排查技巧实录5.1 训练发散能量爆炸与模式坍塌EBM训练最常遇到的问题就是发散表现包括loss变成NaN、能量值飞向正负无穷、生成样本变成纯噪声或陷入单一模式。能量爆炸的排查路径一般是先看采样器是否稳定。朗之万采样的步长如果过大粒子会跑到低概率区域算出的能量梯度噪声极大训练自然发散。解决措施减小采样步长增加采样步数检查输入数据的归一化范围。再检查能量网络的输出层有没有做合理初始化我习惯把网络偏置初始化为0最后一层权重的标准差设置在0.01左右这样起步能量场比较平坦不至于一开始就出现巨大梯度。模式坍塌的表现是生成样本多样性差。一个常见原因是MCMC链陷入局部势阱无法逃逸特别是能量函数存在很深很窄的谷时。解决思路提高采样温度让链能跳出来或者用PCD的持久链配合多个不同初始点或者对能量函数加正则化抑制过尖的势能面。我在实验中用过一个很有效的招数在MCMC采样时对每一步的梯度方向加一点随机噪声噪声幅值随着训练过程逐渐衰减类似模拟退火这能明显改善模式覆盖。5.2 采样质量差朗之万步数与步长的调参经验朗之万动力学采样是深度EBM生成样本的常规手段采样更新公式为x_{t1} x_t (ε²/2) ∇_x log p(x_t) ε z_t其中z_t是标准高斯噪声ε是步长。这里有一个反直觉的点梯度项的系数是ε²/2噪声项的系数是ε。当ε很小时噪声项相对梯度项占比更大所以采样结果会更随机、更多样但更粗糙当ε较大时梯度驱动的分量强样本更清晰但容易重复。实践中我通常先设定一个较大的ε让链快速到达高概率区域再用退火调度逐步降低ε最后阶段用小步长精修细节。很多教程说步数一千两千就够但在我自己测试的1080p到4k图像生成场景中这种步数远远不够。正常生成一张清晰图像至少需要几千步采样如果追求细节质量可能需要上万步。这也是EBM生成速度慢的根本原因不像GAN和扩散模型那样可以通过few-step蒸馏加速。后续有研究通过“采样步数蒸馏”来加速EBM生成但从理论到可用还有距离。5.3 评估与调参log-likelihood不可计算时的替代指标EBM的最大尴尬在于模型训练完成后没法直接算log-likelihood来评估好坏。配分函数不可计算传统指标用不了。实践中我常用几个替代指标FID是生成样本质量与多样性的常用指标做法是利用预训练特征提取器如InceptionV3计算特征空间中生成样本与真实样本分布的Wasserstein距离。FID越低生成质量越好。虽然FID不完美但实验对比起来比肉眼看可靠得多。重构误差适用于带隐藏变量的EBM例如RBM可以用重构误差来评估特征表示质量。但对于纯深度EBM重构误差没有直接定义。能量-概率差值是个间接指标可以统计验证集上样本的能量分布观察它是否明显低于随机噪声的能量。如果模型学到了有意义的结构验证集样本能量应该显著更低。这不能替代生成质量评估但能辅助判断模型是否在走向正确的方向。对比样本可视化是最直观也最容易被忽略的做法。训练过程中定期把你MCMC采出来的对比样本保存下来你看一眼就知道是否还在正常训练。模型学得好的话对比样本会从噪声逐步演化为类似训练数据的图案如果一直停留在噪声状态先不要调模型结构优先怀疑采样器配置。5.4 实战经验清单从理论到可复现项目最后整理一个我实际跑EBM项目时沉淀下来的执行清单按顺序过一遍能避开很多隐蔽的坑数据集预处理要尽量简单。像素归一到[-1, 1]或[0, 1]都可以但必须全局统一。不要在数据增强上用力过猛EBM的能量函数会对强增强敏感导致模型学到了不符合真实分布的变换关系。能量网络不要过大。网络容量越大势能面越尖锐采样越困难。我建议先从小网络起步确定能稳定学到有意义的能量分布后再逐步增加容量。采样器与训练要同步调参。采样步长、步数、噪声项、温度这四个参数之间相互影响每次只改一个变量做消融实验记录生成效果和loss曲线不要同时改多个参数否则出问题根本不知道是谁引起的。学习率要低。深度EBM对学习率极度敏感Adam优化器的初始学习率从3e-4或1e-4起步不要学GAN那种刚开始就设1e-3的调法。学习率太高会让能量函数的梯度估计偏差迅速放大直接崩盘。梯度裁剪必须加。前面说过这是性价比最高的稳定性保险。监控能量分布。每次验证时计算训练集和验证集的平均能量差如果差得太大说明模型过拟合如果都在一个区间说明模型还没学到足够判别力的特征。MCMC链的初始值用训练数据点或噪声都行但相反两者会导致完全不同的训练表现。早期用训练数据点初始化可以加速收敛中后期转向随机初始化或持久链初始化会更接近真实数据分布。配分函数估计可以不做。除非你明确要计算近似似然来做对比实验否则日常训练完全不需要算Z别给自己加负担。结尾做EBM这段时间我最大的感受是这个模型家族把概率论的严谨性和深度学习的灵活性以一种很别扭但又很巧妙的方式结合起来。它不像VAE那样有明确的证据下界可以直接优化也不像GAN那样有判别器和生成器的对抗博弈来间接规避归一化EBM所有的难度都集中在一个点上——如何在不知道归一化常数的情况下让模型学会正确的分布形状。这个“难”字本身也恰恰是EBM最迷人的地方当你看到仅仅靠一个能量函数和一遍遍采样模型就能从噪声中逐步还原出数据的结构时那种成就感确实无法替代。如果你正打算入坑EBM我的建议是先从RBM跑通整个流程再用简单的MLP能量函数在公开小数据集上复现图像生成实验最后再挑战大规模深度EBM。不要一上来就复现最新论文里的复杂架构那样你会被采样和训练的调试折磨到怀疑人生。等你在小数据集上摸清了能量函数、采样器、优化器三者的脾气再面对复杂任务时就会从容很多。后面有时间的话我再写写EBM的现代变体、分步能量模型以及它在具体业务场景中的落地案例希望这些实践经验能帮你少踩几个坑。
返回列表