老城南有一栋没有分水表的居民楼,整栋楼只在单元门口装了一个总水表。月底一看:120 吨。可每家到底用了多少,谁也说不清。于是住户们在公告栏上贴起便条:「我感觉 3 号这月用了 15 吨,8 号可能用了 8 吨……」别人看到这些猜测,便结合自己的习惯重新估计,再贴出新的便条。几轮下来,大家的估算逐渐聚拢,总数也对上了总表。 这个故事看似是小区八卦,其实是概率图模型里一类近似推断方法的缩影。在「变分消息传递」(VMP)的世界里,公告栏上的每条便条不必写完整而复杂的概率曲线,只需携带几个摘要数字:平均值、方差,或者指数族参数的期望。邻居拿到摘要,在自己的小本上更新估算,再贴出新摘要。想要精确求每家用水量的完整分布几乎不可能,但求一个足够合理的「答案」,公告栏足够用了。

岗位关联

对 AI 从业者而言,VMP 是处理大规模贝叶斯模型的核心工具之一。它把「算不动」的后验分布变成「消息间的期望摘要」,让你在做贝叶斯回归、主题模型、高斯混合聚类时,有一套可扩展的推断引擎。

目录
  1. 可视化演示
  2. 推断问题引入
  3. 信念传播原理
  4. 变分推断基础
  5. VMP核心推导
  6. 三大算法对比
  7. 贝叶斯模型应用
  8. 工程实践技巧
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示VMP变分消息传递的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

VMP变分消息传递:变分推断 变分推断与VMP的基本原理 VMP的变分传递机制 核心机制可视化 VMP变分消息传递整体架构与关键组件

推断问题引入

老楼的故事里,总水表代表我们能观测到的数据,每户人家的真实用水量则是看不见的「隐藏变量」。住户们想知道的是:看到总表 120 吨之后,各家用水量最可能落在什么范围。在统计学中,这个「反推」的过程被写成后验分布:给定观测数据后,隐藏变量的概率分布。

精确计算这个分布,要动用贝叶斯公式。分子由先验和似然相乘,分母则是隐藏变量所有可能取值的积分。对老楼来说,这个积分就像把每家每户所有可能用水方案都枚举一遍,再求和。如果楼里有 30 户、每户有 10 种可能用量,组合数就是 10 的 30 次方,宇宙诞生至今也算不完。精确推断的代价,由此变得不可承受。

公告栏故事给了我们启示:与其非要算出每家每户用水量的完整分布,不如允许「差不多」的答案。近似推断的动机,正是用可控的计算量换取足够合理的后验估计。

\displaystylep(\mathbf{Z}\mid\mathbf{X})= \frac{p(\mathbf{X}\mid\mathbf{Z})\,p(\mathbf{Z})}{\int p(\mathbf{X}\mid\mathbf{Z})\,p(\mathbf{Z})\,d\mathbf{Z}}
这个公式把「看到数据后如何反推原因」写成了数学形式。分母那个积分常常是「算不动」的罪魁祸首,也是各种近似推断方法要绕开的大山。
  1. 后验分布等式左边是给定观测数据后隐藏变量的条件概率,也就是「看见总表后对每家用水的猜测」。
    p(Z∣X)\displaystyle p(\mathbf{Z}\mid\mathbf{X})
  2. 先验与似然分子中 $p(\mathbf{Z})$ 是平时对用水习惯的了解,$p(\mathbf{X}\mid\mathbf{Z})$ 是假设各家用量后产生总表读数的可能性。
    p(X∣Z) p(Z)\displaystyle p(\mathbf{X}\mid\mathbf{Z})\,p(\mathbf{Z})
  3. 证据归一化分母对隐藏变量做积分,保证整个分布加起来等于 1,相当于「把所有解释方案的权重汇总」。
    ∫p(X∣Z) p(Z) dZ\displaystyle \int p(\mathbf{X}\mid\mathbf{Z})\,p(\mathbf{Z})\,d\mathbf{Z}
  4. 组合爆炸当隐藏变量维度很高时,积分涉及的状态数按指数增长,精确计算退化为不可行的枚举。
    O(kN)\displaystyle O(k^{N})

信念传播原理

假设物业请来一位极其较真的抄表员。他要求每家住户在公告栏贴上完整的「用水概率曲线」:今天用了 0 吨、1 吨、2 吨……各自的概率是多少。然后他沿着楼道逐户把这些完整曲线相乘、求和,再把结果传给下家。这种方式在概率图模型里叫信念传播(BP),它要求消息本身是一个完整分布函数。

当图结构是一条笔直的管道,也就是统计学家说的「树形图」时,这份严格工作可以精确完成。和积算法把大积分拆成若干局部的小求和、小乘积,沿着树的边逐条传递。每条消息都描述:收到消息的节点,在发消息节点眼里应该是什么状态。

信念传播的「完整曲线」在树形图上精确漂亮,可老楼的楼道一旦出现环,消息会反复循环、不断变厚,计算量如滚雪球般增长。BP 给了我们一个精确的参照系,也把「消息到底该长什么样」这个问题摆上了台面。

\displaystylem_{j\to i}(x_i)= \sum_{x_j} \varphi_j(x_j)\,\psi_{ij}(x_i,x_j)\prod_{k\in \mathcal{N}(j)\setminus i} m_{k\to j}(x_j)
信念传播的每条消息都要对邻居的每一种可能状态求和,消息越传越「厚」,像一份不断加页的完整报告。树状楼道可以精确分发,但换成一栋环形的筒子楼,报告就会迅速膨胀到无法处理。
  1. 邻居集合$\mathcal{N}(j)\setminus i$ 表示节点 $j$ 的所有邻居中,除了收信节点 $i$ 以外的全部邻居。
    N(j)∖i\displaystyle \mathcal{N}(j)\setminus i
  2. 局部因子$\varphi_j(x_j)$ 是节点自身的偏好,相当于这户人家固有的用水习惯;$\psi_{ij}(x_i,x_j)$ 是邻居之间的约束关系。
    φj(xj) ψij(xi,xj)\displaystyle \varphi_j(x_j)\,\psi_{ij}(x_i,x_j)
  3. 乘积合并把其他邻居传来的消息相乘,表示「除了你,别人都认为我是这个状态」。
    ∏k∈N(j)∖imk→j(xj)\displaystyle \prod_{k\in \mathcal{N}(j)\setminus i} m_{k\to j}(x_j)
  4. 求和消除对 $x_j$ 求和,把中间变量消去,得到传给 $i$ 的完整消息。
    ∑xj⋯\displaystyle \sum_{x_j} \cdots

变分推断基础

既然精确的完整曲线贴不完,住户们换了个思路:不再追求每家用水量的真实分布,而是先假设它长成一种固定形状。比如,假设每家用水量近似服从高斯分布,那么只需要调整两个旋钮——均值和方差。公告栏上从此不再贴复杂曲线,只贴「我估计你家平均 13 吨,波动 4 吨²」。这种把推断问题变成「调整简单分布参数」的思路,就是变分推断。

变分推断选一个可控的简单分布 $q(\mathbf{Z})$,希望它尽量接近真实后验 $p(\mathbf{Z}\mid\mathbf{X})$。两个分布的距离用 KL 散度衡量。麻烦的是,真实后验里有那个算不动的积分,KL 散度无法直接测量。于是统计学家把目标函数翻转过来,转而最大化一个叫 ELBO 的量。证据对数等于 ELBO 与 KL 散度之和,ELBO 越大,KL 距离就越小,近似分布就越接近真实后验。

老楼的公告栏从此多了一个「协调效果分数」。住户们每调整一轮估算,就重新计算一次 ELBO;分数不断上升,说明整个楼对总表的解释越来越好。变分推断把「算不清的积分」偷换成了「调参数的优化」,这正是后面 VMP 能够轻松上手的土壤。

KL(q(Z) ∥ p(Z∣X))=ln⁡p(X)−L(q),L(q)=Eq[ln⁡p(X,Z)−ln⁡q(Z)]\displaystyle\mathrm{KL}\big(q(\mathbf{Z})\,\Vert\,p(\mathbf{Z}\mid\mathbf{X})\big)= \ln p(\mathbf{X}) - \mathcal{L}(q),\qquad\mathcal{L}(q)= \mathbb{E}_{q}\big[\ln p(\mathbf{X},\mathbf{Z}) - \ln q(\mathbf{Z})\big]
如果把 KL 散度看作「公告栏上的估计与现实总表的差距」,ELBO 就是「住户们为总表读数的解释力打分」。分数越高,意味着大家的估算越能自圆其说,离真实后验也就越近。
  1. KL 散度衡量近似分布 $q$ 与真实后验 $p$ 之间的信息距离,数值越小说明近似越好。
    KL(q(Z) ∥ p(Z∣X))\displaystyle \mathrm{KL}\big(q(\mathbf{Z})\,\Vert\,p(\mathbf{Z}\mid\mathbf{X})\big)
  2. 证据对数$\ln p(\mathbf{X})$ 是观测数据的边际对数,它是一个与 $q$ 无关的固定常数。
    ln⁡p(X)\displaystyle \ln p(\mathbf{X})
  3. ELBO 定义$\mathcal{L}(q)$ 是变分下界,它等于在 $q$ 分布下联合对数概率的期望,再减去 $q$ 自身的熵。
    Eq[ln⁡p(X,Z)−ln⁡q(Z)]\displaystyle \mathbb{E}_{q}\big[\ln p(\mathbf{X},\mathbf{Z}) - \ln q(\mathbf{Z})\big]
  4. 恒等关系证据对数等于 ELBO 与 KL 之和,所以最大化 ELBO 等价于最小化 KL。
    ln⁡p(X)=L(q)+KL(q ∥ p)\displaystyle \ln p(\mathbf{X}) = \mathcal{L}(q) + \mathrm{KL}(q\,\Vert\,p)

VMP核心推导

变分推断有了目标函数,剩下的问题是:公告栏上的消息具体长什么样?VMP 给出的答案是「期望摘要」。每一条从节点 $i$ 发给节点 $j$ 的消息,都只携带对方期望下的对数因子的结果。换句话说,每家不需要知道邻居完整的用水曲线,只需要知道「邻居眼里我的平均状态」,就能更新自己的参数。

这种更新方式也被称为平均场近似:假设所有隐藏变量彼此独立分解,每个节点单独拥有一份简单的变分分布。逐个节点轮流更新,每次更新时把来自邻居的期望消息收集起来、相加、归一化,就得到这个节点的新分布。整个过程像坐标上升:每次只调整一个变量,固定其他变量。

VMP 的每次更新都只动一个节点,但整栋楼的公告栏在几轮之后就会趋于一致。消息传递不是一次性的,而是反复进行的「期望接力」:你贴摘要给我,我更新我的估计,再贴摘要给别人。这个简单的接力规则,构成了 VMP 的核心。

ln⁡qj ∗(Zj)=∑i∈N(j)Eqi[ln⁡fi(Zi)]+const\displaystyle\ln q_j^{\,*}(\mathbf{Z}_j)= \sum_{i \in \mathcal{N}(j)}\mathbb{E}_{q_i}\big[\ln f_i(\mathbf{Z}_i)\big]+ \text{const}
VMP 的更新规则是一句大白话:我一个节点的新信念,等于所有邻居捎来的「期望摘要」之和,再补上一个保证概率和为 1 的常数。没有复杂积分,没有到处收集完整曲线,只有期望与求和。
  1. 节点自身分布$q_j^{\,*}(\mathbf{Z}_j)$ 是节点 $j$ 更新后的最优变分分布,也就是这家住户修正后的用水估计。
    qj ∗(Zj)\displaystyle q_j^{\,*}(\mathbf{Z}_j)
  2. 邻居集合$\mathcal{N}(j)$ 是所有与节点 $j$ 相连的邻居,相当于楼里和这家有直接消息往来的住户。
    N(j)\displaystyle \mathcal{N}(j)
  3. 期望对数因子$\mathbb{E}_{q_i}[\ln f_i]$ 是邻居分布在因子上的对数期望,这条消息只包含摘要,不包含完整分布。
    Eqi[ln⁡fi(Zi)]\displaystyle \mathbb{E}_{q_i}\big[\ln f_i(\mathbf{Z}_i)\big]
  4. 归一化常数$\text{const}$ 的作用是让最终结果能变成一个合法的概率分布,相当于最后把所有摘要的权重重新调整到总和为 1。
    const\displaystyle \text{const}

三大算法对比

公告栏上有三种管理风格。BP 是那位较真的抄表员,要求每家贴出完整概率曲线;VMP 是实用主义的协调员,只要均值、方差这种期望摘要;EP(期望传播)则是更挑剔的校对员,它对每一条消息都要求「某些统计矩」能对上号。三种方法在消息内容、近似精度和计算成本上各有取舍。

从消息形式看,VMP 与 BP 的差别一目了然。BP 的消息需要对邻居状态做完整的求和或积分,而 VMP 的消息只是指数化的期望对数因子。EP 则更进一层,它会把局部消息与当前近似合并,再做矩匹配,把匹配后的矩作为新消息。VMP 的期望摘要最轻量,BP 的完整分布最重,EP 的矩匹配处于中间状态。

三种管理风格各有适合的场合。BP 在树形图上算出精确答案,到了环状图就举步维艰;EP 的矩匹配精度高,但消息计算要反复迭代,稳定性更敏感;VMP 的消息最轻量,更新规则单调提升 ELBO,虽然可能停在局部最优,却非常适合大规模图。老楼住户最终选了 VMP,因为它最省事,也最容易推广。

\displaystylem_{i\to j}(\mathbf{Z}_j)\propto \exp\Big(\mathbb{E}_{q_i}\big[\ln \psi_{ij}(\mathbf{Z}_i,\mathbf{Z}_j)\big]\Big)
这条消息公式像是公告栏上的「一句话摘要」:取对数,求期望,再指数回去。它没有枚举每一种状态,只问了一句:「在邻居眼里,平均来看我们俩的关系如何?」
  1. 消息方向$m_{i\to j}$ 是从节点 $i$ 发往节点 $j$ 的消息,表示 $i$ 对 $j$ 的估计贡献。
    mi→j(Zj)\displaystyle m_{i\to j}(\mathbf{Z}_j)
  2. 指数化$\propto \exp(\cdot)$ 把实数结果还原成正数,方便继续参与概率运算。
    ∝exp⁡(⋅)\displaystyle \propto \exp\big(\cdot\big)
  3. 对数因子$\ln \psi_{ij}$ 是节点之间的兼容函数取对数,它把相乘关系变成相加关系。
    ln⁡ψij(Zi,Zj)\displaystyle \ln \psi_{ij}(\mathbf{Z}_i,\mathbf{Z}_j)
  4. 期望摘要$\mathbb{E}_{q_i}$ 表示在 $i$ 的当前近似分布下求期望,消息因此只是一个浓缩的摘要,而不是完整函数。
    Eqi[ln⁡ψij(Zi,Zj)]\displaystyle \mathbb{E}_{q_i}\big[\ln \psi_{ij}(\mathbf{Z}_i,\mathbf{Z}_j)\big]

贝叶斯模型应用

VMP 不是只能解决水表分摊的玩笑,它在真实贝叶斯模型里应用极广。凡是模型可以拆成「几个隐藏变量 + 一堆观测数据」的图结构,都能套用公告栏的期望接力。高斯混合聚类、LDA 主题模型、贝叶斯线性回归,都是 VMP 的经典舞台。

以贝叶斯线性回归为例。我们要根据一堆特征预测一个连续值,同时还要估计噪声的精度。模型里有两个隐藏变量:回归系数 $w$ 和噪声精度 $\tau$。VMP 把问题拆成两个节点,轮流更新。更新 $\tau$ 时,只需要从 $w$ 节点拿到一个期望残差;更新 $w$ 时,只需要从 $\tau$ 节点拿到期望精度。由于模型采用共轭先验,每一步更新都保持着简洁的代数形式。

从贝叶斯线性回归到 LDA 主题模型,VMP 的套路高度一致:定义图结构,分配变分分布,然后让节点互相传递期望摘要。这种通用性让 VMP 被封装进多种概率编程库,使用者只需要声明模型,系统会自动推导更新公式。

\displaystyleq(\tau)= \mathrm{Gamma}\!\left(a_0+\frac{n}{2},\b_0+\frac{1}{2}\mathbb{E}_{q}\big[\lVert \mathbf{y}-\Phi\mathbf{w}\rVert^2\big]\right)
这条公式告诉我们,噪声精度的更新只依赖两个数:数据的样本量,以及模型预测残差的期望。这正是 VMP 的典型风格——全局推断被压缩成几个期望摘要的传递。
  1. 伽马分布$\tau$ 是噪声精度,它的变分后验被假设为伽马分布,用形状参数和尺度参数刻画。
    q(τ)=Gamma(an,bn)\displaystyle q(\tau) = \mathrm{Gamma}(a_n, b_n)
  2. 形状参数$a_n = a_0 + \frac{n}{2}$ 表示先验形状加上样本量的一半,对应「多看了 $n/2$ 个虚拟样本」。
    a0+n2\displaystyle a_0+\frac{n}{2}
  3. 残差期望$\mathbb{E}_{q}[\lVert \mathbf{y}-\Phi\mathbf{w}\rVert^2]$ 是预测残差平方和在当前变分分布下的期望,反映了模型现在拟合得怎么样。
    Eq[∥y−Φw∥2]\displaystyle \mathbb{E}_{q}\big[\lVert \mathbf{y}-\Phi\mathbf{w}\rVert^2\big]
  4. 尺度参数$b_0$ 加上残差期望的一半,构成新的尺度参数,相当于把数据波动吸收进精度的估计中。
    b0+12Eq[∥y−Φw∥2]\displaystyle b_0+\frac{1}{2}\mathbb{E}_{q}\big[\lVert \mathbf{y}-\Phi\mathbf{w}\rVert^2\big]

工程实践技巧

公告栏方法也有自己的坑。如果第一篇便条写的是「4 号用了 50 吨」,而事实只有 10 吨,后面的邻居跟着 50 吨的摘要往下调,整个楼可能一起跑偏。VMP 的目标函数不是凸的,迭代可能停在局部最优,而不是全局最优。所以工程上不能盲目相信一轮收敛的结果。

实践中有几个行之有效的技巧。第一,多次随机初始化,让公告栏从不同起点出发,最后保留 ELBO 最高的结果。第二,给更新加阻尼,每次只移动新估计与旧估计之间的一部分,避免消息来回震荡。第三,实时监控 ELBO 曲线,当它的增量小于某个很小的阈值时,再停止迭代。ELBO 是 VMP 迭代中唯一能观察到的「健康指标」。

VMP 的工程实践本质上是在「效率」和「稳健」之间找平衡。公告栏的摘要虽然轻便,但也要防止一篇夸张的便条带偏全局。多重初始化、ELBO 监控、阻尼更新,这三件套就像楼里的协调委员会,保证估算过程既快速又不失控。

L(t+1)−L(t)≥0,停止条件: ΔL<ε\displaystyle\mathcal{L}^{(t+1)}-\mathcal{L}^{(t)} \ge 0,\qquad\text{停止条件:}\ \Delta \mathcal{L} < \varepsilon
这条规则像公告栏的例会纪要:每一轮协调都应该让解释力不降反升;当上升幅度微乎其微时,就说明大家已经谈得差不多,可以散会了。
  1. 单调上升$\mathcal{L}^{(t+1)}-\mathcal{L}^{(t)}$ 表示相邻两轮 ELBO 的变化,理论上坐标上升保证它不小于 0。
    L(t+1)−L(t)≥0\displaystyle \mathcal{L}^{(t+1)}-\mathcal{L}^{(t)} \ge 0
  2. 停止阈值$\varepsilon$ 是一个很小的正数,当 ELBO 增量低于它时,认为迭代收敛。
    ΔL<ε\displaystyle \Delta \mathcal{L} < \varepsilon
  3. 初始化敏感性ELBO 是非凸函数,不同的起始点可能收敛到不同局部最优。
    q(0)(Z)≠q∗(Z)\displaystyle q^{(0)}(\mathbf{Z}) \neq q^{\ast}(\mathbf{Z})
  4. 阻尼更新每次只取新旧估计的加权平均,可以抑制环形图中的消息震荡。
    qj(t+1)=(1−α) qj(t)+α qj∗(t+1)\displaystyle q_j^{(t+1)} = (1-\alpha)\,q_j^{(t)} + \alpha\,q_j^{*(t+1)}

AI 应用场景

LDA 主题模型的大规模文本分析

阶段:数据建模与推断

解决的问题:传统 LDA 用吉布斯采样推断主题-词分布,需要对每篇文档的每个词反复采样,在千万级新闻语料上速度极慢。VMP 把文档-主题分布和主题-词分布都参数化为简单分布,通过期望摘要批量更新,能在保持可接受精度的同时大幅提升吞吐。

具体案例:某新闻客户端要对每天新增的 200 万篇文章自动打主题标签。工程师构建话题模型后使用 VMP 推断:每篇文章只需要在迭代中传递「该文档属于每个主题的期望比例」这类摘要,几轮迭代后即可输出稳定的主题分布,上线后延迟从小时级降到分钟级。

高斯混合聚类中的用户分群

阶段:无监督学习与决策支持

解决的问题:银行要按消费行为把用户分成若干群组,每个用户到底属于哪个群是隐藏变量。直接枚举所有分组方案在数学上不可行,VMP 给每个用户计算「属于各群的期望责任」,再用期望责任汇总更新群参数,交替迭代即可完成聚类。

具体案例:风控团队在建模用户信用特征时,先用 VMP 拟合高斯混合模型,把上亿用户自动分为稳健型、波动型、高风险型三类,再对每一类分别训练违约预测模型。VMP 的期望摘要让聚类任务可以跑在分布式计算集群上,每天定时更新。

概率编程库中的自动变分推断

阶段:模型设计与推断自动化

解决的问题:许多概率编程库把 VMP 的思路发展成自动变分推断,用户只需声明模型结构和先验分布,框架会自动推导 ELBO 并优化参数。这解决了贝叶斯建模者「手动推导更新公式」的负担。

具体案例:一位生物统计研究员用概率编程框架构建药物反应模型,模型包含个体差异、剂量效应和噪声项。她只写出生成式模型,框架自动完成变分推断,输出每个参数的后验区间,并将结果直接用于下一步临床试验设计。

Python 演示

python44 行
import numpy as np  def make_data(n=60, seed=42):    rng = np.random.default_rng(seed)    x = rng.uniform(-2, 2, n)    y = 1.7 * x - 0.8 + rng.normal(0, 0.25, n)    return x, y  def vmp_bayes_linear(x, y, prior_var=5.0, a0=1.0, b0=1.0, iters=200):    n = x.size    phi = np.hstack([x.reshape(-1, 1), np.ones((n, 1))])    d = phi.shape[1]    m_w = np.zeros(d)    S_w = np.eye(d)    a_n = a0    b_n = b0    for _ in range(iters):        E_tau = a_n / b_n        # 更新 w 的变分后验 q(w)        S_w_inv = np.eye(d) / prior_var + E_tau * (phi.T @ phi)        S_w = np.linalg.inv(S_w_inv)        m_w = S_w @ (E_tau * (phi.T @ y))        # 更新 tau 的变分后验 q(tau)        err2 = np.sum((y - phi @ m_w) ** 2)        tr = np.trace(phi.T @ phi @ S_w)        a_n = a0 + 0.5 * n        b_n = b0 + 0.5 * (err2 + tr)        E_tau = a_n / b_n    return m_w, S_w, a_n, b_n, E_tau  def main():    x, y = make_data()    m_w, S_w, a_n, b_n, E_tau = vmp_bayes_linear(x, y)    print("斜率变分后验均值:", round(m_w[0], 3))    print("截距变分后验均值:", round(m_w[1], 3))    print("噪声精度的期望:", round(E_tau, 3))    print("噪声标准差估计:", round(1.0 / np.sqrt(E_tau), 3))  if __name__ == "__main__":    main()
目的:演示 VMP 在贝叶斯线性回归中的完整迭代流程,输出回归系数的变分后验均值与噪声精度的估计。
  1. E_tau = a_n / b_n从噪声精度节点传给回归系数节点的「期望摘要」,它是伽马分布均值的闭式解。
  2. S_w_inv = np.eye(d) / prior_var + E_tau * (phi.T @ phi)精度相加规则:先验精度与数据精度相加,得到后验精度。
  3. m_w = S_w @ (E_tau * (phi.T @ y))后验均值等于精度矩阵的逆乘以「期望精度加权的数据」,相当于把邻居的期望摘要吸收进来。
  4. err2 = np.sum((y - phi @ m_w) ** 2)计算当前预测残差平方和,这是反馈给噪声节点的核心信息。
  5. tr = np.trace(phi.T @ phi @ S_w)把回归系数的不确定性也计入残差期望,避免噪声精度过度自信。
  6. a_n = a0 + 0.5 * n形状参数的更新只与样本量有关,与数据内容无关。
  7. b_n = b0 + 0.5 * (err2 + tr)尺度参数更新由残差期望和不确定性修正共同决定。
  8. phi.T @ phi一次性计算特征间内积矩阵,让后续迭代复用,避免重复运算。

常见误区

误区我一开始以为 VMP 就是把信念传播里的完整消息砍掉一些细节,本质上还是同一套消息传递算法,只是算得快一点。

正解两者目标完全不同。BP 在树形图上计算的是精确后验,消息是完整分布;VMP 则是在优化一个变分下界,消息只是期望对数因子的摘要。VMP 可以处理环状图,而 BP 在环状图上没有精确保证。可以理解为:较真的抄表员和实用主义的协调员,虽然都在楼道里贴便条,但追求的目标不是一回事。

为何常见:两者都在图上做「节点之间传消息」的操作,外观极其相似,初学者很容易把消息传递的形式差异忽略掉,误以为只是精度上的取舍。

误区我常用 ELBO 的绝对值比较不同模型,觉得 ELBO 越高,模型越接近真相,可以放心拿去上线。

正解ELBO 只是证据对数的一个下界,它只能说明近似分布对观测数据的解释力在提升,不能说明后验估计就完全正确。模型本身可能设定错误,变分分布家族可能太简单,ELBO 也可能停在局部最优。就像公告栏上大家的估计越来越一致,不代表大家猜的就是真实用水量,可能只是共同接受了同一个错误假设。

为何常见:ELBO 是迭代中唯一可以实时计算的分数,人脑天然会把「分数高」等同于「做得好」,忽略了近似推断中「分数高未必模型对」这一层。

误区我认为 VMP 输出的方差就是真实后验的方差,分析结果时直接用这个方差做置信区间。

正解平均场假设强制隐藏变量互相独立,这会系统性地低估后验方差,因为变量之间真实的依赖关系被切断了。更形象地说,公告栏上的每家都只看到邻居的摘要,看不到邻居之间的相互牵制,于是大家对自己的估计都显得过度自信。如果需要可靠的置信区间,通常要对方差做修正,或改用其他近似方法。

为何常见:VMP 输出的分布形式上很完整,有均值、有方差,容易让人误以为这些数字就是真实后验的统计量,而忘记了它只是一个受约束的近似。

误区我以为只要多跑几轮迭代,ELBO 总会爬到一个全局最好的解,所以从不关心初始化。

正解VMP 的优化目标是非凸的,迭代过程中 ELBO 虽然单调不降,却可能收敛到局部最优。初始化的位置、节点的更新顺序、阻尼系数都会影响最终落在哪个峰。工程上应该多次随机初始化,保留 ELBO 最高的结果,而不是盲目相信单次运行。

为何常见:坐标上升的每一步都让目标函数变好,人容易把「每步都在变好」等同于「最终一定最好」,忽略了非凸问题中「局部上升」与「全局最优」之间的鸿沟。

面试题

Q1. VMP 中传递的「消息」本质上是什么?

单选题 · easy

  • A.完整后验分布函数
  • B.期望对数因子的摘要← 正确答案
  • C.蒙特卡洛样本集合
  • D.梯度下降的学习率

答案:B。VMP 的消息来自对邻居分布的期望计算,浓缩成几个摘要数字,而不是完整的概率曲线。A 是 BP 的做派,C 是采样的思路,D 与优化器相关,都与 VMP 消息定义不符。

Q2. 变分推断的核心优化目标是什么?

单选题 · easy

  • A.让近似分布与真实后验的 KL 散度最小← 正确答案
  • B.精确算出观测数据的每一种边缘概率
  • C.从后验中抽取无限多样本
  • D.消除观测数据中的所有噪声

答案:A。变分推断的出发点就是找一个简单分布 $q$,让 $q$ 与真实后验之间的 KL 散度尽量小。B 是精确推断或穷举的目标,C 是马尔可夫蒙特卡洛的思路,D 则把推断与降噪混为一谈。

Q3. 平均场假设在 VMP 中指的是什么?

单选题 · easy

  • A.各隐藏变量近似独立分解← 正确答案
  • B.所有变量必须服从高斯分布
  • C.变量均值直接等于观测值
  • D.只用单个常数逼近整个后验

答案:A。平均场假设让每个隐藏变量拥有独立的变分分布,整体后验被分解为各节点分布的乘积。高斯分布只是一个常见选择,B 过于狭隘;C 和 D 则完全偏离了平均场的含义。

Q4. 与信念传播 BP 相比,VMP 的消息有什么显著不同?

单选题 · mid

  • A.消息是完整连续分布
  • B.消息是期望对数摘要← 正确答案
  • C.消息是核密度估计值
  • D.消息方向必须反向传播

答案:B。BP 的消息需要对邻居完整积分,得到的是函数;VMP 只对对数因子求期望,得到的是摘要数字。方向不需要反向传播,D 的说法与两种算法都无关。

Q5. 在贝叶斯线性回归的 VMP 中,回归系数节点更新时需要来自噪声精度节点的哪个信息?

单选题 · mid

  • A.噪声精度的期望值← 正确答案
  • B.观测数据的原始分布
  • C.每轮采样的随机种子
  • D.先验协方差的完整矩阵

答案:A。噪声精度 $\tau$ 对回归系数的影响体现在期望 $E[\tau]$ 上,它作为一个加权因子进入系数后验精度和均值的计算。原始分布、随机种子或完整先验协方差都不是 VMP 期望消息的形态。

Q6. 当 ELBO 在迭代中停止上升时,以下哪个判断是正确的?

单选题 · hard

  • A.一定已经到达全局最优
  • B.可能只是停在局部最优← 正确答案
  • C.后验方差必然被高估
  • D.KL 散度一定已经为零

答案:B。VMP 的 ELBO 是非凸函数,坐标上升只能保证单调不降,不能保证到达全局最优。KL 为零只有在精确近似时才会出现,平均场通常低估方差而非高估,A、C、D 都过于绝对。

Q7. 平均场假设下,VMP 估计的后验方差通常会怎样?

单选题 · hard

  • A.与真实后验方差完全一致
  • B.系统性低估真实后验方差← 正确答案
  • C.系统性高估真实后验方差
  • D.无规律地偏离真实方差

答案:B。因为平均场切断变量间的依赖,近似分布把不确定性「藏」了起来,导致方差被压缩。公告栏上每家只听摘要、不看相互牵制,自然显得过度自信,这正是后验方差低估的原因。

Q8. 下列哪些属于 VMP 相对精确推断的优势?

多选题 · mid

  • A.计算复杂度通常随模型规模近似线性增长← 正确答案
  • B.不需要精确计算归一化常数← 正确答案
  • C.对任意图模型保证收敛到全局最优
  • D.可以处理大规模连续隐藏变量← 正确答案

答案:ABD。VMP 用期望摘要代替完整后验积分,绕开了归一化常数的计算,并且适合大规模连续变量。C 错在「全局最优」:VMP 的目标函数非凸,只能保证局部收敛。

Q9. 下面哪些属于 VMP 的固有局限?

多选题 · hard

  • A.平均场假设会低估后验方差← 正确答案
  • B.优化目标非凸,容易陷入局部最优← 正确答案
  • C.只能处理离散隐藏变量
  • D.需要事先指定变分分布的形式← 正确答案

答案:ABD。平均场方差低估和局部最优是 VMP 的两个主要理论局限。变分分布要通过均值场或者指数族假设来指定,这也限制了它的表达能力。C 错误,VMP 可以处理连续变量、离散变量乃至混合类型。

Q10. 关于 VMP 与其他推断算法的关系,以下说法正确的有?

多选题 · extreme

  • A.VMP 的消息来自期望对数因子← 正确答案
  • B.BP 在树形图上可以得到精确解← 正确答案
  • C.EP 的核心是消息矩匹配← 正确答案
  • D.VMP 要求对每个变量做蒙特卡洛采样

答案:ABC。A 正是 VMP 的消息定义;B 是信念传播的经典性质;C 是期望传播的关键思想。D 说反了,VMP 走的是变分优化路线,不依赖随机采样。