**

变分自编码器(VAE)

**
写在最前面:本文中间有很多细节东西没讲,公式我也没有贴出来,写这个太累了,本来VAE涉及的知识就很多,但是大致思想我应该是讲清楚了的。

目录

  • 变分自编码器(VAE)
    • 前言
    • 从网络结构说起
    • 隐变量
    • 根源
      • 变分贝叶斯
    • Reparameterization trick
    • 网络结构
    • 代码及实验结果

前言

在这个GAN大行其道的时代,变分自编码器作为一种经典的生成模型(GAN有模型坍塌问题,咱们VAE就没有),好像没有必要存在了,其实不然,变分自编码器仍有其很大的价值,也广泛各种方向。经过了几天的学习和思考,特整理出此笔记,主要参考文献在本文末尾给出。网上也有很多博客,但其实那些博客里有很多细节东西没有讲清,或者有很多东西连博主都没有搞懂。毕竟VAE涉及的东西还是很多的。本文或许有诸多纰漏,希望能够得到读者的指正,谢谢。

从网络结构说起


图里面的细节不懂别想啦,把这篇文章看完了就懂了。对比着图可解释:我们首先给输入一张图片给进编码器(其实就是一个神经网络),之后通过编码器得到满足这张图片的高斯分布的均值和方差(为什么?稍后我们解释这个神经网络的作用),然后在这个高斯分布中进行采样得到样本,之后将这个样本送入解码器(神经网络)中,就得到解码后的图片啦。之后我们就可以利用解码器,直接从之前所得那个分布(其实是标准的正态分布,为什么?且看下文)里进行采样,送入Decoder里,就可以得到一张我们没有见过的图片啦。
呃,有点乱,那我们就从头开始讲吧。

隐变量

说清隐变量这个问题其实还是很不容易的,主要是有点抽象。对于我们有的这些图片,我们假设我们的图片经过某一个变换以后,到一个新空间X(咳咳,凑活着用X代替吧)中,那么每一个我们观测到的图片都在X中有个对应的向量和它对应对不对?那么我们其实就可以把X称为隐空间,隐空间的变量就成为隐变量,每一个向量都有一张对应的图片。也可以说,我们的每张图片都是由X生成的。于是乎,我们只要有了X这个空间,就可以生成任意一张图片了。

如上图,我们的隐变量是z,z生成x。(其实这是VAE的图,我们后来再说)

根源

首先我们只有图片的样本,假设这些图片都是人脸,我们希望能够生成任意一张从未在样本里出现过的人脸。怎么做呢?很简单,我们只要知道这些人脸的分布不就行了嘛。假设符合P(X),然后我们直接在这个分布中采样生成新的人脸就行。但是,不幸的是,我们只有样本,确定不了其符合的分布(这么复杂的分布,虽然存在,但就是求不出来哈哈哈)。可是我们不能放弃,于是乎,将P(X)改写一下:

呐,如上图中的公式那样,我们引入一个变量z符合一个已知的简单分布,然后我们由z确定我们的x,最后对z进行积分,一样能得到P(X)。好像很简单哎,我们最大化一个具体的X出现的概率,转换成最大化积分里面的条件概率就行了。而且,从蒙特卡罗采样最基本的原理我们知道,上式可以近似下面的的这种形式:

上式意味着我们每次从z中采样,重复n次最后一样可以近似P(X)。很简单吧,然而不幸的是,我们需要采样非常多次才能近似上式,特别是我们图片的特征维度贼高的情况下,n趋于无穷才好。唉,成功的道路就是这么曲折,不过我们总是可以去克服。于是我们不从z中采样,我们从一个最可能生成x的分布中采样不就行了吗?什么分布最可能生成x呢?当然是由x确定的z啊。即

哈哈哈,是不是恍然大悟了。我们找到后验分布P(z|X),然后从这里面采样z不就可以了吗?这样就可以大大减少采样次数了。
于是乎,我们的目的就是找到P(z|X)和P(X)之间的关系了。如何找?就用到了我们的变分贝叶斯法。我们在下文来说。

变分贝叶斯

首先我们知道P(z|X)是一个我们不知道的复杂的后验分布,于是我们找一个我们已知的简单分布Q(一般我们假设是一个高斯分布)近似它。用我们的KL散度来衡量两个分布间的差异。得到下式:

进一步化简得到下式记为(1):

其实要知道EM算法的话,和那个开始推到是一样的。上式右边第一项我们称为变分下界(和ELBO一样的,当然也可以称为ELBO)。仔细看上式,右边第一项(变分下届)不就是我们的P(X|z)*Q(z|X)嘛,即我们生成X最大的概率。右端第二项是我们的后验Q(z|X)(上式中的Q(z))和我们的先验z的差异嘛,我们最大化左边,就是最小化这个D(Q||P),这说明什么。说明我们训练好一个模型之后,生成图片的化直接从我们简单的先验分布P(z)里进行采样生成就行了。
所以说,上式右边第一项就可以对应我们的解码器Decoder,右边第二项对应我们的编码器Encoder。
而且第二项有一个闭式解(自己推推吧,比较好):

之后我们就可以训练我们的网络了。

Reparameterization trick

我们基本上知道了什么是VAE,但是这里面有个小trick,就是我们在训练的时候是从z中采样,但是这个采样的过程不可导啊,这意味着我们不能进行反向传播训练我们的模型,咋办,我们就用了这个trick。


我们从利用上面的式子进行模拟采样,(反正z都是符合Q(z|X)的均值和方差的),可导了,完美,这样我们就可以实现端到端了。最终我们从标准正态分布采样就行了。

网络结构


我们来回顾一下我们的整个结构,训练阶段我们从X经过Encoder得到后验分布Q(z|X),然后从这个分布里采样到Decoder里得到图片。生成图片时,我们从标准的正态分布采样送到Decoder就可以生成新图片。
最后我们假设我们的Decoder训练的分布是正态分布的话,那么我们就有一个MSE损失。

代码及实验结果

VAE实现还是很简单的,代码Github里遍地都是。
放张我生成的手写体数字图片吧,不得不说,VAE生成的真的是比GAN模糊。。。

罢了,就到这吧。

参考文献
[1]:Doersch C . Tutorial on Variational Autoencoders[J]. 2016.
[2]:Kingma D P , Welling M . Auto-Encoding Variational Bayes[J]. 2013.

变分自编码器原理解析相关推荐

  1. 变分自编码器原理详解

    变分自编码器 基本思想:VAE在2013年提出,假设数据xix_ixi​是由一个随机过程产生的,该随机过程分为两步: 由先验分布Pθ∗(z)P_{\theta^*}(z)Pθ∗​(z)产生隐变量ziz ...

  2. 通俗易懂——VAE变分自编码器原理

    变分自编码器(Variational Auto Encoder, VAE) 李宏毅机器学习笔记.转载请注明出处. 自编码器(Autoencoder): Autoencoder = Encoder + ...

  3. VAE(变分自编码器)原理简介

    一.技术背景 变分自编码器(VAE)是一种深度生成模型,可以用于从高维数据中提取潜在的低维表示,并用于生成新的样本数据.自编码器(Autoencoder)是深度学习领域中常用的一种无监督学习方法,其基 ...

  4. 【13】变分自编码器(VAE)的原理介绍与pytorch实现

    文章目录 1.VAE的设计思路 2.VAE的模型架构 3.VAE的作用原理 4.VAE的Pytorch实现 1)参考代码 2)训练结果展示 3)生成结果展示 5.实现VAE中出现的问题 1.VAE的设 ...

  5. 论文解析:变分自编码器

    VAE(变分自编码器)  变分自编码器来自于论文<Auto-Encoding Variational Bayes>,是一种生成式模型,生成式模型的概念在CS229中已经有过介绍了,简单来说 ...

  6. 模型汇总-10 Variational AutoEncoder_变分自动编码器原理解析

    在<模型汇总-9>部分,详细讲解了与VAE有关的基础知识,涉及LVM.MAP.EM.MCMC.Variational Inference(VI),可以通过公众号往期内容查看.有了这些知识的 ...

  7. 变分自编码器VAE的数学原理

    变分自编码器(VAE)是一种应用广泛的无监督学习方法,它的应用包括图像生成.表示学习和降维等.虽然在网络架构上经常与Auto-Encoder联系在一起,但VAE的理论基础和数学公式是截然不同的.本文将 ...

  8. 漫谈概率 PCA 和变分自编码器

    作者丨知乎DeAlVe 学校丨某211硕士生 研究方向丨模式识别与机器学习 介绍 主成分分析(PCA)和自编码器(AutoEncoders, AE)是无监督学习中的两种代表性方法. PCA 的地位不必 ...

  9. 变分自编码器(VAE)详解与实现(tensorflow2.x)

    变分自编码器(VAE)详解与实现(tensorflow2.x) VAE介绍 VAE原理 变分推理 VAE核心方程 优化方式 重参数化技巧(Reparameterization trick) VAE实现 ...

最新文章

  1. webview页面和壳通信的库(精简版)
  2. Python 元类(控制实例创建)
  3. sqlite+php+函数大全,PHP SQLite SQLite 函数_编程学问网
  4. java操作samba_使用Java和Samba JCIFS访问文件
  5. ElementUI项目中怎样引用Jquery
  6. 到底什么是AI0T?现在不少头部企业都在打造AIOT概念,今天我们就梳理一下AIOT产业都包含了哪些,启明云端在AIOT中,能提供哪些解决方案?
  7. Python学习【day02】-str类型方法记录
  8. Springboot/Cloud集成Sentinel进阶实战
  9. Tomcat中的Out Of Memory错误
  10. android.bg,[Android]AMS-PSS
  11. 面试工作笔记001---记录各种语言_各种技术经典面试问题
  12. CSS兼容性解决方法!important的IE7,Firefox问题
  13. mysql 数据库乱码的解决办法_数据库 MySQL中文乱码解决办法总结
  14. 有了世界级的数据中心,你还会担心 “全年无休”吗?
  15. 【原创】Linux 菜鸟入门记录 常用命令 常用软件
  16. 人脸检测进阶:使用 dlib、OpenCV 和 Python 检测眼睛、鼻子、嘴唇和下巴等面部五官
  17. 华人工程师在美国-从微软高管离职说起
  18. 201621123068 Week02-Java基本语法与类库
  19. Window安装Netbeans9
  20. 计算机网络 自顶向下方法 第二章 应用层

热门文章

  1. Python线程,以及多线程带来的数据错乱和死锁的解决方法
  2. 水果(hdu1262)map
  3. windows的FTP服务账户和密码输入正确也不能登陆
  4. Symantec SEP11.0客户端部署!
  5. 如何利用QQ影音把视频转码为MP4格式
  6. php商城毕业设计ppt,一直想用PHP写个商城。,毕业论文设计,答辩ppt,开题报告,外文翻译,苹果,硕士研究生,iphone...
  7. 3.1无名管道、命名管道
  8. 监控器物检测object detection实战
  9. rectangle函数的使用
  10. 2DBox和3DBox和旋转Box的iou计算