news 2026/10/6 1:33:31

概率图模型与变分推断:从指数族到算法谱系的系统梳理

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
概率图模型与变分推断:从指数族到算法谱系的系统梳理

简介:概率图模型、指数族与变分推断是机器学习与统计学的核心交汇点。这份PDF为Wainwright与Jordan合著的经典综述,原刊于Foundations and Trends in Machine Learning,系统阐述三者之间的数学联系,并统一解释sum-product、均值场、期望传播、最大积与线性规划松弛等主流推断算法。资源包仅含1个PDF文件,压缩后大小约2.06MB,全文三百余页,排版清晰便于检索,适合作为该领域深度学习与研读的原始文献。已有235人下载学习。读者通过它,可掌握指数族与熵的共轭对偶性、似然计算与边缘/众数推断的变分表示,理解大规模统计模型近似推断的通用框架,也可为生物信息学、通信理论、统计物理、信号与图像处理等应用提供统一的方法论支撑。

1. 把图模型、指数族和变分推断读成一条线:一份 305 页综述的打开方式

概率图模型(Graphical Models)、指数族(Exponential Families)和变分推断(Variational Inference),这三个词共同构成 Wainwright 与 Jordan 在 2008 年发表的这篇 305 页综述的主线。它横跨 Foundations and Trends in Machine Learning 第一卷第一二期的完整篇幅,用“变分表示”这一根线把和积算法、均值场、期望传播、最大积、线性规划松弛全部串在一起。对做概率建模的从业者来说,这份文档不是一本入门书,而是一张地图:它解释了为什么你会看到那么多风格迥异的推断算法,以及它们各自在近似什么。

我第一次读完的感受是:以前我把 sum-product 当树上的精确算法、把 mean field 当贝叶斯推断的近似工具,两者之间没什么概念上的桥。这篇综述把桥搭了出来——所有算法都是在优化同一个变分目标,差别只在于你放松了哪个约束、近似了哪个函数。适合读它的人有两类:一类是手里已经有一个图模型、却在推断环节反复踩坑的研究生或算法工程师;另一类是从 MCMC 转过来、想系统了解变分方法能做什么、不能做什么的统计背景从业者。这篇笔记按我的阅读顺序拆:先看图模型怎么和指数族接上,再讲变分框架如何派生算法,最后聊复现时最容易翻车的几个点。

2. 从因子分解到指数族:为什么所有推断问题都能写成优化问题

2.1 有向图与无向图:两类因子分解的差异

图模型的核心是因子分解。给定图 $G = (V,E)$,每个顶点 $s$ 关联一个随机变量 $X_s$,联合分布被拆成局部函数的乘积。有向图模型用条件概率做因子:$p(x) = \prod_{s} p_s(x_s \mid x_{\pi(s)})$,其中 $\pi(s)$ 是 $s$ 的父节点集合,要求图是无环的。无向图模型则把分布写成定义在团上的势函数乘积:$p(x) = \frac{1}{Z} \prod_{c} \psi_c(x_c)$,$Z$ 是配分函数。表面上只是分解方式不同,但它们对“哪些条件独立关系能被表达出来”有本质差异。

有向图适合生成式故事:每个变量由它的直接原因决定,比如隐马尔可夫模型的观测依赖隐状态。无向图适合表达对称的约束关系,比如图像里的邻域平滑先验,这时你很难说清谁是因谁是果。综述第 2 节用了大量篇幅讲这两种形式各自的图论语义,但我更建议你先把注意力放在归一化这一行,因为它是后面所有变分推导的入口。

表 1 有向图模型与无向图模型的对比

对比项有向图模型(DAG)无向图模型(MRF)
因子形式条件概率 $p_s(x_s \mid x_{\pi(s)})$势函数 $\psi_c(x_c)$
归一化方式局部归一,联合分布自动归一需要显式计算全局配分函数 $Z$
条件独立语义由 d-分离准则给出由图分离给出
典型应用HMM、贝叶斯网络网格 MRF、玻尔兹曼机

注意配分函数那一行。有向图模型每个局部因子都归一化,联合分布整体自动归一,不需要算 $Z$;无向图模型则绕不开 $Z = \int \prod_c \psi_c(x_c) dx$。正是这个 $Z$ 把无向图模型和指数族绑在一起,因为 $Z$ 本质上就是指数族里的对数配分函数 $A(\theta)$。很多人在学习时把图模型和指数族当成两门课,等到看这篇综述才意识到:它们讨论的是同一件事的两种写法。

2.2 指数族:对数配分函数与共轭对偶

指数族把分布写成 $p(x;\theta) = \exp(\langle \theta, \phi(x) \rangle - A(\theta))$,其中 $\theta$ 是自然参数,$\phi(x)$ 是充分统计量,$A(\theta) = \log \int \exp(\langle \theta, \phi(x) \rangle) dx$ 是对数配分函数。高斯、泊松、多项、Ising 模型全都在这个框架里。$A(\theta)$ 有两个关键性质:它是凸函数,且梯度等于充分统计量的期望 $\nabla A(\theta) = E_\theta[\phi(X)]$。这意味着只要你能算出 $A(\theta)$,所有边际都有了。可惜实际问题里 $A(\theta)$ 几乎从来不能闭式求解。

变分方法的基本思路是绕过直接积分:利用凸分析里的 Fenchel 共轭,把 $A(\theta)$ 写成另一个优化问题,即 $A(\theta) = \sup_{\mu} { \langle \theta, \mu \rangle + H(\mu) }$。这里 $H(\mu)$ 是熵,$\mu$ 遍历充分统计量所有可能期望值构成的集合,这个集合叫边际多面体。这个等式是整篇综述的基石:它把一个积分问题等价地翻译成一个凸优化问题。我当年第一次看到这个公式时觉得它只是数学技巧,后来才发现,它其实是“所有推断算法都是优化算法”这句话的出处。

这里有个容易忽略的点:$\sup$ 是在边际多面体上取的,而边际多面体本身通常有指数多个顶点。所以这个等式虽然精确,但直接优化不可行。所有近似算法干的都是同一件事——要么缩小可行集,要么用一个容易算的熵函数近似真实熵。均值场走第一条路,Bethe 近似走第二条路。这个视角解释了为什么风格完全不同的算法会被放在同一篇综述里,也解释了为什么会有第六章那些看似玄学的调参问题。

2.3 边际概率与模式概率如何变成变分问题

有了 2.2 的等式,计算边际概率就变成求解一个优化问题。计算最大后验(MAP)也类似:当 $\theta$ 里某个分量趋于无穷时,变分问题的解会退化到某个顶点,对应一个具体配置。更直接地说,$\log Z$ 的某种极限形式就是 $\max_x \log p(x)$。综述把这两类任务统称为推断:一类是求和(边际、似然),另一类是求最大(MAP)。它们在变分框架下只有细微差别——对求和任务,你要的是 $\log Z$ 本身;对求最大任务,你要的是被积函数的最大值,可以看成 $\log Z$ 在某个极限下的行为。

理解了这一点,你就明白为什么 max-product 和 sum-product 共享同一套消息传递骨架:它们只是在同一棵树上做不同半环上的动态规划。实际工程里,我拿到一个新模型时有个习惯:先别急着跑现成的推断库,而是把联合分布写成指数族形式,明确写出 $\phi(x)$ 和 $\theta$。这一步会强迫你指出哪些量是已知参数、哪些要推断、充分统计量是什么。很多时候模型的“难推断”本质就藏在 $\phi(x)$ 的结构里——是包含高阶交互项还是只含成对项?这决定了你接下来该选哪类近似。

3. 变分推断的算法谱系:从和积、均值场到期望传播

3.1 和积算法与 Bethe 近似:树上的精确与环上的近似

和积(sum-product)算法是树上的精确推断。消息从叶子向根传递,每个节点把收到的消息乘上自身势函数再求和,逐步得到边际。它之所以精确,是因为树结构下没有环,消息不会重复计算同一个子问题;等价地,在树形图上 Bethe 近似是精确的。一旦图里有环,消息传递就变成迭代过程,不再保证收敛到真实边际,甚至不一定收敛。

把 sum-product 和 Bethe 自由能联系起来是综述的一大贡献。Bethe 自由能把真实熵替换成每个节点熵之和减去每条边上的互信息修正:$H_{Bethe} = \sum_s H_s - \sum_{(s,t)} I_{st}$。在树上这个修正恰好抵消多余部分,所以精确;在环上则引入了偏差。工程上的直接收益是:调试环图上的置信传播(loopy BP)时,不要死盯消息向量是否稳定,而是看 Bethe 自由能的变化轨迹。如果自由能一路下降最后停住,说明迭代还在朝某个不动点移动;如果来回震荡,说明阻尼不够或者模型进入了振荡区。

我的血泪经验是,loopy BP 在强耦合的 Ising 模型上特别容易震荡。解决手法通常是两种:一是加阻尼,把新消息和旧消息做加权平均 $m^{(k+1)} = \alpha m^{(k)} + (1-\alpha) m_{new}$,$\alpha$ 取 0.3 到 0.7 之间,具体值要靠二分法试;二是换消息调度,从同步更新改成随机序贯更新,很多情况下序贯更新能打破震荡的对称性。这些在综述里只是一句话带过,但实际调起来往往要花掉你半天时间。

3.2 均值场:从可分解分布构造下界

均值场(mean field)走另一条路:把可行集缩小到完全可分解的分布 $q(x) = \prod_s q_s(x_s)$。在这个子集上,变分目标变成可解析计算的求和,而且因为可行集是真实边际多面体的子集,你得到的永远是 $\log Z$ 的一个下界。这带来一个工程上的好处:迭代过程中目标函数只会上升,你有明确的单调性保证;代价是近似分布表达力有限,难以刻画变量间的强相关,觉得均值场“低估相关性”是正常的,不是 bug。

实际实现时,均值场迭代就是一组坐标上升方程。以二元成对 MRF 为例,变量取值 ${0,1}$,节点势 $\theta_s$、边耦合 $J_{st}$,更新规则是每个节点的后验只依赖邻居的当前期望。这里给一个最小可运行版本:

# 二元成对 MRF 的均值场更新 # theta: 节点势 (n,),J: 边的耦合矩阵 (n,n),对称且对角为 0 import numpy as np def mean_field_update(theta, J, n_iter=200, tol=1e-6, init=None): n = len(theta) q = np.random.rand(n) if init is None else init.copy() for _ in range(n_iter): q_new = q.copy() for s in range(n): # 邻居贡献: 把邻居变量替换成它的期望 neighbor_sum = 0.0 for t in range(n): if J[s, t] != 0.0: neighbor_sum += J[s, t] * q[t] # logit 形式更新 logit = theta[s] + neighbor_sum q_new[s] = 1.0 / (1.0 + np.exp(-logit)) if np.max(np.abs(q_new - q)) < tol: break q = q_new return q

代码里每个节点的更新只依赖邻居当前的期望值,本质上是把随机变量替换成它的期望,从而把高维积分拆成单变量积分。$\theta_s$ 是节点自身的偏置,$J_{st}$ 是成对耦合强度;如果模型带高阶势函数,均值场的推导会复杂一些,但思路一致。收敛判据我习惯看 $q$ 的最大变化量,而不是看目标函数,因为目标函数在最优点附近可能非常平坦,看数值变化容易误判。

有个容易被忽略的坑:既然均值场只能给下界,那么用均值场做模型选择时,不同模型的下界不能直接比大小,除非保证它们的近似误差同一量级。综述强调下界这一性质,但到了实际选模型时,很多人还是把它当成真实似然在用,这是比较危险的习惯。

3.3 期望传播与矩匹配:把近似分布锚定在真实矩上

期望传播(EP)是第三条路线,它不去缩小可行集,而是用指数族里的投影操作:每一步把真实因子替换成一个近似因子,使两者的矩匹配。维护一个近似的完全分布 $q$,当加入某个真实因子后,计算 $q$ 的矩,再调整近似因子让矩保持一致。直观说,EP 在每一步都问“当前这个近似分布,在哪些矩上应该和真实分布一致”,然后强迫它们一致。

EP 的麻烦在于它没有一个全局目标函数来保证收敛,实践中经常振荡甚至发散。综述把它归入广义和积算法一族,并指出在树状结构上 EP 可以退化成精确算法;在一般图上它是矩匹配迭代家族的一员。我的经验是:EP 适合那些因子本身温和、矩容易闭式计算的模型;如果矩计算本身还要套一层数值积分或者蒙特卡洛,EP 的性价比就很低,不如直接用采样或者均值场。

表 2 三类变分算法的核心差异

算法近似对象边界方向收敛性
均值场可行集缩小到可分解分布下界迭代目标单调上升
Bethe / loopy BP用 Bethe 熵近似真实熵无保证可能震荡,加阻尼可缓解
EP因子逐个做矩匹配投影无保证可能发散,需要额外防护

这张表是我在实际项目里选型的主要依据。如果我只想要一个快速且稳定下限,选均值场;如果模型接近树结构,优先 loopy BP;如果因子都是温和的指数族,且对精度要求高,才考虑 EP。

4. 模式计算与凸松弛:最大乘积之外的另两条路

4.1 计算模式本质上是整数规划

MAP 推断在离散变量下是一个整数规划问题:$\max_x \sum_i \theta_i(x_i) + \sum_{(s,t)} \theta_{st}(x_s, x_t)$。当变量是二值时,这等价于带线性目标和二次约束的优化;对有环图,它是 NP 难的,所以你不可能保证多项式时间内找到最优解。最大值积(max-product)在树上是精确的,在环上只是启发式,而且和 loopy BP 一样可能震荡或不收敛。

很多做工程的人习惯直接调库求 MAP,但很少意识到“消息传递”只是求解手段之一。综述把 MAP 明确放到整数规划的框架里,这是一个非常实用的认知升级:一旦你知道它是整数规划,你就能理解为什么会有线性规划松弛、半定松弛这些后续工具,也就能解释为什么某些图结构下问题简单、某些图结构下问题突然变难。树宽这个图论指标在这里派上用场——树宽小,可以用联结树算法;树宽大,联结树的中间团尺寸指数爆炸,必须转近似。

4.2 线性规划松弛与加权重加消息传递

综述的贡献之一是把 MAP 和线性规划松弛连起来。把离散变量的取值替换成边际 $\mu_s(x_s)$ 和二阶边际 $\mu_{st}(x_s, x_t)$,原来的整数规划放松成一个线性规划。这个 LP 的最优值是原 MAP 问题的一个上界,如果 LP 的解恰好是整数顶点,那它就是精确解;如果不是,你就得到了一个有意义的界,以及一个可以用来引导搜索的分数解。

实际求解这个 LP 时,一个主流做法是加权重加消息传递(weighted max-product):给每条边分配一个权重 $\rho_{st}$,把原始消息乘上 $\frac{1}{\rho_{st}}$ 次幂再传递。调整权重会影响收敛速度和解的质量,这是可以落地的调参点。我一般先用均匀权重跑一遍,观察对偶间隙;如果间隙太大,再对关键边增大权重,把优化压力集中到图上最“难”的子结构上。

表 3 松弛层级与计算代价

松弛方法约束类型边界计算复杂度
整数规划(原问题)$x_s \in {0,1}$精确解NP 难
LP 松弛边际局部一致上界多项式
SDP 松弛矩矩阵半正定更紧的上界接近 $O(n^3)$
均值场可分解分布下界线性迭代

从这张表能看出一个通用策略:先用 LP 松弛拿一个上界,再用均值场拿一个下界,两个界之间的间隙直接告诉你这个模型有多难推断。间隙小,说明近似解可信;间隙大,说明要么模型结构太难,要么你选的近似类不合适。这个方法我在后面第六章会展开。

4.3 半定松弛:用矩矩阵收紧界限

当 LP 松弛不够紧时,综述第 9 节引入了半定规划松弛。思路是:把一阶边际和二阶边际组装成矩矩阵 $M$,并约束它半正定。这个约束比 LP 局部一致性强得多,因此能给出更紧的上界,但计算成本高一个量级。对几十个变量的小规模模型,SDP 完全可行;对上万变量的图模型,SDP 基本不实用,只能作为研究工具或在小规模子问题上做参照。

我实际使用 SDP 的场景很有限:通常是在开发新算法时,用小模型上的 SDP 上界和均值场下界来夹逼,验证我的近似算法到底离最优解有多远。如果你只是想快速推断,不建议一上来上 SDP,先跑 LP 看间隙更实际。综述把 SDP 放在最后一章是有原因的——它代表了边界最紧、但计算代价最高的一层,是研究的终点,不是工程的起点。

5. 复现与避坑:实现变分推断时最常见的五个问题

5.1 环图上的置信传播不收敛或震荡

现象:loopy BP 迭代几百轮后,消息在两个值之间来回震荡,或者缓慢漂移,Bethe 自由能降不下去。

原因:环图让消息传递失去树上的次序保证,Bethe 自由能存在多个局部最优和鞍点,同步更新容易陷入振荡极限环。

解决:先加阻尼,把消息更新改成 $m_{new} = \alpha m_{old} + (1-\alpha)m_{calc}$,从 $\alpha=0.5$ 开始调;如果还不行,改成随机序贯更新,每轮随机打乱节点顺序;再不行,检查边的耦合强度是否过大,可以考虑把强耦合边收缩成超节点。

5.2 均值场卡在不良局部最优

现象:用不同随机种子初始化均值场迭代,得到明显不同的边际估计,下界值也差很多。

原因:均值场目标非凸,初始化的位置决定了最后落在哪个局部最优点。理论上 $A(\theta)$ 是凸的,但收缩到可分解分布之后目标不再凸。

解决:多初始化是最后的手段,更有效的做法是先用一个低精度的 help 分布做初始化,比如先用 loopy BP 跑几十轮拿到的近似边际当起点,再切到均值场迭代;或者用退火式均值场,先从高温版本开始一步步降温。

5.3 Bethe 近似给出的边际不满足基本一致性

现象:某个节点从不同边收到消息,算出的节点边际概率对 $x_s$ 求和小于 1,或者二阶边际的左右边缘对不上。

原因:环图上消息传递的不动点并不保证边际归一化,也不保证局部一致。Bethe 自由能的最小点不一定落在合法边际多面体内部。

解决:把消息做显式归一化,每个传出消息先除以自己的求和值,这能消除量纲漂移;更系统的做法是改用满足局部一致约束的消息形式,或者在每轮迭代后对边际做一次投影操作,强制它们落在局部一致多面体上。

5.4 用 MCMC 做交叉验证时发现变分估计偏差方向不对

现象:均值场下界给出的边际和 MCMC 的参考边际相比,某些变量明显偏低,另一些又偏高,不像简单的“低估相关性”能解释。

原因:均值场把变量当成独立的,这个近似误差在每个变量上不是均匀的;和邻居耦合最强的变量误差最大。另外,MCMC 本身在模式混合慢的时候也有自身方差。

解决:不要直接比边际数值,先对比两个量:整体的对数似然估计值,以及每个变量的后验均值差。如果后验均值差集中在少数几个变量上,说明这些节点周围的结构是近似最薄弱的地方,考虑对该变量所在的子图用联结树做精确推断,其余部分保留均值场,也就是贝叶斯推断里常见的“混合推断”策略。

5.5 把上界当成下界用,导致模型选择方向反了

现象:用变分方法比较两个候选模型,选出了“更好”的那个,但后续实验完全对不上;回头一查,发现一个模型用的是均值场下界,另一个用的是 LP 上界。

原因:不同算法给的是不同方向的界,跨方法比较时界的方向被忽略了。下界越大越好,上界越小越好,但下界和上界没有共同参照系。

解决:统一用同一类算法给所有候选模型算命。如果必须混合使用,至少要记录每个模型的界方向,并额外用一个真实似然近似(比如重要性采样或较短的 MCMC)来校准。否则,模型选择结果就是噪声。

6. 一个实用验证技巧:用似然上下界夹逼你的近似

6.1 为什么需要同时算上界和下界

任何一个近似推断算法单独跑出来,你都不知道它离精确结果有多远。均值场给下界,LP 松弛给上界,min-max 两边一夹,间隙本身就是对近似质量的一个可操作度量。间隙小于 0.1 nats 时,边际估计通常已经足够稳定;间隙大于 1 nats 时,任何基于这套推断的下游决策都值得怀疑。这个技巧不需要额外实现复杂算法,只要你能跑两种不同方向的方法。

6.2 最小可用流程

以一个只有几十个变量的成对 MRF 为例,我的标准验证流程分四步。第一步,用均值场跑出下界 $\underline{L}$。第二步,用 LP 松弛跑出上界 $\overline{L}$。第三步,计算间隙 $\Delta = \overline{L} - \underline{L}$,如果 $\Delta$ 大于阈值,看它集中在哪些变量上。第四步,对间隙最大的子图切出来用联结树做精确推断,再把精确结果并回去,重新估算整个模型的似然。每执行一次这个流程,间隙通常会显著缩小,因为瓶颈被局部精确推断修掉了。

6.3 一个具体案例

我在一个图像分割项目里用过这个流程。模型是整张图像大小的网格 MRF,均值场给出的下界和 LP 上界之间差了大约 0.8 nats,看似不大,但分割结果里成片出现错误标签。按流程定位后发现,间隙几乎全部集中在图像边缘区域——那里的边界条件让局部后验高度多峰,均值场的可分解假设彻底失效。我把边缘区域约 5% 的节点用联结树做了局部精确推断,整体间隙降到 0.1 nats 以下,分割错误率立刻下降了一个数量级。从那以后,我每次遇到新的图模型,都强制先跑一遍上下界夹逼,再决定要不要投入精力调精确推断算法,不会直接默认某个变分方法“差不多能用”。这个习惯帮我省下了大量调参时间,也希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/6 1:33:01

鲁班猫5部署YOLOv12:RK3588 NPU目标检测完整实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:32:58

AXI VIP调优实战:乱序与延时配置深入解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:32:56

RK3588 NPU部署MediaPipe手势识别:TFLite转RKNN量化与性能优化实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:32:56

伏秒平衡原理详解:从BUCK到BOOST的占空比推导与电感选型

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:32:56

半解析法快速求解正交加筋层压圆柱壳体振动声学特性

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/10/6 1:32:54

Deepseek本地知识库部署全指南:从RAG原理到工具选型与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华