变分自编码器 VAE 在近两年的新进展介绍 Variational Autoencoder

1,448 阅读3分钟
原文链接: zhuanlan.zhihu.com

本专栏之前介绍了如何最快推导出 VAE,在此介绍 VAE 在 2017/18 年的新进展。

1. VAE 的“编码坍塌”

如果思考过 VAE 的原理,会发现它有一个矛盾之处:如果每个 xz 的每维都是 N(0,1) ,那么这个 z 实际就没有编码能力,因为不同 x 的编码都一样。网络最终会试图忽略 z,直接去还原 p_x

如下图所示:

对于左边的普通 VAE,它会要求 z (三角标记)都往目标分布(中间的三角标记)靠拢(减少 KL),但是,中间的三角标记只会还原出一个固定的 x (中间的正方标记)。

假如我们加入一个新网络,可以判断 z 是否属于 p_z(而不是预先限制 z 为 Gaussian 然后只看 KL),就可以改善这种问题。于是在 [1711.01558] Wasserstein Auto-Encoders 提出用一个 WGAN 或 MMD 去判断,例如这样的全连接 WGAN:

他们发现 WGAN 的效果比 MMD 更好。

类似的例子是 Information Maximizing Variational Autoencoders 其中只用了 MMD 判断:


2. VAE 为什么能实现 Disentanglement?

考虑 SVHN,令编码为 (y,z) ,其中 y 是 10 个数字类别, z 是额外的“风格”,例如数字的角度,颜色,等等。

如果用 VAE 训练这个问题,我们会发现成功实现 disentanglement,类似于无监督的分类:

但如果仔细想想,这并不显然。如 Rethinking Style and Content Disentanglement in Variational Autoencoders 所述,模型没有动力去必须完成这个任务:

经过实验,关键还是在于 DCNN + SGD 过程。在编码 disentangle 的情况下,E 和 G 网络都训练更快(因为对于 DCNN 而言,这样的任务“更简单”)。所以梯度下降时网络会倾向于走这个最快的道路。

我的看法:关键是在网络架构本身,在于 Deep Image Prior,在前文我也说过很多次了。


3. 对 VAE loss 的拆分

本文见 [1804.02086] Structured Disentangled Representations,考虑 G 网络和 E 网络:

如我在前文的 VAE 推导所述,VAE 用这样的看法更直接:

可进一步拆分成很多部分:

每个部分的作用如图:

还可以继续拆 KL:

每个项目都可以加因子,许多论文都是调整因子而已:


4. IntroVAE:为 VAE 植入 GAN 思想的一种方法

论文见Introspective Variational Autoencoders for Photographic Image Synthesis。通过修改 VAE 的 LOSS,在不引入新网络的情况下,用 E 网络承担了 GAN 中 D 网络的功能。

效果如下图,和 nVidia 的 PGGAN 相当,而且不需要分层训练,可以直接训练:

训练过程,其实思想非常简单:

思想是,在原有 VAE 的基础上,要求 E 网络在输入假图像【包括 G(z) 和 G(E(x))】时,给出和 p_z 分布尽量不同的编码(增大此时 zp_z 的 KL)。这样 E 网络就有了“鉴别能力”。而 G 网络加一个目标去骗过 E 网络。

有个细节是,为了防止 E 网络把假图像的 z 分布推得和 p_z 过远,在两个分布间的 KL 大于超参数 m 时,就不再推了。这个 m 可以取得比正常 VAE 中的 KL 大一些即可。


最后发一下我在调的网络,也是类似 VAE,不过更简化,只有生成 G 网络。例如,编码转移效果,点击看 GIF 动画:

训练非常快。在 GTX1070 上 1 个小时就很清晰。稍后再调清晰一些写写做法。