**
** 写在最前面:本文中间有很多细节东西没讲,公式我也没有贴出来,写这个太累了,本来VAE涉及的知识就很多,但是大致思想我应该是讲清楚了的。
在这个GAN大行其道的时代,变分自编码器作为一种经典的生成模型(GAN有模型坍塌问题,咱们VAE就没有),好像没有必要存在了,其实不然,变分自编码器仍有其很大的价值,也广泛各种方向。经过了几天的学习和思考,特整理出此笔记,主要参考文献在本文末尾给出。网上也有很多博客,但其实那些博客里有很多细节东西没有讲清,或者有很多东西连博主都没有搞懂。毕竟VAE涉及的东西还是很多的。本文或许有诸多纰漏,希望能够得到读者的指正,谢谢。
图里面的细节不懂别想啦,把这篇文章看完了就懂了。对比着图可解释:我们首先给输入一张图片给进编码器(其实就是一个神经网络),之后通过编码器得到满足这张图片的高斯分布的均值和方差(为什么?稍后我们解释这个神经网络的作用),然后在这个高斯分布中进行采样得到样本,之后将这个样本送入解码器(神经网络)中,就得到解码后的图片啦。之后我们就可以利用解码器,直接从之前所得那个分布(其实是标准的正态分布,为什么?且看下文)里进行采样,送入Decoder里,就可以得到一张我们没有见过的图片啦。 呃,有点乱,那我们就从头开始讲吧。
说清隐变量这个问题其实还是很不容易的,主要是有点抽象。对于我们有的这些图片,我们假设我们的图片经过某一个变换以后,到一个新空间X(咳咳,凑活着用X代替吧)中,那么每一个我们观测到的图片都在X中有个对应的向量和它对应对不对?那么我们其实就可以把X称为隐空间,隐空间的变量就成为隐变量,每一个向量都有一张对应的图片。也可以说,我们的每张图片都是由X生成的。于是乎,我们只要有了X这个空间,就可以生成任意一张图片了。 如上图,我们的隐变量是z,z生成x。(其实这是VAE的图,我们后来再说)
首先我们只有图片的样本,假设这些图片都是人脸,我们希望能够生成任意一张从未在样本里出现过的人脸。怎么做呢?很简单,我们只要知道这些人脸的分布不就行了嘛。假设符合P(X),然后我们直接在这个分布中采样生成新的人脸就行。但是,不幸的是,我们只有样本,确定不了其符合的分布(这么复杂的分布,虽然存在,但就是求不出来哈哈哈)。可是我们不能放弃,于是乎,将P(X)改写一下: 呐,如上图中的公式那样,我们引入一个变量z符合一个已知的简单分布,然后我们由z确定我们的x,最后对z进行积分,一样能得到P(X)。好像很简单哎,我们最大化一个具体的X出现的概率,转换成最大化积分里面的条件概率就行了。而且,从蒙特卡罗采样最基本的原理我们知道,上式可以近似下面的的这种形式: 上式意味着我们每次从z中采样,重复n次最后一样可以近似P(X)。很简单吧,然而不幸的是,我们需要采样非常多次才能近似上式,特别是我们图片的特征维度贼高的情况下,n趋于无穷才好。唉,成功的道路就是这么曲折,不过我们总是可以去克服。于是我们不从z中采样,我们从一个最可能生成x的分布中采样不就行了吗?什么分布最可能生成x呢?当然是由x确定的z啊。即 哈哈哈,是不是恍然大悟了。我们找到后验分布P(z|X),然后从这里面采样z不就可以了吗?这样就可以大大减少采样次数了。 于是乎,我们的目的就是找到P(z|X)和P(X)之间的关系了。如何找?就用到了我们的变分贝叶斯法。我们在下文来说。
首先我们知道P(z|X)是一个我们不知道的复杂的后验分布,于是我们找一个我们已知的简单分布Q(一般我们假设是一个高斯分布)近似它。用我们的KL散度来衡量两个分布间的差异。得到下式: 进一步化简得到下式记为(1): 其实要知道EM算法的话,和那个开始推到是一样的。上式右边第一项我们称为变分下界(和ELBO一样的,当然也可以称为ELBO)。仔细看上式,右边第一项(变分下届)不就是我们的P(X|z)*Q(z|X)嘛,即我们生成X最大的概率。右端第二项是我们的后验Q(z|X)(上式中的Q(z))和我们的先验z的差异嘛,我们最大化左边,就是最小化这个D(Q||P),这说明什么。说明我们训练好一个模型之后,生成图片的化直接从我们简单的先验分布P(z)里进行采样生成就行了。 所以说,上式右边第一项就可以对应我们的解码器Decoder,右边第二项对应我们的编码器Encoder。 而且第二项有一个闭式解(自己推推吧,比较好): ‘ 之后我们就可以训练我们的网络了。
我们基本上知道了什么是VAE,但是这里面有个小trick,就是我们在训练的时候是从z中采样,但是这个采样的过程不可导啊,这意味着我们不能进行反向传播训练我们的模型,咋办,我们就用了这个trick。 我们从利用上面的式子进行模拟采样,(反正z都是符合Q(z|X)的均值和方差的),可导了,完美,这样我们就可以实现端到端了。最终我们从标准正态分布采样就行了。
我们来回顾一下我们的整个结构,训练阶段我们从X经过Encoder得到后验分布Q(z|X),然后从这个分布里采样到Decoder里得到图片。生成图片时,我们从标准的正态分布采样送到Decoder就可以生成新图片。 最后我们假设我们的Decoder训练的分布是正态分布的话,那么我们就有一个MSE损失。
VAE实现还是很简单的,代码Github里遍地都是。 放张我生成的手写体数字图片吧,不得不说,VAE生成的真的是比GAN模糊。。。
罢了,就到这吧。
参考文献 [1]:Doersch C . Tutorial on Variational Autoencoders[J]. 2016. [2]:Kingma D P , Welling M . Auto-Encoding Variational Bayes[J]. 2013.
