标准VAE(Variational Autoencoder)的原理:
在autoencoder模型中,我们加入一个编码器,它能帮我们把图片编码成向量。然后解码器能够把这些向量恢复成图片。
我们现在获得了一个有点实际用处的网络了。而且我们现在能训练任意多的图片了。如果我们把这些图片的编码向量存在来,那以后我们就能通过这些编码向量来重构我们的图像。我们称之为标准自编码器。
但是,我们想建一个产生式模型,而不是一个只是储存图片的网络。现在我们还不能产生任何未知的东西,因为我们不能随意产生合理的潜在变量。因为合理的潜在变量都是编码器从原始图片中产生的。
这里有个简单的解决办法。我们可以对编码器添加约束,就是强迫它产生服从单位高斯分布的潜在变量。正式这种约束,把VAE和标准自编码器给区分开来了。现在,产生新的图片也变得容易:我们只要从单位高斯分布中进行采样,然后把它传给解码器就可以了。
这里有一些使用VAE好处,就是我们可以通过编码解码的步骤,直接比较重建图片和原始图片的差异,但是GAN做不到。
另外,VAE的一个劣势就是没有使用对抗网络,所以会更趋向于产生模糊的图片。
VAEGAN的原理
我们知道 VAE 可以实现从原始分布编码到一个 normal 的分布,再从 normal 的分布解码回原始分布的功能,然后这个解码用到的 decoder 就可以单独被提取出来作为生成器使用。但是,VAE 有一个很大的问题就是,解码产生的图片往往都比较模糊。那为什么产生的图片会模糊?我会在之后学习 VAE 的过程中再去研究,目前我们只是知道,VAE 产生的图片是容易模糊的。于是就出现了 VAEGAN,它的作用,就是给 VAE 加上了 GANs 的架构, 通过判别器使得 VAE 产生的图片变得清晰。因此我们可以理解为,VAEGAN 就是利用 GANs 去提升了 VAE 的图片生成质量。
我们来说明一下这个架构。首先输入一张真实图像X𝑖𝑛,通过一个 encoder 变成一个 normal 的分布 z,然后 z 再输入到 decoder 中产生生成图像X𝑜𝑢𝑡,这时 VAE 希望X𝑜𝑢𝑡与X𝑖𝑛 之间的 loss 越小越好,但是 loss 小不见得图片就清晰,于是X𝑜𝑢𝑡又会被放入一个判别器中, 去让判别器判断输入的图片属于P𝑑𝑎𝑡𝑎还是P𝐺,这样最终X𝑜𝑢𝑡就会与X𝑖𝑛不仅相似还清晰。
而关于 VAEGAN,有趣的一点是,我们不仅可以用 GANs 来提升 VAE,也可以用 VAE 来 提升 GANs。如果是被用作后者的话,“GANVAE”其实就等效为 CycleGAN 的一部分,如下图 所示。
这两者的差别在于,把 X encode 成 z 的过程是放在生成器的前面还是后面,如果放在前面,就是 VAEGAN;如果放在后面,就是 CycleGAN。
VAEGAN的变种
上一节的 VAEGAN 存在一个问题,就是 Encoder 编码出的 z 不一定完全符合我们期望的 normal z 的样式,也就是编码出的 z 和我们输入的 z 可以存在细微的不同,但是通过生成器的处理,它们产生的输出都能够骗过判别器。 为了解决这一问题 VAEGAN 提出了一个变种,它改变了判别器,使得判别器能更精细的鉴别输入图像的种类,共包括三个种类:真实图片,重构图片,与生成图片。
于是现在X𝑟𝑒𝑐与X𝑔的差异能够被判别器学到,又因为生成器是共用的,那为了消除这种 差异只能让输入 z 接近一致,也就是 encoder 编码出的 z 不断逼近我们给定的输入 z,最终几乎完全一样。结果证明,这种模型在实验中比 VAEGAN 有少量的提升。
VAE(Variational Autoencoder)的原理 - Shiyu_Huang - 博客园