变分下界与重参数化原理
在VAE文章中,推导过变分下界,但是感觉晦涩难懂。即使是维基百科的解释,也让人摸不着头脑。阅读了CVAE相关的文章之后,发现了一个很好的解释。
变分下界
在变分推断中,主要的目标是近似复杂的的后验分布$p(z\vert x)$。确切的说,通过利用一个简单的分布近似后验分布,本质上是把推断任务变为一个优化问题,即最小化真实后验分布与近似后验之间的KL距离
$$
\begin{aligned}
KL(q_{\phi}(z\vert x)\Vert p_{\theta}(z\vert x))=\mathbb{E}_{q_{\phi}(z\vert x)}[\frac{logq_{\phi}(z\vert x)}{logp_{\theta}(z\vert x)}]
\end{aligned}\tag{1}
$$
根据贝叶斯理论,式(1)可变为
$$
\begin{aligned}
KL(q_{\phi}(z\vert x)\Vert p_{\theta}(z\vert x))
=\mathbb{E}_{q_{\phi}(z\vert x)}[\frac{logq_{\phi}(z\vert x)p_{\theta}(x)}{logp_{\theta}(x,z)}] \\
=\mathbb{E}_{q_{\phi}(z\vert x)}[\frac{logq_{\phi}(z\vert x)}{logp_{\theta}(x,z)}]+\mathbb{E}_{q_{\phi}(z\vert x)}[logp_{\theta}(x)] \\
=-\mathbb{E}_{q_{\phi}(z\vert x)}[\frac{logp_{\theta}(x,z)}{logq_{\phi}(z\vert x)}]+\mathbb{E}_{q_{\phi}(z\vert x)}[logp_{\theta}(x)]
\end{aligned}\tag{2}
$$
式(2)的左侧中近似后验分布与后验分布之间的$KL$距离为非负,且右侧第2项由于$0\lt p_{\theta}(x)\lt1$而为负值。因此,右侧第一项为边际似然的下界:
$$
\begin{aligned}
logp_{\theta}(x)\ge\mathcal{L}(\theta,\Phi)= \\
\mathbb{E}_{q_{\phi}(z\vert x)}[-logq_{\phi}(z\vert x)+logp_{\theta}(x,z)]
\end{aligned}\tag{3}
$$
随着$\mathcal{L}(\theta,\Phi)$的增加,与边际似然相接近,$KL$距离变小,那么近似后验分布与后验分布相接近。由此,该优化问题为最大化边际似然下界,从而近似后验,也被称为证据下界(Evidence Lower BOund, ELBO)。
式(3)中ELBO可被进一步扩展为
$$
\begin{aligned}
\mathcal{L}(\theta,\Phi)=-KL(q_{\phi}(z\vert x)\Vert p_{\theta}(z))+\mathbb{E}_{q_{\phi}(z\vert x)}[logp_{\theta}(x\vert z)]
\end{aligned}\tag{4}
$$
式(4)右边第一项为近似后验与先验之间的$KL$距离,第二项为重构误差。
Tips: 证据下界是指边界似然$logp_{\theta}(x)$的下界,即数据分布的下界。推测一下,这里“证据”的含义应该指的是隐变量$z$。
重参数化
由于基于近似后验分布$q_{\Phi}(z\vert x)$采样的步骤引入了非微运算阻碍了优化过程,因此VAE作者们提出了重参数化。
这种方法引入了一个辅助噪音变量$\epsilon$,从而把隐变量$z$变为了一个确定性变量。其中,噪音变量独立于模型参数和输入数据的正态分布$\epsilon\sim\mathcal{N}(0,I)$,从而使梯度以确定性的方式流入模型,绕过了随机部分。确切的说,重参数化方法可见式(5)
$$
\begin{aligned}
\mu,{\sigma}^2=f_{enc}(x;\Phi) \\
z=\mu+\sigma\odot\epsilon,\epsilon\sim N(0,I)
\end{aligned}\tag{5}
$$
引用方法
请参考:
li,wanye. "变分下界与重参数化原理". wyli'Blog (May 2024). https://www.robotech.ink/index.php/archives/505.html
或BibTex方式引用:
@online{eaiStar-505,
title={变分下界与重参数化原理},
author={li,wanye},
year={2024},
month={May},
url="https://www.robotech.ink/index.php/archives/505.html"
}