本专栏之前介绍了如何最快推导出 VAE,在此介绍 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 判断:
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 动画:
训练非常快。在 GTX1070 上 1 个小时就很清晰。稍后再调清晰一些写写做法。