资讯详情

图模型与变分推断:从概率分解到近似推断实践

📅 2026/10/28 23:24:18 | 华诺云谱 👁 阅读
图模型与变分推断:从概率分解到近似推断实践
简介《Graphical Models, Exponential Families, and Variational Inference》是一份面向概率图模型与近似推断学习者的经典综述型 PDF适合机器学习、统计学方向的研究生及需要补齐理论框架的算法工程师。内容以指数族表示和累积量函数与熵的共轭对偶为主线系统梳理似然、边际概率与最可能配置的变分表达并将 sum-product、簇变分、期望传播、mean field、max-product 及线性规划、锥规划松弛纳入统一视角同时触及生物信息学、信号与图像处理、信息检索等应用场景。压缩包仅含 1 个 PDF 文件约 2.06MB轻量便于检索、批注与反复查阅。已有 235 人学习在图模型与变分推断主题上具备一定参考热度。读者可从中获得从问题建模、变分表示到算法归类的完整脉络并理解图模型、指数族与变分推断之间的结构性联系。1. 一屋子互相影响的人图模型到底在算什么想象一个屋子里坐着十来个人每个人今晚出不出门取决于旁边几个人出不出门。你想知道某一个人出门的概率就得把所有 2 的 10 次方种组合逐一算一遍人再多一点这个数字立刻变成天文数字。图模型Graphical Models要做的事就是先画出「谁影响谁」这张关系图再顺着连线把那个巨大的联合概率拆成一堆小块让计算从「根本不可能」退回到「勉强能算」。这个概念值得搞懂因为今天你听到的消息传递、信念传播、变分推断、采样近似全都是围着这张图在转搞不清图在表达什么后面那些算法就只是个黑匣子。2. 图模型是什么把一张天文数字的概率表拆成一张关系网2.1 有向图把联合概率写成一串条件概率的乘积第一种写法是「有向」边上带箭头箭头表示「谁直接影响谁」。如果箭头永远不绕回起点这张图就叫有向无环图。在这个约定下每个节点只需要关心自己的父节点也就是那些直接指向它的节点。于是联合概率可以写成一串条件概率连乘每个节点的概率只以它自己的父节点为条件。这句话看着平淡威力在于它顺手给出了一堆条件独立一个节点在给定父节点之后就和图上的其他节点都没关系了。举个四节点的例子节点 1、2、3 都指向节点 4。如果不看图写联合概率要枚举 2 的 4 次方共 16 种组合看了图只要存三张边缘小表和一张「三父一子」的条件表一共 3×2 8×2 22 个数而且每个数都有明确含义改一个不影响别的。import itertools import numpy as np # 某模拟项目里的四节点有向图1-4, 2-4, 3-4变量均取 0/1 # cpt[节点][父节点取值元组] [P(x0), P(x1)] cpt { 1: {(): np.array([0.6, 0.4])}, 2: {(): np.array([0.3, 0.7])}, 3: {(): np.array([0.5, 0.5])}, # 节点 4 有三个父节点条件表共 8 行这里用一个简单规则填充 4: {(a, b, c): (np.array([0.9, 0.1]) if a b c 0 else np.array([0.2, 0.8])) for a, b, c in itertools.product([0, 1], repeat3)}, } parents {1: (), 2: (), 3: (), 4: (1, 2, 3)} def joint(x): 给定一次完整赋值 x(x1,x2,x3,x4)按图结构连乘得到联合概率 p 1.0 for node, pa in parents.items(): key tuple(x[int(p) - 1] for p in pa) if pa else () p * cpt[node][key][x[int(node) - 1]] return p print(sum(joint(x) for x in itertools.product([0, 1], repeat4))) # 应等于 1.0这段代码里最关键的不是循环而是parents这张表它决定了每个条件项只依赖谁。key那一行把父节点的取值打包成一个元组去查表这正是「按图分解」在代码层面的样子。如果把parents[4]改成空元组就等于宣称节点 4 和谁都不相干模型立刻退化成四个独立变量——图变了模型就变了这是图模型最直观的一点。2.2 无向图团、势函数和那个算不出来的归一化常数第二种写法是「无向」边没有箭头只表示「这两个变量之间有约束」。这时候没法再谈父子只能谈团——图上两两相连的一组节点。联合概率写成每个团上一个非负函数叫势函数的乘积再除以一个归一化常数 Z。无向图更适合表达「互相迁就」而不是「谁导致谁」。比如一张黑白噪点图每个像素和上下左右四个邻居倾向于同色这种关系是对称的硬要画箭头反而别扭。反过来如果你要表达「先有病因再有症状」有向图更自然。无向图还带来一套漂亮的图判据两个变量如果在图上被「切断」——把它们的邻居都拿掉之后彼此不连通——那它们在给定这些邻居时条件独立。这套判据让「独立性」这种抽象概念变成了拿眼睛看图就能判断的事。代价出在 Z 上。有向图的连乘天然归一化每一项都是条件概率无向图的势函数只是「打分的相对大小」必须除以所有可能取值的总和才能变成概率。这个总和就是配分函数节点一多求和项数指数级爆炸。后面所有的近似推断方法本质上都是在跟这个 Z 较劲。2.3 为什么非拆不可联结树算法和树宽这道坎拆完之后能不能算取决于一个叫树宽的图指标。有一种经典算法能把图上的求和整理成一棵「团树」在树上做一轮消息传递就能精确算出所有边缘概率。它的开销大致是「取值数」的「树宽加一次方」。这句话翻译过来就是树宽小的图比如链、树、稀疏网格算起来很轻松树宽大的图比如几乎人人都和人人相连的稠密图开销直接翻车。而现实中的模型往往不稀疏——一份文档里词与词的关系、一张图里区域与区域的关系稍不留神就连成一片。提示判断一个图模型能不能硬算第一步不是看节点多少而是估一下树宽。节点一千但结构像条链可能比节点五十但稠密相连还好算。这就是整份资料要解决的核心矛盾精确算法在图不够稀疏时失效于是需要一套系统的近似方法。采样是一条路变分推断是另一条路也是这份资料重点铺开的那条。3. 指数族为什么是万能底座凸性、对偶和那个算不出来的 Z3.1 一句话定义和三个零件指数族是一大类概率分布的统称形式统一概率等于「一个基准函数」乘上「自然参数的线性组合取指数」再除以一个归一化项。这个归一化项通常记作 A(θ)叫对数配分函数。它有三个零件自然参数 θ决定分布长什么样充分统计量 φ(x)是从数据里能算出来的那组数还有 A(θ)负责把结果拉回概率。伯努利、泊松、高斯、多项分布全都是这个形式的特例只是零件不同。为什么图模型几乎都长在指数族上因为图模型的每个团因子本身就是「打分」形式取个对数就变成了参数的线性组合天然落进指数族的框里。换句话说指数族不是硬套上去的帽子而是图模型分解结构的自然语言。3.2 共轭对偶把「求和」翻译成「求最优」指数族最值钱的性质是凸性。A(θ) 是凸函数它的导数就是充分统计量的期望这个映射还是可逆的。更重要的是A(θ) 有一个共轭对偶函数 A*(μ)本质上是负熵。这组对偶关系说的是你可以用参数 θ 描述一个分布也可以用期望 μ 描述同一个分布两种描述一一对应中间靠一个凸函数连接起来。参数空间里的一次「求导」对应期望空间里的一次「求值」。这一步是整份资料的地基。因为一旦把「算概率」翻译成「算一个凸函数的对偶」原本的积分求和问题就变成了一个优化问题而优化问题是有成熟工具、有下界、有收敛性可谈的。3.3 变分表示log Z 的两种身份把对偶关系代进去会得到一个非常关键的等式对数配分函数等于「参数和期望的内积减去负熵」在所有合法期望上的上确界。左边是一个算不动的积分右边是一个优化问题。import numpy as np # 伯努利指数族phi(x)xA(theta)log(1exp(theta)) def A(theta): return np.log1p(np.exp(theta)) def A_star(mu): 共轭对偶函数 负熵mu 必须在 (0,1) 内 return mu * np.log(mu) (1 - mu) * np.log(1 - mu) for theta in [-1.5, 0.0, 2.0]: mu 1 / (1 np.exp(-theta)) # mu A(theta)参数到期望的映射 dual theta * mu - A_star(mu) # 变分表示右边的取值 print(ftheta{theta:5.2f} mu{mu:.4f} A{A(theta):.4f} dual{dual:.4f})跑一下会发现两组数完全一致A(theta)和dual每一行都相等。这不是巧合而是说在最优的那个 μ 上右侧取到最大值正好等于左侧。这个等式就是「变分表示」四个字的全部含义把一个难算的量写成一族好算的量的最大值。难点在于「合法的期望」这个集合。精确的集合叫边缘多面体它由大量线性不等式刻画规模随变量数指数增长。所以真正的做法是把这个集合换成更大或更小的近似集合得到原问题的一个上界或下界。整套变分推断就是围绕「换哪个集合、换来的是上界还是下界、优化起来难不难」这三个问题展开的。4. 变分推断怎么落地把难算的积分换成一个能优化的目标4.1 Bethe 近似与和积算法把大问题拆成一堆小问题最经典的一种换法叫 Bethe 近似。它把精确表示里的熵项换成一堆「单点熵减去边熵」的组合。这个组合在树上是严格正确的所以树上的消息传递算法能给出精确答案图上一旦出现环这个近似就只是近似而且不保证是上界还是下界。对应的算法就是和积算法也就是常说的信念传播。每个节点往邻居发一条消息消息的内容是「结合我自己的势函数、以及其他邻居告诉我的信息我认为你应该是什么样」。所有消息反复迭代到不再变化再用收敛后的消息算出每个变量的边缘概率。import numpy as np # 一条四节点链上的和积算法1 - 2 - 3 - 4二值变量 pairwise { # 相邻节点之间的 2x2 势函数兼容性打分 (1, 2): np.array([[3.0, 0.5], [0.5, 3.0]]), (2, 3): np.array([[2.0, 0.8], [0.8, 2.0]]), (3, 4): np.array([[2.5, 0.6], [0.6, 2.5]]), } unary {i: np.array([1.0, 1.0]) for i in range(1, 5)} # 单点势函数先设为均匀 def message(i, j): 节点 i 发给节点 j 的消息把自己的单点势和除 j 外所有邻居消息乘起来再求和 m unary[i].copy() for k in (i - 1, i 1): if k in unary and (min(i, k), max(i, k)) in pairwise and k ! j: m * incoming[(k, i)] psi pairwise[(min(i, j), max(i, j))] return psi m # 对 i 的取值求和得到关于 j 取值的向量 incoming {} for (i, j) in pairwise: incoming[(i, j)] np.ones(2) incoming[(j, i)] np.ones(2) for _ in range(50): # 链上没有环几轮就收敛有环的图需要更多轮且未必收敛 new {k: message(k[0], k[1]) for k in incoming} if max(np.abs(new[k] - incoming[k]).max() for k in incoming) 1e-9: break incoming new for i in range(1, 5): # 用收敛的消息拼出每个节点的边缘未归一化 b unary[i].copy() for k in (i - 1, i 1): if k in unary and (min(i, k), max(i, k)) in pairwise: b * incoming[(k, i)] print(i, b / b.sum())这段代码有两个容易忽略的细节。第一message里先用min/max把边的顺序统一否则 (2,1) 和 (1,2) 会被当成不同的边查到不存在的键上直接报错。第二链上迭代几十轮就稳定但在有环的图上消息可能来回震荡永不收敛——这不是代码写错了而是 Bethe 近似本身的性质。工程上常见的做法是加阻尼或者干脆限制迭代次数后取最后一次结果但那样就没有任何保证可言了。4.2 平均场砍断耦合换一个可靠的下界另一种思路更粗放既然变量之间互相纠缠难算那就干脆假设它们互相独立。用一个可分解的分布去逼近真实后验然后最小化两者之间的 KL 散度。这个假设明显是错的但它错得有方向——因为 KL 散度这个量本身有个符号保证这么逼近得到的目标值一定是真实对数配分函数的下界。也就是说答案不精确但你知道真实值在它上面不会算着算着自己骗自己。优化方式是坐标上升固定其他所有变量的分布单独更新某一个更新公式是「在其余变量的当前分布下对联合对数概率取期望」。一轮一轮刷目标值单调不降直到稳定。缺点是容易停在局部最优而且因为强行假设独立往往会低估不确定性给出过于自信的结论。Bethe 和平均场都建立在非凸的优化问题上都可能有多解。这正是下一节要说的凸松弛的动机既然非凸让人提心吊胆那就找一个凸的近似。4.3 凸松弛换一个更大的集合换一个上界回到那个「在所有合法期望上取上确界」的表示。如果精确集合太难刻画就把它放宽成一个更大的集合比如只用「每个变量各自的取值非负且求和为一」这类线性约束去包住它。集合变大了上确界只会变大于是结果成了真实值的一个上界。这类做法叫线性规划松弛它和最大积算法有很深的联系最大积算法在树上精确在有环时其实隐式地解了一个线性规划而松弛做得越细结果越接近真实。再往外还有锥规划松弛用半正定的矩矩阵来施加更紧的约束。代价是每一层松弛都更贵收益是界更紧。实际选择时通常先跑便宜的松弛看看界松不松如果本来就接近精确就没必要上重的工具。5. 最容易搞混的五个地方图模型、指数族、变分推断的边界在哪5.1 误区一把变分推断和采样当成同一类东西这两者经常被并列成「两种近似推断」于是很多人以为它们可以互换。混淆的原因在于它们解决的确实是同一个问题算不动的边缘概率和配分函数。区别在路径上。采样是从分布里抽样本用样本频率去估计期望样本够多时结果会收敛到真值但收敛速度和「多久算够」没有硬保证跑一晚上也未必知道差多少。变分推断是把推断变成一个优化问题得到的是确定性的解速度快但解本身有系统性偏差而且这个偏差不会因为多跑几轮就消失。区分的口诀是要一个能明确说出「误差往哪个方向偏」的答案走变分要一个长期看不会偏、且能承受等待的答案走采样。两者的混合也常见用变分给出一个初始近似再用采样去修正。5.2 误区二把图模型、贝叶斯网络、马尔可夫随机场当成三个并列的东西初学者常把这三个名词轮流使用以为差不多。混淆的原因在于它们的名字都很「概率」而且经常同时出现在一篇文档里。真实关系是包含关系图模型是总称贝叶斯网络是有向无环图那一支马尔可夫随机场是无向图那一支。判据很简单看边有没有箭头、允不允许成环。有箭头且无环贝叶斯网络无箭头马尔可夫随机场。同一份问题甚至可以用两种图分别表示只是分解方式和独立性读法不同。5.3 误区三把「边缘概率」和「最可能配置」混为一谈这两个任务都要面对那个算不出来的归一化常数看起来像是同一件事的两种说法。混淆的原因在于很多人第一次接触时都是在一棵树上跑算法两种算法长得几乎一样。区别在于问的问题不同边缘概率问的是「单个变量取某个值的概率是多少」最可能配置问的是「所有变量一起取哪组值联合概率最大」。前者用和积算法后者用最大积算法中间就是把「求和」换成「取最大」。关键点在于最可能配置不能由各变量的边缘概率拼出来。每个变量各自最可能的取值凑在一起可能恰恰是一组联合概率很低的组合。这在离散变量的问题里尤其常见用错了会得到一个自相矛盾的结论。5.4 误区四以为算法跑出数来就是对的树上跑消息传递是精确的这一点很多人记住了然后不小心推广成「消息传递是精确的」。混淆的原因在于代码完全一样换个图结构照样能跑出数不报错。区分要看图上有没有环以及环有多长。无环时精确有环时不保证而且可能来回震荡。工程上的常见补救是加阻尼、改成异步更新、或者用更贵的凸松弛换一个能说清方向的界。注意有环图上的信念传播结果既可能是上界也可能是下界甚至可能因为没收敛而毫无意义。看到收敛曲线还在跳就别急着用那个数。5.5 误区五以为 Bethe 近似和平均场差不多两者都是近似都做优化都不保证全局最优看起来像一对兄弟。混淆的原因在于它们在简单例子上经常给出接近的结果。差别在界的方向和熵的写法。Bethe 保留了一部分变量之间的相关性在树上严格正确有环时方向不明。平均场直接砍掉所有相关性换来一个严格的下界代价是低估方差、结果过于自信。如果你需要一个能对外声明的保证——比如说「真实值不会低于这个数」——那只能用平均场或凸松弛这一侧的工具。6. 什么时候用、什么时候别用一份判断清单先给一个具体的对照。假设手上有一个模型要算某几个变量的后验。第一步不是选算法而是估结构情况特征建议路线风险点图是一棵树或链树宽小无环和积算法直接算精确几乎无注意数值下溢转对数域图有环但稀疏环长局部连接信念传播 阻尼或用 Bethe 近似不保证收敛结果无界的方向保证需要能对外声明的界下游要做决策平均场拿下界线性规划松弛拿上界两边都松界可能宽到没用变量多且耦合强稠密树宽大采样或变分看能等多久采样难判断收敛变分有系统偏差只要最可能配置离散变量组合优化味道最大积 / 线性规划松弛不能用边缘概率拼会自相矛盾几个明确的「别用」场景。第一别在有环图上用信念传播然后把结果当成精确后验写进报告这是最容易翻车的一步。第二别用平均场去估计不确定性区间它的方差估计天生偏小拿它做风险度量等于自己给自己吃后悔药。第三别在变量强耦合的问题上硬套可分解的平均场独立性假设和现实差太远优化会卡在一个明显不对的解上。第四别在树宽已经很小的图上上锥规划松弛那是拿大炮打蚊子还容易因为数值问题引入新的误差。反过来什么时候这套东西值得投入当你需要反复对同一个模型做推断、且对速度有要求时变分方法的优势就出来了优化一次后续查询几乎免费采样则每次都要重跑。当你需要把推断嵌进一个更大的训练循环里时变分还能顺带把参数估计一起做掉这是它相比采样更顺手的地方。我第一次认真读这类材料时是从「变分」这个词开始懵的后来才明白它不过是在说「把算不出来的积分写成一族可以优化的量的极值」。从那以后我每次拿到一个新模型都强制走一遍「先看树宽、再看有没有环、最后问自己需不需要界」这三步哪怕结论是「这个图太小直接硬算」。这份三百多页的综述把图模型、指数族、变分推断三条线拧成了一股绳从因子分解讲到凸松弛中间每一步都有例子和推导支撑需要的可以按文件名取这份资料对着自己手上的模型翻对应的章节比从头读到尾省力得多。希望帮到你。本文还有配套的精品资源点击获取
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑