Class 3 - Variational Inference, VI

1. Variational Inference

1.1. 基本思想

首先,贝叶斯定理(Bayes' Theorem)的SOP如下: $$p(\theta|y)=\frac{p(y|\theta)p(\theta)}{\int p(y|\theta)p(\theta)d\theta}=\frac{p(y|\theta)p(\theta)}{p(y)}$$ $p(y)=\int p(y|\theta)p(\theta)d\theta$ 这个分母被称为“证据” (Evidence) 或“边际似然” 。

这个公式里的 $∫…dθ$ 是一个积分,而且是针对 所有 参数 $θ$ 的积分。在简单的模型(比如一两个参数)中,这个积分可能可以手算出来。但在“许多有趣的模型”中(比如深度神经网络),参数 $θ$ 的维度可以高达数百万、数十亿。在一个几十亿维的空间上做积分,这在计算上是完全不可行的(这就是所谓的“维度灾难”)。

因此,我们无法计算出一个归一化的常数 $p(y)$。如果我们不知道这个分母,我们就无法精确计算出完整的后验分布 $p(θ∣y)$。

  1. 替代方案(一):采样

既然无法精确计算(解析解),我们能不能用近似的方法?

“随机近似方法” (Stochastic approximation approaches),在实践中,这通常指的是“采样方法” (sampling methods)**。

  • 这类方法中最著名的是 MCMC (Markov Chain Monte Carlo, 马尔可夫链蒙特卡洛)
  • MCMC 的思想是:我们不直接 计算 $p(θ∣y)$ 的数学公式,而是设计一个巧妙的随机过程,从这个后验分布中 抽取样本。
  • 比如,我们抽取 10000 个 $θ$ 的样本。这些样本的分布会逐渐收敛到真实的后验分布。
  • 优点: 只要有无限的计算资源(即运行时间足够长),它们可以提供“几乎精确”(渐近无偏和一致)的结果。它们是近似推断的“黄金标准”。
  • 缺点: 在实践中,它们“计算量非常大” 。MCMC 链可能需要很长时间才能收敛,特别是是在高维空间中,采样效率可能很低。

变分推断的核心思想,是用一个更简单的、可处理的 分布族 $q(\theta|\nu)$,来近似那个我们算不出来的、棘手的后验分布 $p(\theta|y)$

这个简单的分布 $q$ 有它自己的一组参数,称为“变分参数” $ν$。我们要做的就是,找到一组最好的变分参数 $ν$,使得我们的 $q$ 分布尽可能地“接近”我们感兴趣的后验分布 $p$。

一旦我们通过优化找到了这组最好的参数 $ν^∗$(比如最优的均值 $μ^∗$ 和方差 $σ^{∗2}$),我们就使用这个带有“拟合好”的参数的 $q(θ∣ν^∗)$,来作为 $p(θ∣y)$ 的“代理”

因此,VI 是一种“用简单换复杂”的近似策略。它放弃了追求“完美但算不出”的真实后验 $p(θ∣y)$,而是主动选择一个“简单且可控”的近似分布 $q(θ∣ν)$,然后通过优化 $ν$ 来让 $q$ 尽可能地模仿 $p$,最后用这个 $q$ 作为 $p$ 的替身去执行所有后续任务。

1.2. Kullback-Leibler (KL) 散度

KL 散度是用来衡量两个分布 $P$ 和 $Q$ 之间“差异性”或“不相似性”的一种方法。这个公式有两种写法,但含义相同: $$KL(P||Q)=\int p(x)\log\left(\frac{p(x)}{q(x)}\right)dx=E_{x\sim p}\left[\log\frac{p(x)}{q(x)}\right]$$ $p(x)$ 和 $q(x)$ 分别是 $P$ 和 $Q$ 的概率密度函数。

  • 写法一(积分): $∫p(x)log(…)dx$
  • 写法二(期望): $E_{x\sim p}[\ldots]$

第二种写法 $E_{x\sim p}[\ldots]$ 其实就是积分的简写。它非常清楚地告诉我们 KL 散度在计算什么:

  • 核心是 $\log\left(\frac{p(x)}{q(x)}\right)$:这是在 $x$ 这一点上,两个分布概率密度的“对数比率”。
    • 如果 $q(x)$ 完美近似 $p(x)$,那么 $p(x)=q(x)$,比率为 1,$log(1)=0$。
    • 如果 $q(x)$ 低估了 $p(x)$,比率大于 1,log 值为正。
    • 如果 $q(x)$ 高估了 $p(x)$,比率小于 1,log 值为负。
  • 期望是 $E_{x\sim p}[\ldots]$:我们计算这个“对数比率”的期望值(或加权平均值)。权重就是 $P$ 分布本身,即 $p(x)$。
    • 这意味着,KL 散度重点关注的是 $P$ 分布有高概率($p(x)$ 很大)的区域。如果在这些重要区域 $q(x)$ 的近似很差(导致比率远离1),KL 散度就会变得很大。

一个非常经典的信息论解释:

  • “当真实分布是 $P$ 时,使用 $Q$ 作为模型所带来的‘预期额外惊讶程度’”
  • 在信息论中,“惊讶程度” (Surprise) 被定义为 $−log(probability)$。一个事件的概率越低,发生时你就越“惊讶”。
  • 真实(最小)的平均惊讶度: 如果我们知道真实分布是 $P$,那么我们平均的“惊讶程度”(即“熵”)是 $E_{x\sim p}[-\log p(x)]$。
  • 使用 $Q$ 时的平均惊讶度: 如果我们 错误地 以为分布是 $Q$,但数据 实际上 仍然来自 $P$,那么我们感受到的平均“惊讶程度”(即“交叉熵”)是 $E_{x\sim p}[-\log q(x)]$。
  • “额外”的惊讶度 (KL 散度): $$KL(P||Q)=(\text{用 }\mathbb{Q}\text{ 时的惊讶度})-(\text{用 P 时的惊讶度})$$ $$KL(P||Q)=E_{x\sim p}[-\log q(x)]-E_{x\sim p}[-\log p(x)]$$ $$KL(P||Q)=E_{x\sim p}[\log p(x)-\log q(x)]$$ $$KL(P||Q)=E_{x\sim p}\left[\log\frac{p(x)}{q(x)}\right]$$ 因此,KL 散度就是我们用 $Q$ 替代 $P$ 所付出的“信息损失”或“额外惊讶”的代价。

KL 散度有几个重要性质:

  • 非负性: $KL(P∣∣Q)≥0$ (吉布斯不等式)。
  • $KL(P∣∣Q)=0$ 当且仅当 $P$ 和 $Q$ 是完全相同的分布。
  • 不对称性 (Asymmetry): $KL(P||Q)\neq KL(Q||P)$

在数学上,“距离”必须是对称的(比如 A 到 B 的距离等于 B 到 A 的距离)。KL 散度不满足这一点,所以它不叫“KL 距离”,而叫“KL 散度”。

1.3. 前向 KL 散度 (Forward KL divergence)

$KL(P∣∣Q)$ 的公式,这也被称为“前向 KL”: $$KL(P||Q)=\int p(x)\log\left(\frac{p(x)}{q(x)}\right)dx=E_{x\sim p}\left[\log\frac{p(x)}{q(x)}\right]$$ 这里的关键是期望 $E_{x\sim p}[\ldots]$,它由真实分布 $P$ 来主导。这意味着,我们最关心的是 $p(x)$ 概率高的区域。这种 KL 散度具有“寻求均值” (Mean-seeking) 的行为。

(1) 惩罚机制:

  • $KL(P∣∣Q)$ 会“严厉惩罚” Q 分布的“遗漏”。
  • 如果在一个地方,真实概率 p(x)>0(即这个事件可能发生),但我们的近似分布 $q(x)$ 却很小或为 0(即我们的模型说这不可能发生),那么 $\log\frac{p(x)}{q(x)}$ 这一项将会趋向于正无穷大
  • 只要有任何一个 $P$ 能取到的地方被 $Q$ 遗漏了,KL 散度就会“爆炸”。

(2) Q 的应对策略:

  • 为了最小化 $KL(P∣∣Q)$ 并避免这种无限大的惩罚,$Q$ 必须“不惜一切代价”避免遗漏。
  • $Q$ 必须在 所有 $P$ 具有高密度(高概率)的区域都分配显著的概率。
  • 这样做的代价是,$Q$ 可能会变得“过于宽泛” (overly broad),被迫去覆盖那些 $P$ 概率很低的“无人区”。

(3) 多峰分布的例子:

  • 想象一下,真实的 P 分布是一个“双峰骆驼”(一个多峰, multimodal 分布)。
  • 此时,如果我们试图用一个简单的 $Q$(比如单峰的高斯分布)来最小化 $KL(P∣∣Q)$,会发生什么?
  • $Q$ 不能只选择其中一个峰。如果它只拟合了左边的峰,那么 Q 在右边峰的概率 $q(x)$ 就会接近 0。由于右边峰的 $p(x)>0$,KL 散度会爆炸。
  • 因此,$Q$ 唯一的办法就是“拉宽”自己,把整个身体横跨在两个山峰上,让自己“散开” (spreading out)。
  • 最终 $Q$ 的均值会落在两个峰值的“均值”附近,但它会变得非常胖(方差很大),以确保两个峰都被覆盖。这就是“寻求均值”的由来。

这种行为更直观地称为 “zero-avoiding”(避免零概率)。$Q$ 会尽力避免在 $P$ 非零的地方变成零。这种前向 KL 散度在变分推断(VI)中并不常用。向 KL 更多地用在一些需要“覆盖”数据分布的场合,比如期望最大化 (EM) 算法的 $M$ 就是在最小化一个前向 KL。

1.4. 反向 KL 散度 (Reverse KL divergence)

反向 KL 散度的公式如下: $$KL(Q||P)=\int q(x)\log\left(\frac{q(x)}{p(x)}\right)dx=E_x\sim q\left[\log\frac{q(x)}{p(x)}\right]$$ KL 散度的大小是由我们选择的近似分布 $Q$ 来主导的。我们只关心 $Q$ 分布概率高的区域。这种 KL 散度具有“寻求模式” (Mode-seeking) 的行为。这意味着 $Q$ 会主动去寻找 $P$ 分布中概率密度最高的“峰值”(Mode)。

(1) 惩罚机制:

  • $KL(Q∣∣P)$ 会“严厉惩罚” $Q$ 分布的““溢出”。
  • 如果在一个地方,我们的近似 $q(x)>0$(即我们的模型说“这里有东西”),但真实分布 $p(x)≈0$(即真实情况是“这里是无人区”),那么 $\log\frac{q(x)}{p(x)}$ 这一项将会变得“非常大”(趋向正无穷)。
  • 只要 Q“溢出”到了任何 P 的“无人区”,KL 散度就会“爆炸”。

(2) Q 的应对策略:

  • 为了最小化 $KL(Q∣∣P)$ 并避免这种无限大的惩罚,$Q$ 必须变得非常“谨慎”。
  • $Q$ 被迫去“躲避” $P$ 分布中概率小的区域。它必须确保自己只存在于 $P$ 也认为“合理”的区域。

(3) 多峰分布的例子:

  • 这就是最关键的区别。再次想象 $P$ 是一个“双峰骆驼”(多峰, multimodal 分布)。
  • 此时,如果我们试图用一个简单的 $Q$(比如单峰的高斯分布)来最小化 $KL(Q∣∣P)$:
  • $Q$ 绝对不能像前向 KL 那样“拉宽”自己去覆盖两个峰。
  • 因为如果 $Q$ 拉宽,它必然会“溢出”到两个山峰之间的“山谷”里。在山谷里,$p(x)≈0$,这会导致 KL 散度爆炸。
  • $Q$ 唯一的办法是“二选一”:它必须只选择其中一个山峰(模式),然后用自己全部的概率质量去紧紧地拟合那一个峰。
  • 这样,$Q$ 就完美地避开了所有 $p(x)≈0$ 的区域,KL 散度会很低。

VI 是“乐观”的: 由于 VI 最小化 $KL(Q∣∣P)$,它会表现出“模式寻求”的行为。如果一个模型的真实后验分布 $p(θ∣y)$ 非常复杂,有多个“同样好”的解(多个模式),那么 VI 通常只会找到其中一个解,并错误地认为这就是全部的答案。

VI 常常会低估不确定性。它找到的 $q$ 分布(比如一个很窄的高斯)会比真实的 $p$ 分布“更自信”(方差更小),因为它忽略了其他可能的解。但是它通常能很快地“锁定”到一个好的解(一个峰值)。

![[Pasted image 20250918165457.png]]

1.5. 困难

直到现在,我们明确了我们的任务:

  1. 约束 (Restrict): 我们不寻找任意的 $q(θ)$,而是将其约束在一个特定的、简单的分布族 $q(θ∣v)$ 中(比如,所有的高斯分布)。
  2. 目标 (Target): 找到一组最优的变分参数 $ν^∗$,这组参数能让 $q(θ∣v)$ 与那个我们算不出来的真实后验 $p(θ∣y)$之间的 KL 散度最小化

用数学公式表达出来,就是: $$\nu^*=\arg\min_\nu KL(q(\theta|v)||p(\theta|y))$$ 把 KL 散度的定义(即反向 KL)代入,就得到: $$=\arg\min_\nu\int q(\theta|v)\log\left(\frac{q(\theta|v)}{p(\theta|y)}\right)d\theta$$

  • $arg~minν$​ 这个符号的意思是:“找到那个能让后面表达式最小化的参数 $ν$”。
  • 这正式确认了 VI 是一个优化问题。我们的“抓手”或“旋钮”就是 $ν$。
  • 这也正式确认了 VI 使用的是反向 KL ($KL(Q∣∣P)$),因此,VI 将具有“模式寻求”(mode-seeking)的行为。

现在,我们有了一个清晰的优化目标,但注意,归一化的后验 $p(θ∣y)$ 本身是难以计算的,所以我们如何优化一个我们无法计算的目标函数

1.6. 杰森不等式 (Jensen's Inequality)

杰森不等式的正式定义:

如果 X 是一个随机变量,并且 $ψ$  是一个凸函数,那么:$\psi(E[X])\leq E[\psi(X)]$,即对于凸函数,“函数值的平均” ≥ “平均值的函数值”。

![[Pasted image 20250918170455.png]]

对于凹函数 $g$,杰森不等式的方向是相反的:$g(E[X])\geq E[g(X)]$

我们可以使用这个不等式: $$log\mathrm{~}p(y)=log\int p(y,\theta)d\theta$$ 在积分内部同时乘以和除以 $q(θ)$: $$=log\int q(\theta)\frac{p(y,\theta)}{q(\theta)}d\theta$$ 改写为期望,因为这个积分 $\int q(\theta)[\ldots]d\theta$ 正是 $[…]$ 这一项在 $q(θ)$ 分布下的期望 $E_q​$: $$=logE_q\left[\frac{p(y,\theta)}{q(\theta)}\right]$$ 应用杰森不等式: 我们有 $log(E[X])$ 这样的形式,log 函数是一个凹函数。根据杰森不等式,对于凹函数 $g(E[X])≥E[g(X)]$。因此,我们可以把 log 移到期望 $E_q$​ 的内部,但代价是等号必须变成大于等于号: $$\geq E_q\left[\log\left(\frac{p(y,\theta)}{q(\theta)}\right)\right]$$ 我们记不等号为 $\mathcal{L}(q)$ ,则有 $log\left.p(y)\right.\geq\mathcal{L}(q)$ ,这证明了 $\mathcal{L}(q)$ 永远小于或等于 $log~p(y)$,所以它是一个“下界”。同时也有另一种写法: $$\mathcal{L}(q)=E_q[\log p(y,\theta)]-E_q[\log q(\theta)]$$ 观察这个公式,它只依赖于:

  1. $p(y,θ)$:联合概率 $p(y∣θ)p(θ)$(似然 x 先验)。这是我们已知的
  2. $q(θ)$:我们的近似分布。这是我们自己选的

我们也可以通过代入 $p(y,θ)=p(θ∣y)p(y)$ 来变换 $\mathcal{L}(q)$ $$\mathcal{L}(q)=\int q(\theta)\log\left(\frac{p(\theta|y)p(y)}{q(\theta)}\right)d\theta$$ $$=\int q(\theta)\log\left(\frac{p(\theta|y)}{q(\theta)}\right)d\theta+\int q(\theta)\log p(y)d\theta$$ 第一项:$\int q(\theta)\log\left(\frac{p(\theta|y)}{q(\theta)}\right)d\theta$ ,这正好是 $−KL(q(θ)∣∣p(θ∣y))$ (即负的反向 KL 散度)。

第二项:$\int q(\theta)\log p(y)d\theta$ ,$log~p(y)$ 是一个常数(与 $θ$ 无关),可以提出来。剩下 $∫q(θ)dθ$,任何概率分布的积分都是 1。所以第二项就是 $log~p(y)$。

1.7. 证据下界 (ELBO)

从上一节我们可以得到一个核心恒等式 $$\log p(y)=\mathcal{L}(q)+KL(q(\theta)||p(\theta|y))$$ 让我们拆解它的三个部分:

  • $\log~p(y)$ (证据): 这是我们真正关心、但无法计算的常数
  • $L(q)$ (ELBO): 这是我们可以计算和优化的变量
  • $KL(q(θ)∣∣p(θ∣y))$ (KL 散度): 这是 $q$ 和 $p$ 之间的“差距”,是一个变量

从这个恒等式出发,因为 KL 散度有一个重要性质,即 $KL(…)≥0$(它永远是非负的),所以 $L(q)$ 永远不可能超过 $log~p(y)$。这就得到了 第一个结论:$log~p(y)≥L(q)$。ELBO ($L(q)$) 是对数证据 $log~p(y)$ 的“下界” 。

KL 散度就是 $log~p(y)$ 和 $L(q)$ 之间的“差距”。当这个“差距”,即 KL 散度为 0 时,意味着我们的近似 $q(θ)$ 与真实后验 $p(θ∣y)$ 完全相等。此时,$L(q)=log~p(y)$,这个下界是“紧的”。

又因为 $log~p(y)$ 是一个常数,根据恒等关系,有最小化 KL 散度 $KL(q∣∣p)$ 在数学上等价于 最大化 ELBO $L(q)$

我们原来的目标是 $\min KL(q||p)$ ,这是很难的,因为它依赖于 $p(θ∣y)$。但是改变之后转换成了 $\max\mathcal{L}(q)$ ,这是不难的,因为 $\mathcal{L}(q)=E_q[\log p(y,\theta)]-E_q[\log q(\theta)]$ ,因为它只依赖于 $p(y,θ)$(联合概率)和 $q(θ)$(我们的近似),这两者都是已知的。

通过引入 ELBO,我们把一个“无法计算的最小化问题”转化成了一个“可以计算的最大化问题”。我们通过不断调整 $q$ 的参数 $v$ 来最大化 $L(q)$,当我们把 $L(q)$ 推得越高时,那个看不见的“差距” $KL(q∣∣p)$ 就会被压缩得越小。

1.8. 变分推断(VI)的三步流程

第一步:选择 (Choose)

  • 选择一个变分分布族 $q(θ∣v)$ 来近似我们无法计算的真实后验 $p(θ∣y)$
    • 这是一个模型设计步骤。这个选择决定了你的近似能力和计算效率。
    • 常见的选择:
      1. 参数形式: 最简单的,假设 $q$ 属于一个我们熟知的分布族,比如高斯分布 $N(θ∣μ,Σ)$。在这种情况下,变分参数 $ν$ 就是均值 $μ 和协方差矩阵 $Σ$。
      2. 平均场 (Mean-Field): 这是一个更强的假设,我们假设 $θ$ 中的所有参数都是相互独立的。即 $q(\theta_1,\theta_2,...,\theta_D)=q_1(\theta_1)q_2(\theta_2)...q_D(\theta_D)$。
    • $q$ 选得越简单(比如平均场),计算就越快,但它与真实 $p$ 的差距(KL 散度)可能就越大。

第二步:计算 (Calculate)

  • 写出 ELBO 的公式,并计算它的两个期望项
  • 我们已经知道 ELBO $\mathcal{L}(q)=E_q[\log p(y,\theta)]-E_q[\log q(\theta|v)]$。
  • 所以,我们需要计算这两个部分:
    1. $E_q[\log p(y,\theta)]$:在我们的近似 $q$ 下,“数据和参数的联合概率”的期望。
    2. $E_q[\log q(\theta|v)]$:这是近似分布 $q$ 自身的对数概率的期望。
    • 这两项有非常直观的意义:
    • $E_q[\log p(y,\theta)]$这一项鼓励 $q$ 去找到那些能够很好地解释观测数据 $y$ 的参数 $θ$。
    • $-E_q[\log q(\theta|v)]$ 这一项是 $q$ 分布的信息熵。最大化 ELBO 意味着最大化这一项,即最大化 $q$ 的熵。这是一个正则项,它鼓励 $q$ 的分布尽可能“散开”,防止 $q$“过拟合”到某一个点上(即方差变得极小)。
    • VI 的目标就是在“拟合数据”和“保持不确定性”之间找到平衡。

第三步:最大化 (Maximize)

  • 通过调整变分参数 $ν$,来最大化 ELBO(即最大化第一项和第二项的差值)。
  • 我们的目标是找到最优的 $ν^∗$,它使得 $L(q)$ 达到最大值。
  • 一旦找到了 $ν^∗$,我们的任务就完成了。这个 $q(θ∣ν^∗)$ 就是我们对真实后验 $p(θ∣y)$ 的最终近似。
    • 这是 VI 的执行步骤。如何最大化 ELBO?
    • 梯度上升: 这是最现代、最通用的方法。我们可以计算 ELBO $L(q)$ 相对于 $ν$ 的梯度 $∇ν​L(q)$,然后使用随机梯度上升(Stochastic Gradient Ascent)来迭代优化 $ν$。
    • 坐标上升: 对于某些特殊情况(如平均场),我们可以固定 $q$ 的其他部分,解析地求出 $q$ 某一个部分的最优解。

总结一下: VI 成功地把一个无法计算的“积分”问题(计算 $p(θ∣y)$)转化成了一个可以执行的“优化”问题(找到最好的 $ν$ 来最大化 ELBO)。

1.9. 梯度法 (Gradient Method)

现在我们的目标是找到最优参数 $ν^∗$ 来最大化 ELBO $L(q,ν)$。我们使用的方法是使用梯度上升 (Gradient Ascent)。

思路:

  1. 计算 ELBO $L(q,ν)$ 相对于变分参数 $ν$ 的梯度(导数),即 $∇ν​L(q,ν)$。
  2. 让参数 $ν$ 沿着梯度的方向更新,从而使 $L(q,ν)$ 变大。

我们要求解的目标: $$\nu^*=\arg\max_\nu L(q,\nu)=\arg\max_\nu{E_{q(\cdot|v)}[\log p(y,\theta)-\log q(\theta|v)]}$$ 对 ELBO 的积分形式进行求导: $$\nabla_\nu L(q,\nu)=\nabla_\nu\left{\int q(\theta|v)(\log p(y,\theta)-\log q(\theta|v))d\theta\right}$$ 将求导符号 $∇ν​$ 放入积分内部,并应用了微积分中的“乘法法则” $∇(f⋅g)=(∇f)g+f(∇g)$(经过简化),得到了如下形式: $$=\int\nabla_\nu q(\theta|v)\log\left(\frac{p(y,\theta)}{q(\theta|v)}\right)d\theta-\int\nabla_\nu q(\theta|v)d\theta$$ 我们得到了一个梯度的公式,但这个公式在计算上非常棘手,问题在于第一项 $\int[\nabla_\nu q(\theta|v)]\log(\ldots)d\theta$ ,这个梯度 $∇ν​q(θ∣v)$ 是对 $q$ 的概率密度函数本身求导,它出现在了期望的“权重”部分。这使得我们很难用蒙特卡洛(Monte Carlo)采样来估计这个积分。我们无法简单地从 $q(θ∣v)$ 中采样 $θ$ 来计算它。

为了解决这个难题,VI 领域引入了一个极其重要的技巧,叫做“对数-导数技巧” (log-derivative trick),在强化学习中它也被称为 REINFORCE 或得分函数估计器 (Score Function Estimator)。

首先,我们看第二项:$\int\nabla_\nu q(\theta|v)d\theta$ ,我们可以交换积分和求导的顺序 $=\nabla_\nu\int q(\theta|v)d\theta$ ,由于 $q(θ∣v)$ 是一个概率分布,它对 $θ$ 的积分永远等于 1。因此,$∇ν​(1)=0$。梯度简化为: $$\nabla_\nu L(q,\nu)=\int\nabla_\nu q(\theta|v)\log\left(\frac{p(y,\theta)}{q(\theta|v)}\right)d\theta$$ 然后,我们利用“对数-导数技巧”,这是一个恒等式: $$\nabla_\nu q(\theta|v)=q(\theta|v)\cdot\nabla_\nu\log q(\theta|v)$$ 我们把这个恒等式代入上面简化的梯度公式中: $$\nabla_\nu L(q,\nu)=\int[q(\theta|v)\cdot\nabla_\nu\log q(\theta|v)]\log\left(\frac{p(y,\theta)}{q(\theta|v)}\right)d\theta$$ 现在,我们把 $q(θ∣v)$ 提出来,变回期望的形式: $$\nabla_\nu L(q,\nu)=E_{q(\theta|v)}\left[\nabla_\nu\log q(\theta|v)\cdot\log\left(\frac{p(y,\theta)}{q(\theta|v)}\right)\right]$$ 因为它是一个期望,我们可以用蒙特卡洛采样来近似它:

  • 从 $q(θ∣v)$ 中采样 $N$ 个 $θ_i$​。
  • 对每个 $θ_i$​,计算 $g_i=\nabla_\nu\log q(\theta_i|v)\cdot\log\left(\frac{p(y,\theta_i)}{q(\theta_i|v)}\right)$。
  • 整个梯度的近似值就是 $\frac{1}{N}\sum g_i$。
  • 然后我们就可以用这个估计出的梯度来执行梯度上升了。

这里我们的目标是最大化 (Maximize) ELBO $L(q)$,所以我们要“上坡”,即“梯度上升”。而 ELBO 的梯度 $∇L$ 是一个期望 (Expectation):$∇ν​L(q,ν)=E_q​[…]$。在实际计算中,我们几乎不可能精确地计算这个期望(这需要一个棘手的积分)。

因此,我们采用蒙特卡洛方法来(近似)计算这个梯度:我们从 $q(θ∣v_n​)$ 中随机采样一个或一小批 $θ$,并用它们来估计梯度的值。

因为梯度是基于随机采样估计的,所以这个方法被称为“随机”梯度上升。核心迭代公式: $$v_{n+1}\leftarrow v_n+\eta\nabla_vL(q,v_n)$$ 让我们来拆解这个公式:

  • $v_n$​:这是在第 $n$ 步时,我们的变分参数 $ν$ 的当前值
  • $∇v​L(q,v_n​)$:这是我们在 $v_n$​ 这一点计算出来的 ELBO 梯度(或者,更准确地说,是它的随机估计值)。这个梯度向量指向了能使 ELBO 增长最快的“上坡”方向。
  • $η$:这是步长 (step size),在机器学习中更常被称为“学习率” 。它是一个很小的正数(比如 0.001),用来控制我们沿着梯度方向“走”多远。
  • $v_n+1​$:这就是我们更新后的新参数值

1.10. 平均场变分推断 (Mean-Field Variational Inference)

平均场的核心思想是“分而治之”,它基于一个非常强但计算上很方便的假设。

分割 (Partition): 首先,我们假设可以把所有参数 $θ$ 分割成 $D$ 个不相交的组(或分区),${θ_i​,i=1,...,D}$。

  • 最简单的情况是 $D$ 等于 $θ$ 的维度,即把每个参数 $θ_i​$ 都当作一个独立的组。
  • 因子化: 然后,我们做出一个关键假设:我们选择的近似分布 $q(θ)$ 可以“因子化”为这些组的独立分布的乘积: $$q(\theta)=\prod_{i=1}^Dq_i(\theta_i)$$ 这个公式的意思是,我们强行假设在我们的近似 $q$ 分布中,$θ_1$​ 的值与 $θ_2$​ 的值是完全相互独立的。知道 $θ_1$​ 不会告诉我们任何关于 $θ_2$​ 的信息。

这是一个“权衡”:

  • 真实情况: 在真实的后验 $p(θ∣y)$ 中,参数之间几乎总是相关的(比如,一个模型的两个权重之间,或者权重和偏差之间)。
  • 近似情况: 我们的 $q$ 分布(由于因子化假设)无法捕捉这些参数之间的相关性。
  • 权衡: 我们牺牲了“捕捉参数间相关性”的能力,换取了“计算上的巨大便利”。

平均场假设很明显是错的,但是:

  • 在“平均场”假设下,我们不再需要使用(随机)梯度上升法
  • 我们可以推导出一个叫做 CAVI 的算法。
  • 我们可以循环地解析地(即用一个数学公式)更新每一个因子 $q_j​(θ_j​)$,使 ELBO 达到最大。
  • 我们可以固定住所有 $q_{i\neq j}$,然后直接推导出 $q_j$​ 的最优解的公式。这种“坐标上升”通常比梯度上升收敛得更快。

“平均场”是 VI 的一种具体实现,它通过假设参数组之间相互独立(因子化),来换取一个更简单、更快速(通常是解析的)优化算法。

现在我们要证明 ELBO $L(q)$ 中的第二项(熵项),在平均场假设下,可以被完美地分解。我们从 ELBO 的标准公式开始: $$\mathcal{L}(q)=E_q[\log p(y,\theta)]-E_q[\log q(\theta)]$$ 这个公式由两项组成:

  • $E_q[\log p(y,\theta)]$ :数据拟合项,我们之后再处理。
  • $-E_q[\log q(\theta)]$ :$q$ 分布的熵 (Entropy)

我们把 $q(\theta)=\prod q_i$ 和 $\log q(\theta)=\sum\log q_i$ (对数定律)代入积分: $$\int q(\theta)\log q(\theta)d\theta=\int\left(\prod_{i=1}^Dq_i(\theta_i)\right)\left(\sum_{i=1}^D\log q_i(\theta_i)\right)d\theta$$ 我们把求和 $\sum_{i=1}^D$ 拆成“第 $j$ 项”和“其他所有项 $i\neq j$”。 $$\cdots=\int\prod_{i\neq j}q_i(\theta_i)\left[\int q_j(\theta_j)\left(\log q_j(\theta_j)+\sum_{i\neq j}\log q_i(\theta_i)\right)d\theta_j\right]d\theta_{-j}$$ 我们来解这个内部的方括号 $\int[\ldots]d\theta_j$ :

  1. 第一部分:$\int q_j(\theta_j)\log q_j(\theta_j)d\theta_j$ ,这部分被保留了下来。
  2. 第二部分:$\int q_j(\theta_j)\left(\sum_{i\neq j}\log q_i(\theta_i)\right)d\theta_j$ 。
    • 对于 $dθ_j​$ 的积分来说,$\sum_{i\neq j}\log q_i(\theta_i)$ 是一个常数,可以提出来。
    • 剩下 $\int q_j(\theta_j)d\theta_j$​。任何概率分布的积分都是 1
    • 所以第二部分就等于 $\sum_{i\neq j}\log q_i(\theta_i)$。

我们成功地把第 $j$ 项“剥离”了出来。剩下的部分 $\int\prod_{i\neq j}q_i\ldots d\theta_{-j}$ 是一个对 $D−1$ 个因子的同样问题。如果我们重复这个过程(数学归纳法),我们最终会把每一项都“剥离”出来,得到一个简单的总和: $$\int q(\theta)\log q(\theta)d\theta=\sum_{i=1}^D\int q_i(\theta_i)\log q_i(\theta_i)d\theta_i$$ 这个推导在数学上证明了一个非常直观的、信息论上的结论:

  • $\int q_i(\theta_i)\log q_i(\theta_i)d\theta_i$ 就是非常直观的 $E_{q_i}[\log q_i(\theta_i)]$。
  • 所以,$E_q[\log q(\theta)]=\sum_{i=1}^DE_{q_i}[\log q_i(\theta_i)]$。

换句话说:在平均场假设(独立性)下,联合分布 $q$ 的(负)熵,等于所有独立因子 $q_i$​ 的(负)熵的总和。

一个“系统”的总不确定性,等于它所有“独立子系统”的不确定性之和。我们的 ELBO $L(q)$ 现在可以被分解为: $$\mathcal{L}(q)=\underbrace{E_q[\log p(y,\theta)]}{\text{第一项}}-\underbrace{\sum{i=1}^DE_{q_i}[\log q_i(\theta_i)]}_{\text{第二项(已分解)}}$$ 现在我们对第一项进行处理:

重写第一项: $$\int q(\theta)\log p(y,\theta)d\theta=\int\left(\prod_{i=1}^Dq_i(\theta_i)\right)\log p(y,\theta)d\theta$$ 分离 $q_j​$,我们把 $q_j​(θ_j​)$ 提出来,把所有其他 $i\neq j$ 的积分 $\int\ldots d\theta_{-j}$ 放到一个内部方括号里: $$=\int q_j(\theta_j)\left[\int\prod_{i\neq j}q_i(\theta_i)\log p(y,\theta)d\theta_{-j}\right]d\theta_j$$ 改写为期望: 观察这个内部的方括号 $[…]$:它正是在 $q_{−j}​$(即除 $j$ 之外所有 $q_i​$ 的联合分布)下,对 $log~p(y,θ)$ 求的期望, 所以第一项可以被简写为: $$=\int q_j(\theta_j)E_{\theta_{-j}\sim q_{-j}}[\log p(y,\theta_j,\theta_{-j})]d\theta_j$$ 现在,我们把分解后的第一项和(来自上一页的)分解后的第二项重新组合起来,我们就得到了一个只突出 $q_j$​ 的 ELBO 完整表达式: $$\mathcal{L}(q)=\underbrace{\int q_j(\theta_j)E_{\theta_{-j}\sim q_{-j}}[\log p(y,\theta)]d\theta_j}\text{第一项}-\underbrace{\sum_i\int q_i(\theta_i)\log q_i(\theta_i)d\theta_i}\text{第二项}$$ 假设我们保持 $q_{−j}​$(即 $j$ 之外的所有 $q_i​$)固定不变,我们的目标是“最大化 $L(q)$,但只将其视为关于 $q_j​(θ_j​)$ 的函数”。这就是“坐标上升”法:我们有很多变量($q_1​,q_2​,…,q_D$​),我们一次只优化一个 $q_j​$,同时“冻结”所有其他的 $q_i$​。

现在我们固定了所有 $q_{i\neq j}$,现在只想找到最优的 $q_j​$ 来最大化 ELBO。

我们这样想,当 $q_{−j}$​(所有 $q_{i\neq j}$)都固定时,ELBO $\mathcal{L}(q)$ 中的哪些项是常数?

  • $E_q[\log p(y,\theta)]$ :这项依赖 $q_j​$,不是常数。
  • $\sum_iE_{q_i}[\log q_i]$ :这项可以拆分为 $E_{q_j}[\log q_j]+\sum_{i\neq j}E_{q_i}[\log q_i]$
    • 后面那项 $\sum_{i\neq j}\ldots$ 是常数(因为 $q_{−j}$​ 被固定了)。

因此,我们只需要最大化 $\mathcal{L}(q)$ 中所有与 $q_j​$ 相关的项,我们称之为 $\mathcal{L}j(q_j)$ 。 $$L_j(q_j)=\int q_j(\theta_j)E{\theta_{-j}\sim q_{-j}}[\log p(y,\theta)]d\theta_j-\int q_j(\theta_j)\log q_j(\theta_j)d\theta_j$$ 我们把 $E_{\theta_{-j}\sim q_{-j}}[\log p(y,\theta)]$ 这一项(它是一个关于 $θ_j​$ 的复杂函数)记作 $\log\tilde{p}(\theta_j)$ : $$\log\tilde{p}j(\theta_j)=E{q_{-j}}[\log p(\theta_{-j},\theta_j|y)]+C$$

  • $p(\theta_{-j},\theta_j|y)$ 就是 $p(θ∣y)$,即真实的后验分布
  • $E_{q_{-j}}[\ldots]$ 的意思是 “对 $j$ 以外的所有 $θ_i​$ 求期望(在 $q_i$​ 下)”。
  • $\log\tilde{p}j$ 就是真实后验 $\log p(\theta|y)$ 在 $q{−j}​$ 的“平均场”下所呈现的“样子”。$C$ 是一个归一化常数,确保 $\tilde{p}_j$​ 积分后为 1。

那么$\mathcal{L}_j(q_j)$可以写为:

$$\mathcal{L}_j(q_j)=\int q_j(\theta_j)\log\tilde{p}(\theta_j)d\theta_j-\int q_j(\theta_j)\log q_j(\theta_j)d\theta_j$$ $$=\int q_j(\theta_j)\log\left(\frac{\tilde{p}(\theta_j)}{q_j(\theta_j)}\right)d\theta_j$$ 这个形式等价于 $-KL(q_j(\theta_j)||\tilde{p}(\theta_j))$ ,即

$$\mathcal{L}_j(q_j)=-KL(q_j||\tilde{p}_j)$$

所以我们的目标是最大化 $\mathcal{L}_j(q_j)$ ,这等价于最小化 $q_j​$ 和 $\tilde{p}$ 之间的 KL 散度。KL 散度的最小值是 0,当且仅当两个分布完全相等时取得。

因此, $q_j​$ 的最优解就是: $$q_j^(\theta_j)=\tilde{p}j(\theta_j)$$ 再结合 $$\log\tilde{p}j(\theta_j)=E{q{-j}}[\log p(\theta_{-j},\theta_j|y)]+C$$ 可以得到 $$q_j^(\theta_j)\propto\exp(E_{q_{-j}}[\log p(\theta|y)])$$ 所以,最优的 $q_j$​ 分布,就是那个“在 $q_{−j}​$ 平均场下对真实后验取期望”所得到的 $\tilde{p}_j$分布

所以我们现在知道最优的 $q_j^$ 的对数 $\log q_j^(\theta_j)$ 正比于 $E_{q_{-j}}[\log p(\theta|y)]$ 。

  • 理论解:$q_j^*(\theta_j)=\tilde{p}j(\theta_j)\propto\exp{E{q_{i\neq j}}[\log p(\theta|y)]}$
  • 问题: 这个公式仍然依赖于真实后验 $p(\theta|y)$ ,因为 $p(\theta|y)=\frac{p(y,\theta)}{p(y)}$ ,而我们还是不知道 $p(y)$(证据)。

我们知道 $p(y)$ 是一个常数(与 $θ_j​$ 无关)。我们可以在 $exp{…}$ 内部的分子和分母上同时加上 $\log p(y)$ 这个常数,这不会改变等式。

$$q_j^*(\theta_j)=\frac{\exp{E_{q_{-j}}[\log p(\theta|y)]}}{\int\exp{E_{q_{-j}}[\log p(\theta|y)]}d\theta_j}=\frac{\exp{E_{q_{-j}}[\log p(\theta|y)]+\log p(y)}}{\int\exp{E_{q_{-j}}[\log p(\theta|y)]+\log p(y)}d\theta_j}$$

$\log p(y)$ 是常数,所以 $E_{q_{-j}}[\log p(y)]=\log p(y)$ 。我们可以把它移入期望 $E_{q_{-j}}[\ldots]$ 内部。

$$=\frac{\exp{E_{q_{-j}}[\log p(\theta|y)+\log p(y)]}}{\int\exp{E_{q_{-j}}[\log p(\theta|y)+\log p(y)]}d\theta_j}$$

贝叶斯替换 (Payoff),利用贝叶斯定理 $\log p(\theta|y)+\log p(y)=\log p(y,\theta)$ $$=\frac{\exp{E_{q-j}[\log p(y,\theta)]}}{\int\exp{E_{q-j}[\log p(y,\theta)]}d\theta_j}$$ 我们得到最终的可用的更新公式,这个推导的最终结果是: $$q_j^(\theta_j)\propto\exp{E_{q-j}[\log p(y,\theta)]}$$ 因此,我们可以直接取 $q_j^(\theta_j)\propto\exp{E_{q_{i\neq j}}[\log p(y,\theta)]}$ 。

这个算法在文献中常被称为 CAVI (Coordinate Ascent Variational Inference,坐标上升变分推断)

整个迭代过程可以概括为以下步骤:

1. 初始化 (Initialize)

  • “初始化 (Initialize) 所有的因子 $q_j​$”
  • 这一步意味着我们要为所有 $j=1,…,D$ 的 $q_j(\theta_j)$ 分布的参数(例如,如果 $q_j​$ 是高斯分布,就是它的均值 $μ_j​$ 和方差 $σ_j^2​$)提供一个初始猜测值。

2. 迭代更新 (Iterate)

  • 接下来,我们开始一个大循环,“迭代 (iterate) 遍历所有因子”,轮流更新它们。
  • 对于 $j=1,…,D$ 的每一个因子 $q_j​$
    • A. 固定 (Fix): 保持所有 $q_i$​(其中 $i\neq j$)固定不变。
    • B. 更新 (Update): 使用我们推导出的“最优解”公式来更新 $q_j​$: $q_j(\theta_j)\propto\exp{E_{q_{-j}}[\log p(y,\theta)]}$

3. 重复 (Repeat)

  • “重复 (Repeat) 上述的整个大循环”(即不断地从 $j=1$ 轮到 $D$,再从 $j=1$ 轮到 $D$…)。
  • “直到 (Until) 满足一个预设的收敛标准”
  • 最常用的“收敛标准”是什么就是监控 ELBO。在每一步更新 $q_j$ 后,ELBO $L(q)$ 都会上升(或保持不变)。
    • 当我们完整地循环了一轮(更新了所有的 $q_j​$)之后,发现 ELBO 的增长值非常小(例如,小于一个阈值 $\epsilon=10^{-6}$),我们就认为算法已经收敛,可以停止了。

这个算法的收敛是保证的,因为ELBO这个界相对于每一个单独的因子 $q_j$​ 来说,是凸的

从“最大化”的角度来说,ELBO $L(q)$ 相对于 $q_j$​ 是凹的 (concave),这等价于 $−L(q)$ 是凸的。最大化一个凹函数(或最小化一个凸函数)是一个“好”问题。"坐标上升" 算法(一次只优化一个变量,固定其他变量)在优化一个“逐个凹”的函数时,保证了 ELBO 会单调递增,并最终收敛

它保证收敛,但不一定是收敛到“全局”最优解。它可能会收敛到一个“局部”最优解。但在实践中,这已经是一个非常强大和有用的保证了。

平均场”假设($q$ 可因子化)的最大好处,就是它把一个复杂的、高维的优化问题,分解成了一系列简单的、一维的(或低维的)、有解析解的更新步骤(CAVI 算法),并且这个算法还保证收敛

1.11. 一个例子

我们的目标 $p(z)$ 是一个我们想要近似的真实后验分布。在这个例子中,它是一个二元高斯(正态)分布 $p(z_1,z_2)\sim\mathcal{N}_2(\mu,\Lambda^{-1})$ 。

  • $\mu=(\mu_1,\mu_2)^\top$ 是均值向量。
  • $Λ$ 是精度矩阵(协方差矩阵的逆),它描述了 $z_1​$ 和 $z_2​$ 之间的相关性。$\Lambda=\begin{bmatrix}\Lambda_{11}&\Lambda_{12}\\Lambda_{21}&\Lambda_{22}\end{bmatrix}$
  • $p(z)$ 的概率密度函数(PDF)为:$p(z)\propto\exp\left(-\frac{1}{2}(z-\mu)^\top\Lambda(z-\mu)\right)$

我们使用平均场 (Mean-Field) 假设,即我们选择一个因子化的近似分布 $q(z)$,强行假设 $z_1$​ 和 $z_2​$ 是相互独立的: $$q(z_1,z_2)=q_1(z_1)q_2(z_2)$$ 我们推导出,最优的 $q_j^$ 满足: $$q_j^(\theta_j)\propto\exp{E_{q_{-j}}[\log p(y,\theta)]}$$ 应用到 $q_1$​,对于 $q_1​(z_1​)$,这个公式变为: $$q_1^*(z_1)\propto\exp(E_{z_2\sim q_2}[\log p(z)])$$ 我们现在要计算这个期望 $E_{z_2\sim q_2}[\log p(z)]$ 。

我们取 $\log q_1^*(z_1)=E_{z_2\sim q_2}[\log p(z)]+\mathrm{const}$,将 $p(z)$ 的 PDF(只看 exp 内部)代入: $$\log p(z)=-\frac{1}{2}(z-\mu)^\top\Lambda(z-\mu)+\mathrm{const}$$ $$=-\frac{1}{2}\sum_{i=1}^2\sum_{j=1}^2\Lambda_{ij}(z_i-\mu_i)(z_j-\mu_j)+\mathrm{const}$$ 我们将这个求和展开,并只保留所有与 $z_1$​ 相关的项。所有不含 $z_1$​ 的项在对 $z_2$​ 求期望都会变成一个与 $z_1$​ 无关的常数,并被吸收到 const 中。

经过整理,我们得到: $$\log q_1^(z_1)\propto-\frac{1}{2}z_1^2\Lambda_{11}+z_1(\ldots)+\mathrm{const}$$ 任何形如 $Az_1^2+Bz_1+C$ 的对数 exp 之后,其本身就是一个高斯(正态)分布。通过“配方法”或“匹配系数”,我们可以从这个二次式中直接读出高斯分布的均值和方差。经过处理我们的得到 $q_1^(z_1)$ 是一个新的高斯分布 $\mathcal{N}(m_1,\tau_1^{-1})$ ,其参数为:

  • 精度:$\tau_1=\Lambda_{11}$
  • 均值:$m_1=\mu_1-\frac{\Lambda_{12}}{\Lambda_{11}}(E_{z_2\sim q_2}[z_2]-\mu_2)$

通过对称性,我们可以立即写出 $q_2^(z_2)$ 的解:$q_2^(z_2)\sim\mathcal{N}(m_2,\tau_2^{-1})$

  • 精度:$\tau_2=\Lambda_{22}$
  • 均值:$m_2=\mu_2-\frac{\Lambda_{21}}{\Lambda_{22}}(E_{z_1}[z_1]-\mu_1)$

这里,我们遇到了一个“耦合”问题:

  • $q_1​$ 的最优均值 $m_1​$ 依赖于 $q_2$​ 的均值 $m_2$​(因为 $E_{z_2\sim q_2}[z_2]=m_2$)。
  • $q_2$​ 的最优均值 $m_2$​ 依赖于 $q_1$​ 的均值 $m_1$​(因为 $E_{z_1}[z_1]=m_1$)。

CAVI 迭代求解: 我们通过“定点迭代”来解这个方程组,这就是 CAVI 算法的执行

  1. 初始化 $m_2$​(比如 $m_2(0)​=0$)。
  2. 在第 $t$ 轮迭代时:
  3. 用 $m_2$​ 的旧值 $m_2^{(t-1)}$ 来更新 $m_1$​: $$m_1^{(t)}=\mu_1-\frac{\Lambda_{12}}{\Lambda_{11}}(m_2^{(t-1)}-\mu_2)$$
  4. 用 $m_1$​ 的新值 $m_1^{(t)}$​ 来更新 $m_2$​: $$m_2^{(t)}\leftarrow\mu_2-\frac{\Lambda_{21}}{\Lambda_{22}}(m_1^{(t)}-\mu_1)$$
  5. 重复 3-4 步,直到 $m_1$​ 和 $m_2$​ 收敛(不再变化)。

2. 潜变量模型 (Latent Variable Models)

2.1. 从“有限数据”到“真实期望”

机器学习中“生成模型”的基本场景如下:

  • 数据 $x$: 我们有一堆观测到的数据变量 $x$(比如 $x_1$​,…,$x_n​$,代表 $n$ 张图片)。
  • 真实分布 $p^∗(x)$: 我们假设这些数据是从一个未知的、潜在的“真实”数据分布 $p^∗(x)$ 中随机抽样出来的(比如“世界上所有真实照片”的分布)。
  • 模型 $p_θ​(x)$: 我们的目标是选择一个模型 $p_θ​(x)$(例如一个由参数 $θ$ 定义的深度神经网络),并训练它,使其能够拟合或近似那个未知的真实分布 $p^∗(x)$。

“学习” (Learning) 就是找到一组最优参数 $θ^∗$,使得我们的模型 $p_θ^∗​(x)$ 成为 $p^∗(x)$ 的最佳近似。找到这组 $θ^∗$ 呢最标准、最经典的方法就是:

  • 最大似然估计 (Maximum likelihood fit): 我们调整 $θ$,使得我们的模型 $p_θ​(x)$ 为我们已经观测到的数据 $x_1​,…,x_n$​ 赋予的总概率(似然)最大。
  • 为了计算稳定和方便,我们通常最大化其对数似然 (log-likelihood)$$\theta^ \leftarrow \operatorname*{arg,max}{\theta} \sum{i=1}^n \log p_{\theta}(x_i)$$

既然我们是最大化其对数似然,那么就是等同于最大化其对数平均似然 $$\arg\max_{\boldsymbol{\theta}}\frac{1}{n}\sum_{i=1}^n\log p_{\boldsymbol{\theta}}(\boldsymbol{x}i)$$ 那么我们有一个结论:用来优化的平均对数似然,实际上是真实期望对数似然 $E{x\sim p^*}[\log p_\theta(x)]$ 的一个蒙特卡洛估计

  • $p^∗(x)$ 是未知的真实数据分布(如“所有真实猫的照片”)。
  • $x_1​,…,x_n$​ 是我们从 $p^∗$ 中抽取的有限样本(我们收集到的猫的照片)。

根据大数定律,当我们的数据量 $n→∞$ 时,这个基于样本的“平均值”会收敛到真实的“期望值”: $$\arg\max_\theta\frac{1}{n}\sum_{i=1}^n\log p_\theta(x_i)\xrightarrow{n\to\infty}\arg\max_\theta E_{x\sim p^*}[\log p_\theta(x)]$$ 这意味着,我们用有限数据做 MLE,实际上是在近似一个更根本的目标:找到一个模型 $p_θ​(x)$,使其在整个真实数据分布 $p^∗(x)$ 上的期望对数似然最大。

2.2. MLE 与 KL 散度的等价性

我们的目标目标(期望形式): $$\arg\max_\theta E_{x\sim p^}[\log p_\theta(x)]=\arg\max_\theta\int p^(x)\log p_\theta(x)dx$$ 我们可以在 argmax 中添加(或减去)任何与 $θ$ 无关的常数,这不会改变最优的 $θ$。 我们添加一个“常数”:$-E_{x\sim p^}[\log p^(x)]$ (即 $p^∗$ 的负熵)。 $$\arg\max_\theta\left(E_{x\sim p^}[\log p_\theta(x)]-E_{x\sim p^}[\log p^(x)]\right)$$ $$=\arg\max_\theta E_{x\sim p^}[\log p_\theta(x)-\log p^(x)]$$ $$=\arg\max_\theta E_{x\sim p^}\left[\log\left(\frac{p_\theta(x)}{p^(x)}\right)\right]$$ $\arg\max_\theta[-f(\theta)]$ 等价于 $\arg\min_\theta[f(\theta)]$ $$=\arg\max_\theta\left[-E_{x\sim p^}\left[\log\left(\frac{p^(x)}{p_\theta(x)}\right)\right]\right]$$ $$=\arg\min_\theta E_{x\sim p^}\left[\log\left(\frac{p^(x)}{p_\theta(x)}\right)\right]$$ 这个 $E_{x\sim p^}\left[\log\left(\frac{p^(x)}{p_\theta(x)}\right)\right]$ 正是前向 KL 散度 $KL(p^(x)||p_\theta(x))$ $$=\arg\min_\theta KL(p^(x)||p_\theta(x))$$ 因此我们有结论: $$最大似然估计 (MLE) ⇔ 最小化前向 KL 散度 KL(p^ || p_\theta)$$ 这为我们提供了一个深刻的理论依据:我们使用 MLE 来训练模型 p$_θ​(x)$,从信息论的角度看,我们实际上是在迫使我们的模型分布 $p_θ​(x)$ 去接近(最小化 KL 散度)那个未知的真实数据分布 $p^∗(x)$。

前向 KL ($KL(P∣∣Q)$) 是“mean-seeking”(寻求均值)的。这意味着 MLE 会严厉惩罚我们的模型 $p_θ​(x)$ 遗漏了真实数据 $p^∗(x)$ 的任何部分(即 $p^∗(x)>0$ 但 $p_θ​(x)≈0$)。

这迫使 $p_θ​(x)$ 必须变得“宽泛”,以确保它覆盖所有我们观测到的数据模式,这符合我们训练生成模型的直觉。

2.3. 潜变量 (Latent Variables)

  • 在实际的模型中,变量不总是能被完全观测到。
  • 潜变量 $z$ 就是那些模型中存在、但我们观测不到的变量,因此它们不属于数据集 $x$。

当我们引入了潜变量 $z$ 后,我们能观测到的 $x$ 的似然 $p_θ​(x)$ 就变成了一个“边际似然” (marginal likelihood)。

为了得到 $p_θ​(x)$,我们必须通过积分来“边缘化”掉所有可能的 $z$  $$p_\theta(x)=\int_zp_\theta(x,z)dz=\int_zp_\theta(x|z)p(z)dz$$

  • $p(z)$:是潜变量的先验 (Prior)
  • $p_θ​(x∣z)$:是似然 (Likelihood)(或称为“生成器”、“解码器”)。
  • $p_θ​(x)$:是证据 (Evidence) 或边际似然

我们的目标仍然是最大似然估计(MLE): $$\theta^*=\arg\max_\theta\sum_{i=1}^n\log p_\theta(x_i)$$ 这个观测数据的边际似然 $p_\theta(x)=\int p_\theta(x|z)p(z)dz$ (或者写作 $E_{z\sim p(z)}[p_\theta(x|z)]$ ) 可能是难以处理且难以最大化的,因为这又是一个高维积分,如果 $z$ 是一个高维向量(比如 VAE 中的 100 维风格向量),要在 100 维的空间上做积分,这在计算上是不可行的。这和我们最初的问题 $p(y)=\int p(y|\theta)p(\theta)d\theta$ 是一样的。

2.4. 因子化潜变量模型

我们设定一个模型结构:

  • 我们有 $n$ 个观测数据 $X={x_1,...,x_n}$
  • 我们有 $n$ 个对应的潜变量 $Z={z_1,...,z_n}$
  • 核心假设: 整个模型是“因子化” (factorized) 的。

这意味着,所有数据 $X$ 和所有潜变量 $Z$ 的联合概率 $p_\theta(X,Z)$ ,可以被分解为 $n$ 个独立的 $(x_i​,z_i​)$ 对的概率的乘积: $$p_\theta(X,Z)=\prod_{i=1}^np_\theta(x_i,z_i)=\prod_{i=1}^np_\theta(x_i|z_i)p(z_i)$$ 这基本就是说,我们的 $n$ 个数据点是 i.i.d. (独立同分布) 生成的。 生成第 $i$ 个数据点 $x_i$​ 的过程,只依赖于第 $i$ 个潜变量 $z_i​$。这个过程与其他的数据点 $x_j$​ 或潜变量 $z_j$ ​完全无关

例如: 在 VAE(变分自编码器)中,这假设我们生成一张图片 $x_i$​ 时,所用的“风格”向量 $z_i$​ 与我们生成另一张图片 $x_j$​ 时所用的“风格”向量 $z_j$​ 是独立的。这在处理非序列数据(如图像集)时是一个非常标准的假设。

这个“因子化”假设带来了一个极其重要且有用的推论,即推断 $z_i​$ 只依赖于 $x_i​$。 $$p_\theta(z_i|X,z_{-i})=\frac{p_\theta(X,Z)}{p_\theta(X,z_{-i})}=\frac{p_\theta(x_i,z_i)}{\int p_\theta(x_i,z_i)dz_i}=p_\theta(z_i|x_i)$$

  • $p_\theta(z_i|X,z_{-i})$ 意思: 给定_所有数据 $X$(即 $x_1​,…,x_n​$)和所有其他潜变量 $z_{−i}$​, $z_i$​ 的后验是什么?
  • $p_\theta(z_i|x_i)$ 意思:只给与 $z_i​$ 对应的数据 $x_i​$,$z_i​$ 的后验是什么?

$p_\theta(z_i|X,z_{-i})=p_\theta(z_i|x_i)$ 的意义:由于模型的因子化结构,观测 $x_j​$ 或知道 $z_j$​ 并不会为我们推断 $z_i$​ 提供任何额外信息。推断 $z_i​$ 所需要的全部信息,都已经包含在它自己的 $x_i​$ 中了。这被称为“后验可分离” 。

这个“后验可分离”的特性极大地简化了我们的变分推断问题:

ELBO 也可以被分解:

我们的目标是最大化 ELBO $L(q)$,由于 $p$(真实后验)是可分离的,我们也可以选择一个可分离的 $q$(近似后验):$q(Z)=\prod_{i=1}^nq_i(z_i)$

  • 在此假设下,ELBO $L(q)$ 也可以被完美地分解为 $n$ 个独立项的总和: $$\mathcal{L}(q)=\sum_{i=1}^n\mathcal{L}i(q_i(z_i))$$ 其中 $\mathcal{L}i(q_i)=E{q_i}[\log p\theta(x_i,z_i)]-E_{q_i}[\log q_i(z_i)]$ 。

“大问题”变成 $n$ 个“小问题”:

我们把一个“巨大”的、高维的优化问题(优化 $q(Z)$),分解成了 $n$ 个“小”的、一模一样的优化问题(优化 $q_i​(z_i​)$)。

这意味着,我们只需要解决一个数据点的推断问题(即如何近似 pθ​(zi​∣xi​)),然后就可以将其推广到所有 $n$ 个数据点上。

2.4.1. 一个例子:高斯混合模型 (Mixture of Gaussians, GMM)

GMM 是一个“生成模型”,他的生成参数步骤如下:

第 1 步 (生成参数):

  • 假设有 $K$ 个簇。模型首先从一个先验分布(例如高斯分布 $\mathcal{N}(0,\tau^2)$)中抽取 $K$ 个聚类中心 (Cluster means) $μ_k$​
  • 这些 $μ_k​$($k=1,…,K$)是这个模型的参数 $μ$

第 2 步 (生成数据):

  • 然后,对于 $n$ 个数据点中的每一个 $i$ (from 1 to n):
  • A. 分配簇 (潜变量 $z_i$​):
    • 模型先从一个多项式分布 $Multinomial(π)$ 中抽取一个潜变量 $z_i$​
    • $z_i$​ 是一个簇的编号(比如 $z_i$​=3),代表“第 $i$ 个数据点 $x_i$​ 将属于第 3 个簇”。
  • B. 生成数据 (观测值 $x_i$​):
    • 一旦 $z_i​$ 被确定(例如 $z_i​=k$),模型就从以 $μ_{z_i}$​​(即 $μ_k​$)为均值的高斯分布 $N(μ_{z_i}​​,σ^2)$ 中,抽取观测数据 $x_i$​
  • 这里为了简化,假设所有簇的方差 $σ^2$ 都是已知的。

识别 x, z, 和 θ

这个例子清晰地展示了潜变量模型中的三个关键角色:

  • 观测数据 (Observed data) $x$:
    • 就是我们能看到的数据点 $x={x_1,...,x_n}$。
    • 在 GMM 中,这就是 $n$ 个数据点的坐标。
  • 潜变量 (Latent variables) $z$:
    • 就是我们观测不到的簇分配标签 $z={z_1​,...,z_n​}$。
    • 我们只知道 $x_i​$ 在哪里,但不知道它到底属于哪个簇($z_i​$ 是多少)。这是我们需要推断的。
  • 参数 (Parameters) $μ$ (即 $θ$):
    • 就是模型的聚类中心 $μ=(μ_1​,...,μ_K​)$。
    • 这是我们需要通过学习来找到的。

GMM 是“因子化”的,因为第 $i$ 个数据点 $x_i​$ 的生成,只依赖于第 $i$ 个潜变量 $z_i$​(它属于哪个簇)和全局参数 $μ$。它与其他数据点 $x_j​$ 或 $z_j​$(当 $j\neq i$ 时)是独立的。

因此,总的联合概率 $p(X,Z|\mu)$ 可以被完美地因子化: $$p(X,Z|\mu)=\prod_{i=1}^np(x_i,z_i|\mu)=\prod_{i=1}^np(x_i|z_i,\mu)p(z_i)$$ 这完全符合 $p_\theta(X,Z)=\prod p_\theta(x_i,z_i)$ 的定义。

在 GMM 中,我们面临两个问题:

  1. 推断 (Inference): 估计潜变量 $z$(即 $p(z_i​∣x_i​,μ)$:数据点 $x_i​$ 属于簇 $k$ 的概率是多少?)。
  2. 学习 (Learning): 估计参数 $μ$(即 $μ_k​$ 的最佳位置在哪里?)。
  • 经典的 EM (Expectation-Maximization) 算法就是用来交替解决这两个问题的。
  • 变分推断 (VI) 则提供了一个统一的框架(最大化 ELBO),可以同时(或交替)优化 $z$ 的近似分布 $q(Z)$ 和参数 $μ$。

![[Pasted image 20250919095539.png]]

2.5. 因子化假设

对于GMM这样的模型,“因子化”假设是可以极大地简化了我们的优化目标的(ELBO)。

我们已经证明了如果模型 $p$ 是因子化的 $(p(X,Z)=\prod p(x_i,z_i))$ 那么它的真实后验 $p(Z∣X)$ 也是可分离的 的 $(p(Z|X)=\prod p(z_i|x_i))$

既然真实后验 $p$ 是可分离的,我们自然会选择一个同样可分离的近似 $q$。这就是我们之前提到的平均场近似

  • 我们的 $q(Z)$ 分解为 $n$ 个独立因子的乘积: $q(Z)=\prod_{i=1}^nq_{\phi_{z_i}}(z_i)$
  • $\phi_{z_i}$ 是只属于第 $i$ 个数据点 $x_i$​ 的变分参数。
  • 我们的目标是让每一个 $q_{\phi_{z_i}}(z_i)$ 都去近似它对应的 $p_\theta(z_i|x_i)$

“因子化”假设($p$ 和 $q$ 都是因子化的)带来的最大好处是:ELBO 本身也可以被分解

ELBO 总公式: $$ELBO=L(\theta,\phi)=E_q[\log p_\theta(X,Z)]-E_q[\log q(Z)]$$ 代入因子化: $$p_\theta(X,Z)=\prod p_\theta(x_i,z_i)\Longrightarrow\log p_\theta(X,Z)=\sum\log p_\theta(x_i,z_i)$$ $$q(Z)=\prod q_{\phi_{z_i}}(z_i)\Longrightarrow\log q(Z)=\sum\log q_{\phi_{z_i}}(z_i)$$ 分解期望: 由于期望 $E_q​[…]$ 的线性和 $q$ 的独立性,$E_q[\sum f_i(z_i)]=\sum E_{q_i}[f_i(z_i)]$

ELBO $L$ 完美地分解为 $n$ 个“小 ELBO”的总和: $$L(\theta,\phi)=\sum_{i=1}^nE_{z_i\sim q_{\phi_{x_i}}}[\log p_\theta(x_i,z_i)]-\sum_{i=1}^nE_{z_i\sim q_{\phi_{z_i}}}[\log q_{\phi_{z_i}}(z_i)]$$ 最终形式: 我们可以把每一对 $(x_i,z_i)$ 的项组合起来,定义为 $L_{i}$ $$L(\theta,\phi)=\sum_{i=1}^nL_i(\theta,\phi_{z_i})$$ 这个结论是革命性的,它使现代 VI 成为可能:

  1. 支持随机梯度上升 (SGD):

我们的总目标是 $\max\sum_{i=1}^nL_i$ ,这意味着我们可以使用小批量梯度上升。我们不再需要一次性计算所有 $n$ 个数据点($n$ 可能是 10 亿)的总梯度。我们可以随机抽取一小批数据(例如 128 个),只计算这 128 个 $L_i​$ 的总和,并用它来估计总梯度,然后更新我们的(全局)模型参数 $θ$。这使得 VI 可以扩展到海量数据集

  1. 引出了“摊销推断” :

这个公式也暴露了一个新问题:我们是否需要为 $n$ 个数据点($n$=10 亿)分别学习和存储 $n$ 组独立的变分参数 $ϕ_{z_i}$​​?这显然是不可行的。

所以,我们不再学习 $n$ 个单独的 $\phi_{z_i}$ 而是学习一个函数(例如,一个神经网络),这个函数以 $x_i​$ 为输入,输出它对应的参数 $\phi_{z_i}$。即: $$\phi_{z_i}=f_\phi(x_i)$$ 这个函数 $f_ϕ$​(称为“推断网络”或“编码器”)的参数 $ϕ$ 在所有数据点之间是共享的。这就是 VAE(变分自编码器)的核心思想。

那么,现在我们知道了总的 $ELBO=\sum_{i=1}^nL_i$ 现在我们来看 $L_i​$ 是什么。上一节我们已经引出 $L_i$​ 的定义 $$L_i(\theta,\phi_{z_i})=E_{z_i\sim q\phi_{z_i}}\left[\log\left(\frac{p_\theta(x_i,z_i)}{q_{\phi_{z_i}}(z_i)}\right)\right]$$ 我们使用 $p_\theta(x_i,z_i)=p_\theta(z_i|x_i)p_\theta(x_i)$ 来重写 $L_i$​: $$=E_{z_i\sim q_{\phi_{z_i}}}\left[\log\left(\frac{p_\theta(z_i|x_i)p_\theta(x_i)}{q_{\phi_{z_i}}(z_i)}\right)\right]$$ 拆分 $\log$ 项: $$=E_{z_i\sim q_{\phi_{z_i}}}\left[\log\left(\frac{p_\theta(z_i|x_i)}{q_{\phi_{z_i}}(z_i)}\right)\right]+E_{z_i\sim q_{\phi_{z_i}}}\left[\log p_\theta(x_i)\right]$$ 第一项:$E_q[\log(p/q)]$ 正是负的反向 KL 散度 $-KL(q_{\phi_{z_i}}||p_\theta(z_i|x_i))$ 。 第二项:$p_\theta(x_i)$ 对 $z_{i}$ 来说是常数,所以它的期望就是它自己 $\log p_\theta(x_i)$

最终恒等式: $$L_i(\theta,\phi_{z_i})=-KL(q_{\phi_{z_i}}||p_\theta(z_i|x_i))+\log p_\theta(x_i)$$ 从这个恒等式,我们可以得到一个重要结论:

因为 $KL(…)$ 永远 $≥0$,所以:$L_i(\theta,\phi_{z_i})\leq\log p_\theta(x_i)$ ,它不仅是全局证据的下界,它还是单个数据点 $x_i​$ 的对数似然 $\log p_θ​(x_i​)$ 的下界。

所以在这个假设下,新优化目标是: $$\arg\max_{\theta,\phi}\sum_{i=1}^nL_i(\theta,\phi_{z_i})$$ 这个单一的目标函数 $\sum L_{i}$ 具有双重含义,它让我们同时优化两个东西:

  1. 训练全局模型参数 $θ$(例如,GMM 中的聚类中心 $μ_k$​)。
  2. 学习近似推断模型 $q$(由参数 $ϕ$ 定义)(例如,GMM 中 $x_i$​ 属于各簇的概率)。

实际上,在 $\log p_\theta(x_i)=L_i(\theta,\phi_{z_i})+KL(q_{\phi_{z_i}}||p_\theta(z_i|x_i))$ 中,我们的总目标是最大化 $\sum\log p_\theta(x_i)$ (最大似然)。

最大化 $L_i​$ 意味着同时做两件事:

  • 最大化 $\log p_\theta(x_i)$ (学习 $θ$): 通过调整 $θ$,我们让模型 $p_θ​$ 本身变得更好,使得数据 $x_i​$ 的似然 $p_θ​(x_i​)$ 尽可能高。
  • 最小化 $KL(…)$ (推断 $q$): 通过调整 $ϕ_{z_i}​​$,我们让近似 $q_{ϕ_{z_i}}​​​$ 变得更准,使其与真实后验 $p_\theta(z_i|x_i)$ 之间的 KL 散度(“差距”)尽可能小。

更新 $θ$ 和更新 $ϕ$  都可以提升 ELBO。这背后其实是 VI 框架与经典 EM (Expectation-Maximization) 算法的深刻联系:

  • A. 更新 $ϕ$(固定 $θ$):E-Step(推断)
    • 假设我们固定 $θ$(模型参数不变),只对 $ϕ$ 最大化 ELBO: $\arg\max_\phi L(\theta,\phi)=\arg\max_\phi[\log p_\theta(X)-KL(q_\phi(Z)||p_\theta(Z|X))]$
    • 因为 $θ$ 固定了,$\log p_\theta(X)$ 也是一个常数。
    • 所以,$\arg\max_\phi(\mathrm{Const}-KL)$ 等价于 $\arg\min_\phi KL(q_\phi(Z)||p_\theta(Z|X))$。
    • 结论: 优化 $ϕ$ 是在做“推断” (Inference)。它在调整 $q_ϕ$​,使其尽可能地接近当前 $θ$ 下的真实后验 $p_θ​(Z∣X)$。这非常像 EM 算法中的 E-step (期望步)
  • B. 更新 $θ$(固定 $ϕ$):M-Step(学习)
  • 假设我们固定 $ϕ$($q_ϕ$​ 不变),只对 $θ$ 最大化 ELBO: $\arg\max_\theta L(\theta,\phi)=\arg\max_\theta E_{q_\phi(Z)}[\log p_\theta(X,Z)]-E_{q_\phi(Z)}[\log q_\phi(Z)]$
  • 因为 $ϕ$ 固定了,第二项(熵)是一个常数。
  • 所以,这等价于 $\arg\max_\theta E_{q_\phi(Z)}[\log p_\theta(X,Z)]$。
  • 结论: 优化 $θ$ 是在做“学习”。它在调整 $p_θ$​,使其在 $q_ϕ$​ 给出的“平均”潜变量下,最大化数据的(期望)联合似然。这非常像 EM 算法中的 M-step (最大化步)

VI 框架提供了一个单一的目标函数 ELBO,通过(通常是同时)优化 θ 和 ϕ,我们可以同时完成“学习”和“推断”,这使得它比严格交替的 EM 算法更灵活、更适用于复杂的深度学习模型。

2.6. 优化模型参数 $θ$

这里假设 $\phi_{z_i}$ 是固定的,这时我们的唯一目标是找到能最大化 ELBO 的模型参数 $θ$。我们的目标函数是: $$\theta^*=\arg\max_\theta L(\theta,\phi)=\arg\max_\theta\sum_{i=1}^nE_{q_{\phi_{z_i}}}\left[\log\left(\frac{p_\theta(x_i,z_i)}{q_{\phi_{z_i}}(z_i)}\right)\right]$$ $θ$-梯度的推导

为了使用梯度上升法来找到 $θ^∗$,我们需要计算 ELBO 对 $θ$ 的梯度 $∇θ​L(θ,ϕ)$。这里展一个非常简洁和重要的推导:

Step 1: 对 ELBO 求 $θ$-梯度。 $$\nabla_\theta L(\theta,\phi)=\nabla_\theta\sum_{i=1}^nE_{q_{\phi_{z_i}}}\left[\log\left(\frac{p_\theta(x_i,z_i)}{q_{\phi_{z_i}}(z_i)}\right)\right]$$ Step 2 :因为积分的分布 $q_{\phi_{z_i}}$​​​ 不依赖于 $θ$(它只依赖于被“冻结”的 ϕ)。交换 $∇θ$​ 和 $E_q​$,因此,我们可以安全地将 $∇θ$​ 推入 $E_q​[…]$ 积分的内部。 $$=\sum_{i=1}^nE_{q_{\phi_{z_i}}}\left[\nabla_\theta\log\left(\frac{p_\theta(x_i,z_i)}{q_{\phi_{z_i}}(z_i)}\right)\right]$$ Step 3 : $$\nabla_\theta\left[\log\left(\frac{p_\theta(x_i,z_i)}{q_{\phi_{z_i}}(z_i)}\right)\right]=\nabla_\theta\left[\log p_\theta(x_i,z_i)-\log q_{\phi_{z_i}}(z_i)\right]$$ 我们一个个看,$\log p_\theta(x_i,z_i)$ 依赖于 $θ$,保留。$\log q_{\phi_{z_i}}(z_i)$ 不依赖于 $θ$,它对 $θ$ 的导数为 0。因此,整个梯度极大地简化了: $$=\sum_{i=1}^nE_{q_{\phi_{z_i}}}\left[\nabla_\theta\log(p_\theta(x_i,z_i))\right]$$ 这个最终的梯度公式 $\sum E_q[\nabla_\theta\log p_\theta(x,z)]$ 是一个期望,这意味着我们可以用蒙特卡洛(Monte Carlo)方法来估计这个梯度,从而实现(随机)梯度上升。

现在我们有理论梯度 $$\nabla_\theta L=\sum E_q[\nabla_\theta\log p_\theta(x,z)]$$ 但是现在有一些问题:

  • 求和 $\sum_{i=1}^n$​: 我们需要对所有 $n$ 个数据点求和(如果 $n$=10 亿,这计算量太大了)。
  • 期望 $E_{q_{\phi_{z_i}}}[\ldots]$: 我们需要计算一个期望(这需要一个棘手的积分)。

所以,我们可以采用随机近似方案:

  1. 解决 $\sum_{i=1}^n$​: 我们不使用全部 $n$ 个数据,而是随机抽取“一小批观测”。
  2. 解决 $E_{q_{\phi_{z_i}}}[\ldots]$: 我们不计算精确积分,而是使用“蒙特卡洛方法,用一个单独的样本”。

这就得到了我们(随机)梯度估计值 $\hat{\nabla}{\theta}L$ $$\hat{\nabla}\theta L(\theta,\phi)=\frac{n}{|\mathrm{Batch}|}\sum_{i\in\mathrm{Batch}}\nabla_\theta\log(p_\theta(x_i,\hat{z}_i))$$

  • $\hat{z}i\sim q{\phi_{z_i}}(z_i)$ :这就是“蒙特卡洛采样”。我们从 $q$ 分布中抽取一个 $z^i​$ 样本 来代替 $E_q​[…]$ 期望。
  • $\sum_{i\in\mathrm{Batch}}$:我们只对“批次”中的数据求和。
  • $\frac{n}{|\mathrm{Batch}|}$ :这是一个缩放因子,它将“批次梯度”的幅度放大到与“完整梯度”相匹配。

既然我们有了梯度,我们可以执行随机梯度上升 来更新 $θ$(在 $ϕ$ 固定的情况下): $$\theta_{n+1}=\theta_n+\eta\hat{\nabla}_\theta L(\theta,\phi)$$ $η$ 是学习率。

算法流程1(例如在 VAE 中训练解码器 θ):

  1. 从数据集中取一个 $x_i​$(或一个 mini-batch)。
  2. 推断:从 $q_{\phi_{z_i}}(z_i)$ 中采样一个 $\hat{z}_i$ (例如,通过编码器 $z∼{Encoder}_ϕ​(x_i​)$)。
  3. 计算梯度: 计算 $\nabla_\theta\log p_\theta(x_i,\hat{z}i)$ ,通常是 $\nabla\theta[\log p(x_i|\hat{z}_i)+\log p(\hat{z}_i)$
  4. 更新 (Update): $θ←θ+η⋅$(计算出的梯度)。

算法流程2(更新 $ϕ$ ):

  1. 固定 $θ$。
  2. 抽取一批数据 $x_i​$。
  3. 更新 $q_{\phi_{z_i}}(z_i)$。

更新方法:

  • (A) 传统 VI (如 GMM): 使用“平均场近似”(即 CAVI 公式 $q_j\propto\exp(E[\ldots])$)来解析地计算最优的 $\phi_{z_i}$​​(例如,$x_i​$ 属于各簇的概率)。
  • (B) 现代 VI (如 VAE): 我们也可以用梯度上升法来优化 $ϕ$(这需要 $∇_ϕ​L$,即我们之前讨论过的 'log-derivative trick')。

2.7. 摊销推断 (Amortized Inference)

我们之前的VI过程虽然很好,但是还是有如下的缺陷:

在因子化模型中,我们把大问题分解成了 $n$ 个小问题。对于每一个数据点 $x_i​$,我们都需要找到它自己专属的最优近似 $q_{\phi_{z_i}}(z_i)$,来匹配它专属的真实后验 $p(z_i|x_i)$。

这导致我们的变分参数 $ϕ$ 变成了所有数据点专属参数的巨大集合 $\phi={\phi_{z_{1}},\phi_{z_{2}},...,\phi_{z_{n}}}$ 在实践中,数据集 $n$ 通常非常大(例如一百万张图片)。这意味着我们需要学习和存储一百万组不同的参数 $\phi_{z_i}$。这是“计算昂贵且低效的”。

更糟糕的是:当一个新的、从未见过的数据点 $x_{new}$​ 出现时,这个模型完全不知道如何处理它。我们必须为这个新点重新运行一次完整的 VI 优化算法(比如 CAVI 循环),才能找到它专属的 $ϕ_{new}$​。

“摊销”是一个来自会计学的术语,这里的意思是“分摊成本”:

  • 非摊销推断:这就是我们之前的做法。每来一个数据点 $x_i$​,我们都必须支付一次完整的“推断成本”(即运行一个优化算法来找到 $ϕ_{z_i}​​$)。
  • 摊销推断:们能不能预先支付一笔巨大的“训练成本”,来学习一个通用的函数 $f_ϕ$​?这个函数 $f_ϕ$​ 训练好之后,当任何数据点 $x_i​$(无论是旧的还是新的)进来时,我们不再需要运行优化了。我们只需进行一次简单的前向计算 $f_ϕ​(x_i​)$,它就能立即“预测”出 $x_i$​ 所对应的最优变分参数 $ϕ_{z_i}​​$。我们将 $n$ 次昂贵的“推断成本”,“摊销”到了一次单一的“训练成本”中。

学习一个“推断网络”

我们可以选择构建一个从数据点到其变分近似的映射,也就是说,我们“学习一个模型 $q_ϕ​(z∣x)$”。$q_ϕ​(z∣x)$ 现在是一个参数,但它它是一个参数化的函数,在现代 VI 中,这通常是一个深度神经网络。它被称为“推断网络” (Inference Network) 或 “编码器” (Encoder)

$ϕ$ 也不再是 ${\phi_{z_1},\ldots,\phi_{z_n}}$ 这样 $n$ 组独立的参数。$ϕ$ 现在是这个神经网络的权重。无论 $n$ 是一百万还是一百亿,$ϕ$(神经网络的权重)的数量都是固定的。这些参数 $ϕ$ 在所有数据点之间是共享的

在摊销推断中,我们学习一个从输入数据 $x$ 到其变分参数的映射。举个例子,我们假设这个映射 $q_ϕ​(z∣x)$(即我们的近似后验分布)服从高斯分布。但这个高斯分布的均值和方差不是固定的。它们是由输入 $x$ 决定的。 $$q_\phi(z|x)=\mathcal{N}(z;\mu_\phi(x),\Sigma_\phi(x))$$

  • $\mu_{\phi}(\cdot)$:这是一个深度神经网络。它以数据点 $x$ 为输入,输出这个高斯分布的均值向量 $μ$
  • $\Sigma_{\phi}(\cdot)$:这是另一个深度神经网络(通常与 $μ_ϕ$​ 共享大部分网络层)。它也以 $x$ 为输入,输出这个高斯分布的协方差矩阵 $Σ$(或其对角线,即方差向量)。

摊销推断的优势:

  1. 信息共享

学习一个映射可以在所有数据点之间共享信息。我们只训练一个神经网络 $q_ϕ$​。当我们用 $x_1$​ 训练它时,我们会更新网络的权重 $ϕ$;当我们用 $x_2​$ 训练它时,我们更新的是同一组权重 $ϕ$。这意味着网络 $q_ϕ$​ 从 $x_1​$ 学到的“推断模式”(例如,“看到这种形状的笔画,潜变量 $z$ 可能代表数字 7”)可以被复用到 $x_2$​ 的推断上。

  1. 泛化能力

它可以“为我们在训练集中未见过的新数据点提供更好的近似”。为 $q_ϕ​(z∣x)$ 是一个已经训练好的神经网络(编码器),当一个新数据点 $x_{new​}$ 出现时,我们只需要执行一次前向传播 $q_ϕ​(x_{new}​)$,就能立即得到它的近似后验分布。这个训练好的编码器 $q_ϕ$​ 泛化了它从训练集中学到的推断能力。

  1. 更新效率

它将“导致对参数 $θ$ 和 $ϕ$ 的更高效的更新”。传统方式中我们通常需要“交替”优化:(E-step) 完整地迭代优化所有的 $ϕ_{z_i}​​$,然后 (M-step) 基于此更新一次 $θ$。这个过程很慢,且难以使用小批量(mini-batch)。

而在现在我们可以同时优化 $θ$(例如 VAE 的解码器)和 $ϕ$(VAE 的编码器)。

  • 抽取一个小批量 (mini-batch) 的数据 $x$。
  • 通过编码器 $q_ϕ​(z∣x)$ 得到 $z$ 的分布,并采样 $\hat{z}$。
  • 计算这批数据的 ELBO $L$。
  • 同时计算 $L$ 对 $θ$ 的梯度($∇_θ​L$)和对 $ϕ$ 的梯度($∇_ϕ​L$)。
  • 使用梯度上升法,在同一步同时更新 $θ$ 和 $ϕ$

这个单一的、端到端的(end-to-end)梯度更新过程可以完全在 GPU 上高效运行。

2.8. 现代生成模型

输入 $x$ 和潜变量 $z$ 之间的关系,可以被定义为三个关键部分:

1. 先验 (Prior): $p(z)$

  • 这是一个关于潜变量 $z$ 的先验分布。
  • 它通常“易于计算”。
  • 在实践中,我们通常选择一个非常简单的分布,比如标准高斯分布 $p(z)=N(0,I)$。这代表了我们对“潜空间”(例如“风格向量”的空间)的假设。

2. 似然 (Likelihood): $p_θ​(x∣z)$

  • 这是一个由参数 $θ$ 定义的似然函数。
  • 它也通常“易于计算”。
  • 这就是我们的“生成器” 或 “解码器”。它通常是一个神经网络,负责回答这个问题:“给定一个潜变量 $z$(例如一个风格向量),生成数据 $x$(例如一张图片)的概率是多少?”

3. 后验: $p_θ​(z∣x)$

  • 这是后验分布。它回答一个相反的问题:“给定一张图片 $x$,它对应的潜变量 $z$ 是什么?”
  • 这个分布通常是“难以处理的”。
  • 根据贝叶斯定理:$p_\theta(z|x)=\frac{p_\theta(x|z)p(z)}{p_\theta(x)}$​。它的分母 $p_\theta(x)=\int p_\theta(x|z)p(z)dz$ 是那个我们无法计算的“边际似然”(或“证据”)

2.8.1. 后验(推断网络)

后验我们可以应用变分推断(VI)来进行近似,我们引入一个由参数 $ϕ$ 定义的、可处理的分布 $q_\phi(z|x)$ ,来近似那个无法计算的真实后验 $p_\theta(z|x)$ $$q_\phi(z|x)\approx p_\theta(z|x)$$

我们训练好的 $q_ϕ​(z∣x)$ 被正式命名为“推断网络” (inference network)。一旦我们找到了一个好的 $q_ϕ​(z∣x)$,我们就可以从 $x$ 推断 $z$,而不需要做任何积分

这意味着,给定一张新图片 $x_{new}​$,我们不再需要运行一个缓慢的、迭代的优化算法(如 CAVI)来为它“解出”对应的 $z$。我们只需要执行一次快速的神经网络前向传播 $q_ϕ​(x_{new}​)$,就能立即得到 $z$ 的近似分布(例如,一个高斯分布的均值和方差)。

2.8.2. 似然(生成网络)

$p_θ​(x∣z)$ 是一个由参数 θ 定义的深度神经网络。它的工作是回答:“给定一个潜变量 $z$(例如一个风格向量),生成数据 $x$(例如一张图片)的概率是多少?”

两种常见的解码器工作方式:

A. 概率性解码器 (Probabilistic Decoder)

  • 在这类模型中,神经网络以 $z$ 为输入,输出一个完整概率分布的参数
  • 例如: $p_\theta(x|z)=\mathcal{N}(x;\mu_\theta(z),\Sigma_\theta(z))$。
  • 这意味着解码器神经网络 $f_θ​(z)$ 并不直接输出图片 $x$。它输出一个均值向量 $μ_θ​(z)$ 和一个协方差矩阵 $Σ_θ​(z)$。最终的图片 $x$ 是从这个高斯分布中采样得到的。这在处理真实图像时很常见(例如,$Σ$ 是对角矩阵,代表每个像素的独立方差)。

B. 确定性解码器 (Deterministic Mapping)

  • 另一类模型提供一个从 $z$ 到 $x$ 的“确定性映射”。
  • 这更像是标准自编码器中的解码器,它只输出一个重建的 $x_{\mathrm{recon}}=f_\theta(z)$。在概率模型中,这通常被建模为 $p_\theta(x|z)=\mathcal{N}(x;f_\theta(z),\sigma^2I)$,即我们假设输出 $x$ 是一个以 $f_θ​(z)$ 为中心、方差 $σ^2$ 固定(例如 $σ^2=1$)的高斯分布。

2.8.3. 先验 (Prior)

先验分布 $p(z)$通常是一个“简单的、固定的”分布。最常见的选择就是标准高斯分布(均值为 0,协方差矩阵为单位阵 $I$): $p(z)=N(z;0,I)$

3. 变分自编码器 (Variational AutoEncoder, VAE)

VAE 可以被训练在各种复杂的真实数据集上,例如各种物体、动物和场景图片。训练完成后,VAE 作为一个生成模型,可以“创造”出新的、逼真的、但又不存在于训练集中的数据,例如合成的人脸。

3.1. 核心组件

数据与潜变量:

以图片生成人脸为例子:

  • 观测 $x$: 就是我们能看到的“真实世界的图像” 。
  • 潜变量 z: 就是图片中包含的、无法直接观测的“潜在信息”。

例如,在人脸数据集中,$z$ 可能编码了“性别”、“头发颜色”、“是否微笑”、“脸部朝向”等抽象的视觉特征。

3.1.1. 概率编码器

$q_\phi(z|x)$ :这就是我们之前讨论的“摊销推断网络” $q_ϕ​(z∣x)$,在 VAE 框架中,它被正式称为“概率编码器”。这是一个由 $ϕ$ 参数化的深度神经网络,负责“将一张输入的图像 $x$ 编码 为潜空间中的一个向量 $z$”。

更准确地说,它将 $x$ 编码为一个概率分布(例如,高斯分布的均值 $μ_ϕ​(x)$ 和方差 $Σ_ϕ​(x)$),然后我们从这个分布中采样 $z$。

3.1.2. 概率解码器

$p_\theta(x|z)$  这就是我们之前讨论的“生成网络” $p_θ​(x∣z)$,现在它被称为“概率解码器”。这是一个由 $θ$ 参数化的深度神经网络,负责“将潜空间中的一个向量 $z$ 解码 回一张图像 $x$”。

变分自编码器这个名字结合了两个领域的概念:

  • “自编码器” (AutoEncoder): VAE 在结构上与一个标准的(非概率性的)自编码器非常相似:
    • 标准 Encoder: $z=f_ϕ​(x)$ (将 $x$ 压缩为一个点 $z$)
    • 标准 Decoder: $x_{recon}$ ​= $g_θ​(z)$ (将 $z$ 解码回一个点 $x_{recon}$​)
    • 标准 AE 的训练目标是最小化重构误差(Reconstruction Error),例如 $∣∣x−x_{recon}​∣∣^2$。
  • “变分” (Variational): VAE 在这个结构上增加了“变分推断”**的概率层:
    • VAE Encoder $q_ϕ​(z∣x)$: 不再输出一个点 $z$,而是输出一个概率分布(例如 $N(μ_ϕ​(x),Σ_ϕ​(x))$)。
    • VAE Decoder $p_θ​(x∣z)$: 不再输出一个点 $x_{recon}$​,而是输出一个概率分布(例如 $N(μ_θ​(z),Σ_θ​(z))$)。
    • 训练目标: VAE 不是最小化简单的重构误差,而是通过我们之前推导出的统一目标最大化 ELBO来进行端到端训练的。

3.2. 流程

![[Pasted image 20250919121300.png]]

1. 编码器 (Encoder) $q_ϕ​(z∣x)$:

  • 我们从左侧的输入 (Input) $x$ 开始(例如一张图片)。
  • $x$ 被送入“概率编码器” $q_ϕ​(z∣x)$**。
  • 关键点: 编码器不直接输出一个潜向量 $z$。相反,它输出两个独立的向量:一个均值 (Mean) $μ$ 和一个标准差 (Std. dev) $σ$**。
  • 这两个向量 $μ$ 和 $σ$ 共同定义了一个高斯分布 $N(μ,σ^2)$。这就是我们对“给定 $x$ 时 $z$ 的后验分布” $\mathcal{N}(\mu,\sigma^2I)$ 的近似。

2. 潜向量 (Latent Vector) $Z$:

  • 接下来,我们需要从这个高斯分布 $\mathcal{N}(\mu,\sigma^2I)$ 中采样 (Sample) 一个 $z$,这个 $z$ 就是“输入的压缩低维表示”。
  • 这一步我们稍后会详细讲解。

3. 解码器 (Decoder) $p_θ​(x∣z)$:

  • 这个“采样后的潜向量” $Z$ 被送入“概率解码器”  $p_θ​(x∣z)$**。
  • 解码器尝试从这个潜向量 $Z$ 中“重建”原始图像,得到“重建” $x′$。

这张图的核心,在于中间那个采样公式。这个公式是 VAE 能够被成功训练的关键,被称为“重参数化技巧”。

公式: $$z=\mu+\sigma\odot\epsilon$$ ($⊙$ 符号代表逐元素相乘)。

我们的训练目标是最大化 ELBO。为了使用梯度法(反向传播)来训练整个网络(包括编码器 $ϕ$ 和解码器 $θ$),从 $x′$(损失)到 $x$(输入)的路径必须是可微分的。但流程中有一个“采样”步骤:$z\sim q_\phi(z|x)$(即 $z\sim\mathcal{N}(\mu_\phi(x),\sigma_\phi(x))$)。

“采样”这个动作本身是一个随机节点,它是不可微分的。梯度“流”到 $z$ 这里就会被卡住,我们无法将梯度反向传播回 $μ$ 和 $σ$,因此也永远无法更新编码器 $q_ϕ$​ 的权重 $ϕ$。

重参数化

  • 这个技巧巧妙地“随机性”“参数”分离开。它将随机性“外包” 了。
  1. 它不再让 $z$ 直接从一个依赖 $ϕ$ 的分布中采样。
  2. 相反,它说:我们从一个固定的、与 $ϕ$ 无关的标准高斯分布 $N(0,I)$ 中采样一个随机噪声 $ϵ$。这个步骤是随机的,但它发生在“计算图”之外。
  3. 然后,我们通过一个确定性的 (deterministic)、完全可微分的函数,将这个随机噪声 $ϵ$ 与我们的网络输出 $μ$ 和 $σ$ 组合起来,得到 $z$: $z=μ+σ⊙ϵ$。
  • $z$ 仍然是一个服从 $\mathcal{N}(\mu,\sigma^2I)$ 分布的正确随机变量。
  • 梯度现在可以畅通无阻地从解码器流过 $z$,分别流向 $μ$ 和 $σ$(因为加法和乘法都是可导的),并最终反向传播回编码器网络的权重 $ϕ$。
  • 没有这个技巧,VAE 就无法使用梯度下降法进行端到端的训练。

3.3. 优化模型参数 $ϕ$

VAE的完整优化目标是 同时训练编码器 $ϕ$ 和解码器 $θ$ 。我们的目标函数是总 ELBO,即所有 $n$ 个数据点的“小 ELBO” $L_i​$ 的总和。这里使用的是“摊销”版本($ϕ$ 是共享的神经网络参数): $$L(\theta,\phi)=\sum_{i=1}^nE_{q_\phi(z_i|x_i)}\left[\log\left(\frac{p_\theta(x_i,z_i)}{q_\phi(z_i|x_i)}\right)\right]$$ 为了同时优化 $θ$ 和 $ϕ$,我们需要分别计算它们俩的梯度。优化 $θ$ 相对简单(见2.6.)。真正的难题是计算编码器 $q_ϕ​$ 的梯度 $∇_ϕ​L_i​$

对 $L_i=\int q_\phi(z|x)\log\left(\frac{p_\theta(x,z)}{q_\phi(z|x)}\right)dz$ 直接求导得到的结果如下: $$\nabla_\phi L_i(\theta,\phi)=\underbrace{E_{q_\phi(z_i|x_i)}\left[\nabla_\phi\log(\ldots)\right]}{\mathrm{Term~A}}+\underbrace{\int\log(\ldots)\nabla\phi q_\phi(z_i|x_i)dz_i}_{\mathrm{Term~B}}$$ Term A:

$E_{q_\phi}[\nabla_\phi\log(p_\theta/q_\phi)]$ 可以被展开为 $E_{q_\phi}[\nabla_\phi\log p_\theta-\nabla_\phi\log q_\phi]$ ,$p_{\theta}$ 不依赖于 $ϕ$,所以 $\nabla_\phi\log p_\theta=0$ 。于是这一项变为 $$-E_{q_\phi}[\nabla_\phi\log q_\phi]=-\int q_\phi\frac{\nabla_\phi q_\phi}{q_\phi}dz=-\int\nabla_\phi q_\phi dz$$ 交换积分和求导顺序: $$-\nabla_\phi\int q_\phi dz=-\nabla_\phi(1)=0$$ 所以,第一项等于 0

Term B

这意味着 $ϕ$-梯度实际上就是第二项: $$\nabla_\phi L_i=\int\log\left(\frac{p_\theta(x_i,z_i)}{q_\phi(z_i|x_i)}\right)\nabla_\phi q_\phi(z_i|x_i)dz_i$$ 一个好的期望的期望的形式是 $\int f(z)q(z)dz$ (我们就可以用蒙特卡洛采样) ,但是这个的形式是 $\int f(z)\nabla_\phi q_\phi(z)dz$ ,$\nabla_\phi q_\phi(z)$ 不是一个概率分布,所以我们无法使用简单的蒙特卡洛(Monte Carlo)采样来估计这个梯度

目前有两个主要的解决方法:

3.3.1. REINFORCE

我们依然使用“log-derivative trick”(对数求导技巧) $$\nabla_\phi q_\phi(z)=q_\phi(z)\nabla_\phi\log q_\phi(z)$$ 把这个技巧应用到 Term B 中: $$\mathrm{Term~B}=\int\log\left(\frac{p_\theta(x,z)}{q_\phi(z|x)}\right)\left(q_\phi(z|x)\nabla_\phi\log q_\phi(z|x)\right)dz$$ 重新整理一下顺序: $$\mathrm{Term~B}=\int\left[\log\left(\frac{p_\theta(x,z)}{q_\phi(z|x)}\right)\nabla_\phi\log q_\phi(z|x)\right]q_\phi(z|x)dz$$ 我们转换成了标准期望的形式 $E_{z\sim q_\phi}[...]$ 这个梯度估计方法被称为 Score Function Estimator,在强化学习中,它有一个更广为人知的名字:REINFORCE 算法。

既然它是一个期望,它就可以用简单的蒙特卡洛方法来估计,我们只需要从 $q_ϕ$​ 中采样一个 $\hat{z}$,然后计算下面这个式子作为梯度的近似值: $$\hat{\nabla}\phi L_i\approx\log\left(\frac{p\theta(x_i,\hat{z}i)}{q\phi(\hat{z}i|x_i)}\right)\cdot\nabla\phi\log q_\phi(\hat{z}_i|x_i)$$ 这种形式的梯度估计器 $E_q[f(z)\cdot\nabla\log q(z)]$ 被称为 REINFORCE 或得分函数估计器,尽管它是无偏的,但在实践中以具有极高的方差 而闻名,这使得训练非常不稳定。

我们可以直观地理解一下上面那个“梯度近似值”公式:

  • “得分函数” $\nabla_\phi\log q_\phi(\hat{z}|x)$:它的作用是告诉我们,应该如何调整参数 $\phi$,才能让我们刚刚采样到的这个 $\hat{z}$ 出现的概率变高。
  • "奖励" $\log\left(\frac{p_\theta(x,\hat{z})} {q_\phi(\hat{z}|x)}\right)$ :它是一个标量,评估我们这次采样得到的 $\hat{z}$ 到底“好不好”。如果这个值很大(一个好的样本),我们就希望它出现的概率变高;如果这个值是负的(一个差的样本),我们就希望它出现的概率降低。

实际优化过程如下:

计算这个梯度总共分三步:

  1. 采样得到 $\hat{z_i}$。
  2. 计算标量“奖励” $R$。
  3. 计算梯度向量“得分函数” $S$。
  4. 将两者相乘得到最终的梯度估计 $g_ϕ$。

假设我们有两个神经网络:

  • 编码器 Encoder (参数为 $\phi$ ):输入 $x_i$,输出一个高斯分布的参数,即均值 $μ_ϕ$ 和对数方差 $\log σ_ϕ^2$。
  • 解码器 Decoder (参数为 $θ$):输入一个隐变量 $z$,输出一个伯努利分布的参数(例如,一张黑白图片的所有像素为1的概率),或者一个高斯分布的参数(例如,一张彩色图片的像素均值)。
  • 先验 Prior $p(z)$:通常是一个固定的、无需学习的标准正态分布 $N(0,I)$。

步骤 1: 采样 $\hat{z_i}$

这是所有计算的第一步。

  1. 将数据 $x_i$ 输入编码器,得到输出 $μ_ϕ$ 和 $\log σ_ϕ^2$。
  2. 根据这些参数,构建一个高斯分布对象,即 $q_\phi(z|x_i)=\mathcal{N}(z;\mu_\phi,\sigma_\phi^2)$。
  3. 调用这个分布对象的采样函数,得到一个具体的样本 $\hat{z_i}$。

步骤 2: 计算“奖励” $R$

这是一个标量(一个数字),我们需要把它从计算图中“分离”出来,因为它只作为后续梯度计算的权重,本身不提供梯度。 $$R=\log p_\theta(x_i,\hat{z}i)-\log q\phi(\hat{z}_i|x_i)$$ 我们来分别计算这两项:

a) 计算 $\log q_\phi(\hat{z}_i|x_i)$ (编码器部分的对数概率)

这一项问的是:“根据我们的编码器,刚刚采样出的这个 $\hat{z_i}$ 出现的概率的对数是多少?”

  • 计算方法:我们已经有了在构建的分布对象和样本。我们只需要调用该分布的 log 就行。

b) 计算 $\log p_\theta(x_i,\hat{z}_i)$ (模型联合概率的对数)

根据概率论的链式法则,$p(x,z)=p(x∣z)p(z)$,所以 $\log p(x,z)=\log p(x∣z)+\log p(z)$。我们需要分别计算这两部分。

  • 计算 $\log p(\hat{z_i})$ (先验对数概率) 这一项问的是:“根据我们设定的先验分布(通常是标准正态分布),$\hat{z_i}$ 出现的概率的对数是多少?”

因为先验的概率分布有了,所以概率是很好求出的。

  • 计算 $\log p_θ(x_i∣\hat{z}_i)$ (解码器对数概率 / 重建似然) 这一项问的是:“给定我们采样的隐变量 $\hat{z}_i$,我们的解码器认为原始数据 $x_i$ 出现的概率的对数是多少?”
  • 计算方法
    1. 将 $\hat{z}i$ 输入解码器,得到输出,例如重建图像 $x{recon}$。
    2. 这个 $x_{recon}$ 实际上是一个分布的参数。例如,对于二值图像,$x_{recon}$ 的每个像素值是伯努利分布的参数 $p$。
    3. 我们基于这个输出分布,计算原始数据 $x_i$ 的对数概率。这通常等价于计算重建损失。例如,对于伯努利分布,它就是二元交叉熵损失 的相反数。

c) 组合得到 $R$

现在我们把所有部分组合起来: $$R=(\log p_\theta(x_i|\hat{z}_i)+\log p(\hat{z}i))-\log q\phi(\hat{z}_i|x_i)$$ 至此,我们就得到了一个数字 $R$。

步骤 3: 计算“得分函数” S

这一项是一个梯度向量: $$\nabla_\phi\log q_\phi(\hat{z}i|x_i)$$ 它代表了这个值对编码器所有参数 $\phi$ 的梯度。$\log q\phi(\hat{z}_i|x_i)$ 在之前的 (a) 中已经算出来了,所以这里只有对每个参数依次求一下梯度。

最终的梯度是 $g_ϕ≈R×S$。

3.3.2. 重参数化

我们不直接从 $q_ϕ​(z∣x)$ 采样,而是引入一个独立的噪声变量 $ϵ∼p(ϵ)$(例如 $ϵ∼N(0,I)$),然后通过一个确定性函数 $z=g(ϕ,x,ϵ)$ 来生成 $z$。

原始的期望  $$L(\theta,\phi)=\sum_{i=1}^nE_{q_\phi(z_i|x_i)}\left[\log\left(\frac{p_\theta(x_i,z_i)}{q_\phi(z_i|x_i)}\right)\right]$$ 被改写为对 ϵ 的期望: $$L_i = E_{\epsilon \sim p(\epsilon)}[f(g(\phi, x, \epsilon))]$$ 写成积分形式: $$L_i=\int p(\epsilon)f(g(\phi,x,\epsilon))d\epsilon$$ 现在,我们可以毫无问题地将梯度推入积分内部,因为我们积分所依据的分布 $p(ϵ)$ 完全不依赖于 $\phi$

由于 $p(ϵ)$ 与 $\phi$ 无关,梯度只作用于后面的 $f(…)$ 项: $$=\int p(\epsilon)\nabla_\phi\left[f(g(\phi,x,\epsilon))\right]d\epsilon$$ 这个积分又是一个标准期望的定义 $$\nabla_\phi L_i=E_{\epsilon\sim p(\epsilon)}[\nabla_\phi f(g(\phi,x,\epsilon))]$$ 我们得到了一个梯度的期望。这个梯度 $∇_ϕ​f(g(ϕ,x,ϵ))$ 可以通过链式法则 轻松计算,因为函数 $g$ 是确定且可微的。

在实践中,我们只需要:

  1. 采样一个 $\hat{ϵ}$。
  2. 计算 $\hat{z}=g(ϕ,x,\hat{ϵ})$。
  3. 计算最终的损失 $f(\hat{z})$。
  4. 算出 $f$ 对 $\phi$ 的梯度。

这个估计量的方差非常低,使得训练稳定高效。但是对于离散潜变量(例如 z 是一个类别标签),重参数化技巧不适用,REINFORCE 是(几乎)唯一的计算梯度的方法。

3.4. ELBO 目标函数的两种等价的解释

3.4.1. ELBO 的第一种形式:(证据 - KL 散度)

指出 ELBO(对于单个数据点 x)具有以下形式。定义式: $$L(\theta,\phi)=E_{z\sim q_\phi(\cdot|x)}\left[\log\left(\frac{p_\theta(x,z)}{q_\phi(z|x)}\right)\right]$$ 恒等变形: $$L(\theta,\phi)=\log p_\theta(x)-KL(q_\phi(z|x)||p_\theta(z|x))$$ 这个恒等式是我们之前推导过的 $\log p(x)=L+KL$ 的变形。它直观地告诉我们:

ELBO (我们能优化的) = 证据 (我们想要的) - KL散度 (我们的近似有多差)

最大化 ELBO $L(θ,ϕ)$,等价于同时做两件事情:

  • 最大化 $\log p_θ​(x)$
  • 最小化 $KL(…)$(即 $q_ϕ​(z∣x)$ 和 $p_θ​(z∣x)$ 之间的距离)。

这个“双重目标”对应了我们在 VAE 中需要优化的两组参数($θ$ 和 $ϕ$):

  • 1. 学习 (Learning):最大化 $\log p_θ​(x)$
    • 这对应于调整我们的生成模型(解码器)参数 $θ$
    • 我们希望我们的生成器 $p_θ$​ 变得尽可能好,以便它能为我们观测到的真实数据 $x$ 赋予尽可能高的(边际)似然概率。
  • 2. 推断 (Inference):最小化 $KL(q_ϕ​∣∣p_θ​)$
    • 这对应于调整我们的推断网络(编码器)参数 $ϕ$
    • 我们希望我们的编码器 $q_ϕ$​ 变得尽可能准,使其产生的近似后验 $q_ϕ​(z∣x)$,与那个(无法计算的)真实后验 $p_θ​(z∣x)$ 之间的“距离”(KL散度)尽可能小。

但是,这个公式在实践中是“不好用”的,因为它包含两个都难以处理 的项:

  • $\log p_\theta(x)$ :这是边际似然,它需要那个棘手的积分 $∫pθ​(x∣z)p(z)dz$,我们从一开始就没法算。
  • $KL(q_\phi||p_\theta)$:这需要 $p_θ​(z∣x)$(真实后验),它也依赖于 $p_θ​(x)$ 作为分母( $p_\theta(z|x)=p_\theta(x,z)/p_\theta(x)$ ),我们也算不出来。

所以我们要寻求另一种等价写法:

3.4.2. ELBO 的第二种形式:(重构损失 - KL 正则项)

ELBO 定义式: $$ELBO=E_{q_\phi(z|x)}\left[\log\left(\frac{p_\theta(x,z)}{q_\phi(z|x)}\right)\right]$$ 这一次,我们使用联合概率的另一条规则来分解 $p_θ​(x,z)$: $$p_\theta(x,z)=p_\theta(x|z)p(z)$$ $$ELBO=E_{q_\phi(z|x)}\left[\log\left(\frac{p_\theta(x|z)p(z)}{q_\phi(z|x)}\right)\right]$$ 拆分 $\log$ 并重组: $$ELBO=E_{q_\phi(z|x)}[\log p_\theta(x|z)+\log p(z)-\log q_\phi(z|x)]$$ $$=E_{q_\phi(z|x)}[\log p_\theta(x|z)]+E_{q_\phi(z|x)}[\log p(z)]-E_{q_\phi(z|x)}[\log q_\phi(z|x)]$$ $$=E_{q_\phi(z|x)}[\log p_\theta(x|z)]-\left(E_{q_\phi(z|x)}[\log q_\phi(z|x)]-E_{q_\phi(z|x)}[\log p(z)]\right)$$ 后面这两项正是 KL 散度 $KL(q_ϕ​(z∣x)∣∣p(z))$ 的定义,最终形式为最终形式 (VAE 目标函数) $$ELBO=E_{q_\phi(z|x)}[\log p_\theta(x|z)]-KL(q_\phi(z|x)||p(z))$$ 这个公式里面的每一项都是可计算的。

  • $q_{\phi}(z|x)$ 我们的编码器 (Encoder)。我们知道它的公式(例如 $N(μ_ϕ​(x),Σ_ϕ​(x)))$。
  • $p(z)$  我们的先验 (Prior)。我们_定义_了它(例如 $N(0,I)$)。
  • $p_\theta(x|z)$ 我们的解码器 (Decoder)。我们也知道它的公式(例如 $N(μ_θ​(z),Σ_θ​(z)))$。

我们具体讲这个公式分成两个部分来看: $$ELBO=\underbrace{E_{q_\phi(z|x)}[\log p_\theta(x|z)]}\text{第一项:重构项}-\underbrace{KL(q\phi(z|x)||p(z))}_\text{第二项:正则项}$$

  • $E_{q_\phi(z|x)}[\log p_\theta(x|z)]$,即重构损失:这一项是“对数似然”的期望。它是在说:从编码器 $q_ϕ$​ 采样一个 $z$,然后看解码器 $p_θ​$ 能否很好地“重建”出原始的 $x$。最大化这一项,等价于最小化“重构损失”。它迫使编码器 $ϕ$ 和解码器 $θ$ 协同工作,确保潜变量 $z$ 包含了重建 $x$ 所需的全部信息。
  • $-KL(q_\phi(z|x)||p(z))$,即 KL 正则项:这一项充当了“正则化器” ,因为我们在最大化 ELBO,我们就在最大化 $−KL(…)$,这等价于最小化 $KL(q_ϕ​(z∣x)∣∣p(z))$。这个正则化项强迫我们的编码器 $q_ϕ​(z∣x)$(它为每个 x 输出一个特定的分布)不能太“随心所欲”,它的输出分布在平均意义上,必须始终接近 (stay close to) 那个简单的、固定的先验 $p(z)$(即 $N(0,I)$)。

正则化的目的:

  • 避免过拟合:它防止编码器为每个 $x_i​$“记忆”一个完美的、但在潜空间中相距甚远的 $z_i​$。
  • 平滑潜空间:它迫使所有 $x$ 的 $z$ 分布都“挤在”原点 $N(0,I$) 附近。

正是因为这种平滑性(而不是让每个 $z$ 都离得很远),我们才能在训练后,从先验 $p(z)$ 中采样一个新的 $z_{new}$​(它会落在某个 $q_ϕ​(x)$ 附近),然后解码器 $p_θ$​ 就能将其解码为一张有意义的、新的图片。这就是 VAE 实现“生成”功能的关键。

3.4.2.1. 重构损失

第一个元素代表了重构损失,它衡量原始输入在经过‘编码-解码’过程后被重建得有多好。我们的目标是最大化这一项(最大化对数似然)

这一项 $E_{q_\phi(z|x)}[\log p_\theta(x|z)]$ 看起来很抽象。它和我们熟悉的“损失函数”(如 MSE)的关系如下:

假设: 我们假设解码器 $p_θ​(x∣z)$ 输出一个高斯分布: $$p_\theta(x|z)=\mathcal{N}(x;\mu_\theta(z),\Sigma_\theta(z))$$ 其中,神经网络 $μ_θ​(z)$ 输出重建的均值,$Σ_θ​(z)$ 输出协方差。

对数似然: 那么它的对数似然(忽略常数)就是高斯分布的对数 PDF: $$\log p_\theta(x|z)=-\frac{1}{2}(x-\mu_\theta(z))^\top\Sigma_\theta(z)(x-\mu_\theta(z))+\mathrm{const.}$$ 让我们做一个常见的简化:假设协方差 $Σ_θ​(z)$ 是一个固定的单位矩阵 $I$(即 $Σ_θ​(z)=I$)。这意味着我们假设重建的每个像素都有相同的、单位为 1 的方差。此时,解码器 $μ_θ​(z)$ 就成了重建图像 $x′$ 的唯一输出

上述公式变为: $$\log p_\theta(x|z)=-\frac{1}{2}(x-\mu_\theta(z))^\top I(x-\mu_\theta(z))=-\frac{1}{2}||x-\mu_\theta(z)||^2$$ 这正是(负的)平方 L2​ 损失 (scaled L2​ loss),也就是我们常说的均方误差

所以最大化高斯似然 ⇔ 最小化 MSE (L2 损失)。类似的,如果我们的数据 $x$ 是二元的(0或1),我们会选择一个伯努利分布 (Bernoulli) 作为解码器输出,而最大化伯努利似然就等价于最小化二元交叉熵损失

这个“重构损失”还必须在编码器 $q_ϕ​(z∣x)$ 的输出上求期望(即 $z$ 是从编码器采样得到的)。

我们现在可以写出 VAE 的最终损失函数(我们要最小化负 ELBO) $$\mathrm{Loss}(\theta,\phi)=\min_{\theta,\phi}\left(\underbrace{E_{z\sim q_\phi(z|x)}[-\log p_\theta(x|z)]}{\text{Reconstruction Loss (e.g., MSE)}}+\underbrace{KL(q\phi(z|x)||p(z))}_{\text{KL Regularizer}}\right)$$ 这就是 VAE 训练的全部内容。它实现了一个权衡

  1. (重构损失): 迫使编码器和解码器协同工作,确保潜变量 z 包含了足够的信息,使得重建的图像 $x′$ 与原始图像 $x$ 尽可能像。
  2. (KL 正则项): 迫使编码器 $q_ϕ$​ 产生的所有 $z$ 的分布都必须“看起来”像一个简单的先验分布 $p(z)$(如 $N(0,I)$),以确保潜空间的平滑性。