VAE:变分自编码器(Variational Auto-Encoder,VAE)

1、AE模型回顾

AE(Auto-Encoder)模型,它的逻辑如下所示:
VAE:变分自编码器(Variational Auto-Encoder,VAE)
其中,x是真实数据构成的样本空间里面的一个采样值,z是Encoder编码得到的latent code(隐编码),最后经过Decoder解码出来一个接近x的值。

理论上,x的数量是无限的。实际操作时,只能获取有限个采样值,构成训练数据集,比如ImageNet、COCO等数据集中的图片,可以看成是从真实世界中采样(拍照)得到的有限个采样值。AE网络本质上,是把有限个x通过encoder映射到了另外一个空间中(latent code space),最后再映射回去。这种映射可以理解为“死记硬背”。

当希望用Decoder生成一些未曾在已有数据集中出现过的新数据时,AE模型显的无能为力。因为只能是x经过Encoder得到的z,才能作为Decoder的合法输入。由于不知道z的分布情况,无法生成其他满足条件的z。如果有办法知道了z的分布,就可以从分布中随机采样出新的z,通过Decoder生成新的数据。

2、关于分布

AE模型,可以看成是数据在不同空间的映射,也可以看成是不同分布的映射。
·x的分布:训练数据集中的有限个采样值,本身会服从某个未知的分布。这个分布,我们是无能为力的,是不可能搞清楚它到底是一个怎样的分布。
·z的分布:它的分布虽然未知,但Encoder是可以控制的,逻辑上,z也是可以控制的。如果有办法使z满足一个已知的分布,就可以从这个分布中直接采样,然后通过Decoder生成新数据。

3、VAE的思路与实现

VAE基于以上思路,训练网络时,通过添加约束,使z向标准正态分布靠近。之后可以直接从正态分布中采样得到z,通过Decoder生成新数据。具体逻辑是:

对于每个 x, Encoder会编码出两个值:均值和方差,从而确定一个正态分布。然后从这个确定的正态分布中采样,得到z,最后通过Decoder得到一个接近x的值。
VAE:变分自编码器(Variational Auto-Encoder,VAE)

loss方面:
1、VAE使用KL divergence来度量 N(μI,σi2) 与 N(0,1) 两个分布之间的差异,通过其构建loss函数,使 N(μI,σi2) 向 N(0,1) 逼近。
2、VAE使用MSE loss,使x^\hat xi 向xi逼近。

4、VAE的原理

VAE:变分自编码器(Variational Auto-Encoder,VAE)

5、本质

VAE 虽然也称是 AE(AutoEncoder)的一种,但它的做法(或者说它对网络的诠释)是别具一格的。

在 VAE 中,它的 Encoder 有两个,一个用来计算均值,一个用来计算方差,这已经让人意外了:Encoder 不是用来 Encode 的,是用来算均值和方差的,这真是大新闻了,还有均值和方差不都是统计量吗,怎么是用神经网络来算的?

VAE 从让普通人望而生畏的变分贝叶斯理论出发,它本质上就是在我们常规的自编码器的基础上,对 encoder 的结果(在VAE中对应着计算均值的网络)加上了“*高斯噪声 *”,使得结果 decoder 能够对噪声有鲁棒性;而那个额外的 KL loss(目的是让均值为 0,方差为 1),事实上就是相当于对 encoder 的一个正则项,希望 encoder 出来的东西均有零均值。

那另外一个 encoder(对应着计算方差的网络)的作用呢?它是用来动态调节噪声的强度的。直觉上来想,当 decoder 还没有训练好时(重构误差远大于 KL loss),就会适当降低噪声(KL loss 增加),使得拟合起来容易一些(重构误差开始下降)。反之,如果 decoder 训练得还不错时(重构误差小于 KL loss),这时候噪声就会增加(KL loss 减少),使得拟合更加困难了(重构误差又开始增加),这时候 decoder 就要想办法提高它的生成能力了。

VAE:变分自编码器(Variational Auto-Encoder,VAE)
重构的过程是希望没噪声的,而 KL loss 则希望有高斯噪声的,两者是对立的。所以,VAE 跟 GAN 一样,内部其实是包含了一个对抗的过程,只不过它们两者是混合起来,共同进化的。从这个角度看,VAE 的思想似乎还高明一些,因为在 GAN 中,造假者在进化时,鉴别者是安然不动的,反之亦然。当然,这只是一个侧面,不能说明 VAE 就比 GAN 好。GAN 真正高明的地方是:它连度量都直接训练出来了,而且这个度量往往比我们人工想的要好。

6、总结

VAE从概率分布的角度,给出了一个生成模型的思路。