1. 背景:为什么需要ELBO?
贝叶斯推断的挑战
在概率模型中,我们通常需要处理两类变量:
观测变量 x x x:直接可观测的数据,例如图片像素、文本单词。
潜在变量 z z z:隐藏的、不可直接观测的变量,代表数据的内在结构,例如图片的类别、内容的语义。
我们希望通过贝叶斯推断,计算后验分布 p ( z ∣ x ) p(z|x) p(z∣x),即给定数据 x x x 时,潜在变量 z z z 的概率分布:
p ( z ∣ x ) = p ( x , z ) p ( x ) = p ( x ∣ z ) p ( z ) ∫ p ( x ∣ z ) p ( z ) d z p(z|x) = frac{p(x, z)}{p(x)} = frac{p(x|z)p(z)}{int p(x|z)p(z) dz} p(z∣x)=p(x)p(x,z)=∫p(x∣z)p(z)dzp(x∣z)p(z)
p ( x ∣ z ) p(x|z) p(x∣z):似然,描述 z z z 如何生成 x x x。
p ( z ) p(z) p(z):先验,描述 z z z 的分布(通常假设为简单分布,如标准正态分布)。
p ( x ) p(x) p(x):边际似然(也称“证据”),是联合分布 p ( x , z ) p(x, z) p(x,z) 对 z z z 的积分。
问题:计算 p ( x ) = ∫ p ( x ∣ z ) p ( z ) d z p(x) = int p(x|z)p(z) dz p(x)=∫p(x∣z)p(z)dz 非常困难,因为:
高维积分:当 z z z 是高维变量时,积分无法解析求解。
复杂模型:在深度学习中, p ( x ∣ z ) p(x|z) p(x∣z) 可能是神经网络,积分更是无从下手。
这导致我们无法直接计算 p ( z ∣ x ) p(z|x) p(z∣x),需要一种近似方法。
变分推断的引入
变分推断(Variational Inference)是一种解决贝叶斯推断难题的方法。其核心思想是:
不直接计算复杂的 p ( z ∣ x ) p(z|x) p(z∣x),而是用一个简单、参数化的分布 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x)(称为变分分布)来近似它。
通过优化参数 ϕ phi ϕ,使 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 尽可能接近 p ( z ∣ x ) p(z|x) p(z∣x)。
衡量“接近”的标准通常是 KL散度(Kullback-Leibler Divergence):
D K L ( q ϕ ( z ∣ x ) ∥ p ( z ∣ x ) ) = E q ϕ ( z ∣ x ) [ log q ϕ ( z ∣ x ) p ( z ∣ x ) ] D_{KL}(q_phi(z|x) | p(z|x)) = mathbb{E}_{q_phi(z|x)}left[log frac{q_phi(z|x)}{p(z|x)}
ight] DKL(qϕ(z∣x)∥p(z∣x))=Eqϕ(z∣x)[logp(z∣x)qϕ(z∣x)]
目标是找到 ϕ phi ϕ,使KL散度最小化。但直接最小化KL散度需要知道 p ( z ∣ x ) p(z|x) p(z∣x),这又回到了原问题。
ELBO的角色:ELBO提供了一个间接的方法,通过最大化一个目标函数(即ELBO),同时:
逼近 p ( z ∣ x ) p(z|x) p(z∣x)。
提高数据的边际似然 log p ( x ) log p(x) logp(x)。
2. ELBO是什么?
直观解释与类比
你可以将ELBO想象为一个“替代目标”。我们真正想要的是计算 log p ( x ) log p(x) logp(x)(数据的概率),但这太难了。ELBO就像一个“更容易计算的近似目标”,它保证:
ELBO的值总是小于或等于 log p ( x ) log p(x) logp(x)(因此称为“下界”)。
最大化ELBO会使我们的近似分布 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 更接近真实后验 p ( z ∣ x ) p(z|x) p(z∣x)。
类比:
假设你想爬一座山(目标是到达山顶,代表 log p ( x ) log p(x) logp(x)),但山路崎岖,直接爬很困难。
ELBO就像一条“绕路的平坦小路”(下界),虽然不会直接带你到山顶,但通过不断优化这条小路,你会越来越接近山顶,同时避开了复杂的计算。
数学定义
ELBO的数学表达式为:
L ( θ , ϕ ; x ) = E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] − D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) mathcal{L}( heta, phi; x) = mathbb{E}_{q_phi(z|x)}[log p_ heta(x|z)] – D_{KL}(q_phi(z|x) | p_ heta(z)) L(θ,ϕ;x)=Eqϕ(z∣x)[logpθ(x∣z)]−DKL(qϕ(z∣x)∥pθ(z))
其中:
θ heta θ:生成模型 p θ ( x ∣ z ) p_ heta(x|z) pθ(x∣z) 和先验 p θ ( z ) p_ heta(z) pθ(z) 的参数。
ϕ phi ϕ:近似后验 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 的参数。
E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] mathbb{E}_{q_phi(z|x)}[log p_ heta(x|z)] Eqϕ(z∣x)[logpθ(x∣z)]:重构项,衡量生成数据的质量。
D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) D_{KL}(q_phi(z|x) | p_ heta(z)) DKL(qϕ(z∣x)∥pθ(z)):KL散度项,衡量近似后验与先验的差异。
直观理解:
重构项:从 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 采样 z z z,用 p θ ( x ∣ z ) p_ heta(x|z) pθ(x∣z) 生成数据,查看生成的 x x x 与真实 x x x 的接近程度。
KL散度项:确保 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 不偏离先验 p θ ( z ) p_ heta(z) pθ(z) 太远,相当于一种“正则化”。
3. ELBO的详细数学推导
为了让你彻底理解ELBO,我将一步步推导,尽量清晰且详细。我们从贝叶斯推断的目标开始。
目标:计算边际似然
我们希望计算数据的边际似然:
p ( x ) = ∫ p ( x , z ) d z = ∫ p ( x ∣ z ) p ( z ) d z p(x) = int p(x, z) dz = int p(x|z)p(z) dz p(x)=∫p(x,z)dz=∫p(x∣z)p(z)dz
取对数:
log p ( x ) log p(x) logp(x)
这是我们优化的最终目标,但积分难以计算。
引入变分分布
我们引入一个变分分布 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 来近似后验 p ( z ∣ x ) p(z|x) p(z∣x)。用KL散度衡量两者的差异:
D K L ( q ϕ ( z ∣ x ) ∥ p ( z ∣ x ) ) = E q ϕ ( z ∣ x ) [ log q ϕ ( z ∣ x ) p ( z ∣ x ) ] D_{KL}(q_phi(z|x) | p(z|x)) = mathbb{E}_{q_phi(z|x)}left[log frac{q_phi(z|x)}{p(z|x)}
ight] DKL(qϕ(z∣x)∥p(z∣x))=Eqϕ(z∣x)[logp(z∣x)qϕ(z∣x)]
将 p ( z ∣ x ) = p ( x , z ) p ( x ) = p ( x ∣ z ) p ( z ) p ( x ) p(z|x) = frac{p(x, z)}{p(x)} = frac{p(x|z)p(z)}{p(x)} p(z∣x)=p(x)p(x,z)=p(x)p(x∣z)p(z) 代入:
D K L ( q ϕ ( z ∣ x ) ∥ p ( z ∣ x ) ) = E q ϕ ( z ∣ x ) [ log q ϕ ( z ∣ x ) − log p ( x ∣ z ) − log p ( z ) + log p ( x ) ] D_{KL}(q_phi(z|x) | p(z|x)) = mathbb{E}_{q_phi(z|x)}left[ log q_phi(z|x) – log p(x|z) – log p(z) + log p(x)
ight] DKL(qϕ(z∣x)∥p(z∣x))=Eqϕ(z∣x)[logqϕ(z∣x)−logp(x∣z)−logp(z)+logp(x)]
展开期望:
D K L ( q ϕ ( z ∣ x ) ∥ p ( z ∣ x ) ) = E q ϕ ( z ∣ x ) [ log q ϕ ( z ∣ x ) ] − E q ϕ ( z ∣ x ) [ log p ( x ∣ z ) ] − E q ϕ ( z ∣ x ) [ log p ( z ) ] + log p ( x ) D_{KL}(q_phi(z|x) | p(z|x)) = mathbb{E}_{q_phi(z|x)}[log q_phi(z|x)] – mathbb{E}_{q_phi(z|x)}[log p(x|z)] – mathbb{E}_{q_phi(z|x)}[log p(z)] + log p(x) DKL(qϕ(z∣x)∥p(z∣x))=Eqϕ(z∣x)[logqϕ(z∣x)]−Eqϕ(z∣x)[logp(x∣z)]−Eqϕ(z∣x)[logp(z)]+logp(x)
因为 log p ( x ) log p(x) logp(x) 不依赖于 z z z,可以提出期望:
log p ( x ) = D K L ( q ϕ ( z ∣ x ) ∥ p ( z ∣ x ) ) + E q ϕ ( z ∣ x ) [ log p ( x ∣ z ) + log p ( z ) − log q ϕ ( z ∣ x ) ] log p(x) = D_{KL}(q_phi(z|x) | p(z|x)) + mathbb{E}_{q_phi(z|x)}[log p(x|z) + log p(z) – log q_phi(z|x)] logp(x)=DKL(qϕ(z∣x)∥p(z∣x))+Eqϕ(z∣x)[logp(x∣z)+logp(z)−logqϕ(z∣x)]
定义ELBO
右边的第二项就是ELBO:
L ( θ , ϕ ; x ) = E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) + log p θ ( z ) − log q ϕ ( z ∣ x ) ] mathcal{L}( heta, phi; x) = mathbb{E}_{q_phi(z|x)}[log p_ heta(x|z) + log p_ heta(z) – log q_phi(z|x)] L(θ,ϕ;x)=Eqϕ(z∣x)[logpθ(x∣z)+logpθ(z)−logqϕ(z∣x)]
我们可以用KL散度改写这个表达式。注意到:
E q ϕ ( z ∣ x ) [ log p θ ( z ) − log q ϕ ( z ∣ x ) ] = − E q ϕ ( z ∣ x ) [ log q ϕ ( z ∣ x ) p θ ( z ) ] = − D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) mathbb{E}_{q_phi(z|x)}[log p_ heta(z) – log q_phi(z|x)] = – mathbb{E}_{q_phi(z|x)}left[log frac{q_phi(z|x)}{p_ heta(z)}
ight] = – D_{KL}(q_phi(z|x) | p_ heta(z)) Eqϕ(z∣x)[logpθ(z)−logqϕ(z∣x)]=−Eqϕ(z∣x)[logpθ(z)qϕ(z∣x)]=−DKL(qϕ(z∣x)∥pθ(z))
因此:
L ( θ , ϕ ; x ) = E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] − D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) mathcal{L}( heta, phi; x) = mathbb{E}_{q_phi(z|x)}[log p_ heta(x|z)] – D_{KL}(q_phi(z|x) | p_ heta(z)) L(θ,ϕ;x)=Eqϕ(z∣x)[logpθ(x∣z)]−DKL(qϕ(z∣x)∥pθ(z))
为什么是下界?
从推导中:
log p ( x ) = L ( θ , ϕ ; x ) + D K L ( q ϕ ( z ∣ x ) ∥ p ( z ∣ x ) ) log p(x) = mathcal{L}( heta, phi; x) + D_{KL}(q_phi(z|x) | p(z|x)) logp(x)=L(θ,ϕ;x)+DKL(qϕ(z∣x)∥p(z∣x))
因为KL散度 D K L ≥ 0 D_{KL} geq 0 DKL≥0,所以:
log p ( x ) ≥ L ( θ , ϕ ; x ) log p(x) geq mathcal{L}( heta, phi; x) logp(x)≥L(θ,ϕ;x)
当 q ϕ ( z ∣ x ) = p ( z ∣ x ) q_phi(z|x) = p(z|x) qϕ(z∣x)=p(z∣x) 时, D K L = 0 D_{KL} = 0 DKL=0,ELBO等于 log p ( x ) log p(x) logp(x)。因此,最大化ELBO就是在:
提高 log p ( x ) log p(x) logp(x)。
让 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 接近 p ( z ∣ x ) p(z|x) p(z∣x)。
图示解释
想象一个二维平面:
横轴: q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 的参数 ϕ phi ϕ。
纵轴:目标函数的值。
log p ( x ) log p(x) logp(x) 是一条水平线(真实值,固定但未知)。
ELBO是 log p ( x ) log p(x) logp(x) 下方的一条曲线,最大值不超过 log p ( x ) log p(x) logp(x)。
KL散度是ELBO和 log p ( x ) log p(x) logp(x) 之间的“间隙”。
优化ELBO就是在调整 ϕ phi ϕ,让ELBO曲线尽可能接近 log p ( x ) log p(x) logp(x),从而缩小KL散度。
4. ELBO的两个组成部分
ELBO由两部分组成,每部分都有明确的意义:
1. 重构项(Reconstruction Term)
E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] mathbb{E}_{q_phi(z|x)}[log p_ heta(x|z)] Eqϕ(z∣x)[logpθ(x∣z)]
含义:从近似后验 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 采样 z z z,通过生成模型 p θ ( x ∣ z ) p_ heta(x|z) pθ(x∣z) 生成数据,评估生成数据与真实数据的匹配程度。
直观理解:类似于自编码器中的“重构误差”。如果 z z z 能生成与 x x x 很接近的 x ^ hat{x} x^,说明模型学到了数据的结构。
数学解释:这是对 log p θ ( x ∣ z ) log p_ heta(x|z) logpθ(x∣z) 的期望,衡量生成分布的似然。
在VAE中:假设 p θ ( x ∣ z ) ∼ N ( x ^ , σ 2 ) p_ heta(x|z) sim mathcal{N}(hat{x}, sigma^2) pθ(x∣z)∼N(x^,σ2),则:
log p θ ( x ∣ z ) ∝ − 1 2 σ 2 ∥ x − x ^ ∥ 2 log p_ heta(x|z) propto -frac{1}{2sigma^2} | x – hat{x} |^2 logpθ(x∣z)∝−2σ21∥x−x^∥2
这等价于均方误差(MSE)。
2. KL散度项(KL Divergence Term)
D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) D_{KL}(q_phi(z|x) | p_ heta(z)) DKL(qϕ(z∣x)∥pθ(z))
含义:衡量近似后验 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 与先验 p θ ( z ) p_ heta(z) pθ(z) 之间的差异。
直观理解:它像一个“约束”,要求 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 不偏离先验太远。如果没有这一项, q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 可能变得很随意,导致潜在空间没有规律性。
数学解释:
D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) = E q ϕ ( z ∣ x ) [ log q ϕ ( z ∣ x ) p θ ( z ) ] D_{KL}(q_phi(z|x) | p_ heta(z)) = mathbb{E}_{q_phi(z|x)}left[log frac{q_phi(z|x)}{p_ heta(z)}
ight] DKL(qϕ(z∣x)∥pθ(z))=Eqϕ(z∣x)[logpθ(z)qϕ(z∣x)]
在VAE中:假设:
先验 p θ ( z ) ∼ N ( 0 , I ) p_ heta(z) sim mathcal{N}(0, I) pθ(z)∼N(0,I)。
近似后验 q ϕ ( z ∣ x ) ∼ N ( μ , σ 2 ) q_phi(z|x) sim mathcal{N}(mu, sigma^2) qϕ(z∣x)∼N(μ,σ2)。
KL散度有解析解:
D K L ( N ( μ , σ 2 ) ∥ N ( 0 , I ) ) = 1 2 ∑ ( μ i 2 + σ i 2 − log σ i 2 − 1 ) D_{KL}(mathcal{N}(mu, sigma^2) | mathcal{N}(0, I)) = frac{1}{2} sum left( mu_i^2 + sigma_i^2 – log sigma_i^2 – 1
ight) DKL(N(μ,σ2)∥N(0,I))=21∑(μi2+σi2−logσi2−1)
两者的平衡
重构项:希望生成的数据尽量接近真实数据,强调拟合。
KL散度项:希望潜在变量的分布接近先验,强调正则化。
类比:重构项像“努力让模型记住数据”,KL散度项像“提醒模型不要太离谱,保持简单规律”。
优化ELBO是在两者之间找到平衡:
如果重构项权重过大,模型可能过拟合,潜在空间失去结构。
如果KL散度项权重过大,模型可能欠拟合,生成数据质量差。
5. ELBO在变分自编码器(VAE)中的应用
VAE是ELBO的一个经典应用场景,结合了深度学习和概率模型。我们通过VAE来进一步理解ELBO。
VAE的模型结构
VAE由两部分组成:
编码器(Encoder):
输入:数据 x x x。
输出:近似后验 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x),通常假设为高斯分布 N ( μ , σ 2 ) mathcal{N}(mu, sigma^2) N(μ,σ2)。
实现:神经网络预测均值 μ mu μ 和对数方差 log σ 2 log sigma^2 logσ2。
解码器(Decoder):
输入:潜在变量 z ∼ q ϕ ( z ∣ x ) z sim q_phi(z|x) z∼qϕ(z∣x)。
输出:生成分布 p θ ( x ∣ z ) p_ heta(x|z) pθ(x∣z),通常也是高斯分布或伯努利分布。
实现:神经网络从 z z z 生成重构数据 x ^ hat{x} x^。
如何通过ELBO训练VAE
VAE的目标是最大化ELBO:
L ( θ , ϕ ; x ) = E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] − D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) mathcal{L}( heta, phi; x) = mathbb{E}_{q_phi(z|x)}[log p_ heta(x|z)] – D_{KL}(q_phi(z|x) | p_ heta(z)) L(θ,ϕ;x)=Eqϕ(z∣x)[logpθ(x∣z)]−DKL(qϕ(z∣x)∥pθ(z))
训练步骤:
前向传播:
输入数据 x x x,通过编码器得到 μ , log σ 2 mu, log sigma^2 μ,logσ2。
从 q ϕ ( z ∣ x ) ∼ N ( μ , σ 2 ) q_phi(z|x) sim mathcal{N}(mu, sigma^2) qϕ(z∣x)∼N(μ,σ2) 采样 z z z。
通过解码器生成 x ^ ∼ p θ ( x ∣ z ) hat{x} sim p_ heta(x|z) x^∼pθ(x∣z)。
计算ELBO:
重构项:计算 log p θ ( x ∣ z ) log p_ heta(x|z) logpθ(x∣z),通常是对 x x x 和 x ^ hat{x} x^ 的损失(如均方误差或交叉熵)。
KL散度项:用解析解计算 D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) D_{KL}(q_phi(z|x) | p_ heta(z)) DKL(qϕ(z∣x)∥pθ(z))。
优化:
用梯度下降更新 θ heta θ(解码器参数)和 ϕ phi ϕ(编码器参数),最大化ELBO(即最小化负ELBO)。
重参数化技巧
直接从 q ϕ ( z ∣ x ) ∼ N ( μ , σ 2 ) q_phi(z|x) sim mathcal{N}(mu, sigma^2) qϕ(z∣x)∼N(μ,σ2) 采样会导致梯度不可导。VAE使用重参数化技巧:
z = μ + σ ⋅ ϵ , ϵ ∼ N ( 0 , I ) z = mu + sigma cdot epsilon, quad epsilon sim mathcal{N}(0, I) z=μ+σ⋅ϵ,ϵ∼N(0,I)
ϵ epsilon ϵ 是标准正态分布的随机噪声。
z z z 变成了 μ mu μ 和 σ sigma σ 的确定性函数,梯度可以传播。
直观理解:重参数化技巧就像“把随机性外包给 ϵ epsilon ϵ”,让神经网络只负责预测 μ mu μ 和 σ sigma σ,这样可以用梯度下降优化。
VAE中的ELBO例子
假设我们用VAE处理MNIST手写数字:
输入:28×28像素的图片(展平为784维向量)。
编码器:将图片映射到潜在空间,输出 μ , log σ 2 mu, log sigma^2 μ,logσ2(假设潜在维度为20)。
采样:从 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 采样 z z z。
解码器:从 z z z 生成一张28×28的图片。
ELBO:
重构项:比较生成图片和原图片的像素差异(交叉熵损失)。
KL散度项:确保 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 接近 N ( 0 , I ) mathcal{N}(0, I) N(0,I)。
6. ELBO与EM算法的关系
你提到在EM算法中也遇到过ELBO,确实,EM算法(Expectation-Maximization)和变分推断有相似的思想,都涉及优化一个下界。
EM算法的本质
EM算法用于最大化数据的边际似然 log p ( x ) log p(x) logp(x),适用于有潜在变量的模型。其步骤是:
E步(Expectation):
计算后验分布 p ( z ∣ x ) p(z|x) p(z∣x)。
计算联合分布 p ( x , z ) p(x, z) p(x,z) 在 p ( z ∣ x ) p(z|x) p(z∣x) 下的期望,形成一个下界。
M步(Maximization):
最大化这个下界,更新模型参数。
ELBO在EM算法中的体现
在EM算法中,E步实际上是在构造一个类似ELBO的目标函数。假设我们引入一个分布 q ( z ) q(z) q(z),可以证明:
log p ( x ) = L ( q , θ ) + D K L ( q ( z ) ∥ p ( z ∣ x ) ) log p(x) = mathcal{L}(q, heta) + D_{KL}(q(z) | p(z|x)) logp(x)=L(q,θ)+DKL(q(z)∥p(z∣x))
其中:
L ( q , θ ) = E q ( z ) [ log p ( x , z ) ] + H ( q ) mathcal{L}(q, heta) = mathbb{E}_{q(z)}[log p(x, z)] + H(q) L(q,θ)=Eq(z)[logp(x,z)]+H(q)
( H ( q ) H(q) H(q) 是 q ( z ) q(z) q(z) 的熵)。在EM算法中,E步设置 q ( z ) = p ( z ∣ x ) q(z) = p(z|x) q(z)=p(z∣x),使KL散度为0,从而:
L ( q , θ ) = log p ( x ) mathcal{L}(q, heta) = log p(x) L(q,θ)=logp(x)
M步则最大化这个下界,更新参数 θ heta θ。
两者的区别
EM算法:
假设 p ( z ∣ x ) p(z|x) p(z∣x) 可以精确计算(通常在简单模型中,如高斯混合模型)。
E步直接使用真实后验,KL散度为0。
变分推断:
假设 p ( z ∣ x ) p(z|x) p(z∣x) 难以计算(复杂模型,如深度神经网络)。
用参数化的 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 近似后验,优化ELBO以减小KL散度。
类比:
EM算法像“直接抄答案”,因为它能算出真实后验。
变分推断像“猜答案”,用一个简单的分布去逼近真实后验,ELBO是“评分标准”。
7. ELBO的意义与局限性
为什么是“下界”?
ELBO是 log p ( x ) log p(x) logp(x) 的下界,因为:
log p ( x ) = L ( θ , ϕ ; x ) + D K L ( q ϕ ( z ∣ x ) ∥ p ( z ∣ x ) ) log p(x) = mathcal{L}( heta, phi; x) + D_{KL}(q_phi(z|x) | p(z|x)) logp(x)=L(θ,ϕ;x)+DKL(qϕ(z∣x)∥p(z∣x))
KL散度 D K L ≥ 0 D_{KL} geq 0 DKL≥0,所以 log p ( x ) ≥ L ( θ , ϕ ; x ) log p(x) geq mathcal{L}( heta, phi; x) logp(x)≥L(θ,ϕ;x)。当 q ϕ ( z ∣ x ) = p ( z ∣ x ) q_phi(z|x) = p(z|x) qϕ(z∣x)=p(z∣x),KL散度为0,ELBO等于 log p ( x ) log p(x) logp(x)。
ELBO的优点
可优化:将复杂的积分问题转化为优化问题,适合梯度下降。
灵活性:可以与深度学习结合(如VAE),处理高维数据。
正则化:KL散度项防止过拟合,保证潜在空间的规律性。
ELBO的局限性
下界松弛:ELBO只是下界,可能无法完全逼近 log p ( x ) log p(x) logp(x),尤其当 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 的表达能力有限。
分布假设:ELBO的计算通常假设 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 和 p θ ( z ) p_ heta(z) pθ(z) 是简单分布(如高斯分布),可能不适合复杂场景。
平衡问题:重构项和KL散度项可能冲突,需要调整权重(如β-VAE)。
8. 直观例子与代码实现
直观例子
假设你在分析手写数字图片(MNIST):
数据 x x x:一张数字“7”的图片。
潜在变量 z z z:表示图片的“风格”(如笔画粗细、倾斜角度)。
目标:学会生成类似的“7”。
编码器:看图片,猜测 z z z 的分布(比如 z ∼ N ( μ , σ 2 ) z sim mathcal{N}(mu, sigma^2) z∼N(μ,σ2))。
采样:从这个分布采样一个 z z z。
解码器:用 z z z 生成一张图片 x ^ hat{x} x^。
ELBO:
重构项:比较 x ^ hat{x} x^ 和原图 x x x 的像素差异。
KL散度项:确保 z z z 的分布接近标准正态分布 N ( 0 , I ) mathcal{N}(0, I) N(0,I)。
Python代码实现
以下是一个简单的PyTorch代码,展示VAE中的ELBO计算:
import torch
import torch.nn as nn
import torch.distributions as dist
# 定义VAE模型
class VAE(nn.Module):
def __init__(self, input_dim, hidden_dim, latent_dim):
super(VAE, self).__init__()
# 编码器
self.encoder = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, 2 * latent_dim) # 输出均值和方差
)
# 解码器
self.decoder = nn.Sequential(
nn.Linear(latent_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, input_dim),
nn.Sigmoid() # 输出范围[0,1]
)
def encode(self, x):
h = self.encoder(x)
mu, log_var = h.chunk(2, dim=-1)
return mu, log_var
def reparameterize(self, mu, log_var):
std = torch.exp(0.5 * log_var)
eps = torch.randn_like(std)
return mu + eps * std
def decode(self, z):
return self.decoder(z)
def forward(self, x):
mu, log_var = self.encode(x)
z = self.reparameterize(mu, log_var)
x_recon = self.decode(z)
return x_recon, mu, log_var
# 计算ELBO
def loss_function(x, x_recon, mu, log_var):
# 重构损失(二分类交叉熵)
recon_loss = nn.functional.binary_cross_entropy(x_recon, x, reduction='sum')
# KL散度
kl_div = -0.5 * torch.sum(1 + log_var - mu.pow(2) - log_var.exp())
return recon_loss + kl_div
# 示例数据
input_dim, hidden_dim, latent_dim = 784, 256, 20
vae = VAE(input_dim, hidden_dim, latent_dim)
x = torch.randn(64, input_dim) # 批量大小64
x_recon, mu, log_var = vae(x)
loss = loss_function(x, x_recon, mu, log_var)
print(f"ELBO Loss: {
loss.item()}")
代码解释:
模型:编码器预测 μ , log σ 2 mu, log sigma^2 μ,logσ2,解码器生成重构数据。
重参数化:通过 z = μ + σ ⋅ ϵ z = mu + sigma cdot epsilon z=μ+σ⋅ϵ 采样。
损失:负ELBO = 重构损失 + KL散度。
9. 常见困惑与解答
Q1:为什么需要KL散度项?
A:KL散度项确保 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 接近先验 p θ ( z ) p_ heta(z) pθ(z),防止潜在空间变得无序。如果没有KL散度,模型可能过拟合,生成随机或无意义的 z z z。
Q2:重构项和KL散度项如何权衡?
A:两者可能冲突(重构项想拟合数据,KL散度项想简化分布)。可以引入超参数 β eta β(如β-VAE):
L = E q ϕ ( z ∣ x ) [ log p θ ( x ∣ z ) ] − β D K L ( q ϕ ( z ∣ x ) ∥ p θ ( z ) ) mathcal{L} = mathbb{E}_{q_phi(z|x)}[log p_ heta(x|z)] – eta D_{KL}(q_phi(z|x) | p_ heta(z)) L=Eqϕ(z∣x)[logpθ(x∣z)]−βDKL(qϕ(z∣x)∥pθ(z))
β > 1 eta > 1 β>1:强调正则化,可能牺牲重构质量。
β < 1 eta < 1 β<1:强调重构,可能导致潜在空间不规律。
Q3:为什么ELBO是“下界”?
A:因为 log p ( x ) = L + D K L log p(x) = mathcal{L} + D_{KL} logp(x)=L+DKL,而 D K L ≥ 0 D_{KL} geq 0 DKL≥0。ELBO是 log p ( x ) log p(x) logp(x) 的最大可能值(当 q ϕ ( z ∣ x ) = p ( z ∣ x ) q_phi(z|x) = p(z|x) qϕ(z∣x)=p(z∣x) 时相等)。
Q4:我还是不理解推导中的期望和KL散度!
A:没关系!我们可以用一个简单的例子:
假设 z z z 是一维变量, q ϕ ( z ∣ x ) ∼ N ( μ , σ 2 ) q_phi(z|x) sim mathcal{N}(mu, sigma^2) qϕ(z∣x)∼N(μ,σ2), p θ ( z ) ∼ N ( 0 , 1 ) p_ heta(z) sim mathcal{N}(0, 1) pθ(z)∼N(0,1)。
重构项:从 q ϕ ( z ∣ x ) q_phi(z|x) qϕ(z∣x) 采样 z z z,计算 log p θ ( x ∣ z ) log p_ heta(x|z) logpθ(x∣z),取平均。
KL散度:衡量两个高斯分布的差异,公式是:
D K L = 1 2 ( μ 2 + σ 2 − log σ 2 − 1 ) D_{KL} = frac{1}{2} left( mu^2 + sigma^2 – log sigma^2 – 1
ight) DKL=21(μ2+σ2−logσ2−1)
期望和KL散度都是“平均”的概念,只不过期望是对 log p θ ( x ∣ z ) log p_ heta(x|z) logpθ(x∣z) 平均,KL散度是对分布差异的平均。
10. 总结与学习建议
总结
ELBO的核心:ELBO是变分推断中用于近似贝叶斯推断的目标函数,是 log p ( x ) log p(x) logp(x) 的下界。
组成:
重构项:确保生成数据接近真实数据。
KL散度项:正则化潜在变量分布。
应用:在VAE中,ELBO用于优化编码器和解码器,学习数据的潜在表示。
与EM算法:EM算法直接用真实后验,变分推断用近似后验,ELBO是两者的桥梁。
学习建议
动手实践:
用PyTorch或TensorFlow实现VAE,跑MNIST数据集,观察ELBO的变化。
调整 β eta β 参数,比较重构效果和潜在空间的规律性。
阅读资料:
《Auto-Encoding Variational Bayes》(Kingma & Welling, 2013):VAE的原始论文。
《Pattern Recognition and Machine Learning》(Bishop):第10章详细讲解变分推断。
进阶主题:
学习β-VAE,探索潜在空间解耦。
研究其他变分方法,如重要性加权自编码器(IWAE)。
对比VAE和GAN,理解生成模型的差异。















暂无评论内容