变分自编码器是一种生成模型

参考文献苏剑林. (2018, Mar 18). 《变分自编码器(一):原来是这么一回事 》
流程
给定一个数据集 X(其中X={x1,x2,⋯,xn}),和GAN一样,都希望求出X概率分布p(X)。我们可以直接在概率分布中采样,得到(生成)所有的我们想要的数据(包括数据集里没有的数据)。
但是概率分布p(X)很难求出,所以我们希望借助隐变量Z,间接求出X。假设隐变量Z服从某个常见的分布q(Z),并且存在某个映射X=g(Z)(映射也可看做条件概率分布q(X∣Z)),能够将Z变换成X。 那么我们就可以直接在分布q(Z),随机采样一个zi,根据映射得到一个xi=g(zi)。
此时,X的分布可以表示为
q(X)=∫q(X,Z)dZ=∫q(X∣Z)q(Z)dZ
其中q(X,Z)=q(X∣Z)q(Z),即假设了联合概率分布存在,且q(Z)是边缘分布q(⋅,Z),同理q(X)=q(X,⋅)
我们希望在这个过程中,生成的x能够与数据集中某张图片非常像,甚至一模一样。但是这个由随机采样zi生成的x?应该和谁对比呢?
我们假设x?与数据集中样本xi相关,即算loss函数时,应对比x?与xi之间的差异。如此一来,样本xi也必须和zi,甚至分布q(Z)产生联系,才能保证x?对应到xi
所以假设数据集X的真实分布为p(X),从分布p(X),随机采样一个点xi。我们可以求得一个专属于xi的分布p(Z∣xi),在分布p(Z∣xi)随机采样一个点z^i。
此时Zi的分布可以表示为:
p(Zi)=∫p(Z∣xi)p(X)dX
总结:变分自编码器流程如下
编码过程:在数据集中取样本xi(其中数据集的分布为p(X),求出专属于xi的分布p(Z∣xi),在分布p(Z∣xi)随机采样一个点z^i。其中p(Zi)=∫p(Z∣xi)p(X)dX
解码过程:在隐变量分布q(Z)中,随机采样zi。通过映射X=g(Z),即分布q(X∣Z),得到样本近似x^i。其中q(X)=∫q(X,Z)dZ=∫q(X∣Z)q(Z)dZ
推导
从上述流程我们可以看出:我们要让q(Z)和p(Z∣xi)一样,才能保证随机采样的过程可靠。要让q(X)=p(X),才能保证生成的图片足够真实
回顾一下主要目的:借助隐变量q(Z),求出数据的真实分布p(X)。即用解码过程中求出的q(X)去逼近真实分布p(X)。在此过程中还需要保证隐变量采样的一致。
编码过程
给定一个真实样本xi,利用神经网络求得一个专属于xi的分布p(Z∣xi)。假设这个专属的分布属于正态分布(独立,多元)。其中专属是因为我们要从这个分布中采样一个隐变量zi,用它去拟合xi。
正态分布仅需要两个变量μi,δi,所以构造两个神经网络f1,f2计算专属于xi的μi,δi就可以了。μi=f1(xi),δi=f2(xi),p(Z∣xi)=N(μi,δi)
在解码的过程中,我们希望生成的x^i与xi的重构误差尽可能的小,即D(x^i,xi)→0. 但由于噪声(隐变量)zi是从p(Z∣xi)中采样得到(也可以说是从q(Z)中采样,这里不做区分,下面再讲)。
它的随机性会给网络造成很大困难。为了让网络拟合得更好,网络趋向于让δi→0,即噪声zi的变化趋于0.此时每次采样的结果就一模一样了。相当于网络只拟合了一个,生成能力差。
所以为了提高生成能力要让δi尽量大,而为了让网络尽快收敛,又要让δi趋于0,这么就有了对抗。
最终,我们期望δi趋于1,μi趋于0,即N(μi,δi)≈N(0,1).所以
p(Z)=∫Xp(Z,X)dX=∫Xp(Z∣X)p(X)dX=X∑p(Z∣X)p(X)=X∑N(0,1)p(X)=N(0,1)X∑p(X)=N(0,1)
上式表明,如果p(Z∣xi)=N(0,1),则p(Z)=N(0,1).
编码过程实际上是将真实分布p(X)映射到标准正态分布。
如何衡量p(Z∣xi)与N(0,1)之间的差异呢?采用KL散度:
KL(p(Z∣xi)∣∣N(0,1))=KL(N(μi,δi)∣∣N(0,1))=21i∑(μi2+δi2−logδi2−1)
解码过程
从隐变量分布q(Z)中采样zi。为了让编码过程和解码过程一致,则让q(Z)和p(Z∣xi)一样。在开始我们假设隐变量Z服从某个常见的分布,方便采样。这里假设q(Z)=N(0,1)。所以q(Z)=p(Z∣xi)=N(0,1)。这就是为什么前面要让p(Z∣xi)等于正态分布的原因。
之后,使用神经网络x^i=g(zi): 将zi映射成x^i。神经网络g(Z),也可以表示为q(X∣Z)。所以有:
q(X)=∫q(X,Z)dz=∫q(X∣Z)q(Z)dz
为了让x^i→xi,我们要求q(X)→p(X)
Loss
编码过程有p(Z,X)=p(Z∣X)p(X) ,所以
p(X)=∫p(X,Z)dz=∫p(X∣Z)p(Z)dz
解码过程有
q(X)=∫q(X,Z)dz=∫q(X∣Z)q(Z)dz
有上面两个式子:当q(X,Z)→p(X,Z)时,有q(X)→p(X)
用KL散度衡量q(X,Z)和p(X,Z)之间的差异:
KL(p(X,Z)∣∣q(X,Z))=∫p(X)[∫p(Z∣X)lnq(X,Z)p(X)p(Z∣X)dz]dx
=Ex∼p(X)[Ex∼p(Z∣X)[−lnq(X∣Z)]+KL(p(Z∣X)∣∣q(Z))]
释疑
为啥是p和q
vae分为两个过程,编码过程和解码过程
编码过程有真实样本X生成隐变量Z。 描述这个过程用联合分布p(X,Z)来表达。
编码过程用条件分布表示p(Z∣X)。
真实样本X的分布用边缘概率p(X,⋅)表示,其中p(X,⋅)=∫p(X,Z)dz。文中简写为p(X)
这就是为什么编码过程p(Z∣X)和真实样本X的分布p(X)都用p表示
p(Z)和q(Z)
同样的,编码由联合概率p(X,Z)表达,由X生成隐变量的Z的分布 用p(Z)表示。
而在解码中,Z在q(Z)中采样得到,整个过程用q(Z,X)描述。
这就是为什么Z有两个分布的原因:一个是生成出来的属于p(Z)分布,一个是设定好的属于q(Z)分布。最终我们要让p(Z)趋近于q(Z)
同理可得p(X)和q(X)