想象这样一个周六下午:你朋友发来一条微信“我在商场里,快来”,然后手机就没电了。你知道他爱喝奶茶,也知道他大概在五层楼的巨型商场的某处。你不可能拿把尺子把每一寸地板量一遍,只能凭几条线索和一份经验,在脑中勾出“他此刻最可能在哪个片区”的信念地图。 在贝叶斯统计里,这张“信念地图”就是后验分布。可惜真实的商场地图往往有几百个拐角、几十个出入口——真实后验分布复杂到根本无法直接算出来。变分推断(Variational Inference,简称 VI)的思路非常生活化:既然拿不到精确地图,那我就举着一个可调节大小和角度的“雷达圈”(简单分布),在商场上反复比划,直到这个圈尽可能贴合真实的概率分布。这个“比划—调整—再比划”的循环,就是变分推断的全部灵魂。 本文会用这个“商场找朋友”的比喻贯穿始终,带你从贝叶斯推断的困境出发,理解 VI 的优化框架、ELBO 目标、平均场假设、坐标上升更新、重参数化技巧,再看它如何撑起 VAE 这类深度生成模型。

岗位关联

变分推断是 AI 工程师进入贝叶斯深度学习的必备钥匙:无论是训练 VAE、做贝叶斯神经网络,还是在大规模推荐系统中做不确定性建模,你都会遇到它。理解 VI,相当于同时解锁了“近似推断”与“深度生成模型”两扇门。

目录
  1. 可视化演示
  2. 推断困境
  3. 变分框架
  4. ELBO目标
  5. 平均场假设
  6. 坐标上升法
  7. 重参数化
  8. 对比MCMC
  9. VAE实战
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示变分推断核心原理:ELBO优化模式下变分分布q逼近真实后验p(z|x)的过程;平均场模式下因子分解假设与坐标上升更新;VAE模式下编码器-解码器架构与重参数化技巧的端到端流程。

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

ELBO优化 变分分布q逼近后验p(z|x) ELBO=E[log p(x,z)]-E[log q(z)] 最大化ELBO等价最小化KL

推断困境

你朋友可能出现在商场的任何位置,体现在概率上就是一张覆盖全商场的“位置分布图”。贝叶斯公式给出了这幅图的数学表达式:把先验(他平时爱去的地方)乘上似然(当前的线索),再除以一个保证概率之和为一的归一化常数。这个归一化常数在统计学里叫“证据”,它要对所有可能的隐藏位置做积分。问题是,现实模型里这个积分几乎从来没有解析解。

p(z∣x)=p(x∣z)p(z)∫p(x∣z)p(z) dz\displaystyle p(\mathbf z|\mathbf x)=\frac{p(\mathbf x|\mathbf z)p(\mathbf z)}{\int p(\mathbf x|\mathbf z)p(\mathbf z)\,d\mathbf z}

以积分难解为首,维度稍高一点就彻底算不动。

1. 先验:表示在拿到观测数据之前,我们对隐藏变量的初始信念

p(z)\displaystyle p(\mathbf z)

2. 似然:表示给定隐藏变量取值时,观测到当前数据的概率

p(x∣z)\displaystyle p(\mathbf x|\mathbf z)

3. 分子乘积:先验与似然相乘,得到的量正比于后验分布

p(x∣z)p(z)\displaystyle p(\mathbf x|\mathbf z)p(\mathbf z)

4. 分母积分:对全部可能的隐藏变量做积分,得到归一化常数

∫p(x∣z)p(z) dz\displaystyle \int p(\mathbf x|\mathbf z)p(\mathbf z)\,d\mathbf z

这正是贝叶斯推断的困境:商场太大,你不可能真的把每个商铺翻一遍。传统方法如 MCMC 可以慢慢逼近,但遇到大数据、高维度就力不从心。于是“近似推断”成了刚需,变分推断正是其中最锋利的一把刀。

变分框架

既然真实地图画不出来,那就换个思路:先从“简单形状”里挑一个。你手里有一张可以调节大小、位置、胖瘦的雷达圈,这个雷达圈就是代理分布 \(q\),它属于我们预先选定的分布家族,比如高斯家族。现在的问题变成:把这个圈放在哪里、调到多大,才能最好地“冒充”真实后验?

DKL(q(z)∥p(z∣x))=∫q(z)ln⁡q(z)p(z∣x) dz\displaystyle \mathcal D_{\mathrm{KL}}(q(\mathbf z)\|p(\mathbf z|\mathbf x))=\int q(\mathbf z)\ln\frac{q(\mathbf z)}{p(\mathbf z|\mathbf x)}\,d\mathbf z

KL 散度就是“两个分布差多远”的尺子。变分推断把“求后验”这个积分问题,转换成了“调整雷达圈参数使 KL 散度最小”的优化问题。这个转变是革命性的:求积分做不到,但调参数我们很擅长。

1. 代理分布:选一个结构简单、便于计算的分布来充当后验的替身

q(z)\displaystyle q(\mathbf z)

2. 对数比值:在每个点上计算 q 与真实后验的差异对数

ln⁡q(z)p(z∣x)\displaystyle \ln\frac{q(\mathbf z)}{p(\mathbf z|\mathbf x)}

3. 加权积分:用 q 作为权重对差异取平均,得到总体差距

∫q(z)ln⁡q(z)p(z∣x) dz\displaystyle \int q(\mathbf z)\ln\frac{q(\mathbf z)}{p(\mathbf z|\mathbf x)}\,d\mathbf z

4. 非负特性:KL 散度永远大于等于零,当且仅当两个分布完全一致时取零

DKL(q∥p)≥0\displaystyle \mathcal D_{\mathrm{KL}}(q\|p)\geq 0

雷达圈越贴近真实分布,KL 就越小。但这里有个绕不开的悖论:KL 公式里需要真实后验,而真实后验恰恰是我们求不出来的东西。这个矛盾将我们推向下一节的主角——ELBO。

ELBO目标

既然 KL 算不出来,数学家玩了一个漂亮的套路:不直接最小化 KL,而是最大化一个等价的下界。把对数证据 \(\log p(\mathbf x)\) 拆成 ELBO 加 KL,因为左边是一个只由数据决定的常数,所以最大化 ELBO 就等于最小化 KL。这个下界就是变分推断的发动机——ELBO(Evidence Lower Bound,证据下界)。

L(q)=Eq(z)[ln⁡p(x,z)q(z)]=Eq(z)[ln⁡p(x∣z)]−DKL(q(z)∥p(z))\displaystyle \mathcal L(q)=\mathbb E_{q(\mathbf z)}\left[\ln\frac{p(\mathbf x,\mathbf z)}{q(\mathbf z)}\right]=\mathbb E_{q(\mathbf z)}\left[\ln p(\mathbf x|\mathbf z)\right]-\mathcal D_{\mathrm{KL}}\left(q(\mathbf z)\|p(\mathbf z)\right)

ELBO 的两项非常直观:第一项是“重构项”,衡量雷达圈覆盖的区域能否很好地解释观测数据;第二项是“惩罚项”,要求雷达圈不要太偏离先验。两者互相拉扯,共同决定最终的位置。

1. ELBO 原始形式:取联合分布与代理分布比值的对数期望

Eq(z)[ln⁡p(x,z)q(z)]\displaystyle \mathbb E_{q(\mathbf z)}\left[\ln\frac{p(\mathbf x,\mathbf z)}{q(\mathbf z)}\right]

2. 重构期望:数据拟合得越好,这一项越大

Eq(z)[ln⁡p(x∣z)]\displaystyle \mathbb E_{q(\mathbf z)}\left[\ln p(\mathbf x|\mathbf z)\right]

3. 正则惩罚:代理分布越接近先验,这一项的负值越小

DKL(q(z)∥p(z))\displaystyle \mathcal D_{\mathrm{KL}}\left(q(\mathbf z)\|p(\mathbf z)\right)

4. 优化目标:整体最大化 ELBO,等效于拉近 q 与真实后验的距离

arg⁡max⁡q∈QL(q)\displaystyle \arg\max_{q\in\mathcal Q}\mathcal L(q)

回到商场场景:重构项逼着雷达圈去解释“他在美食广场”这条线索,正则项又提醒你别把他放到完全不可能的楼顶。两个力量平衡时,雷达圈就停在了最合理的位置。ELBO 越高,说明你的雷达圈越接近真相。

平均场假设

雷达圈虽然方便,但真实地图常常是拧巴的:朋友在甜品店和电影院的可能性不是独立的,它们之间存在复杂的相关性。为了进一步降低难度,平均场假设做了一个大胆的简化:把多维的雷达圈拆成几个独立的子圈,每个子圈只管自己的维度。就像你在商场里先单独判断“他在 1 楼还是 2 楼”,再单独判断“他在东区还是西区”,至于两个判断之间的关联,先假装不存在。

q(z)=∏j=1mqj(zj)\displaystyle q(\mathbf z)=\prod_{j=1}^{m}q_j(\mathbf z_j)

这个乘积分解就是平均场假设的核心。它把原本耦合的高维分布拆成 \(m\) 个独立因子的乘积,每个因子只依赖自己那一块变量。代价是丢失变量间的相关性,收益是让更新公式变得极其简单。

1. 连乘记号:逐个因子相乘,表示各因子相互独立

∏j=1mqj(zj)\displaystyle \prod_{j=1}^{m}q_j(\mathbf z_j)

2. 因子独立性:同一个因子内部的变量可以相关,不同因子之间没有粘连

qj(zj)\displaystyle q_j(\mathbf z_j)

3. 近似含义:这只是我们在近似分布中强加的独立性,真实后验依然相关

q(z)≈p(z∣x)\displaystyle q(\mathbf z)\approx p(\mathbf z|\mathbf x)

4. 复杂度降低:把一个高维联合分布拆成一堆低维边缘分布,计算量大幅下降

O(m)+∑jO(dj) 代替 O(∏jdj)\displaystyle \mathcal O(m)+\sum_j\mathcal O(d_j)\ \text{代替}\ \mathcal O\left(\prod_j d_j\right)

平均场假设就像把一张复杂的二维地图裁剪成两张互相独立的一维地图。虽然丢失了“甜品店与电影院相邻”这类信息,但两张小地图各自都很好处理——这是变分推断能在工业界大规模落地的重要原因。

坐标上升法

有了因子分解,接下来的任务就是逐个调整子圈。坐标上升法(Coordinate Ascent VI,CAVI)的原理非常朴素:一次只动一个因子,固定住其他所有因子,找出当前因子的最优形式,然后换下一个。就像你调试雷达圈:先固定南北方向的旋钮,单独拧东西方向的旋钮;拧到位后再反过来调南北方向。如此反复,直到整个系统稳定。

ln⁡qj∗(zj)=Eq−j[ln⁡p(x,z)]+const\displaystyle \ln q_j^{\ast}(\mathbf z_j)=\mathbb E_{q_{-j}}\left[\ln p(\mathbf x,\mathbf z)\right]+\mathrm{const}

这个公式是坐标上升法的心脏:第 \(j\) 个因子的最优对数形式,等于在其它所有因子的期望下,联合分布的“平均对数”。剩余的所有项都吸收进常数里,最后通过指数化再归一化,就能得到更新的因子。

1. 固定其余因子:对除第 j 个因子外的全部变量求期望

Eq−j[ln⁡p(x,z)]=∫q−j(z−j)ln⁡p(x,z) dz−j\displaystyle \mathbb E_{q_{-j}}\left[\ln p(\mathbf x,\mathbf z)\right]=\int q_{-j}(\mathbf z_{-j})\ln p(\mathbf x,\mathbf z)\,d\mathbf z_{-j}

2. 联合对数:完整模型的对数概率,包含先验与似然

ln⁡p(x,z)=ln⁡p(x∣z)+ln⁡p(z)\displaystyle \ln p(\mathbf x,\mathbf z)=\ln p(\mathbf x|\mathbf z)+\ln p(\mathbf z)

3. 吸收常数项:与第 j 个变量无关的项全部丢弃,不影响归一化结果

+const\displaystyle +\mathrm{const}

4. 迭代更新:对所有因子轮流套用公式,直到 ELBO 不再上升

qj←qj∗,  j=1,2,…,m\displaystyle q_j\leftarrow q_j^{\ast},\ \ j=1,2,\ldots,m

这个更新过程非常像 EM 算法:EM 是在“已知参数时求后验”的特例下做坐标上升,而 CAVI 用近似的因子分解替代精确后验。雷达圈的每一次微调都让整体 ELBO 爬升一格,几十轮之后,你的搜索圈就稳定在了最优位置。

重参数化

坐标上升法虽然漂亮,但要求每个因子的更新有闭式解。在深度模型里,我们常常面对无法解析求解的分布。这时需要换一条路:用梯度上升直接优化 ELBO。可问题来了——ELBO 里面含有对 \(q\) 的采样,采样这个动作是不可导的,梯度传不过去。

∇θEqθ(z)[f(z)]=Ep(ε)[∇θf(μ+σ⊙ε)]\displaystyle \nabla_{\theta}\mathbb E_{q_\theta(\mathbf z)}\left[f(\mathbf z)\right]=\mathbb E_{p(\boldsymbol{\varepsilon})}\left[\nabla_{\theta}f(\boldsymbol{\mu}+\boldsymbol{\sigma}\odot\boldsymbol{\varepsilon})\right]

重参数化技巧巧妙地化解了这个死结:把随机变量 \(z \sim q_\theta(z)\) 拆成“确定性变换 + 外部噪声”,即 \(z=\mu+\sigma\odot\varepsilon\),其中 \(\varepsilon\) 服从标准正态分布。随机性被转移到与参数无关的噪声上,梯度就可以顺着确定性路径穿透过去了。

1. 原本不可导:直接对 z 采样会使梯度无法回传给参数

∇θEqθ(z)[f(z)]\displaystyle \nabla_\theta \mathbb E_{q_\theta(\mathbf z)}[f(\mathbf z)]

2. 重参数化替换:把随机性从 z 转移到噪声变量

z=μ+σ⊙ε,ε∼N(0,I)\displaystyle \mathbf z=\boldsymbol{\mu}+\boldsymbol{\sigma}\odot\boldsymbol{\varepsilon},\quad \boldsymbol{\varepsilon}\sim\mathcal N(\mathbf 0,\mathbf I)

3. 梯度穿透:f 对 μ 和 σ 的导数可以通过链式法则计算

∇θf(μ+σ⊙ε)\displaystyle \nabla_\theta f(\boldsymbol{\mu}+\boldsymbol{\sigma}\odot\boldsymbol{\varepsilon})

4. 蒙特卡洛估计:采样若干个噪声,用平均梯度近似期望梯度

1L∑l=1L∇θf(μ+σ⊙ε(l))\displaystyle \frac{1}{L}\sum_{l=1}^{L}\nabla_\theta f(\boldsymbol{\mu}+\boldsymbol{\sigma}\odot\boldsymbol{\varepsilon}^{(l)})

这就是随机梯度变分贝叶斯(SGVB)的核心,也是 VAE 能够端到端训练的基石。你不再手动拧雷达圈的旋钮,而是让神经网络自己学习怎么拧——它比人快得多,也调得准得多。

对比MCMC

马尔可夫链蒙特卡洛(MCMC)是另一类近似推断方法,它的思路是直接去真实后验中采样:派一名侦探把商场彻底逛一遍,每到一处就画一个点,点越密的地方就是朋友越可能出现的区域。随着采样点越来越多,这个点云会逼近真实地图。

Ep(z∣x)[f(z)]≈1T∑t=1Tf(z(t)),z(t)∼p(z∣x)\displaystyle \mathbb E_{p(\mathbf z|\mathbf x)}\left[f(\mathbf z)\right]\approx\frac{1}{T}\sum_{t=1}^{T}f(\mathbf z^{(t)}),\quad \mathbf z^{(t)}\sim p(\mathbf z|\mathbf x)

MCMC 是渐近无偏的:只要走足够多步,估计误差会趋于零。但代价是收敛慢,尤其是在高维空间里,侦探可能要逛上几天几夜。VI 则不同——它不采样,而是直接在分布族里做优化,速度可以快几个量级。

1. 样本均值:用大量采样点的均值去逼近目标期望

1T∑t=1Tf(z(t))\displaystyle \frac{1}{T}\sum_{t=1}^{T}f(\mathbf z^{(t)})

2. 目标分布采样:要求样本确实来自真实后验分布

z(t)∼p(z∣x)\displaystyle \mathbf z^{(t)}\sim p(\mathbf z|\mathbf x)

3. 渐近无偏性:T 趋于无穷大时,估计值收敛到真实期望

lim⁡T→∞1T∑t=1Tf(z(t))=Ep[f]\displaystyle \lim_{T\to\infty}\frac{1}{T}\sum_{t=1}^{T}f(\mathbf z^{(t)})=\mathbb E_p[f]

4. 与 VI 的本质区别:MCMC 用样本近似,VI 用分布族近似

p(z∣x)∼1T∑δz(t)  vs.  p(z∣x)≈qλ(z)\displaystyle p(\mathbf z|\mathbf x)\sim\frac{1}{T}\sum\delta_{\mathbf z^{(t)}}\ \ \text{vs.}\ \ p(\mathbf z|\mathbf x)\approx q_\lambda(\mathbf z)

用商场比喻来说:MCMC 是带着纸笔走遍每个店铺的侦探,结果精确但费时;VI 是拿着雷达圈快速比划的保安,速度飞快但圈内细节可能失真。在工业级大规模数据面前,VI 的“快”远比“精确”更值钱。

VAE实战

变分推断最耀眼的实战舞台就是变分自编码器(Variational Autoencoder,VAE)。在 VAE 里有两位配合默契的搭档:编码器负责把观测到的图像压缩成雷达圈的参数(均值与方差),解码器负责从雷达圈里采样出隐变量,再重建出图像。这两位搭档一起训练,共同把 ELBO 推向最大。

L(θ,ϕ;x)=Eqϕ(z∣x)[ln⁡pθ(x∣z)]−DKL(qϕ(z∣x)∥p(z))\displaystyle \mathcal L(\theta,\phi;\mathbf x)=\mathbb E_{q_\phi(\mathbf z|\mathbf x)}\left[\ln p_\theta(\mathbf x|\mathbf z)\right]-\mathcal D_{\mathrm{KL}}\left(q_\phi(\mathbf z|\mathbf x)\|p(\mathbf z)\right)

这正是 VI 思想在深度生成模型中的直接套用:编码器给出推理网络 \(q_\phi(z|x)\),解码器给出生成网络 \(p_\theta(x|z)\)。第一项鼓励重建的图片像原图,第二项约束隐变量分布不要偏离标准正态先验。

1. 编码器:给定观测数据 x,输出隐变量 z 的高斯参数

qϕ(z∣x)=N(z;μϕ(x),σϕ2(x))\displaystyle q_\phi(\mathbf z|\mathbf x)=\mathcal N(\mathbf z;\boldsymbol\mu_\phi(\mathbf x),\boldsymbol\sigma_\phi^2(\mathbf x))

2. 重构期望:从编码器采样隐变量,再由解码器重构原图

Eqϕ(z∣x)[ln⁡pθ(x∣z)]\displaystyle \mathbb E_{q_\phi(\mathbf z|\mathbf x)}\left[\ln p_\theta(\mathbf x|\mathbf z)\right]

3. KL 正则:强制隐变量后验靠近标准正态先验,起到正则化作用

DKL(qϕ(z∣x)∥p(z))\displaystyle \mathcal D_{\mathrm{KL}}\left(q_\phi(\mathbf z|\mathbf x)\|p(\mathbf z)\right)

4. 训练流程:用重参数化采样计算梯度,端到端更新编码器与解码器

z=μϕ(x)+σϕ(x)⊙ε,ε∼N(0,I)\displaystyle \mathbf z=\boldsymbol\mu_\phi(\mathbf x)+\boldsymbol\sigma_\phi(\mathbf x)\odot\boldsymbol\varepsilon,\quad \boldsymbol\varepsilon\sim\mathcal N(\mathbf 0,\mathbf I)

训练完成后,VAE 就是一台强大的“生成机器”:随便从标准正态分布中抽取一个隐变量,解码器就能画出一张新的人脸、一幅数字或一段音乐。雷达圈不再只是找朋友的工具,而是变成了创造新世界的画笔。

AI 应用场景

大规模推荐系统的不确定性推断

阶段:模型推断与在线服务

解决的问题:传统矩阵分解用点估计求用户向量,无法表达置信度;MCMC 在大规模用户数据上慢得不可接受。VI 将用户和物品的隐向量后验近似为独立高斯,用坐标上升或随机梯度更新,把推断变成可并行的优化问题。

具体案例:在拥有上亿用户的电商推荐中,用变分贝叶斯矩阵分解建模点击记录,每个用户的兴趣向量不再是一个固定点,而是一个带方差的分布。系统不仅能推荐商品,还能给出“这个推荐有多确定”,遇到冷启动用户时自动调低置信度。

变分自编码器做异常检测

阶段:训练与评估

解决的问题:工业场景中正常样本容易获得、异常样本极少。VAE 用 VI 学习正常样本的隐空间分布,重构误差高的样本即视为异常,无需标注异常样本。

具体案例:在工厂质检流水线上,用 VAE 对产品图片建模。编解码器把正常产品压缩到隐空间再重建,重建误差超过阈值就触发警报。重参数化让这个流程可以端到端训练,部署时只需一次前向传播,速度快到能跟上流水线节拍。

贝叶斯神经网络的医疗风险预测

阶段:模型训练与不确定性校准

解决的问题:医疗诊断中模型不能只给一个预测概率,还要给出“模型自己有多不确定”。用 VI 将神经网络权重后验近似为高斯分布,输出预测方差,帮助医生判断是否需要人工复核。

具体案例:在糖尿病视网膜病变筛查中,用变分贝叶斯神经网络分析眼底图像。模型对每一张图都输出患病概率和置信区间,低置信度的影像自动转给眼科专家复查,大幅减少漏诊。

Python 演示

python21 行
import numpy as np  def cavi_sum_model(y_data, sigma=1.0, iters=30):    """平均场坐标上升法:y_i = z1 + z2 + noise, 用 q(z1)q(z2) 逼近后验"""    n = len(y_data)    ybar = np.mean(y_data)    # 初始化为不同的均值,便于观察交替更新    m1, m2 = -1.0, 1.0    var = 1.0 / (1.0 + n / (sigma ** 2))    for _ in range(iters):        m1 = var * (n * ybar / (sigma ** 2) - n * m2 / (sigma ** 2))        m2 = var * (n * ybar / (sigma ** 2) - n * m1 / (sigma ** 2))    return (m1, var), (m2, var)  if __name__ == "__main__":    y = np.array([2.8, 3.4])    (m1, v1), (m2, v2) = cavi_sum_model(y)    print("q(z1) 均值: %.3f, 方差: %.3f" % (m1, v1))    print("q(z2) 均值: %.3f, 方差: %.3f" % (m2, v2))
目的:演示平均场坐标上升法如何用两个独立高斯因子逼近一个互相耦合的后验分布。
  1. var = 1.0 / (1.0 + n / (sigma ** 2))— 先验精度加上数据精度后取倒数,得到后验方差;这是高斯模型下的闭式解。
  2. m1 = var * (n * ybar / (sigma ** 2) - n * m2 / (sigma ** 2))— 更新 q1 时把 q2 的均值当作常数扣除,体现“固定其他因子”的坐标上升思想。
  3. m2 = var * (n * ybar / (sigma ** 2) - n * m1 / (sigma ** 2))— 紧接着更新 q2,使用刚更新的 m1,形成交替迭代。
  4. y = np.array([2.8, 3.4])— 两个观测值,代表两条互相印证的线索。
  5. cavi_sum_model(y)— 返回两个因子的均值与方差,收敛后两者趋于一致,因为模型对 z1 和 z2 具有对称性。

常见误区

误区学完 ELBO 推导后,以为 \(q\) 的最优解就是真实后验分布,甚至拿它去和精确结果对比,发现对不上就认为代码写错了。

正解VI 永远是在你选定的分布家族里找“最不差”的近似。真实后验往往不在这个家族里,所以无论怎么优化都存在近似偏差。雷达圈终究是圈,不能要求它变成一张细节丰富的地图。

为何常见:初学者容易把“数学推导里的最优解”误解为“真实世界的最优解”,忽略了变分推断从第一步就接受了分布族限制。

误区看到 KL 散度就直觉认为它是对称的“距离”,觉得正着算反着算都一样。

正解KL 散度不满足对称性和三角不等式。VI 使用的是反向 KL(q 在分母),它倾向找到一个窄而高的模式,称为 mode-seeking;正向 KL 则倾向覆盖全域,称为 moment-matching。方向选反,结果可能天差地别。

为何常见:初学概率时习惯了欧氏距离的对称直觉,对“定向散度”的概念需要刻意建立。

误区学了 \(q(\mathbf z)=\prod q_j(z_j)\) 之后,认为我们假设了真实后验中变量互不影响。

正解平均场假设只是说“我们用乘积形式去近似真实后验”,真实后验的变量依然可以高度相关。正是因为我们强行用独立结构去拟合相关结构,才会产生近似误差。丢掉相关性是刻意简化,不是客观事实。

为何常见:符号上的“假设”容易被理解为对真实世界的断言,其实数学假设是对近似分布族的限制。

误区既然 \(z = \mu + \sigma\varepsilon\) 能解决不可导问题,那离散变量的采样也可以照葫芦画瓢。

正解重参数化要求分布具有“可微的确定性变换”,这对连续高斯分布很自然,但对伯努利等离散分布并不适用。离散场景通常改用得分函数估计器(如 REINFORCE)或 Gumbel-Softmax 等松弛技巧。

为何常见:只记住了“加个噪声就能求导”这个操作,忽略了重参数化成立的前提条件是变换的连续性与可微性。

误区MCMC 理论上是渐近无偏的,于是认为它是更高级的方法,所有场景都用 MCMC。

正解MCMC 的无偏性建立在“采样足够多步”的前提下,而高维模型往往需要海量样本才能收敛。VI 的偏差来自分布族限制,但优化过程确定性收敛,配合随机梯度上升可以扩展到海量数据。工程上常常用“先 VI 粗跑,再 MCMC 精修”的组合策略。

为何常见:只比较理论性质,忽略了收敛速度和计算资源这些工程瓶颈。

面试题

Q1. 变分推断的核心思路是?

单选题 · easy

  • A.直接计算复杂积分
  • B.用优化近似后验分布← 正确答案
  • C.用采样逼近后验分布
  • D.忽略先验只看观测值

答案:B。VI 把贝叶斯推断转化为优化问题,在简单分布族中寻找最接近真实后验的 q。直接计算积分对应精确推断,采样逼近对应 MCMC,忽略先验则根本不是贝叶斯方法。

Q2. 最大化 ELBO 等价于?

单选题 · easy

  • A.让 q 与先验分布保持一致
  • B.让 q 与真实后验的 KL 散度最小← 正确答案
  • C.让观测数据在模型中影响变小
  • D.让证据积分的值无限增大

答案:B。对数证据是常数,ELBO 加上 KL(q||p) 等于该常数,因此最大化 ELBO 就是在压缩 KL 距离。先验不是最终目标,观测数据的影响力也不能削弱。

Q3. 变分自编码器中“重参数化”是为了?

单选题 · easy

  • A.让采样过程可以求导← 正确答案
  • B.让损失函数取值更小
  • C.让编码器退化为解码器
  • D.让隐变量维度变高

答案:A。重参数化把随机变量写成 μ+σε,随机性来自外部噪声,这样梯度可以顺着确定性路径回传。它并不改变损失大小、维度或模块结构。

Q4. 平均场假设的核心形式是?

单选题 · mid

  • A.后验必须满足高斯分布
  • B.q 分解为独立因子乘积← 正确答案
  • C.先验与似然互不影响
  • D.隐变量只有一个维度

答案:B。平均场假设的核心是 \(q(z)=\prod q_j(z_j)\),把高维联合分布拆成多个低维因子。高斯分布只是常见的分布族选择而非必要条件。

Q5. 关于 KL(q||p) 与 KL(p||q) 的说法,正确的是?

多选题 · mid

  • A.前者是反向 KL,后者是正向 KL← 正确答案
  • B.反向 KL 倾向锁定单一模式← 正确答案
  • C.两者数值大小完全相同
  • D.VI 通常最小化反向 KL← 正确答案

答案:ABD。KL 散度不对称,正反向数值不同。VI 选择反向 KL,所以近似分布容易表现出 mode-seeking 行为。选项 C 说“完全相同”明显错误。

Q6. 坐标上升 VI 更新第 j 个因子的核心公式是?

单选题 · mid

  • A.ln q_j 正比于其余因子的期望联合对数← 正确答案
  • B.q_j 等于似然函数的表达式
  • C.q_j 从后验中直接采样得到
  • D.q_j 与先验分布完全相等

答案:A。CAVI 的更新式是 \(\ln q_j^\star=\mathbb E_{q_{-j}}[\ln p(x,z)]+const\),固定其他因子后求解当前因子的最优形式。它不是采样、不是直接用似然,也不会退化成先验。

Q7. 关于平均场 VI 与 MCMC 的对比,错误的是?

单选题 · extreme

  • A.MCMC 渐近无偏但收敛较慢
  • B.VI 在限定分布族内做近似
  • C.MCMC 的估计存在蒙特卡洛噪声
  • D.VI 必定比 MCMC 更加精确← 正确答案

答案:D。VI 的精度受限于分布族,MCMC 才是渐近精确的。D 说 VI “必定更精确”完全颠倒了两者的适用场景。A、B、C 的描述均正确。

Q8. 在高斯共轭模型下,坐标上升得到的最优后验方差是?

单选题 · mid

  • A.先验方差与似然方差的平均值
  • B.先验精度与似然精度之和的倒数← 正确答案
  • C.先验均值与似然均值之间的差值
  • D.与观测数据的样本方差完全一致

答案:B。贝叶斯更新中,后验精度等于先验精度加上似然精度,因此后验方差是两者之和的倒数。样本方差描述的是数据自身的离散程度,与后验方差不是一回事。

Q9. 关于 ELBO 的分解,正确的有?

多选题 · mid

  • A.它等于重构项减去 KL 正则项← 正确答案
  • B.它是证据对数的下界← 正确答案
  • C.它恒大于等于对数证据
  • D.最大化它等价于最小化 q 与后验的 KL← 正确答案

答案:ABD。ELBO 是对数证据的下界,始终小于等于 log p(x)。它与 KL 之和等于常数,所以最大化 ELBO 就是最小化 KL。选项 C 把上下界关系写反了。

Q10. 在 SGVB 中估计梯度时用到的技巧是?

单选题 · hard

  • A.将 z 重写为 μ 加 σ 乘噪声← 正确答案
  • B.对离散数据直接求导
  • C.用数值差分替代参数梯度
  • D.用解析解替换所有期望

答案:A。SGVB 依赖重参数化技巧,把采样变换成确定性函数作用在标准正态噪声上,从而让梯度可穿透。离散分布没有这种可微变换,数值差分也只在无法求导时兜底而非 SGVB 本意。