变分自编码器

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/fuyouzhiyi/article/details/91127504

变分自编码器是一种生成模型
在这里插入图片描述
参考文献苏剑林. (2018, Mar 18). 《变分自编码器(一):原来是这么一回事 》

流程

给定一个数据集 XX(其中X={x1,x2, ,xn}X=\{x_1, x_2, \cdots,x_n\}),和GAN一样,都希望求出XX概率分布p(X)p(X)。我们可以直接在概率分布中采样,得到(生成)所有的我们想要的数据(包括数据集里没有的数据)。

但是概率分布p(X)p(X)很难求出,所以我们希望借助隐变量ZZ,间接求出XX。假设隐变量ZZ服从某个常见的分布q(Z)q(Z),并且存在某个映射X=g(Z)X=g(Z)(映射也可看做条件概率分布q(XZ)q(X|Z)),能够将ZZ变换成XX。 那么我们就可以直接在分布q(Z)q(Z),随机采样一个ziz_i,根据映射得到一个xi=g(zi)x_i=g(z_i)

此时,XX的分布可以表示为
q(X)=q(X,Z)dZ=q(XZ)q(Z)dZq(X)=\int q(X,Z) \mathrm{d}Z=\int q(X|Z)q(Z) \mathrm{d}Z
其中q(X,Z)=q(XZ)q(Z)q(X,Z)= q(X|Z)q(Z),即假设了联合概率分布存在,且q(Z)q(Z)是边缘分布q(,Z)q(\cdot ,Z),同理q(X)=q(X,)q(X)=q(X,\cdot)

我们希望在这个过程中,生成的xx能够与数据集中某张图片非常像,甚至一模一样。但是这个由随机采样ziz_i生成的x?x_?应该和谁对比呢?

我们假设x?x_?与数据集中样本xix_i相关,即算loss函数时,应对比x?x_?xix_i之间的差异。如此一来,样本xix_i也必须和ziz_i,甚至分布q(Z)q(Z)产生联系,才能保证x?x_?对应到xix_i

所以假设数据集XX的真实分布为p(X)p(X),从分布p(X)p(X),随机采样一个点xix_i。我们可以求得一个专属于xix_i的分布p(Zxi)p(Z|x_i),在分布p(Zxi)p(Z|x_i)随机采样一个点z^i\hat z_i
此时ZiZ_i的分布可以表示为:
p(Zi)=p(Zxi)p(X)dXp(Z_i)=\int p(Z|x_i)p(X)\mathrm{d}X

总结:变分自编码器流程如下
编码过程:在数据集中取样本xix_i(其中数据集的分布为p(X)p(X),求出专属于xix_i的分布p(Zxi)p(Z|x_i),在分布p(Zxi)p(Z|x_i)随机采样一个点z^i\hat z_i。其中p(Zi)=p(Zxi)p(X)dXp(Z_i)=\int p(Z|x_i)p(X)\mathrm{d}X

解码过程:在隐变量分布q(Z)q(Z)中,随机采样ziz_i。通过映射X=g(Z)X=g(Z),即分布q(XZ)q(X|Z),得到样本近似x^i\hat x_i。其中q(X)=q(X,Z)dZ=q(XZ)q(Z)dZq(X)=\int q(X,Z) \mathrm{d}Z=\int q(X|Z)q(Z) \mathrm{d}Z

推导

从上述流程我们可以看出:我们要让q(Z)q(Z)p(Zxi)p(Z|x_i)一样,才能保证随机采样的过程可靠。要让q(X)=p(X)q(X)=p(X),才能保证生成的图片足够真实

回顾一下主要目的:借助隐变量q(Z)q(Z),求出数据的真实分布p(X)p(X)。即用解码过程中求出的q(X)q(X)去逼近真实分布p(X)p(X)。在此过程中还需要保证隐变量采样的一致。

编码过程

给定一个真实样本xix_i,利用神经网络求得一个专属于xix_i的分布p(Zxi)p(Z|x_i)。假设这个专属的分布属于正态分布(独立,多元)。其中专属是因为我们要从这个分布中采样一个隐变量ziz_i,用它去拟合xix_i
正态分布仅需要两个变量μi,δi\mu_i,\delta_i,所以构造两个神经网络f1,f2f_1,f_2计算专属于xix_iμi,δi\mu_i,\delta_i就可以了。μi=f1(xi)  ,  δi=f2(xi)  ,  p(Zxi)=N(μi,δi)\mu_i=f_1(x_i)\;,\;\delta_i=f_2(x_i)\;,\; p(Z|x_i)=N(\mu_i,\delta_i)

在解码的过程中,我们希望生成的x^i\hat x_ixix_i的重构误差尽可能的小,即D(x^i  ,  xi)0D(\hat x_i\;,\;x_i) \to 0. 但由于噪声(隐变量)ziz_i是从p(Zxi)p(Z|x_i)中采样得到(也可以说是从q(Z)q(Z)中采样,这里不做区分,下面再讲)。

它的随机性会给网络造成很大困难。为了让网络拟合得更好,网络趋向于让δi0\delta_i\to 0,即噪声ziz_i的变化趋于0.此时每次采样的结果就一模一样了。相当于网络只拟合了一个,生成能力差。

所以为了提高生成能力要让δi\delta_i尽量大,而为了让网络尽快收敛,又要让δi\delta_i趋于0,这么就有了对抗。
最终,我们期望δi\delta_i趋于1,μi\mu_i趋于0,即N(μi,δi)N(0,1)N(\mu_i,\delta_i) \approx N(0,1).所以
p(Z)=Xp(Z,X)dX=Xp(ZX)p(X)dX=Xp(ZX)p(X)p(Z)=\int_X p(Z,X)\mathrm{d}X=\int_Xp(Z|X)p(X)\mathrm{d}X=\sum_Xp(Z|X)p(X)=XN(0,1)p(X)=N(0,1)Xp(X)=N(0,1)=\sum_X N(0,1)p(X)=N(0,1)\sum_Xp(X)=N(0,1)
上式表明,如果p(Zxi)=N(0,1)p(Z|x_i)=N(0,1),则p(Z)=N(0,1)p(Z)=N(0,1).
编码过程实际上是将真实分布p(X)p(X)映射到标准正态分布。

如何衡量p(Zxi)p(Z|x_i)N(0,1)N(0,1)之间的差异呢?采用KL散度:
KL(p(Zxi)N(0,1))=KL(N(μi,δi)N(0,1))=12i(μi2+δi2logδi21)KL(p(Z|x_i)||N(0,1))=KL(N(\mu_i,\delta_i)||N(0,1))=\frac12 \sum_i(\mu_i^2+\delta_i^2-\log \delta_i^2-1)

解码过程

从隐变量分布q(Z)q(Z)中采样ziz_i。为了让编码过程和解码过程一致,则让q(Z)q(Z)p(Zxi)p(Z|x_i)一样。在开始我们假设隐变量ZZ服从某个常见的分布,方便采样。这里假设q(Z)=N(0,1)q(Z)=N(0,1)。所以q(Z)=p(Zxi)=N(0,1)q(Z)=p(Z|x_i)=N(0,1)。这就是为什么前面要让p(Zxi)p(Z|x_i)等于正态分布的原因。

之后,使用神经网络x^i=g(zi)\hat x_i=g(z_i): 将ziz_i映射成x^i\hat x_i。神经网络g(Z)g(Z),也可以表示为q(XZ)q(X|Z)。所以有:
q(X)=q(X,Z)dz=q(XZ)q(Z)dzq(X)=\int q(X,Z)\mathrm{d}z=\int q(X|Z)q(Z)\mathrm{d} z
为了让x^ixi\hat x_i \to x_i,我们要求q(X)p(X)q(X) \to p(X)

Loss

编码过程有p(Z,X)=p(ZX)p(X)p(Z,X)=p(Z|X)p(X) ,所以
p(X)=p(X,Z)dz=p(XZ)p(Z)dzp(X)=\int p(X,Z)\mathrm{d}z=\int p(X|Z)p(Z)\mathrm{d}z
解码过程有
q(X)=q(X,Z)dz=q(XZ)q(Z)dzq(X)=\int q(X,Z)\mathrm{d}z=\int q(X|Z)q(Z)\mathrm{d} z
有上面两个式子:当q(X,Z)p(X,Z)q(X,Z) \to p(X,Z)时,有q(X)p(X)q(X) \to p(X)
用KL散度衡量q(X,Z)q(X,Z)p(X,Z)p(X,Z)之间的差异:
KL(p(X,Z)q(X,Z))=p(X)[p(ZX)lnp(X)p(ZX)q(X,Z)dz]dxKL(p(X,Z)||q(X,Z))=\int p(X)\left [\int p(Z|X) \ln \frac{p(X)p(Z|X)}{q(X,Z)} \mathrm{d} z\right] \mathrm{d} x
=Exp(X)[Exp(ZX)[lnq(XZ)]+KL(p(ZX)q(Z))]=\mathbb{E}_{x \sim p(X)} \left [ \mathbb{E}_{x \sim p(Z|X)} [- \ln q(X|Z)] +KL(p(Z|X)||q(Z)) \right]

释疑

为啥是p和q

vae分为两个过程,编码过程和解码过程

编码过程有真实样本XX生成隐变量ZZ。 描述这个过程用联合分布p(X,Z)p(X,Z)来表达。
编码过程用条件分布表示p(ZX)p(Z|X)
真实样本XX的分布用边缘概率p(X,)p(X,\cdot)表示,其中p(X,)=p(X,Z)dzp(X,\cdot)=\int p(X,Z) \mathrm{d} z。文中简写为p(X)p(X)
这就是为什么编码过程p(ZX)p(Z|X)和真实样本XX的分布p(X)p(X)都用pp表示

p(Z)和q(Z)

同样的,编码由联合概率p(X,Z)p(X,Z)表达,由XX生成隐变量的ZZ的分布 用p(Z)p(Z)表示。
而在解码中,ZZq(Z)q(Z)中采样得到,整个过程用q(Z,X)q(Z,X)描述。
这就是为什么ZZ有两个分布的原因:一个是生成出来的属于p(Z)p(Z)分布,一个是设定好的属于q(Z)q(Z)分布。最终我们要让p(Z)p(Z)趋近于q(Z)q(Z)
同理可得p(X)p(X)q(X)q(X)

展开阅读全文

没有更多推荐了,返回首页