变分自编码器 VAE 在近两年的新进展 Variational Autoencoder
本专栏之前介绍了 VAE 的推导:PENG Bo:快速推导 VAE 变分自编码器,多种写法,和重要细节 Variational Autoencoder ,在此介绍 VAE 在 2017/18 年的部分新进展。
1. VAE 的「编码坍塌」
如果思考过 VAE 的原理,会发现它有一个矛盾之处:如果每个 的 的每维都是 ,那么这个 实际就没有编码能力,因为不同 的编码都一样。网路最终会试图忽略 ,直接去还原 。
如下图所示:
对于左边的普通 VAE,它会要求 (三角标记)都往目标分布(中间的三角标记)靠拢(减少 KL),但是,中间的三角标记只会还原出一个固定的 (中间的正方标记)。
假如我们加入一个新网路,可以判断 是否属于 (而不是预先限制 为 Gaussian 然后只看 KL),就可以改善这种问题。于是在 [1711.01558] Wasserstein Auto-Encoders 提出用一个 WGAN 或 MMD 去判断,例如这样的全连接 WGAN:
他们发现 WGAN 的效果比 MMD 更好。
类似的例子是 Information Maximizing Variational Autoencoders 其中只用了 MMD 判断:
这类思想最早的来源是 Adversarial Autoencoders ,大同小异。
2. VAE 为什么能实现 Disentanglement?
考虑 SVHN,令编码为 ,其中 是 10 个数字类别, 是额外的「风格」,例如数字的角度,颜色,等等。
如果用 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))】时,给出和 分布尽量不同的编码(增大此时 和 的 KL)。这样 E 网路就有了「鉴别能力」。而 G 网路加一个目标去骗过 E 网路。
有个细节是,为了防止 E 网路把假图像的 z 分布推得和 过远,在两个分布间的 KL 大于超参数 时,就不再推了。这个 可以取得比正常 VAE 中的 KL 大一些即可。
还有更多进展,会在本专栏未来的文章介绍,欢迎关注。
最后发一下我在调的网路,类似 VAE,不过更简化,只有生成 G 网路。例如,编码转移效果,点击看 GIF 动画(噪点是知乎的压缩,原图很流畅,毕竟是 VAE):
训练非常快。在 GTX1070 上 1 个小时就很清晰。稍后再调清晰一些写写做法。
数据集是 Trillion Pair,其中图片有点旧,也似乎少了一些人(例如,缺杨幂,有迪丽热巴,缺范冰冰,有李冰冰,缺梅西,有C罗,缺费德勒,有纳达尔...)。
推荐阅读: