VAE(3)——公式与实现
前面两部分我们已经扫除了一些基本概念上的障碍,下面我们来直奔主题——VAE!
由于文章是一篇一篇写的,所以照顾到大家观看的情况,我们把前面介绍过的一些重要公式搬过来。
首先是系列第一篇的公式——多维高斯分布的KL散度计算公式:
希望大家还有印象,如果没有印象就赶紧翻回去看看吧!
然后是上一回有关variational inference的推导公式:
还有上次的一句话:
“VAE也是利用了这个特点,我们用深度模型去拟合一些复杂的函数”
好吧……专栏写成我这样也是醉了。为了保证每一篇文章的字数不要太长以至于让大家失去了看下去的耐心,这篇文章光是回顾已经花去了好大的篇幅。
好了,下面就是见证奇迹的时刻。
Variational Autoencoder
终于要见到正主了。让我们关注一下variational inference公式的右边,在此之前我们要对公式进行一定的变化,然后给出我们的详细建模过程。
Reparameterization Trick
为了更加方便地求解上面的公式,这里我们需要做一点小小的trick工作。上面提到了Q'(z|X)这个变分函数,它代表了当我们给定某个X的情况下z的分布情况。我们可以想象这里的z是满足某种分布的。那么我们从数值上可以把X抽离出来呢?
比方说我们有一个随机变量a服从高斯分布N(1,1),根据定理我们可以定义一个随机变量b=a-1,那么它将服从高斯分布N(0,1),换句话说,我们可以用一个均值为0,方差为1的随机变量加上1来表示现在的随机变量a。这样我们就把一个随机变量分成了两部分——一部分是确定的,一部分是随机的。
对于上面的Q'(z|X),我们同样可以采用上面的方法完成。我们可以把一个服从这个条件概率的z拆分成两部分,一部分是一个复杂的函数
它解决了确定部分的问题,我们再定义另外一个随机变量
它负责随机的部分。为了书写的一致性,我们用
来表示服从条件概率的z。
这样做有什么好处呢?现在我们知道了z条件概率值完全取决于生成它所使用的
的概率。也就是说如果
那么上面关于变分推导的公式也就变成了下面的公式:
这就是替换的一小步,求解的一大步!实际上到了这里,我们已经接近问题最终的答案了,剩下的只是我们的临门一脚——我们可不可以假设这个随机部分服从什么样的分布呢?
当然能!不过由于我们一般把z的先验假设成一个多维的独立高斯分布,为了KL计算的方便,也为了我们在前面的章节推导2个多维高斯分布的KL散度这件事情没有白做,我们决定在这里让这个替换后的随机部分同样服从多维的独立高斯分布。
下面我们来看看这个公式的两部分具体该如何计算。
右边的第二项,KL散度部分——encoder
首先来看看公式右边的第二项。刚才我们提到我们一般把z的先验假设成一个多维的独立高斯分布,这里我们可以给出一个更强的假设,那就是这个高斯分布的均值为0,方差为单位矩阵,那么我们前面提到的KL散度公式就从:
瞬间简化成为:
真的有种世界清静了的感觉……我们下面的目标就是利用encoder的部分根据X求解z的均值方差。这部分我们采用一个深度的神经网络就可以了。由于实际训练过程中我们采用的是batch的训练方法,因此我们需要输入一个batch的X信息,然后进行模型的计算和优化。
如果我们用一个向量
来表示上面协方差矩阵的主对角线,情况将会更加美好:
到这里,关于这一部分的函数拟合已经比较清晰了,我们的函数输入输出已经非常清楚,我们的loss也化简到了一个比较简单的状态,下面就是具体的计算了。
右边的第一项,期望部分——decoder
从前面的KL散度公式优化中,我们可以看到,如果两个概率分布的KL散度值为0时,实际上就说明我们的随机部分的分布和我们z的先验分布相同了。
这带来一个好消息,就是我们可以直接使用上一步encoder得到的均值方差。这样,我们就需要另外一个深度函数decoder,帮助我们从z再变回X。前面我们说了我们的目标是最大化似然的期望,实际上就可以转换为采样一批X,先用encoder生成z‘的分布,然后通过优化使得p(X|z)的似然最大化。高教帮
关于如何最大化似然,我们有很多办法,这一部分将在实践的环节详细给出。
好了,到这里,实际上VAE的核心计算推导就结束了。我们已经花了3篇文章的时间把这个模型讲完了,怎么可以就这样结束呢?下一回我们来看看一个实现的代码,同时来看看基于经典VAE演变的一些模型是什么样子。