作者丨苏剑林
单位丨广州火焰信息科技有限公司
研究方向丨NLP,神经网络
个人主页丨kexue.fm
前几天写了文章变分自编码器VAE:原来是这么一回事,从一种比较通俗的观点来理解变分自编码器(VAE),在那篇文章的视角中,VAE 跟普通的自编码器差别不大,无非是多加了噪声并对噪声做了约束。
然而,当初我想要弄懂 VAE 的初衷,是想看看究竟贝叶斯学派的概率图模型究竟是如何与深度学习结合来发挥作用的,如果仅仅是得到一个通俗的理解,那显然是不够的。
所以我对 VAE 继续思考了几天,试图用更一般的、概率化的语言来把 VAE 说清楚。事实上,这种思考也能回答通俗理解中无法解答的问题,比如重构损失用 MSE 好还是交叉熵好、重构损失和 KL 损失应该怎么平衡,等等。
建议在阅读变分自编码器VAE:原来是这么一回事后再对本文进行阅读,本文在内容上尽量不与前文重复。
准备
在进入对 VAE 的描述之前,我觉得有必要把一些概念性的内容讲一下。
数值计算 vs 采样计算
对于不是很熟悉概率统计的读者,容易混淆的两个概念应该是数值计算和采样计算,也有读者对三味Capsule:矩阵Capsule与EM路由出现过同样的疑惑。比如已知概率密度函数 p(x),那么 x 的期望也就定义为:
如果要对它进行数值计算,也就是数值积分,那么可以选若干个有代表性的点 x0<x1<x2<⋯<xn,然后得到:
这里不讨论“有代表性”是什么意思,也不讨论提高数值计算精度的方法。这样写出来,是为了跟采样计算对比。如果从 p(x) 中采样若干个点 x1,x2,…,xn,那么我们有:
我们可以比较 (2) 跟 (3),它们的主要区别是 (2) 中包含了概率的计算而 (3) 中仅有 x 的计算,这是因为在 (3) 中 xi 是从 p(x) 中依概率采样出来的,概率大的 xi 出现的次数也多,所以可以说采样的结果已经包含了 p(x) 在里边,就不用再乘以 p(xi) 了。
更一般地,我们可以写出:
这就是蒙特卡洛模拟的基础。
KL散度及变分
我们通常用 KL 散度来度量两个概率分布 p(x) 和 q(x) 之间的差异,定义为:
KL 散度的主要性质是非负性,如果固定 p(x),那么 KL(p(x)‖‖‖q(x))=0⇔p(x)=q(x);如果固定 q(x),同样有 KL(p(x)‖‖‖q(x))=0⇔p(x)=q(x),也就是不管固定哪一个,最小化 KL 散度的结果都是两者尽可能相等。
这一点的严格证明要用到变分法,而事实上 VAE 中的 V(变分)就是因为 VAE 的推导就是因为用到了 KL 散度(进而也包含了变分法)。
当然,KL 散度有一个比较明显的问题,就是当 q(