理解:用变分推断统一理解深度生成模型(VAE、GAN、AAE、ALI(BiGAN))

参考文章:https://kexue.fm/archives/5716

https://zhuanlan.zhihu.com/p/40282714

本篇博客主要是参照上述两个博文,另外加入了一些自己的理解,也为了和自己学习或者常见的知识做一个对照,因为在学习过程中总有一个问题困扰,就是符号,前后的符号对照不好,还得想半天。所以有些符合可能跟原文章对不上,但跟我之前的博客可以对上。

特意将常用的符号归纳一下(当然我也是希望和我之前的博客的符号相一致,但是可惜还是没能做好):

p_{data}(x)→真实数据的分布,或者称为x的证据分布(在《模式分类(第二版)》中贝叶斯决策这一章里这样描述)
z→隐变量(VAE)或噪声数据(GAN)
q_{\theta }(x)q(x)q(x;\theta )→生成模型的分布这些符号的记法不同,只是为了方便不同的推导和作者们不同的理解角度,最主要的我们在生成模型中要研究的就是找到一个合适的参数\theta使得q_{\theta }(x)近似于p_{data}(x)

对于GAN,我们现有的认识角度至少包括以下几个:

  • minmax博弈。GAN提出时也是从这个角度阐述的。生成对抗网络中“对抗”一词也从这儿来的。
  • 最优传输理论。参见这里,WGAN的生成器计算最优传输映射,判别器计算Wasserstein距离。
  • 变分推断。这是新的视角,参见用变分推断统一理解生成模型、Variational Inference: A Unified Framework of Generative Models and Some Revelations。这也是这篇博客所要说明的一点,为什么题目称为理解,原因就是在推导文中公式的过程中出现了一些难点,所以列举在此。

1、变分推断新解

假设x是显变量(或者我们称之为样本),z为隐变量(或者我们称之为噪音数据)。p_{data}(x)x的证据分布,或者成为真实数据的分布,并且有

q_{\theta }(x)=\int q_{\theta }(x,z)dz……(1)

生成模型要求的就是希望找到一个最优的参数\theta使得q_{\theta }(x)能逼近p_{data}(x),所以一般情况下,我们会最大化似然函数:

\theta =arg max_{\theta}E_{x\sim p_{data}(x)}\left [ log q_{\theta}(x) \right ]=arg max_{\theta }\int p_{data}(x)log q_{\theta}(x)dx……(2)

原文中将\theta省去,可以认为默认q(x)是带有参数\theta的,为了简单起见,我们这里也就不带有参数\theta

最大化(2)式的似然函数等价于最小化KL散度KL(p_{data}(x)||q(x)),这个我在机器学习与信息论之熵那篇博客中就提到过,这里似然函数可以看做交叉熵,而KL散度(也就是相对熵)与交叉熵之间是有关系的:

D_{KL}(p||q)\\ =\sum_{i=1}^{n}p(x_{i})log\frac{p(x_{i})}{q(x_{i})}=\sum_{i=1}^{n}p(x_{i})log(p(x_{i}))-\sum_{i=1}^{n}p(x_{i})log(q(x_{i}))\\ =-H(p(x))+\left [ -\sum_{i=1}^{n}p(x_{i})log(q(x_{i})) \right ]

等式的前一部分恰巧就是p的熵,等式的后一部分,就是交叉熵:由于KL散度中的前一部分-H(y)不变,所以最大化交叉熵和最小化KL散度是等价的。

这里我们转化为最小化KL散度KL(p_{data}(x)||q(x))

KL(p_{data}(x)||q(x))=\int p_{data}(x)log\frac{p_{data}(x)}{q(x)}dx……(3)

但是由于积分难以计算,因此大多数情况下都难以直接优化。

变分推断中,首先引入联合分布p(x,z)使得p_{data}(x)=\int p(x,z)dz,而变分推断的本质,就是将边缘分布的KL散度KL(p_{data}(x)||q(x))改为联合分布的KL散度KL(p(x,z)||q(x,z))=KL(q(x,z)||p(x,z)),而

KL(p(x,z)||q(x,z))=\int \int p(x,z)log\frac{p(x,z)}{q(x,z)}dxdz\\ =\int \int p_{data}(x)p(z|x)log\frac{p_{data}(x)p(z|x)}{q(x)q(z|x)}dxdz\\ =\int \int p_{data}(x)p(z|x)log\frac{p_{data}(x)}{q(x)}dxdz+\int \int p_{data}(x)p(z|x)log\frac{p(z|x)}{q(z|x)}dxdz\\ =KL(p_{data}(x)||q(x))+\int p_{data}(x)KL(p(z|x)||q(z|x))dx\\ \geqslant KL(p_{data}(x)||q(x))……(4)

(4)式表明联合分布的KL散度是边缘分布的KL散度的一个更强的条件上界。所以一旦优化成功,也就是KL散度最小(或者两个联合分布的距离很小),那么我们就得到q(x,z)\rightarrow p(x,z),从而\int q(x,z)dz\rightarrow \int p(x,z)dz=p_{data}(x),即\int q(x,z)dz成为了真实数据分布p_{data}(x)的一个近似。

当然,引入变分推断也不是加强条件而加强,而是因为在很多情况下,KL(p(x,z)||q(x,z))KL(p_{data}(x)||q(x))gen更容易计算。所以变分推断是提供了一个可计算的方案。

2、VAE和EM算法

结合上述关于变分推断的新理解,我们可以简单导出两个基本的算法就是:变分自动编码器和EM算法。

2.1 VAE

在VAE中,假设q(x,z)=q(x|z)q(z)p(x,z)=p_{data}(x)p(z|x),其中q(x|z)是带有未知参数的高斯分布(代表解码器或生成器),p(z|x)是带有未知参数的高斯分布(代表编码器),q(z)是标准的高斯分布(代表我们想要生成的编码符合高斯分布)。从联合概率分布或上述变分推断的角度考虑,最小化的目标函数是:

KL(p(x,z)||q(x,z))=\int \int p_{data}(x)p(z|x)log\frac{p_{data}(x)p(z|x)}{q(z)q(x|z)}dxdz……(5)

(5)式中log p_{data}(x)不包含优化目标,可以看做常数,而对p_{data}(x)的积分可以转化为对样本的采样,(5)式可转化为:

KL(p(x,z)||q(x,z))=E_{x\sim p_{data}(x)}\left [ -\int p(z|x)logq(x|z)dz + KL(p(z|x)||q(z)) \right ]……(6)

因为在VAE中q(x|z)p(z|x)都是带有参数的神经网络(高斯分布),这时候KL(p(z|x)||q(z))可以显示的算出也就是我们常见的VAE的损失函数中的正则化项。并且通过重参数技巧来采样一个点完成积分\int p(z|x)logq(x|z)dz的估算,可以得到VAE最终要最小化的loss:

E_{x\sim p_{data}(x)}\left [ -logq(x|z) + KL(p(z|x)||q(z)) \right ]……(7)

这一部分的推导很简单,再有不明白的可以参看原作者的文章:变分自编码器

2.2 EM算法

很明显,在VAE中我们对后验分布做了约束,仅假设它是高斯分布(VAE的原始论文也提到了其他的分布,但是效果可能都没这么好),所以我们优化的是高斯分布的参数,如果不作此假设,那么直接优化原始目标(5)式,在某种情况下也是可操作的,但这个时候只能采用交替优化的方式,先固定p(z|x),优化q(x|z),那么就有

q(x|z)=argmax_{q(x|z)}E_{x\sim p_{data}(x)}\left [ \int p(z|x)logq(x,z)dz \right ]……(8)

注意:(5)式我们需要最小化,我们对(8)做的是最大化的过程。(8)式相当于我们的常见EM算法的M步,优化q(x|z)模型中的参数。

完成这一步后,我们固定q(x|z),优化p(z|x),再此之前先将q(x|z)q(z)写成q(z|x)q(x)的形式:

q(x)=\int q(x|z)q(z)dz,q(z|x)=\frac{q(x|z)q(z)}{q(x)}……(9)

那么有:

p(z|x)=argmax_{p(z|x)}E_{x\sim p_{data}(x)}\left [ \int p(z|x)log\frac{p(z|x)}{q(z|x)q(x)}dz \right ]\\=argmax_{p(z|x)}E_{x\sim p_{data}(x)}\left [ KL(p(z|x)||q(z|x))-logq(x) \right ]\\=argmax_{p(z|x)}E_{x\sim p_{data}(x)}\left [ KL(p(z|x)||q(z|x)) \right ]……(10)

由于现在对p(z|x)没有约束,因此可以直接让p(z|x)=q(z|x)使得loss等于0。也就是说,p(z|x)有理论最优解:

p(z|x)=\frac{q(x|z)q(z)}{\int q(x|z)q(z)dz}……(11)

最优化p(z|x),相当于我们常见EM算法的E步。

这里的(8)和(11)交替执行,构成了EM算法的求解步骤。这样,我们从变分推断框架下快速的得到了EM算法。

3、变分推断下的GAN

在这部分内容,将一般的GAN纳入变分推断中,这将为我们进一步认识GAN打开新的思路。并且作者还通过推导得到了一个有效的正则化项,引出了VGAN。

3.1 变分推断看GAN

同VAE一样,GAN也希望能训练一个生成模型q(x|z),来将q(z)=N(z;0,I)映射为数据分布p_{data}(x),不同于VAE中将q(x|z)选择为高斯分布,GAN的选择是:

q(x|z)=\delta (x-G(z)),q(x)=\int q(x|z)q(z)dz……(12)

其中,\delta (x)是狄拉克函数,狄拉克函数除了零点以外取值都为0。这种单点分布可以看做方差无限小的高斯分布。G(z)就是生成器的神经网络。

注:VAE选择高斯分布,会带来模糊,而GAN选择的是狄拉克函数,它只在单点有响应,如果能够优化,则真假样本必然需要充分接近,生成的样本就是sharp(聪明)的。

简单理解GAN比VAE生成的样本更好?

主要区别在于VAE和GAN的目标函数不同,GAN的目标函数要么是似然要么是分布相似性的度量,两者都是衡量生成样本的分布质量的重要指标。而VAE(AE)的目标是重构误差,也就是它不管分布如何,只需要能够比较好的压缩并重构样本即可。

一般我们认为z是隐变量,但由于狄拉克函数实际上是单点分布,因此可以认为xz的关系已经是一一对应的,所以zx的关系已经不够“随机”了,在GAN中我们认为它不是隐变量(意味着我们不需要考虑后验分布p(z|x))。

事实上,在GAN中仅仅引入一个二元的隐变量y来构成联合分布,也就是现在我们需要构造一个分类问题,分真假样本,则有联合分布(也就是我们对于来自于真实数据的样本分类为1,对于来自于生成数据的样本分类为0):

q(x,y)=\left\{\begin{matrix}p_{data}(x)p_{1},y=1 & \\ q(x)p_{0},y=0 & \end{matrix}\right.……(13)

这里p_{1}=1-p_{0}描述了一个二元概率分布,我们直接取p_{1}=p_{0}=1/2。另一方面,我们设p(x,y)=p(y|x)p_{data}(x),p(y|x)是一个条件伯努利分布。而优化目标是另一个方向的KL(q(x,y)||p(x,y))(这也很容易理解,我们想让我们的生成分布区逼近真实数据的分布)。

KL(q(x,y)||p(x,y))\\=\int p_{data}(x)p_{1}log\frac{p_{data}(x)p_{1}}{p(1|x)p_{data}(x)}dx+\int q(x)p_{0}log\frac{q(x)p_{0}}{p(0|x)p_{data}(x)}dx\\ \sim \int p_{data}(x)log\frac{1}{p(1|x)}dx+\int q(x)log\frac{q(x)}{p(0|x)p_{data}(x)}dx……(14)

一旦优化成功,那么就有q(x,y)\rightarrow p(x,y),那么就有

q(x)=p_{1}p_{data}(x)+p_{0}q(x)=\sum_{y}q(x,y)\rightarrow \sum_{y}p(x,y)=p_{data}(x)……(15)

从而q(x)\rightarrow p_{data}(x),完成了生成模型的构建。

现在我们优化对象有p(y|x)G(x),记p(1|x)=D(x),p(0|y)=1-p(1|x)=1-D(x),也就是说,判别器输出样本属于真样本的概率。才有交替更新的方法求解。先固定G(z),即固定q(x|z),也就意味着q(x)也固定了,然后优化p(y|x),即求解D:

D=argmin_{D}-E_{x\sim p_{data}(x)}\left [ logD(x) \right ]-E_{x\sim q(x)}\left [ log(1-D(x)) \right ]……(16)

这也就是我们的零和博弈的GAN(原始的GAN)关于D优化的目标函数。

如果保留p_{0},p_{1},则:

D=argmin_{D}-E_{x\sim p_{data}(x)}\left [ p_{1}\cdot logD(x) \right ]-E_{x\sim q(x)}\left [ p_{0}\cdot log(1-D(x)) \right ]

也就是说, p_{0},p_{1}控制着真假样本的权重。

然后固定D(x)(也就是p(y|x)固定),优化G(z),这时相关的loss就为:

G=argmin_{G}\int q(x)log\frac{q(x)}{(1-D(x))p_{data}(x)}dx……(17)

这里包含我们不知道的p_{data}(x),但是假如D(x)模型具有足够的拟合能力,那么跟(11)式同理,D(x)应该有最优解,最优解为(原始的GAN论文中关于这个最优解有证明,可以见我上一篇博客):

D(x)=\frac{p_{data}(x)}{p_{data}(x)+q^{0}(x)}\Rightarrow p_{data}(x)=\frac{D(x)}{(1-D(x))}q^{0}(x)……(18)

其中, q^{0}(x) 是前一阶段的 q(x) ,简单看成是来自于上次迭代的即可。将 D(x) 的最优解代入 G 的目标函数,化简得到:

\int q(x)log\frac{q(x)}{(1-D(x))p_{data}(x)}dx=\int q(x)log\frac{q(x)}{D(x)q^{0}(x)}dx\\ =-E_{x\sim q(x)}logD(x)+KL(q(x)||q^{0}(x))\\ =-E_{z\sim q(z)}logD(G(z))+KL(q(x)||q^{0}(x))……(19)

该目标和原始的GAN相差一个KL项。

3.2 变分推断下生成器的目标

可以看到,(19)式的第一项就是标准GAN生成器所采用的loss:

-E_{z\sim q(z)}logD(G(z))……(20)

而通过变分推断推导多出了的第二项,可以将其描述为新分布与旧分布之间的距离。这两项loss是对抗的。因为KL(q(x)||q^{0}(x))希望新旧分布尽量一致,但是如果判别器充分优化的话,对于旧分布q^{0}(x)中的样本,D(x)都很小(几乎被认为就是负样本),所以-logD(x)会相当大,反之亦然。这样一来,整个loss一起优化的话,模型既要“传承”旧分布q^{0}(x),同时要在新方向p(1|x)探索,在新旧之间插值。

我们知道,目前标准的GAN的生成器loss都不包含KL(q(x)||q^{0}(x)),这事实上造成了loss的不完备。假设有一个优化算法总能找到G(z)的理论最优解、并且G(z)具有无限的拟合能力,那么G(z)只需要生成唯一一个使得D(x)最大的样本(不管输入的z是什么),这就是模型坍缩。这样说的话,理论上它一定会发生。

那么,KL(q(x)||q^{0}(x))给我们什么启发呢?我们设

q^{0}(x)=q_{\theta -\bigtriangleup \theta }(x),q(x)=q_{\theta }(x)……(21)

其中 \bigtriangleup \theta为生成器的参数改变量,对  KL(q(x)||q^{0}(x))做估计。首先对 q^{0}(x)=q_{\theta -\bigtriangleup \theta }(x) 做泰勒展开

于是:

理解:用变分推断统一理解深度生成模型(VAE、GAN、AAE、ALI(BiGAN))_第1张图片

其中第三行利用了  ,第四行第一项假设求导跟积分可交换,最后一行做了可积的假设。

上述的粗略估计表明,生成器不能迈太大步子。稳健才是正道。

这一部分的分析,只适用于生成器,判别器本身不受约束。

3.3 估算生成器的正则项

与之前引入变分推断一样,直接计算KL(q(x)||q^{0}(x)) 难以计算和估计,但是可以通过 KL(q(x,z)||q^{0}(x,z)) 来估计:

……(23)

将狄拉克分布看成高斯分布在方差趋于0时的极限,即

……(24)

将(24)式带入(23)式可得:

……(25)

因此完整的生成器的loss可以选为:

……(26)

也就是说,可以用新旧生成样本的距离作为正则项,正则项保证模型不会过于偏离旧分布。

4、GAN的其他变式

对抗自编码器(Adversarial Autoencoders,AAE)和对抗推断学习(Adversarially Learned Inference,ALI)这两个模型是GAN的变种之一,也可以被纳入到变分推断中。

4.1 变分推断下的AAE

事实上,只需要在GAN的论述中,将x,z的位置交换,就得到了AAE的框架。

理解:用变分推断统一理解深度生成模型(VAE、GAN、AAE、ALI(BiGAN))_第2张图片

(图采自原始论文,但图中的符号和这里推导的符号正好相反)

具体来说,AAE希望能够训练一个编码模型p(z|x),来将真实分布p_{data}(x)映射成标准高斯分布q(z)=N(z;0,I),而:

p(z|x)=\delta (z-E(x)),p(z)=\int p(z|x)p_{data}(x)dx……(27)

其中E(x)就是编码器的神经网络。

同GAN一样,AAE引入了一个二元的隐变量y,用来构造真假分类问题,则有:

p(z,y)=\left\{\begin{matrix}p(z)p_{1},y=1 & \\ q(z)p_{0},y=0 & \end{matrix}\right.……(28)

同样直接取p_{1}=p_{0}=1/2。另一方面,我们设q(z,y)=q(z|y)q(y),这里的后验分布q(y|z)是一个输入为z的二元分布可以理解为判别模型,然后去优化KL(p(z,y)||q(z,y))(因为q(z)是已知分布):

KL(p(z,y)||q(z,y))\\=\int p(z)p_{1}log\frac{p(z)p_{1}}{q(1|z)q(z)}dz+\int q(z)p_{0}log\frac{q(z)p_{0}}{q(0|z)q(z)}dz\\ \sim \int p(z)log\frac{p(z)}{q(1|z)q(z)}dz+\int q(z)log\frac{1}{q(0|z)}dz……(29)

现在我们的优化对象就有q(y|z)E(x),记q(0|z)=D(z)(因为这里想让来自于q分布的得分更好),依然进行交替迭代:先固定E(x),这也就意味着p(z)就固定了,然后优化q(y|z),得到优化目标:

D=argmin_{D}-E_{z\sim p(z)}[log(1-D(z))]-E_{z\sim q(z)}[logD(z)]\\ =argmin_{D}-E_{x\sim p_{data}(x)}[log(1-D(E(x)))]-E_{z\sim q(z)}[logD(z)]……(30)

然后固定D(z)来优化E(x),这时候相关的loss为:

E=argmin_{E}\int p(z)log\frac{p(z)}{(1-D(z))q(z)}dz……(31)

利用D(z)的理论最优解:

D(z)=\frac{q(z)}{q(z)+q^{0}(x)}\Rightarrow q(z)=\frac{D(z)}{(1-D(z))}q^{0}(z)

将其带入(31)式中,可得:

\int p(z)log\frac{p(z)}{(1-D(z))q(z)}dz=\int p(z)log\frac{p(z)}{D(z)p^{0}(z)}dz\\ =E_{x\sim p_{data}(x)}[-log D(E(x))]+KL(p(z)||p^{0}(z))……(32)

一方面,同标准的GAN一样,我们可以去掉第二项,得到:

E_{x\sim p_{data}(x)}[-log D(E(x))]……(33)

另一方面,我们可以得到编码器之后在训练一个解码器G(z),但是如果所假设的E(x),G(x)的拟合能力是充分的,重构误差可以足够小,那么将G(z)加入到上述loss中并不会干扰对抗部分的训练,因此可以联合训练:

G,E = argmin_{G,E}E_{x\sim p_{data}(x)}[-log D(E(x))+\lambda ||x-G(E(x))||^{2}]……(33)

4.2 变分推断下的ALI

理解:用变分推断统一理解深度生成模型(VAE、GAN、AAE、ALI(BiGAN))_第3张图片

(图采自原始论文,但图中的符号和这里推导的符号正好相反)

ALI像是GAN和AAE的融合,另一个几乎一样的工作是BiGAN。相比于GAN,它将z也作为隐变量纳入到变分推断中。具体来说还是构造一个二分类问题,引入新的变量y,ALI中有:

q(x,y)=\left\{\begin{matrix}p(z|x)p_{data}(x)p_{1},y=1 & \\ q(x|z)q(x)p_{0},y=0 & \end{matrix}\right.……(35)

以及p(x,z,y)=p(y|x,z)p(z|x)p_{data}(x),然后去优化KL(q(x,z,y)||p(x,z,y))

\int \int p(z|x)p_{data}(x)p_{1}log\frac{p(z|x)p_{data}(x)p_{1}}{p(1|x,z)p(z|x)p_{data}(x)}dxdz\\+\int \int q(x|z)q(z)p_{0}log\frac{q(x|z)q(z)p_{0}}{p(0|x,z)p(z|x)p_{data}(x)}dxdz……(36)

等价于最小化:

\int \int p(z|x)p_{data}(x)log\frac{1}{p(1|x,z)}dxdz+\int \int q(x|z)q(z)log\frac{q(x|z)q(z)}{p(0|x,y)p(z|x)p_{data}(x)}dxdz……(37)

现在优化的对象有p(y|x,z),p(z|x),q(x|z),记p(1|x,z)=D(x,z),而p(z|x)是一个带有编码器E的高斯分布或狄拉克分布,q(x|z)是一个带有生成器G的高斯分布或狄拉克分布。依旧交替优化:先固定E,G,那么与D相关的loss为:

D=argmin_{D}-E_{x\sim p_{data}(x),z\sim p(z|x)}logD(x,z)-E_{z\sim q(z),x\sim q(x|z)}log(1-G(x,z)))……(38)

跟VAE一样,对p(z|x)q(x|z)的期望可以通过重参数技巧完成。接着固定D来优化G,E,因为这时候有E又有G,整个loss不能简化,还是类似于(37)那样,但利用D的最优解:

D(x,z)=\frac{p^{0}(z|x)p_{data}(x)}{p^{0}(z|x)p_{data}(x)+q^{0}(x|z)q(z)}……(39)

可以转化为:

-\int \int p(z|x)p_{data}(x)logD(x,z)dxdz-\int \int q(x|z)q(z)logD(x,z)dxdz\\ +\int q(z)KL(q(x|z)||q^{0}(x|z))dz+\int \int q(x|z)q(z)log\frac{p^{0}(z|x)}{p(z|x)}dxdz……(40)

由于p(z|x)q(x|z)都是高斯分布,事实上后两项我们可以具体地算出来(配合重参数技巧),但同标准GAN一样,为了谨慎的训练,我们可以简单去掉后面两项,得到:

-\int \int p(z|x)p_{data}(x)logD(x,z)dxdz-\int \int q(x|z)q(z)logD(x,z)dxdz……(41)

这就是我们通过变分推断导出的ALI的生成器和编码器的loss,它跟标准的ALI结构有所不同。标准的ALI(包括普通的GAN)将其视为一个极大极小问题,所以编码器和生成器的loss为:

-\int \int p(z|x)p_{data}(x)log(1-D(x,z))dxdz-\int \int q(x|z)q(z)logD(x,z)dxdz……(42)

或:

\int \int p(z|x)p_{data}(x)logD(x,z)dxdz+\int \int q(x|z)q(z)log(1-D(x,z))dxdz……(43)

无论(42)还是(43)都与我们推出来的(41)不同,这说明,将对抗网络视为一个极大极小问题仅是一个直觉行为,并非总是应该如此。

当然,本博文所有的内容主要是参考苏剑林的博客,如果理解上有误差欢迎大家一起学习交流。

 

你可能感兴趣的:(生成模型,GAN,VAE,生成模型,ALI,AAE)