变分自编码器(二):从贝叶斯观点出发
源起 #
前几天写了博文《变分自编码器(一):原来是这么一回事》,从一种比较通俗的观点来理解变分自编码器(VAE),在那篇文章的视角中,VAE跟普通的自编码器差别不大,无非是多加了噪声并对噪声做了约束。然而,当初我想要弄懂VAE的初衷,是想看看究竟贝叶斯学派的概率图模型究竟是如何与深度学习结合来发挥作用的,如果仅仅是得到一个通俗的理解,那显然是不够的。
所以我对VAE继续思考了几天,试图用更一般的、概率化的语言来把VAE说清楚。事实上,这种思考也能回答通俗理解中无法解答的问题,比如重构损失用MSE好还是交叉熵好、重构损失和KL损失应该怎么平衡,等等。
建议在阅读《变分自编码器(一):原来是这么一回事》后对本文进行阅读,本文在内容上尽量不与前文重复。
准备 #
在进入对VAE的描述之前,我觉得有必要把一些概念性的内容讲一下。
数值计算vs采样计算 #
对于不是很熟悉概率统计的读者,容易混淆的两个概念应该是数值计算和采样计算,也有读者在《三味Capsule:矩阵Capsule与EM路由》出现过同样的疑惑。比如已知概率密度函数
如果要对它进行数值计算,也就是数值积分,那么可以选若干个有代表性的点
这里不讨论“有代表性”是什么意思,也不讨论提高数值计算精度的方法。这样写出来,是为了跟采样计算对比。如果从
我们可以比较
更一般地,我们可以写出
这就是蒙特卡洛模拟的基础。
KL散度及变分 #
我们通常用KL散度来度量两个概率分布
KL散度的主要性质是非负性,如果固定
当然,KL散度有一个比较明显的问题,就是当
顺便说点题外话,度量两个概率分布之间的差异只有KL散度吗?当然不是,我们可以看维基百科的Statistical Distance一节,里边介绍了不少分布距离,比如有一个很漂亮的度量,我们称之为巴氏距离(Bhattacharyya distance),定义为
这个距离不仅对称,还没有KL散度的无穷大问题。然而我们还是选用KL散度,因为我们不仅要理论上的漂亮,还要实践上的可行,KL散度可以写成期望的形式,这允许我们对其进行采样计算,相反,巴氏距离就没那么容易了,读者要是想把下面计算过程中的KL散度替换成巴氏距离,就会发现寸步难行了。
本文的符号表 #
讲解VAE免不了出现大量的公式和符号,这里将部分式子的含义提前列举如下:
框架 #
这里通过直接对联合分布进行近似的方式,简明快捷地给出了VAE的理论框架。
直面联合分布 #
出发点依然没变,这里再重述一下。首先我们有一批数据样本
这里
接下来就是利用KL散度进行近似。但我一直搞不明白的是,为什么从原作《Auto-Encoding Variational Bayes》开始,VAE的教程就聚焦于后验分布
但事实上,直接来对
KL散度是我们的终极目标,因为我们希望两个分布越接近越好,所以KL散度越小越好。当然,由于现在
于是我们有
这样一来利用
注意这里的
目前最小化
你的VAE已经送达 #
到这里,我们回顾初衷——为了得到生成模型,所以我们把
再简明一点,那就是
看,括号内的不就是VAE的损失函数嘛?只不过我们换了个符号而已。我们就是要想办法找到适当的
再回顾一下整个过程,我们几乎都没做什么“让人难以想到”的形式变换,但VAE就出来了。所以,没有必要去对后验分布进行分析,直面联合分布,我们能更快捷地到达终点。
不能搞分裂~ #
鉴于
然而这种看法是不妥的,因为
事实上,这正是GAN模型中梦寐以求的——有一个总指标能够指示生成模型的训练进程,在VAE模型中天然就具备了这种能力了,而GAN中要到WGAN才有这么一个指标~
实验 #
截止上面的内容,其实我们已经完成了VAE整体的理论构建。但为了要将它付诸于实验,还需要做一些工作。事实上原论文《Auto-Encoding Variational Bayes》也在这部分做了比较充分的展开,但遗憾的是,网上很多VAE教程都只是推导到
后验分布近似 #
现在
首先,为了便于采样,我们假设
注:本来如果已知和 ,那么 最合理的估计应该是:
这其实就是EM算法中的后验概率估计的步骤,具体可以参考《从最大似然到EM算法:一致的理解方式》。但事实上,分母的积分几乎不可能完成,因此这是行不通的。所以干脆用一般的网络去近似它,这样不一定能达到最优,但终究是一个可用的近似。
具体来说,我们假设
这里的
也就是我们所说的KL loss,这在上一篇文章已经给出。
生成模型近似 #
现在只剩生成模型部分
什么?又是正态分布?是不是太过简化了?然而并没有办法,因为我们要构造一个分布,而不是任意一个函数,既然是分布就得满足归一化的要求,而要满足归一化,又要容易算,我们还真没多少选择。
伯努利分布模型 #
首先来看伯努利分布,众所周知它其实就是一个二元分布:
所以伯努利分布只适用于
这时候可以算出
这表明
正态分布模型 #
然后是正态分布,这跟
这里的
很多时候我们会固定方差为一个常数
这就出现了MSE损失函数。
所以现在就清楚了,对于二值数据,我们可以对decoder用sigmoid函数激活,然后用交叉熵作为损失函数,这对应于
采样计算技巧 #
前一节做了那么多的事情,无非是希望能
采样!
我们已经假定了
但是采样多少个才适合呢?VAE非常直接了当:一个!所以这时候
该式中的每一项,可以在把
那么最后的问题就是采样一个究竟够了吗?事实上我们会运行多个epoch,每次的隐变量都是随机生成的,因此当epoch数足够多时,事实上是可以保证采样的充分性的。我也实验过采样多个的情形,感觉生成的样本并没有明显变化。
致敬 #
这篇文章从贝叶斯理论的角度出发,对VAE的整体流程做了一个梳理。用这种角度考察的时候,我们心里需要紧抓住两个点:“分布”和“采样”——写出分布形式,并且通过采样来简化过程。
简单来说,由于直接描述复杂分布是难以做到的,所以我们通过引入隐变量来将它变成条件分布的叠加。而这时候我们对隐变量的分布和条件分布都可以做适当的简化(比如都假设为正态分布),并且在条件分布的参数可以跟深度学习模型结合起来(用深度学习来算隐变量的参数),至此,“深度概率图模型”就可见一斑了。
让我们一起致敬贝叶斯大神,以及众多研究概率图模型的大牛,他们都是真正的勇者。
转载到请包括本文地址:https://spaces.ac.cn/archives/5343
更详细的转载事宜请参考:《科学空间FAQ》
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧