专栏首页卡尼慕Variational Auto-Encoders

Variational Auto-Encoders

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

本文分享自微信公众号 - 卡尼慕(gh_40138f7dc7d3)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-09-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 将excel文件导入到数据库

    参考:http://blog.csdn.net/jayxujia123/article/details/13684313

    二狗不要跑
  • 如何写出一个性能优化的单例模式

    单例模型是面试当中最常见的一种设计模式,它是一种对象创建模式,用于产生一个对象的具体实例,可以确保系统中一个类只产生一个实例。

    朱季谦
  • pt-archiver Bug不会迁移max(id)那条数据的解决方法

    参考: http://www.ttlsa.com/mysql/pt-archiver-bug-cannot-migration-max-id-record/

    二狗不要跑
  • hexdump常用参数

    在分析mysql binlog或者ibd文件时候,常会用到hexdump 查看物理文件的存储内容。

    二狗不要跑
  • JAVA中for与while关于内存的细节问题

    JAVA的程序结构有顺序结构,循环结构,分支结构,以及跳转结构,而循环结构里经常用到的无外乎有以下几种:for循环,while循环,以及do-whil...

    朱季谦
  • C#开发BIMFACE系列3 服务端API之获取应用访问凭证AccessToken

    BIMFACE 平台为开发者提供了大量的服务器端 API 与 JavaScript API,用于二次开发 BIM 的相关应用。

    张传宁老师
  • 求两个有序数组合并后的中位数,最透讲解| 腾讯面试编程50题(三)

    本文是腾讯50道常考编程题之一:求解两个有序数组合并后的中位数,属于 "Hard" 难度,在校招中难倒一大波校招生。本文提供一种基本解法:基于归并排序。并对归并...

    double
  • @Qualifier高级应用---按类别批量依赖注入(QualifierAnnotationAutowireCandidateResolver原理详解)【享学Spring】

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    BAT的乌托邦
  • ROS2编程基础课程--接口

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    zhangrelay
  • LENGTH 和 CHAR_LENGTH 的区别

    char(N) 和 varchar(N) 这里的N指的是字符长度,而不是字节长度。就是说可以插入N个字符的长度的内容(不管插入的是英文还是中文,反正是按照长度...

    二狗不要跑

扫码关注云+社区

领取腾讯云代金券