变分自编码器VAE学习笔记

完整版文章请看知乎原文,link直接点击标题,本文章只记录个人的学习笔记

变分自编码器VAE:原来是这么一回事 | 附开源代码

作者丨苏剑林
单位丨广州火焰信息科技有限公司
研究方向丨NLP,神经网络
个人主页丨kexue.fm

VAE 跟 GAN 比较,它们的目标基本是一致的——希望构建一个从隐变量 Z 生成目标数据 X 的模型,但是实现上有所不同。

生成模型的难题就是判断生成分布与真实分布的相似度,因为我们只知道两者的采样结果,不知道它们的分布表达式,因此KL散度不适用。对于这个问题,GAN 的思路-把这个度量也用神经网络训练出来。就这样WGAN 就诞生了。而 VAE 则使用了一个精致迂回的技巧。
核心idea:通过Z生成获得X
变分自编码器VAE学习笔记_第1张图片
VAE的传统理解
变分自编码器VAE学习笔记_第2张图片

上图的这种理解是错误的,因为不能保证采样出来的zk经过生成器后生成的xk_hat仍然对应着xk。

注意:在整个 VAE 模型中,我们并没有去使用 p(Z)(先验分布)是正态分布的假设,我们用的是假设 p(Z|X)(后验分布)是正态分布。
VAE的真实示意图:VAE 为每个样本构造专属的正态分布,然后采样来重构。

这里,为了保证模型的生成能力,会让 P ( Z ∣ X ) P(Z|X) P(ZX)像标准正态分布看齐,就可以推导出先验假设“ P ( Z ) P(Z) P(Z)服从标准正态分布”。
变分自编码器VAE学习笔记_第3张图片
如何让所有的 p(Z|X) 都向 N(0,I) 看齐呢?在重构误差的基础上加入额外的loss。
变分自编码器VAE学习笔记_第4张图片

VAE本质

VAE本质上就是在我们常规的自编码器的基础上,对 encoder 的结果(在VAE中对应着计算均值的网络)加上了“高斯噪声”,使得结果 decoder 能够对噪声有鲁棒性;而那个额外的 KL loss(目的是让均值为 0,方差为 1),事实上就是相当于对 encoder 的一个正则项,希望 encoder 出来的东西均有零均值。
另外一个 encoder(对应着计算方差的网络)的作用呢?它是用来动态调节噪声的强度的。当 decoder 还没有训练好时(重构误差远大于 KL loss),就会适当降低噪声(KL loss 增加),使得拟合起来容易一些(重构误差开始下降)。反之,如果 decoder 训练得还不错时(重构误差小于 KL loss),这时候噪声就会增加(KL loss 减少),使得拟合更加困难了(重构误差又开始增加),这时候 decoder 就要想办法提高它的生成能力了。
变分自编码器VAE学习笔记_第5张图片
说白了,重构的过程是希望没噪声的,而 KL loss 则希望有高斯噪声的,两者是对立的。所以,VAE 跟 GAN 一样,内部其实是包含了一个对抗的过程,只不过它们两者是混合起来,共同进化的
从这个角度看,VAE 的思想似乎还高明一些,因为在 GAN 中,造假者在进化时,鉴别者是安然不动的,反之亦然。当然,这只是一个侧面,不能说明 VAE 就比 GAN 好。
GAN 真正高明的地方是:它连度量都直接训练出来了,而且这个度量往往比我们人工想的要好(然而 GAN 本身也有各种问题,这就不展开了)。

花式解释AutoEncoder与VAE

自动编码器

变分自编码器VAE学习笔记_第6张图片

  • 自动编码器的应用:最开始用于数据压缩、现在主要用于数据去噪声、可视化降维、生成数据
  • 自动编码器与GAN相比的优缺点:(感觉不是很全面)
  1. GAN生成图片时使用的是高斯噪声,这意味着我们并不能生成任意我们指定类型的图片,也就是说我们没办法决定使用哪种随机噪声能够产生我们想要的图片。但是使用自动编码器我们就能够通过输出图片的编码过程得到这种类型图片的编码之后的分布,相当于我们是知道每种图片对应的噪声分布我们就能够通过选择特定的噪声来生成我们想要生成的图片。
  2. 生成网络通过对抗过程来区分“真”的图片和“假”的图片,然而这样得到的图片只是尽可能像真的,但是这并不能保证图片的内容是我们想要的,换句话说,有可能生成网络尽可能的去生成一些背景图案使得其尽可能真,但是里面没有实际的物体

变分自动编码器(Variational Autoencoder)

  • 变分编码器VS自动编码器:变分编码器是自动编码器的升级版本,其结构跟自动编码器是类似的; 但是自动编码器其实并不能任意生成图片,因为我们没有办法自己去构造隐藏向量,我们需要通过一张图片输入编码我们才知道得到的隐含向量是什么。变分自动编码器通过对隐含向量加限制来解决这个问题,迫使其生成的隐含向量能够粗略的遵循一个标准正态分布,这就是其与一般的自动编码器最大的不同。这时可以从这个标准正态分布随机采样作为隐含变量喂给Decoder来生成图片,而不需要先给他一张原始图片先编码才能获得隐含变量。
    变分自编码器VAE学习笔记_第7张图片
  • 变分编码器的损失函数:重构误差+KL散度误差

在实际情况中,我们需要在模型的准确率上与隐含向量服从标准正态分布之间做一个权衡,所谓模型的准确率就是指解码器生成的图片与原图片的相似程度。我们可以让网络自己来做这个决定,非常简单,我们只需要将这两者都做一个loss,然后在将他们求和作为总的loss,这样网络就能够自己选择如何才能够使得这个总的loss下降。另外我们要衡量两种分布的相似程度,如何看过之前一片GAN的数学推导,你就知道会有一个东西叫KL divergence来衡量两种分布的相似程度,这里我们就是用KL divergence来表示隐含向量与标准正态分布之间差异的loss,另外一个loss仍然使用生成图片与原图片的均方误差来表示

  • 变分编码器除了可以让我们随机生成隐含变量,还能够提高网络的泛化能力
  • VAE的缺点也很明显,他是直接计算生成图片和原始图片的均方误差而不是像GAN那样去对抗来学习,这就使得生成的图片会有点模糊。现在已经有一些工作是将VAE和GAN结合起来,使用VAE的结构,但是使用对抗网络来进行训练,具体可以参考一下这篇论文

AutoEncoder、VAE和GAN

阅读的相关资料的原文:
当我们在谈论 Deep Learning:AutoEncoder 及其相关模型
VAE(Variational Autoencoder)的原理
当我们在谈论 Deep Learning:GAN 与 WGAN

AutoEncoder

  • 原始图像->Encoder->latent vector->Decoder->输出图像**。latent vector中包含原始图像的信息,且合理的latent vector只能通过编码器从原始图像中生成,因此AutoEncoder只能看做是一个存储图片的网络,而不是一个产生式模型,还不能产生任何未知的东西,因为我们不能随意产生合理的潜在变量,Decoder不能直接被拿出来使用。
  • 虽然用 AutoEncoder 来压缩理论上看起来很智能,但是实际上并不太好用:
    1. 由于 AutoEncoder 是训练出来的,故它的压缩能力仅适用于与训练样本相似的样本
    2. AutoEncoder 还要求 encoder 和 decoder 的能力不能太强。极端情况下,它们有能力完全记忆住训练样本,那么 Code 是什么也就不重要了,更不用谈压缩能力了
  • AutoEncoder的扩展:
    1. Sparse AutoEncoder(SAE):对 AutoEncoder 的 Code 增加了稀疏的约束;性质-有降维的效果、有一定抗噪能力、稀疏的可解释性好。
    2. Denoising AutoEncoder(DAE):在原样本中增加噪声,并期望利用 DAE 将加噪样本来还原成纯净样本;性质-由于增加了噪声,学习出来的 Code 会更加稳健。
    3. 其他AutoEncoder:Contrative AutoEncoder(CAE)、Stacked AutoEncoder(SAE)、Convolutional Autoencoder、 Recursive Autoencoder、 LSTM Autoencoder …

VAE

  • 原始图像->Encoder( μ \mu μ, σ \sigma σ)->latent vector( μ + ε ∗ σ \mu+\varepsilon *\sigma μ+εσ)->Decoder->输出图像。解决了“AutoEncoder无法生成训练样本中没有的样本”这一缺点。对编码器添加约束,就是强迫编码器产生服从单位高斯分布的latent vector。此时,可以随机从单位高斯分布中进行采样,然后把它传给Decoder即可生成新的图片。当然由此需要在重构图片的精确度和单位高斯分布的拟合度上进行权衡
  • VAE VS GAN: VAE可以通过编码解码的步骤,直接比较重建图片和原始图片的差异,但是GAN做不到;VAE的一个劣势就是没有使用对抗网络,所以会更趋向于产生模糊的图片。
  • VAE有显式的分布,能够容易地可视化图像的分布;GANs虽然不具有显式的图像分布,但是可以通过对隐变量的插值变化来可视化图像的分布。

GAN

  • 无监督的生成模型算法
  • GAN 与一般生成模型最主要的区别就在于此:
    1. GAN 并不显式地对 p(x) 建模,而试图利用一个 Generator(G) 来学习出数据的分布
    2. 在判断学习出的模型的优劣时,它也并不直接给出误差计算函数,而同样试图用 Discriminator(D) 来自动判断模型的优秀程度
  • 原始 GAN 其实存在各种问题,鲁棒性极差,如:非常依赖 Discriminator 和 Generator 的结构设计、需要精心的调节超参数、没有一种指标来量化训练的进度、还可能出现 Mode Collapse,不一而足。
  • WGAN(Wasserstein GAN)则几乎同时解决(缓解)了上述所有的不足。原始JS divergence有突变的性质训练时Generator会出现梯度消失的现象,WGAN改用Wasserstein Distance(变化平滑),解决了gradient vanish的问题。
  • WGAN 在效果上虽然没有飞跃的进步,但其巨大的意义在于使 GAN 的实用性大大提升,体现主要体现为以下方面:不再需要精心平衡 Discriminator 和 Generator 的能力了,且效果更稳健,不依赖于过于精心设计(trick)的结构;缓解了 Mode Collapse 现象,确保生成的数据的多样性;最重要的是,有一个数值可以定量描述并跟踪训练的效果了。可以预见,在缓解了这些问题后,GAN 研究的价值和热度都会得到显著的提升,不得不说是比较振奋人心的。

GAN 与 VAE 的区别

最后,作为两大主流生成模型,我们来谈谈 GAN 与 VAE 的区别:

  1. VAE 在理论上需要利用 Variational Inference 进行近似,进而引入偏差;而 GAN 不需要这种近似,即理想情况下 GAN 能更好地拟合数据真实分布。事实上,VAE 确实在生成图像时更加模糊,而 GAN 相对锐利
  2. VAE 作为 AE 的一种,本质上是对数据的压缩,同时可以用于生成新数据;而 GAN 则主要关注还原真实数据分布,通过采样生成新数据

你可能感兴趣的:(阅读笔记,VAE)