变分自编码器原理解析
**
变分自编码器(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.
变分自编码器原理解析相关推荐
- 变分自编码器原理详解
变分自编码器 基本思想:VAE在2013年提出,假设数据xix_ixi是由一个随机过程产生的,该随机过程分为两步: 由先验分布Pθ∗(z)P_{\theta^*}(z)Pθ∗(z)产生隐变量ziz ...
- 通俗易懂——VAE变分自编码器原理
变分自编码器(Variational Auto Encoder, VAE) 李宏毅机器学习笔记.转载请注明出处. 自编码器(Autoencoder): Autoencoder = Encoder + ...
- VAE(变分自编码器)原理简介
一.技术背景 变分自编码器(VAE)是一种深度生成模型,可以用于从高维数据中提取潜在的低维表示,并用于生成新的样本数据.自编码器(Autoencoder)是深度学习领域中常用的一种无监督学习方法,其基 ...
- 【13】变分自编码器(VAE)的原理介绍与pytorch实现
文章目录 1.VAE的设计思路 2.VAE的模型架构 3.VAE的作用原理 4.VAE的Pytorch实现 1)参考代码 2)训练结果展示 3)生成结果展示 5.实现VAE中出现的问题 1.VAE的设 ...
- 论文解析:变分自编码器
VAE(变分自编码器) 变分自编码器来自于论文<Auto-Encoding Variational Bayes>,是一种生成式模型,生成式模型的概念在CS229中已经有过介绍了,简单来说 ...
- 模型汇总-10 Variational AutoEncoder_变分自动编码器原理解析
在<模型汇总-9>部分,详细讲解了与VAE有关的基础知识,涉及LVM.MAP.EM.MCMC.Variational Inference(VI),可以通过公众号往期内容查看.有了这些知识的 ...
- 变分自编码器VAE的数学原理
变分自编码器(VAE)是一种应用广泛的无监督学习方法,它的应用包括图像生成.表示学习和降维等.虽然在网络架构上经常与Auto-Encoder联系在一起,但VAE的理论基础和数学公式是截然不同的.本文将 ...
- 漫谈概率 PCA 和变分自编码器
作者丨知乎DeAlVe 学校丨某211硕士生 研究方向丨模式识别与机器学习 介绍 主成分分析(PCA)和自编码器(AutoEncoders, AE)是无监督学习中的两种代表性方法. PCA 的地位不必 ...
- 变分自编码器(VAE)详解与实现(tensorflow2.x)
变分自编码器(VAE)详解与实现(tensorflow2.x) VAE介绍 VAE原理 变分推理 VAE核心方程 优化方式 重参数化技巧(Reparameterization trick) VAE实现 ...
最新文章
- webview页面和壳通信的库(精简版)
- Python 元类(控制实例创建)
- sqlite+php+函数大全,PHP SQLite SQLite 函数_编程学问网
- java操作samba_使用Java和Samba JCIFS访问文件
- ElementUI项目中怎样引用Jquery
- 到底什么是AI0T?现在不少头部企业都在打造AIOT概念,今天我们就梳理一下AIOT产业都包含了哪些,启明云端在AIOT中,能提供哪些解决方案?
- Python学习【day02】-str类型方法记录
- Springboot/Cloud集成Sentinel进阶实战
- Tomcat中的Out Of Memory错误
- android.bg,[Android]AMS-PSS
- 面试工作笔记001---记录各种语言_各种技术经典面试问题
- CSS兼容性解决方法!important的IE7,Firefox问题
- mysql 数据库乱码的解决办法_数据库 MySQL中文乱码解决办法总结
- 有了世界级的数据中心,你还会担心 “全年无休”吗?
- 【原创】Linux 菜鸟入门记录 常用命令 常用软件
- 人脸检测进阶:使用 dlib、OpenCV 和 Python 检测眼睛、鼻子、嘴唇和下巴等面部五官
- 华人工程师在美国-从微软高管离职说起
- 201621123068 Week02-Java基本语法与类库
- Window安装Netbeans9
- 计算机网络 自顶向下方法 第二章 应用层
热门文章
- Python线程,以及多线程带来的数据错乱和死锁的解决方法
- 水果(hdu1262)map
- windows的FTP服务账户和密码输入正确也不能登陆
- Symantec SEP11.0客户端部署!
- 如何利用QQ影音把视频转码为MP4格式
- php商城毕业设计ppt,一直想用PHP写个商城。,毕业论文设计,答辩ppt,开题报告,外文翻译,苹果,硕士研究生,iphone...
- 3.1无名管道、命名管道
- 监控器物检测object detection实战
- rectangle函数的使用
- 2DBox和3DBox和旋转Box的iou计算