本文收录在无痛的机器学习第一季。
前面我们已经见过了许多优秀的深度学习模型,它们达到了非常好的精度和效果。众人曾十分认真地分析过为什么这些模型的效果这么好,结论是深度模型的非线性拟合能力确实很强。不管曾经多么复杂的问题,一个深度模型出马,立刻把问题解决的八九不离十。VAE也是利用了这个特点,我们用深度模型去拟合一些复杂的函数,从而解决实际问题。
让我们先记住这个trick,后面我们会用到它。接下来我们要上场的是生成模型。前面我们看过的很多模型从原理上来说都是判别式模型。我们有一个等待判别的事物X,这个事物有一个类别y,我们来建立一个模型f(x;w),使得p(y|X)的概率尽可能地大,换种方法说就是让f(x;w)尽可能地接近y。
如果我们想用生成式的模型去解决这个问题,就需要利用贝叶斯公式把这个问题转换过来:
为了遵从大多数教科书上的变量用法,这里将y变成了z。当然,这个时候的z可能比上面提到的“类别”y要复杂一些。在很多的生成模型中,我们把z称作隐含变量,把X称作观测变量。一般来说,我们可以比较容易地观察到X,但是X背后的z却不那么容易见到,而很多时候X是由z构造出来的,比方说一天的天气好与坏是由很多不易观察的因素决定的。于是我们自然而然就有了一个需求,当我们拿到这些X之后,我们想知道背后的z是什么,于是乎就有了上面那个公式。
对于一些简单的问题,上面的公式还是比较容易解出的,比方说朴素贝叶斯模型,但是还是有很多模型是不易解出的,尤其当隐含变量处于一个高维度的连续空间中:
这里的积分就没那么容易搞定了。于是乎,各路大神开始想尽一切办法让上面的式子变得好解些。
这时候我们难免会冒出一个问题,既然有了判别式模型可以直接求解式子左边的那个东西,为什么非要把它变成右边那一大堆东西,搞得自己不方便解呢?其实谁都不想给自己找麻烦,可问题是右边的这一堆除了能够解这个问题,它还有一个更加高级的功能,就是根据模型随机生成X。
我们可以想想看,如果我们只拥有式子左边的p(z|X),我们想要生成一个符合某种z的X该怎么办?
- 第一步,随机一个X;
- 第二步,用p(z|X)计算概率,如果概率满足,则结束,如果不满足,返回第一步;
于是乎,用判别式模型生成X变成了人品游戏,谁也不知道自己什么时候能在第二步通过。而生成式模型就不同了,我们可以按需定制,首先确定好z,然后根据p(X|z)进行随机采样就行了,生成X的过程安全可控。
说了这么多,下面我们正式进入公式推导的部分。
Variational Inference
虽然我们鼓吹了很多生成模型的好处,但是面对等号右边那一堆东西,该束手无策还是束手无策。但是,前辈们还是想到了一些精妙的解法。既然用概率论的方法很难求出右边的东西,我们能不能做一些变换,比方说——(略显生硬地)我们用一个variational的函数q(z)去代替p(z|X)?别着急,后面我们会看到它带来的好处的。
这里的variational inference介绍的有点简单,有机会我们再详细介绍下。
既然要用q(z)这个新东西去代替p(z|X),那么我们当然希望两个东西尽可能地相近,于是乎我们选择了KL散度这个指标用来衡量两者的相近程度。由于两边都是可以看作针对z的概率分布,因此用KL散度这个指标实际上非常合适。
所以就有了:
我们做一下贝叶斯公式的变换,就得到了:
再将和z无关的项目从积分符号中拿出来,就得到了:
左右整理一下,就得到了:
好吧,其实整理了一圈,这个公式还是很乱,不过因为KL散度的特殊关系,我们还是从这个公式中看到了一丝曙光:
我们虽然不大容易求出p(X),但我们知道当X给定的情况下,p(X)是个固定值。那么如果我们希望KL(q(z)||p(z|X))尽可能地小,也就相当于让等号右边的那部分尽可能地大。其中等号右边的第一项实际上是基于q(z)的似然期望,第二项又是一个负的KL散度,所以我们可以认为,为了找到一个好的q(z),使得它和p(z|X)尽可能地相近,我们需要:
- 右边第一项的log似然的期望最大化
- 右边第二项的KL散度最小化
对于VAE之前的variation inference(中文可以翻译成变分推断),到这里我们就要开始一段全新的公式推导了。比方说我们做一个mean-field assumption(说实话我不太知道mean-field怎么翻译更直观,于是就把英文放在这里了),于是乎对于多个隐含变量组成的z,分量相互之间是独立的,于是根据这个特性,我们又可以进行进一步地公式化简。由于我们今天的主题是VAE,所以关于这部分我们就不再赘述了。这时候我们又想起了文章开头我们提到的一句话:
“VAE也是利用了这个特点,我们用深度模型去拟合一些复杂的函数”
那么是时候让这句话发挥作用了,不过关于它发挥的方法我们下回再说。
转载自https://zhuanlan.zhihu.com/p/22464764