Variational Autoencoder
核心思想
VAE 是一种基于隐变量的生成模型,它将隐变量
为了使得 VAE 生成真实样本的概率变大,考虑用极大似然法,即采样真实样本
EM 算法回顾:为隐变量
- E-step:固定
,取 ,即使得 ,也即让 ELBO 增大到与 相等。 - M-step:固定
,最大化 ELBO,从而达到优化 的目的。
非常可惜的是,EM 算法无法直接应用于此,这是因为 E-step 要求我们能够表达出后验分布
- E-step:固定
,最小化 KL 项;由于此时 是定值,所以等价于最大化 ELBO,即 . - M-step:固定
,最大化 ELBO,即 .
需要注意的是,E-step 的优化变量是一个概率分布函数
这里有一个小问题——为什么
在下文我们将看到,VAE 的
我们看到,VAE 的损失函数由两部分构成:
是重构项,最大化 被重构的似然; 可以视作正则项,让估计的后验分布逼近先验分布。
怎么理解呢?假设只有重构项,可以想见为了更好的重构,网络会尽可能地减小不确定性——一方面让分布
实例化
我们现在得到了 VAE 的损失函数,但其中的
Encoder network
首先考虑损失函数中
:简便起见,直接取为 标准正态分布; :考虑到它依赖于 ,所以应该是 的形式。可是 用怎样的函数才好呢?在深度学习的时代,这种开放性问题就无脑上神经网络呗!这就是 VAE 中的 encoder network.
将
Decoder network
接下来考虑损失函数中
伯努利分布:输出只有 0/1,所以适用于生成二值数据(比如黑白图像)。设伯努利分布的参数为
正态分布:设参数为
注意:上式中 nn.MSELoss
会对 CHW 维也取平均(假设在图像上训练),结果是实际欧氏距离的
与 encoder network 同理,
至此我们算出了
Loss 权重
考虑实践中最常用的设置:
取 ; 取 ,且 ; 取 ,且 ,其中 是事先取定的一个超参数。
那么根据前两小节的推导,损失函数是:
重参数化技巧
重参数化技巧在之前的文章中已经介绍过了,所以这里不再赘述。简单说来,就是现在
代码实现
Github repo: https://github.com/xyfJASON/vaes-pytorch
放个结果:
参考资料
- 苏剑林. (Mar. 18, 2018). 《变分自编码器(一):原来是这么一回事 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/5253 ↩︎
- 苏剑林. (Mar. 28, 2018). 《变分自编码器(二):从贝叶斯观点出发 》[Blog post]. Retrieved from https://spaces.ac.cn/archives/5343 ↩︎
- 原来VAE是这么回事(从EM到VAE) - 市井小民的文章 - 知乎 https://zhuanlan.zhihu.com/p/368959795 ↩︎
- EM的升级打怪之路:EM-变分EM-VAE(part1) - Young Zicon的文章 - 知乎 https://zhuanlan.zhihu.com/p/418203971 ↩︎
- VAE 的前世今生:从最大似然估计到 EM 再到 VAE - AI科技评论的文章 - 知乎 https://zhuanlan.zhihu.com/p/443540253 ↩︎
- Weng, Lilian. From Autoencoder to Beta-VAE. https://lilianweng.github.io/posts/2018-08-12-vae/ ↩︎
- Doersch, Carl. Tutorial on variational autoencoders. arXiv preprint arXiv:1606.05908 (2016). ↩︎
- Joseph Rocca. Understanding Variational Autoencoders (VAEs). https://towardsdatascience.com/understanding-variational-autoencoders-vaes-f70510919f73 ↩︎