变分自编码器(二):从贝叶斯观点出发

发布时间:2026/8/20 3:39:55
变分自编码器(二):从贝叶斯观点出发 源起前几天写了博文《变分自编码器(一):原来是这么一回事》,从一种比较通俗的观点来理解变分自编码器(VAE),在那篇文章的视角中,VAE跟普通的自编码器差别不大,无非是多加了噪声并对噪声做了约束。然而,当初我想要弄懂VAE的初衷,是想看看究竟贝叶斯学派的概率图模型究竟是如何与深度学习结合来发挥作用的,如果仅仅是得到一个通俗的理解,那显然是不够的。所以我对VAE继续思考了几天,试图用更一般的、概率化的语言来把VAE说清楚。事实上,这种思考也能回答通俗理解中无法解答的问题,比如重构损失用MSE好还是交叉熵好、重构损失和KL损失应该怎么平衡,等等。建议在阅读《变分自编码器(一):原来是这么一回事》后对本文进行阅读,本文在内容上尽量不与前文重复。准备在进入对VAE的描述之前,我觉得有必要把一些概念性的内容讲一下。数值计算vs采样计算对于不是很熟悉概率统计的读者,容易混淆的两个概念应该是数值计算和采样计算,也有读者在《三味Capsule:矩阵Capsule与EM路由》出现过同样的疑惑。比如已知概率密度函数p(x)p(x)p(x),那么xxx的期望也就定义为E[x]=∫xp(x) dx(1) \mathbb{E}[x] = \int xp(x)\,dx \tag{1}E[x]=∫xp(x)dx(1)如果要对它进行数值计算(数值积分),那么可以选若干个有代表性的点x0x1x2⋯xnx_0 x_1 x_2 \cdots x_nx0​x1​x2​⋯xn​,然后得到E[x]≈∑i=1nxip(xi)(xi−xi−1)(2) \mathbb{E}[x] \approx \sum_{i=1}^{n} x_i p(x_i)(x_i-x_{i-1}) \tag{2}E[x]≈i=1∑n​xi​p(xi​)(xi​−xi−1​)(2)这里不讨论“有代表性”是什么意思,也不讨论提高数值计算精度的方法。这样写出来,是为了跟采样计算对比。如果从p(x)p(x)p(x)中采样若干个点x1,x2,…,xnx_1,x_2,\ldots,x_nx1​,x2​,…,xn​,那么我们有E[x]≈1n∑i=1nxi,xi∼p(x)(3) \mathbb{E}[x] \approx \frac{1}{n}\sum_{i=1}^{n}x_i,\qquad x_i\sim p(x) \tag{3}E[x]≈n1​i=1∑n​xi​,xi​∼p(x)(3)我们可以比较(2)跟(3),它们的主要区别是(2)中包含了概率的计算而(3)中仅有xxx的计算,这是因为在(3)中xix_ixi​是从p(x)p(x)p(x)中依概率采样出来的,概率大的xix_ixi​出现的次数也多,所以可以说采样的结果已经包含了p(x)p(x)p(x)在里边,就不用再乘以p(xi)p(x_i)p(xi​)了。更一般地,我们可以写出Ex∼p(x)[f(x)]=∫f(x)p(x) dx≈1n∑i=1nf(xi),xi∼p(x)(4) \mathbb{E}_{x\sim p(x)}[f(x)] = \int f(x)p(x)\,dx \approx \frac{1}{n}\sum_{i=1}^{n}f(x_i),\qquad x_i\sim p(x) \tag{4}Ex∼p(x)​[f(x)]=∫f(x)p(x)dx≈n1​i=1∑n​f(xi​),xi​∼p(x)(4)这就是蒙特卡洛模拟的基础。KL散度及变分我们通常用KL散度来度量两个概率分布p(x)p(x)p(x)和q(x)q(x)q(x)之间的差异,定义为KL(p(x)∥q(x))=∫p(x)ln⁡p(x)q(x) dx=Ex∼p(x)[ln⁡p(x)q(x)](5) KL\bigl(p(x)\Vert q(x)\bigr) = \int p(x)\ln\frac{p(x)}{q(x)}\,dx = \mathbb{E}_{x\sim p(x)}\left[\ln\frac{p(x)}{q(x)}\right] \tag{5}KL(p(x)∥q(x))=∫p(x)lnq(x)p(x)​dx=Ex∼p(x)​[lnq(x)p(x)​](5)KL散度的主要性质是非负性,如果固定p(x)p(x)p(x),那么KL(p(x)∥q(x))=0⇔p(x)=q(x) KL\bigl(p(x)\Vert q(x)\bigr)=0 \Leftrightarrow p(x)=q(x)KL(p(x)∥q(x))=0⇔p(x)=q(x);如果固定q(x)q(x)q(x),同样有KL(p(x)∥q(x))=0⇔p(x)=q(x) KL\bigl(p(x)\Vert q(x)\bigr)=0 \Leftrightarrow p(x)=q(x)KL(p(x)∥q(x))=0⇔p(x)=q(x),也就是不管固定哪一个,最小化KL散度的结果都是两者尽可能相等。这一点的严格证明要用到变分法,而事实上VAE中的V(变分)就是因为VAE的推导就是因为用到了KL散度(进而也包含了变分法)。当然,KL散度有一个比较明显的问题,就是当q(x)q(x)q(x)在某个区域等于0,而p(x)p(x)p(x)在该区域不等于0,那么KL散度就出现无穷大。这是KL散度的固有问题,我们只能想办法规避它,比如隐变量的先验分布我们用高斯分布而不是均匀分布,原因便在此,这一点我们在前文《变分自编码器(一):原来是这么一回事》中也提到过了。顺便说点题外话,度量两个概率分布之间的差异只有KL散度吗?当然不是,我们可以看维基百科的 Statistical Distance 一节,里边介绍了不少分布距离,比如有一个很漂亮的度量,我们称之为巴氏距离(Bhattacharyya distance),定义为DB(p(x),q(x))=−ln⁡∫p(x)q(x) dx(6) D_B\bigl(p(x),q(x)\bigr) = -\ln\int\sqrt{p(x)q(x)}\,dx \tag{6}DB​(p(x),q(x))=−ln∫p(x)q(x)​dx(6)这个距离不仅对称,还没有KL散度的无穷大问题。然而我们还是选用KL散度,因为我们不仅要理论上的漂亮,还要实践上的可行,KL散度可以写成期望的形式,这允许我们对其进行采样计算,相反,巴氏距离就没那么容易了,读者要是想把下面计算过程中的KL散度替换成巴氏距离,就会发现寸步难行了。本文的符号表讲解VAE免不了出现大量的公式和符号,这里将部分式子的含义提前列举如下:符号含义xk,zkx_k,z_kxk​,zk​表示随机变量x,zx,zx,z的第kkk个样本x(k),z(k)x_{(k)},z_{(k)}x(k)​,z(k)​表示多元变量x,zx,zx,z的第kkk个分量Ex∼p(x)[f(x)]\mathbb{E}_{x\sim p(x)}[f(x)]Ex∼p(x)​[f(x)]表示对f(x)f(x)f(x)算期望,其中xxx的分布为p(x)p(x)p(x)KL(p(x)∥q(x))KL\bigl(p(x)\Vert q(x)\bigr)KL(p(x)∥q(x))两个分布的KL散度∥x∥2\lVert x\rVert^2∥x∥2向量xxx的l2l^2l2范数,也就是我们通常说的模长的平方L\mathcal{L}L本文的损失函数的符号D,dD,dD,dDDD是输入xxx的维度,dd