每个人心里都有一位“请不起的影星”——真实后验 \(p(z|x)\)。你只看得到 TA 的电影成片 \(x\),却永远无法直接窥探 TA 拍戏时的内心戏 \(z\)(也就是潜变量)。你想完整复刻 TA 的表演逻辑,可“把全部可能的内心戏都枚举一遍再积分”——这成本高到离谱,没人付得起。于是你签了一位“替身演员”\(q(z)\):他演技有限,但胜在便宜、可控、随叫随到。现在问题变成:替身演得怎么样?你手里有一笔固定的“总票房”——证据 \(\log p(x)\)——无论替身是谁,票房总数不变。你把这笔钱拆成两份:替身的“出镜表现分”(ELBO)和替身与本人的“气场差距分”(KL 散度)。表现分越高,差距分就越薄。本文就用这条“替身追星”的故事线,把 ELBO 从一个吓人的数学符号,讲成一张清清楚楚的片场账单。

岗位关联

对 AI 从业者而言,ELBO 是 VAE、变分推断、扩散模型等生成式模型的“地基公式”。吃透它的推导与分解,你才能真正理解损失函数每一项在做什么,以及如何调试和改进自己的生成模型。

目录
  1. 可视化演示
  2. 1. 问题背景:请不起的影星
  3. 2. 证据边际似然:固定不变的总票房
  4. 3. ELBO的导出:琴生不等式给出下界
  5. 4. ELBO的分解:台词还原分与人设稳定分
  6. 5. 重参数化:把随机性装进外置骰子
  7. 6. 蒙特卡洛估计:多演几场取平均
  8. 7. VAE训练优化:导演与替身联合签约
  9. 8. ELBO与EM关联:一个目标,两种调法
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示ELBO推导的核心机制,通过开始/执行/监控/完成四种模式展示关键概念与交互流程。

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

ELBO推导:对数似然 对数似然与ELBO的基本关系 ELBO的完整推导过程 核心机制可视化 ELBO推导整体架构与关键组件

1. 问题背景:请不起的影星

每个人心里都有一位“请不起的影星”——真实后验。你想搞清楚影星拍某场戏时的内心状态 \(z\),可你手里只有成片 \(x\)。用数学的话说,你面对的是一个隐变量模型:观测 \(x\) 由不可见的潜变量 \(z\) 经过某种生成过程得到。电影上映后,你最想知道的其实是“看到成片 \(x\) 后,影星内心戏 \(z\) 的完整分布”,也就是后验 \(p(z|x)\)。

可惜,这位影星索要的片酬是“穷举所有可能的内心戏,再全部积分一遍”。在连续高维空间里,这个积分几乎永远没有解析解。请不起本尊,片场就只能换一种思路:签一个便宜可控的替身 \(q(z)\),让替身尽量演得像本尊。

请不起本尊并不可怕。可怕的是不知道替身离本尊有多远。而 ELBO 告诉我们的第一件事就是:那份“差距”其实藏在一笔固定的账里。

p(z∣x)=p(x∣z)p(z)p(x)\displaystyle p(z|x)=\frac{p(x|z)p(z)}{p(x)}
后验等于“联合概率除以证据”:分子描述了生成过程,分母是那个让你头疼的积分。
  1. 联合概率分子 \(p(x|z)p(z)\) 等于 \(p(x,z)\),表示“先有内心戏 \(z\),再拍出画面 \(x\)”的联合可能性。
    p(x,z)=p(x∣z)p(z)\displaystyle p(x,z)=p(x|z)p(z)
  2. 证据是分母分母 \(p(x)\) 要把所有可能的内心戏都加一遍,数学上写作对 \(z\) 求积分。
    p(x)=∫p(x∣z)p(z) dz\displaystyle p(x)=\int p(x|z)p(z)\,dz
  3. 正比关系后验与联合概率成正比,除以证据只是为了把概率归一化到总和为 1。
    p(z∣x)∝p(x∣z)p(z)\displaystyle p(z|x)\propto p(x|z)p(z)

2. 证据边际似然:固定不变的总票房

影片上映时,观众能看到的画面 \(x\),其实遵循一个固定的“总票房”——证据 \(p(x)\)。它的计算逻辑很像发行方的排片成本核算:影星先按先验 \(p(z)\) 随机产生一段内心戏(挑剧本),再按似然 \(p(x|z)\) 把它拍成画面(演出来)。把“所有可能内心戏”下的拍摄概率累加起来,就得到这部电影被看到的概率。

你可能已经发现,这顿饭的“总预算”是固定的:\(\log p(x)\) 不会因为你请了哪个替身而改变。既然总成绩固定,那么替身表现越好,剩余的本尊差距就越小。于是我们要给这份固定成绩找一个“替身能直接评估”的表达——这就是 ELBO 登场的理由。

p(x)=∫p(x∣z)p(z) dz\displaystyle p(x)=\int p(x|z)p(z)\,dz
证据是“生成过程对观测数据的整体解释力”。它只取决于数据生成机制,与你的替身选择无关。
  1. 先验抽样\(p(z)\) 是潜变量的先验分布,相当于“影星在无剧本约束下会选什么内心戏”的偏好。
    z∼p(z)\displaystyle z\sim p(z)
  2. 似然映射\(p(x|z)\) 表示给定内心戏 \(z\),拍出画面 \(x\) 的可能性,它是生成模型的“摄像机”。
    p(x∣z)\displaystyle p(x|z)
  3. 遍历求和积分符号 \(\int dz\) 表示对潜空间里所有可能的内心戏累加。潜空间维度一高,这个积分通常没有闭式解。
    ∫zp(x∣z)p(z) dz\displaystyle \int_{z} p(x|z)p(z)\,dz

3. ELBO的导出:琴生不等式给出下界

替身毕竟不是本尊,你无法直接测量“替身与本尊的气场差距分”——那需要本尊亲自出场。但幸运的是,数学里有一把“尺子”叫琴生不等式,它能用替身自己的数据,为总票房画出一条只低不高的线。这条线就是证据下界。

推导的思路很朴素:想给 \(\log p(x)\) 找下界,就硬塞一个替身分布 \(q(z)\) 进去。因为 \(\int q(z)\,dz=1\),你可以在积分号里乘一个"1",再把分子分母同除以 \(q(z)\),整个表达式不打一个折扣。

琴生不等式让我们拿到了“替身表现分”这个安全垫。但 \(\mathcal{L}(q)\) 里还混着联合分布,实际操作起来不够直观。下一步,我们把这张表现分账单拆成两行——一行是“台词还原”,一行是“人设稳定”。

log⁡p(x)=log⁡∫q(z)⋅p(x,z)q(z) dz≥∫q(z)log⁡p(x,z)q(z) dz=L(q)\displaystyle \log p(x)=\log\int q(z)\cdot\frac{p(x,z)}{q(z)}\,dz\ge \int q(z)\log\frac{p(x,z)}{q(z)}\,dz=\mathcal{L}(q)
\(\mathcal{L}(q)\) 就是 ELBO:Evidence Lower BOund,替身表现分。它永远不超过总票房 \(\log p(x)\)。
  1. 插入替身在积分里乘上 \(\int q(z)dz=1\),不改变任何数值,只是为替身腾出了位置。
    log⁡p(x)=log⁡∫q(z)p(x,z)q(z) dz\displaystyle \log p(x)=\log\int q(z)\frac{p(x,z)}{q(z)}\,dz
  2. 识别期望积分形式 \(\int q(z)\cdot f(z)dz\) 正是“在 \(q\) 分布下对 \(f\) 求期望”的定义。
    ∫q(z)p(x,z)q(z) dz=Eq(z)[p(x,z)q(z)]\displaystyle \int q(z)\frac{p(x,z)}{q(z)}\,dz=\mathbb{E}_{q(z)}\left[\frac{p(x,z)}{q(z)}\right]
  3. 琴生不等式因为 \(\log\) 是凹函数,“先取平均再取对数”不小于“先取对数再取平均”,于是得到下界。
    log⁡Eq[⋅]≥Eq[log⁡(⋅)]\displaystyle \log\mathbb{E}_q[\cdot]\ge \mathbb{E}_q[\log(\cdot)]
  4. 定义 ELBO右边就是替身表现分 \(\mathcal{L}(q)\),它完全由替身 \(q\) 和联合分布 \(p(x,z)\) 决定,不需要碰不可算的后验。
    L(q)=Eq(z)[log⁡p(x,z)−log⁡q(z)]\displaystyle \mathcal{L}(q)=\mathbb{E}_{q(z)}[\log p(x,z)-\log q(z)]

4. ELBO的分解:台词还原分与人设稳定分

替身演员的出场费该怎么算?片场会计给出了两项明细:第一项叫重构项,衡量替身按设定演出来的画面离原片有多近——这是“台词还原分”;第二项叫正则项,衡量替身的基本人设与娱乐圈常识(先验 \(p(z)\))差多远——这是“人设稳定分”。两位导演都希望替身“演得像”,同时“不飘得太离谱”。

把联合概率拆开:\(\log p(x,z)=\log p(x|z)+\log p(z)\)。第一项放进对 \(q\) 的期望里就是重构项;后两项 \(\mathbb{E}_q[\log p(z)-\log q(z)]\) 恰好整理成 \(-KL(q\|p(z))\),也就是 KL 散度的相反数。

至此,替身的账单已经清清楚楚:既要能还原电影画面,又要保持人设不飘。但还有一个工程问题没解决:替身每次上场是“临场发挥”(从 \(q\) 中采样),而导演无法对随机发挥下指令——梯度被剪断了。要打通这条训练链路,我们需要重参数化。

L(q)=Eq(z∣x)[log⁡p(x∣z)]−KL(q(z∣x) ∥ p(z))\displaystyle \mathcal{L}(q)=\mathbb{E}_{q(z|x)}[\log p(x|z)]-KL\big(q(z|x)\,\|\,p(z)\big)
最大化 ELBO,等价于在“让解码器还原数据”和“让编码器别偏离先验”两个目标之间做权衡。
  1. 拆开联合把联合概率的对数拆成似然加先验两项。
    log⁡p(x,z)=log⁡p(x∣z)+log⁡p(z)\displaystyle \log p(x,z)=\log p(x|z)+\log p(z)
  2. 重构项\(\mathbb{E}_q[\log p(x|z)]\) 奖励替身能把画面还原出来,相当于给“台词还原分”打分。
    Eq(z∣x)[log⁡p(x∣z)]\displaystyle \mathbb{E}_{q(z|x)}[\log p(x|z)]
  3. KL 正则项\(\mathbb{E}_q[\log p(z)-\log q(z)]\) 衡量替身与先验的偏离程度,写成 KL 散度形式。
    Eq[log⁡p(z)−log⁡q(z)]=−KL(q(z∣x) ∥ p(z))\displaystyle \mathbb{E}_q[\log p(z)-\log q(z)]=-KL(q(z|x)\,\|\,p(z))
  4. 完整账单表现分 = 还原分 − 偏离分。偏离分永远非负,所以它像一个“扣分项”。
    L(q)=重构项−KL(⋅)\displaystyle \mathcal{L}(q)=\text{重构项}-KL(\cdot)

5. 重参数化:把随机性装进外置骰子

以前的替身表演全靠临场发挥:导演喊“再像一点”,替身当场随机发挥一次,导演完全没法指挥这次发挥的细节。原因在于“采样”这个动作本身不可导——你没法对随机数求梯度。解决方案非常巧妙:把随机性装进一颗外置骰子 \(\varepsilon\),替身只负责两个可控参数——表情基准 \(\mu\) 和抖动幅度 \(\sigma\)。每次表演:\(z=\mu+\sigma\varepsilon\)。

骰子 \(\varepsilon\sim\mathcal{N}(0,I)\) 与模型参数完全无关,梯度可以绕过采样节点,直接流到 \(\mu\) 和 \(\sigma\) 上。于是导演终于可以对替身喊:表情基准往左调一点,抖动幅度收一收。

有了外置骰子,导演终于能指挥替身了。但每一场表演都有随机发挥,单看一场口碑不稳——于是我们需要多演几场取平均,这就是蒙特卡洛估计。

z=μϕ(x)+σϕ(x)⊙ε,ε∼N(0,I)\displaystyle z=\mu_{\phi}(x)+\sigma_{\phi}(x)\odot\varepsilon,\qquad \varepsilon\sim\mathcal{N}(0,I)
重参数化把“从分布中采样”改写为“确定性变换 + 外部噪声”,让随机节点变得可导。
  1. 均值基准\(\mu_{\phi}(x)\) 是编码器输出的中心位置,代表替身最可能的“表情基准”。
    μϕ(x)\displaystyle \mu_{\phi}(x)
  2. 幅度缩放\(\sigma_{\phi}(x)\) 控制抖动幅度,决定这次表演偏离基准多少;\(\odot\) 表示逐元素相乘。
    σϕ(x)⊙ε\displaystyle \sigma_{\phi}(x)\odot\varepsilon
  3. 外部噪声\(\varepsilon\sim\mathcal{N}(0,I)\) 是一颗与参数无关的骰子,它保留了采样的随机性,但切断了随机性与参数的纠缠。
    ε∼N(0,I)\displaystyle \varepsilon\sim\mathcal{N}(0,I)
  4. 可微变换现在 \(z\) 是 \((\mu,\sigma,\varepsilon)\) 的确定性函数,梯度可以安心穿过 \(z\) 回传到 \(\phi\)。
    ∇ϕEε[⋅]=Eε[∇ϕ(⋅)]\displaystyle \nabla_{\phi}\mathbb{E}_{\varepsilon}[\cdot]=\mathbb{E}_{\varepsilon}[\nabla_{\phi}(\cdot)]

6. 蒙特卡洛估计:多演几场取平均

替身演一场戏,画面还原得好不好带有随机性——今天状态好,明天状态差。聪明的片场做法是:让替身演 \(L\) 场,把每场的“口碑”(对数函数值)取平均,用样本均值去近似期望。这就是蒙特卡洛估计(Monte Carlo,MC)。

在 ELBO 的语境里,我们要估计的是替身对“联合对数概率减去自身对数概率”的期望值。样本均值天然无偏:样本越多,估计越准,方差越小。而真正让训练高效的是:在实践中,一个 batch 里的几十个样本已经可以看作并行演了多场戏,所以每个数据点只采样一次也行。

有了蒙特卡洛这把“平均尺子”,替身表现分就可以在训练中实时结算了。接下来我们把片场正式组建起来:选角导演(编码器)+ 替身教练(解码器),用 ELBO 作合同一起练兵。

L(θ,ϕ;x)≈1L∑l=1L[log⁡pθ(x∣z(l))+log⁡p(z(l))−log⁡qϕ(z(l)∣x)],z(l)∼qϕ\displaystyle \mathcal{L}(\theta,\phi;x)\approx\frac{1}{L}\sum_{l=1}^{L}\Big[\log p_{\theta}(x|z^{(l)})+\log p(z^{(l)})-\log q_{\phi}(z^{(l)}|x)\Big],\quad z^{(l)}\sim q_{\phi}
MC 估计用有限样本的平均值代替难以解析计算的期望,是 VAE 得以用反向传播训练的关键一环。
  1. 样本抽取从替身分布 \(q_{\phi}(z|x)\) 中抽取 \(L\) 个独立样本,相当于替身演了 \(L\) 场。
    z(l)∼qϕ(z∣x)\displaystyle z^{(l)}\sim q_{\phi}(z|x)
  2. 三项累计每个样本都要计算“重构分 + 先验分 − 替身自身分”,合起来是该样本对 ELBO 的贡献。
    log⁡pθ(x∣z(l))+log⁡p(z(l))−log⁡qϕ(z(l)∣x)\displaystyle \log p_{\theta}(x|z^{(l)})+\log p(z^{(l)})-\log q_{\phi}(z^{(l)}|x)
  3. 取平均除以 \(L\) 求均值,用样本均值逼近真实期望。
    1L∑l=1L[⋅]\displaystyle \frac{1}{L}\sum_{l=1}^{L}[\cdot]

7. VAE训练优化:导演与替身联合签约

现在片场升级为完整阵容:编码器是选角导演,看到电影 \(x\) 就立刻推荐一份替身设定(即 \(q\) 的均值 \(\mu\) 和方差 \(\sigma\));解码器是替身教练,拿到设定 \(z\) 就演出一段还原画面 \(x_{\text{recon}}\)。两者共用一份合同——ELBO——通过梯度下降端到端联合优化。

具体到损失函数,我们把 ELBO 取负号变成“要最小化的代价”:负重构项 + KL 散度。重构项用 MSE 或交叉熵实现,KL 项在高斯假设下可以解析计算。一个常见的细节是训练时逐项含义:重构项在推动解码器尽量还原输入,KL 项在约束编码器不要输出离谱的潜变量分布。

片场运转正常后,你可能想问:这种“交替调整替身与剧本”的思路,和经典 EM 算法有什么渊源?答案是——它们根本就是一家人。

Loss=−ELBO=−Eqϕ(z∣x)[log⁡pθ(x∣z)]+KL(qϕ(z∣x) ∥ p(z))\displaystyle \text{Loss}=-ELBO=-\mathbb{E}_{q_{\phi}(z|x)}[\log p_{\theta}(x|z)]+KL\big(q_{\phi}(z|x)\,\|\,p(z)\big)
VAE 的损失函数就是负 ELBO:前半项逼解码器还原数据,后半项逼编码器靠近先验。
  1. 负重构项\(-\mathbb{E}_q[\log p_{\theta}(x|z)]\) 鼓励解码器把潜变量还原成观测数据,还原越准损失越小。
    −Eqϕ(z∣x)[log⁡pθ(x∣z)]\displaystyle -\mathbb{E}_{q_{\phi}(z|x)}[\log p_{\theta}(x|z)]
  2. KL 惩罚\(+KL(q\|p(z))\) 防止隐变量分布过度偏离标准高斯先验,起正则作用。
    KL(qϕ(z∣x) ∥ p(z))\displaystyle KL\big(q_{\phi}(z|x)\,\|\,p(z)\big)
  3. 联合优化编码器参数 \(\phi\) 和解码器参数 \(\theta\) 同时被梯度更新,整个系统像一个双人签约团队。
    ∇ϕ,θ Loss\displaystyle \nabla_{\phi,\theta}\,\text{Loss}

8. ELBO与EM关联:一个目标,两种调法

老式片场讲究“一板一眼”地推进:先把一段戏打磨到极致(E 步:固定模型参数,求出最优替身分布 \(q\)),再根据这段戏改剧本、定档期(M 步:固定替身分布,优化生成参数 \(\theta\))。两步骤交替进行,每轮都让 ELBO 上升,最终收敛到局部最优——这就是EM 算法(期望最大化)。

VAE 的片场则用了更现代的调法:不用显式地解出最优 \(q\),而是让编码器网络去参数化替身,并用梯度下降同时更新两组参数。两者最大化的是同一个目标 \(\mathcal{L}(q,\theta)\),区别只在于优化方式:EM 做坐标上升,VAE 做随机梯度上升。

现在你应该能看清整条故事线:真实的影星(后验)请不起,我们签替身(\(q\));总票房(证据)是固定常数;替身表现分(ELBO)永远低于总票房;表现分越高,差距分(KL)越少;为了让导演能指挥替身,我们把随机性装进外置骰子(重参数化);多演几场取均值(MC);最后让选角导演与替身教练签约联训(VAE)。这套框架还能看穿 EM 的老底——ELBO 是它们共同的信仰。

E 步: q(t)(z)=p(z∣x;θ(t)),M 步: θ(t+1)=arg⁡max⁡θEq(t)(z)[log⁡pθ(x,z)]\displaystyle \text{E 步: } q^{(t)}(z)=p(z|x;\theta^{(t)}),\qquad \text{M 步: } \theta^{(t+1)}=\arg\max_{\theta}\mathbb{E}_{q^{(t)}(z)}\big[\log p_{\theta}(x,z)\big]
EM 与 VAE 是 ELBO 这座大厦的两扇门:前者交替优化,后者端到端梯度优化。理解这一点,你就掌握了变分推断与生成模型的共同源头。
  1. E 步固定当前参数 \(\theta^{(t)}\),把替身调到理论最优——即真实后验 \(p(z|x)\)。
    q(t)(z)=p(z∣x;θ(t))\displaystyle q^{(t)}(z)=p(z|x;\theta^{(t)})
  2. M 步固定替身 \(q^{(t)}\),更新生成参数,使完整对数似然的期望最大化。
    θ(t+1)=arg⁡max⁡θEq(t)(z)[log⁡pθ(x,z)]\displaystyle \theta^{(t+1)}=\arg\max_{\theta}\mathbb{E}_{q^{(t)}(z)}[\log p_{\theta}(x,z)]
  3. 单调上升两步交替保证了 ELBO 每轮不降,最终逼近证据 \(\log p(x)\) 的局部最优。
    L(q(t+1),θ(t+1))≥L(q(t),θ(t))\displaystyle \mathcal{L}(q^{(t+1)},\theta^{(t+1)})\ge \mathcal{L}(q^{(t)},\theta^{(t)})

AI 应用场景

场景一:工业质检中的无监督异常检测

阶段:模型推理与评估

解决的问题:工业缺陷样本极其稀少,传统监督分类难以覆盖所有未知缺陷类型。VAE 用 ELBO 中的重构项作为异常分数:正常样本“替身演得像”,重构误差小;异常样本“替身没见过”,重构误差急剧增大。无需一张缺陷标签即可完成检测。

具体案例:某面板厂商在 5 万张正常 LCD 面板图像上训练 VAE,用每张测试图的负 ELBO 作为异常分,设定阈值后对划痕、脏污、偏色三类缺陷的检出率从传统方法的 78% 提升到 94%,且能发现训练集中从未出现过的缺陷类型。

场景二:推荐系统中的用户隐表示学习

阶段:特征表示学习

解决的问题:用户行为数据高维稀疏,传统协同过滤的点估计无法表达“用户兴趣的不确定性”。VAE 把用户行为序列 \(x\) 编码成隐兴趣分布 \(q(z|x)\),用 ELBO 的重构项预测行为,用 KL 正则项防止过拟合,让推荐结果既准确又多样。

具体案例:某视频平台借鉴 Multi-VAE 思路,将用户完播、点赞、分享行为编码为 64 维隐向量,ELBO 损失参与召回排序,离线 AUC 提升 3.2%,线上人均观看时长提升 1.8%。

场景三:可控图像生成与人脸属性编辑

阶段:生成与采样

解决的问题:GAN 训练不稳定且缺少编码器,难以在隐空间做语义编辑。VAE 的重参数化技巧保证采样梯度可导,训练稳定;ELBO 的 KL 正则让隐空间各维度解耦,使得“改某一维就能改某个属性”成为可能。

具体案例:人脸编辑应用在人脸数据集上训练 VAE,将 512 维隐向量按属性方向做插值,实现微笑、年龄、发型等属性的连续平滑编辑;生成图像通过解码器输出后,再附加一个轻量判别器提升清晰度,形成 VAE-GAN 混合架构。

Python 演示

python47 行
import torchimport torch.nn as nn torch.manual_seed(0) # 生成八个簇的二维数据,代表八种"隐藏情绪"x_data = torch.cat([    torch.randn(200, 2) + torch.tensor([a, b])    for a, b in [(2, 2), (-2, 2), (2, -2), (-2, -2),                 (0, 3), (3, 0), (-3, 0), (0, -3)]]) # 编码器(选角导演):观测 x -> 潜变量的均值与方差encoder = nn.Sequential(nn.Linear(2, 32), nn.ReLU(), nn.Linear(32, 4))# 解码器(替身教练):潜变量 z -> 重构观测 xdecoder = nn.Sequential(nn.Linear(2, 32), nn.ReLU(), nn.Linear(32, 2)) def encode(x):    h = encoder(x)    mu, log_var = h[:, :2], h[:, 2:]    return mu, log_var def decode(z):    return decoder(z) def elbo(x):    mu, log_var = encode(x)    # 重参数化:外置骰子 eps    eps = torch.randn_like(mu)    z = mu + torch.exp(0.5 * log_var) * eps    x_hat = decode(z)    # 重构项(高斯似然对数)    recon = -((x - x_hat) ** 2).sum(dim=1)    # KL 正则项(标准高斯先验的解析解)    kl = 0.5 * (log_var.exp() + mu ** 2 - 1 - log_var).sum(dim=1)    return (recon - kl).mean() optimizer = torch.optim.Adam(    list(encoder.parameters()) + list(decoder.parameters()), lr=1e-3) for step in range(500):    loss = -elbo(x_data)   # 负 ELBO 作为损失    optimizer.zero_grad()    loss.backward()    optimizer.step()    if step % 100 == 0:        print(f"step {step:3d} | ELBO = {-loss.item():.3f}")
目的:在二维合成数据上训练一个极简 VAE,完整演示 ELBO 的前向计算、重参数化采样与反向传播训练过程。
  1. eps = torch.randn_like(mu)生成与参数无关的外置骰子,让后续采样可导。
  2. z = mu + torch.exp(0.5 * log_var) * eps重参数化:均值基准加上按方差缩放的噪声。
  3. recon = -((x - x_hat) ** 2).sum(dim=1)重构项,衡量替身演出的画面离原片有多近。
  4. kl = 0.5 * (log_var.exp() + mu ** 2 - 1 - log_var).sum(dim=1)与标准高斯先验的 KL 散度解析公式,无需采样。
  5. loss = -elbo(x_data)把 ELBO 取负变成要最小化的损失函数。
  6. optimizer.step()用 SGD 家族算法同时更新“选角导演”和“替身教练”的参数。
  7. print(f"step ... ELBO = ...")每百步打印一次替身表现分,观察 ELBO 稳步上升。

常见误区

误区我训练好 VAE 之后,ELBO 就是 \(log p(x)\) 的近似,拿来当模型的证据汇报准没错。

正解ELBO 只是 \(\log p(x)\) 的下界,不是近似。二者之间隔着一个非负的 KL 散度:\(\log p(x) = ELBO + KL(q\|p(z|x))\)。只有当替身与本尊完全重合(KL 为 0)时,ELBO 才恰好等于证据。实际训练中 KL 几乎不可能归零,所以 ELBO 总是低于证据。

为何常见:大家习惯把“下界”理解为“不精确的近似值”,但数学上下界是保证方向的不等式,近似是误差可控的估计,两者完全不是一回事。

误区VAE 损失函数里那个 KL 项,就是防止过拟合的 L2 正则化,权重随便调调就好。

正解KL 项有明确的概率意义:它约束编码器输出的分布贴近先验 \(p(z)\),直接影响隐空间的几何结构。把它当 L2 正则对待、随意加大权重,会让隐变量丧失信息,导致重构模糊;权重太小又会让隐空间发散、采样失效。KL 项的系数本质上对应 \(\beta\)-VAE 对“信息瓶颈”的调节。

为何常见:从形式上看,KL 项确实有“惩罚偏离默认值”的效果,和 L2 正则很像,这种表面相似最容易误导人。

误区采样不可导是工程小问题,重参数化就是聪明人想出的一个绕弯 trick,没什么理论意义。

正解重参数化在理论上是随机梯度估计的方差缩减方法。它把随机性从参数依赖的分布中“解耦”出来,得到的是比朴素 score-function 估计方差更小的无偏梯度。这个思想还延伸到了流模型、扩散模型和强化学习的随机策略中。

为何常见:因为重参数化的表达式太简单(就是 \(z=\mu+\sigma\varepsilon\)),看起来像补丁;但它的本质是“重新参数化随机变量”这一通用统计技术。

误区MC 估计样本越多越准,所以 VAE 训练时每个数据点应该采样几十次再算梯度。

正解VAE 训练的目标是“期望 ELBO”,而每个 batch 本身就有几十上百个样本。当 batch 足够大时,批内样本已经起到了平均作用,单样本采样(\(L=1\))在计算效率上远优于大 \(L\),且大量实验证明 \(L=1\) 的下界估计收敛很好。真正需要多采样的是训练后评估或低 batch 场景。

为何常见:直觉上“样本越多越好”完全正确,但没意识到 batch 维度本身就是天然的样本维度。

误区EM 是经典统计学的老古董,VAE 是深度学习的现代产物,两者各干各的,没有关系。

正解EM 和 VAE 最大化的是同一个目标 \(\mathcal{L}(q,\theta)\)。EM 用坐标上升交替优化 \(q\) 和 \(\theta\),且要求 E 步能精确求出后验;VAE 用神经网络参数化 \(q\),用梯度下降同时优化两组参数。VAE 可以理解为“在连续潜空间、复杂似然条件下对 EM 的参数化放松”。

为何常见:EM 的教学通常用高斯混合模型,VAE 的教学通常用神经网络,表面场景差异太大,掩盖了底层公式的同一性。

面试题

Q1. 关于 ELBO 与对数证据 \(\log p(x)\) 的关系,下列说法正确的是?

单选题 · easy

  • A.ELBO 是 \(\log p(x)\) 的上界
  • B.ELBO 恒等于 \(\log p(x)\)
  • C.ELBO 是 \(\log p(x)\) 的下界← 正确答案
  • D.ELBO 与 \(\log p(x)\) 没有关系

答案:C。琴生不等式直接给出 \(\log p(x)\ge \mathcal{L}(q)\),所以 ELBO 是证据的对数下界。只有替身与本尊完全重合时等式才成立,C 正确。A 方向反了,B 只在理想情况下成立,D 与推导矛盾。

Q2. 琴生不等式在 ELBO 推导中要求 \(\log\) 函数具有什么性质?

单选题 · easy

  • A.\(\log\) 是凸函数
  • B.\(\log\) 是凹函数← 正确答案
  • C.\(\log\) 只需连续
  • D.\(\log\) 必须是单调递增

答案:B。琴生不等式对凹函数给出“期望的函数值 ≥ 函数值的期望”。\(\log\) 是凹函数,所以 \(\log\mathbb{E}[\cdot]\ge\mathbb{E}[\log(\cdot)]\),这正是 ELBO 下界的来源。如果函数是凸的,不等式方向会反过来。

Q3. 最大化 ELBO 对真实后验 \(p(z|x)\) 的影响是什么?

单选题 · mid

  • A.可以直接算出后验的精确值
  • B.等价于最小化 \(KL(q\|p(z|x))\)← 正确答案
  • C.能让近似误差完全归零
  • D.必须转而求解 EM 问题

答案:B。因为 \(\log p(x)\) 是常数,最大化 ELBO 等价于压缩它与证据之间的缝隙,即最小化 \(KL(q\|p(z|x))\)。B 正确。A 和 C 都忽略了近似分布族的表达能力限制,D 把优化方法当成了必要条件。

Q4. 重参数化技巧解决的核心问题是什么?

单选题 · mid

  • A.让先验分布可以直接求积分
  • B.让采样操作可对模型参数求导← 正确答案
  • C.让 KL 散度可以闭式求解
  • D.让编码器不再需要输出方差

答案:B。从 \(q(z|x)\) 中采样得到的 \(z\) 本身不可导,梯度无法穿过随机节点。重参数化把采样写成 \(z=\mu+\sigma\varepsilon\),随机性转移到外置噪声 \(\varepsilon\) 上,梯度可以正常回传。KL 散度本来就能解析计算,与重参数化无关。

Q5. 在重参数化公式 \(z=\mu+\sigma\varepsilon\) 中,\(\varepsilon\) 的作用是什么?

单选题 · mid

  • A.保存模型的全部参数
  • B.引入与参数无关的随机性← 正确答案
  • C.替代 KL 散度的计算
  • D.直接缩小重构误差

答案:B。\(\varepsilon\) 是从标准正态分布采样的外置噪声,它不依赖任何模型参数,保证了采样仍有随机性但梯度却能穿过确定性部分。B 正确。A、C、D 都与 \(\varepsilon\) 的实际功能不符。

Q6. ELBO 分解后包含哪两类目标?

单选题 · mid

  • A.重构项与 KL 正则项← 正确答案
  • B.先验项与归一化项
  • C.似然项与解码项
  • D.误差项与偏差项

答案:A。\(\mathcal{L}=\mathbb{E}_q[\log p(x|z)]-KL(q\|p(z))\),前一项要求解码器还原观测数据,后一项约束编码器贴近先验。A 正确。其他选项都是干扰项。

Q7. Monte Carlo 估计在 VAE 训练中常取单样本,原因是什么?

单选题 · mid

  • A.单样本无偏,批内样本并行等价于多采样← 正确答案
  • B.多样本一定会导致训练发散
  • C.单样本估计的方差为零
  • D.样本越多模型效果越差

答案:A。MC 估计天然无偏,增加样本只是降低方差。而训练时一个 batch 本身包含几十个样本,已经起到了均值作用,单样本在计算上更划算。A 正确,B、C、D 均违背统计常识。

Q8. 当近似分布族足够灵活且最优解可达时,ELBO 与 \(\log p(x)\) 的关系是?

单选题 · hard

  • A.ELBO 严格小于 \(\log p(x)\)
  • B.ELBO 恰好等于 \(\log p(x)\)← 正确答案
  • C.ELBO 严格大于 \(\log p(x)\)
  • D.两者大小无法比较

答案:B。当 \(q\) 家族包含真实后验 \(p(z|x)\) 时,KL 散度可以取到 0,此时 \(\log p(x)=ELBO+0\),等式成立。这说明 ELBO 的“紧度”完全取决于近似分布族的表达能力,B 正确。

Q9. 关于 EM 算法与 VAE 训练的关系,正确的是?

单选题 · hard

  • A.两者优化的目标函数完全不同
  • B.EM 是坐标上升 ELBO,VAE 是梯度上升 ELBO← 正确答案
  • C.EM 不需要引入任何近似分布
  • D.VAE 是 EM 在潜空间上的严格特例

答案:B。EM 的 E 步求最优 \(q\)、M 步优化 \(\theta\),本质是对 ELBO 做坐标上升;VAE 则用神经网络参数化 \(q\) 并同时梯度上升。两者目标都是 ELBO。D 过于绝对,VAE 是参数化的广义 EM 变体。

Q10. 关于 VAE 训练中 ELBO 分解两项的说法,正确的有?

多选题 · extreme

  • A.重构项鼓励解码器还原可观测数据← 正确答案
  • B.KL 项防止隐变量分布漂离先验← 正确答案
  • C.两个目标之间存在潜在竞争← 正确答案
  • D.增大 KL 项权重总能提升重构效果

答案:ABC。重构项和 KL 项分别管“还原度”与“贴近先验”,二者对隐空间的要求相反,确实存在竞争关系,A、B、C 正确。D 错误:过分强调 KL 会让隐变量丢失观测信息,导致重构模糊,这正是 \(\beta\)-VAE 中信息瓶颈的权衡。