前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Variational Auto-Encoders

Variational Auto-Encoders

作者头像
可爱见见
发布2019-10-09 16:13:51
7120
发布2019-10-09 16:13:51
举报
文章被收录于专栏:卡尼慕卡尼慕

Variational Auto-Encoders

Variational Auto-Encoders又称为变分自编码器,要想学习它,首先需要弄清楚Autoencoder自编码器到底是个什么东西。我从MIT 6.S191中的Deep Generative Models课程中大受启发,感兴趣的朋友可以去看看,这里就附上课程链接:http://introtodeeplearning.com/,另外有篇关于VAEs的文章写得也很不错,本文由参考,附上连接可以自己看看:https://spaces.ac.cn/archives/5253。

Autoencoder

Autoencoder又称为自编码器,是一种无监督的学习算法,也就是说,输入X时候我们并不知道X的label是什么,我们要通过此学习算法,学习输入X的低维度特征,重构原始的无标签数据X。如果你觉得有点难理解,来看图:

这里给出了一个图像,上面写了一个“Z”,但是要记住,此时是无监督学习,因此我们仅仅知道输入的X是一张图片,并不知道上面写了什么。接着,我们把这张图像输入到卷积层,通过卷积层输出潜在变量“z”,也就是将一张图片(一堆像素)编码成了一个字符“z”(一个低维度的数据)。

这称之为“encoder”(编码器)。为了方便理解,我们需要明确几个问题。

  1. 我们为什么需要将图片编码成低维度的数据,为什么我们要去关心图片的低维度潜在变量呢? 低维度的潜在变量能够最准确、最完全的表示图像中的特征,能够明确我们真正需要什么,一方面也是降噪的过程。
  2. 我们如何学习到这种潜在变量? 通过训练模型,使用该潜在变量重新生成一张新的图片,使得生成的图片与原来的输入图片无限接近就可以了!
  3. 为什么不直接从输入x的分布P(x)采样,来得到所有可能的x? 这个很难实现!!!所以我们把分布改了改:

根据这种思路,我们补充一下模型:

我们引入了“decoder”(译码器),decoder的功能与encoder相反,它能帮助我们基于潜在变量重新构建出一张图片。

我们把输入的原始图片设为x,生成的图片设为x~,表示它的重构版本。

我们希望x与x~尽可能相同,因此设置损失函数Loss如下:$$ \mathcal{L}(x, \hat{x})=\|x-\hat{x}\|^{2} $$ 通过设置这种端到端的传播以及损失函数,我们可以尽可能地得到图片中的所有潜在变量,尽可能还原出原始图像。

这里要注意:潜在变量的维度大小将决定重建图片的质量。维度过低会限制生成图片的质量!来,看图。

所以说,Autoencoding也可以作为一种压缩方式!

Autoencoder总结

  1. 生成图片的瓶颈强迫着网络去学习一个复杂的潜在变量的表示,为了在以后能重构它/如上图,越复杂,生成的图片越接近我们输入的图片。
  2. 重构图片的损失函数强迫着潜在变量与编码更多关于数据的信息。
  3. Autoencoding = Automatically encoding data

Variational Autoencoers(VAEs)

变分自编码器实际上就是在自编码器上进行拓展。

我们先稍微回顾一下Autoencoder,对于同一张图片,他始终只能有一个输出,因为他的潜在变量z是永远不变的。

对比上图,VAEs实际上在找潜在变量的时候并不是一个确定的值,而是一个基于μ和σ的一个概率分布。因此,由于潜在变量不同,对于同一张图片的输入,我们生成的结果可能并不是一样的。

reconstruction loss是指重建模型的损失,通常跟autoencoder的损失函数相同,regularization term常用来确保我们计算的潜在变量遵循着我们定义的一些先验分布。

D:代表着两个分布的距离,P(z):代表z的先验分布。我们希望这两个分布尽可能接近!

这里我们选择使用KL散度(KL散度又称为相对熵,计算结果越趋于0,二者越接近)来描述两个分布的差异,具体公式如下:

既然已经表示出两个分布的差异程度,那么作为正则项,他起到的作用就是最小化差异,最小化正则项。

接下来,这里我们将z的先验分布设置成期望为0,方差为1的高斯分布:

但是,出大问题!我们这里如果把z表示成符合某种高斯分布的情况下,z的表达式如下:

发现如果这么表达z,无法做到后向传播!因为“采样”的操作是不可导的!!而采样的结果是可导的。

因此我们利用:

可以发现,(z−μ)/σ=ε 是服从均值为0,方差为1的标准正态分布的!因此,我们发现,从N(μ,σ2) 中采样一个Z,相当于从 N(0,I) 中采样一个ε,然后让 Z=μ+ε×σ 。通常我们把这一步称为“重参数技巧”。

因此,我们重新定义z,把μ和σ看成固定向量,同时σ与从先验分布中提取的随机常数相乘,表达式如下:

因此,当我们固定其他变量时,仅仅增加或者减少单个潜在变量,我们可以得到类似的结果:

我们看这个图片会觉得很自然,变化得很平滑,原因是这个潜在变量遵循着高斯分布,这仅仅是单个潜在变量的训练结果,如果在训练中有许多不同的潜在变量,当然,理想情况下我们希望这些潜在变量都是独立互不相干的,以便我们可以沿着我们固定的维度上走,观察到不同的表达。如图,这有两个潜在变量,一个是笑容,另一个是头的角度,我们完全可以做到通过扰动这两个数字完成微笑和头的角度的自定义。

我们来看看整体结构:

Variational Autoencoers(VAEs)总结

  1. 本质上存在着两个encoder,一个计算均值,一个计算方差。
  2. 它本质上就是在我们常规的自编码器的基础上,对encoder的结果(在VAE中对应着计算均值的网络)加上了“高斯噪声”,使得结果decoder能够对噪声有鲁棒性;而那个额外的KL loss(目的是让均值为0,方差为1),事实上就是相当于对encoder的一个正则项,希望encoder出来的东西均有零均值。
  3. 而另外一个encoder(对应计算方差的网络)是用来动态调节噪声的强度的。当decoder还没有训练好时(重构误差远大于KL loss),就会适当降低噪声(KL loss增加),使得拟合起来容易一些(重构误差开始下降);反之,如果decoder训练得还不错时(重构误差小于KL loss),这时候噪声就会增加(KL loss减少),使得拟合更加困难了(重构误差又开始增加),这时候decoder就要想办法提高它的生成能力了。
  4. 重构的过程是希望没噪声的,而KL loss则希望有高斯噪声的,两者是对立的。所以,VAE跟GAN一样,内部其实是包含了一个对抗的过程,只不过它们两者是混合起来,共同进化的。

Talk is cheap,show me the code

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-09-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 卡尼慕 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Variational Auto-Encoders
    • Autoencoder
      • Autoencoder总结
        • Variational Autoencoers(VAEs)
          • Variational Autoencoers(VAEs)总结
            • Talk is cheap,show me the code
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档