变分自编码器(Variational auto-encoder, VAE)理解及教程
导读
小编在读一篇论文时遇到了变分自编码器(Variational auto-encoder,VAE)的概念,我也是第一次接触,于是乎翻遍了网上现有的好多资料,稍微理解了一点,整理下来,希望能帮助大家。如有不对地方,还请各位下方评论区批评指正,感谢您的交流指导~~
引言
- 首先附上关于变分自编码器的论文
Auto-Encoding Variational Bayes[PDF]
- 变分自编码器(Variational auto-encoder,VAE)是一类重要的生成模型(generative model),它于2013年由Diederik P.Kingma和Max Welling提出。
介绍
VAE可以通过编码解码的步骤,直接比较重建图片和原始图片的差异,但是GAN做不到。
在介绍变分自编码器之前,我们先简单了解下自编码器的一些知识:
一、自编码器
1.介绍
自编码器(autoencoder, AE)是一类在半监督学习和非监督学习中使用的人工神经网络,其功能是通过将输入信息作为学习目标,对输入信息进行表征学习。
自编码器包含编码器(encoder)和解码器(decoder)两部分。按学习范式,自编码器可以被分为收缩自编码器、正则自编码器和变分自编码器,其中前两者是判别模型、后者是生成模型 。按构筑类型,自编码器可以是前馈结构或递归结构的神经网络。
自编码器具有一般意义上表征学习算法的功能,被应用于降维和异常值检测。包含卷积层构筑的自编码器可被应用于计算机视觉问题,包括图像降噪 、神经风格迁移等。
2.算法
自编码器是一个输入和学习目标相同的神经网络,其结构分为编码器和解码器两部分。给定输入空间X∈
χ
\chi
χ 和特征空间h∈F,自编码器求解两者的映射
f
f
f和
g
g
g使输入特征的重建误差达成最小:
求解完成后,由编码器输出的隐含层特征h,即“编码特征”可视为输入数据X的表征。
3.传统自编码器架构
(图片来源网络,侵删)
二、变分自动编码器
VAE继承了传统自动编码器的架构,并使用它来学习数据生成分布,这允许我们从潜在空间中随机抽取样本。然后可以使用解码器网络对这些随机样本进行解码,以生成具有与训练网络的特征类似的特征的独特图像。
(图片来源网络,侵删)
它和AE的不同点就在于:
AE 中间输出的是隐变量的 具体取值,
而VAE中间要输出的是隐变量的具体分布情况,
这样一来,我们就可以从这个分布中另外取样,送入到解码器,就可以生成类似输入样本
x
x
x 的其他样本
x
′
x^{'}
x′ 了,并且这两个会十分近似。
VAE本质上就是在我们常规的自编码器的基础上,对encoder的结果(在VAE中对应着计算均值的网络)加上了“高斯噪声”,使得结果decoder能够对噪声有鲁棒性;而那个额外的KL loss(目的是让均值为0,方差为1),事实上就是相当于对encoder的一个正则项,希望encoder出来的东西均有零均值。
那另外一个encoder(对应着计算方差的网络)的作用呢?它是用来动态调节噪声的强度的。直觉上来想,当decoder还没有训练好时(重构误差远大于KL loss),就会适当降低噪声(KL loss增加,注意KL loss等于0表示分布就是标准正态分布),使得拟合起来容易一些(重构误差开始下降);反之,如果decoder训练得还不错时(重构误差小于KL loss),这时候噪声就会增加(KL loss减少),使得拟合更加困难了(重构误差又开始增加),这时候decoder就要想办法提高它的生成能力了。
说白了,重构的过程是希望没噪声的,而KL loss则希望有高斯噪声的,两者是对立的。所以,VAE跟GAN一样,内部其实是包含了一个对抗的过程,只不过它们两者是混合起来,共同进化的。
- 架构
变分自编码器架构
具体原理推导请参考参考资料部分,这里就不做重复描述了。
- 实现
代码可参考https://github.com/LiUzHiAn/VAE-Pytorch
详细教程
可参考这篇文章,详细介绍了关于变分自编码器的内容
Tutorial on Variational Autoencoders【PDF】
参考资料:
1.百度百科
2.变分自编码器(一):原来是这么一回事
3.变分自编码器(一)——基本原理简介
4.变分自编码器的原理和程序解析
更多推荐
所有评论(0)