Tutorial on Variational AutoEncoders
本文是《Tutorial on Variational AutoEncoders》一文部分翻译的内容。
1.介绍
generative model,学习高维数据的概率分布P(X)P(X)。学习到不同维度之间的相互依赖关系,比如手写数字的生成模型如果生成了8的左边一半像素,那么剩下的像素也就能够随之确定。
latent variable,给予生成模型一些信息用来生成数据。比如一个生成手写数字的生成模型,隐变量z就可以是从[0,…,9]中随机采样的整型,确定了隐变量模型才能生成像素点。
但是隐变量又不可能那么简单,因为对于一个能够表达出数据集特性的生成模型,对于每个数据点,生成模型都要能够产生出一个隐变量来生成一个非常相似的东西。对手写数字数据集来说,同样的一个8,可能大一点或者小一点,往左歪一点或者往右歪一点,字迹是粗一点还是细一点。所以,生成模型中隐变量需要表达更多的信息,需要一个高维度的向量来表示隐变量z∈RZz∈RZ,隐变量要能够自动的学习到这些信息的表示,而且这些影响手写数字生成的信息之间的相互影响和依赖,即隐变量的latent structure,也应该自动的学习。
2.目标函数
VAE的过程是:从概率密度函数P(z)中采样隐变量z之后,从确定性函数f(z;θ)f(z;θ)得到的值,这个值要大概率和数据集中的数据很相似。
所以我们的目标是对数据集中的所有数据x,最大化:
其中的条件概率P(X|z;θ)P(X|z;θ)等于N(X|f(z;θ),σI)N(X|f(z;θ),σI),也就是在标准VAE中,如果输出是实数向量,通常输出的分布是均值为f(z;θ)f(z;θ)方差为σIσI的高斯分布。
VAE要最大化P(x),就要解决两个问题:
- 隐变量z如何表示?
使用标准正态分布N(0,I)N(0,I),因为只要有一个n维标准正态分布的z,再找到一个足够复杂的函数g,那么g(z)就可以表示任意一个n维分布。
对上面的公式而言,f(z;θ)f(z;θ)就是一个多层神经网络组成的函数逼近器。可以将将隐变量映射到最后的输出。
- P(X)P(X)的积分如何计算?
现在我们得到了P(z)=N(0,I)P(z)=N(0,I),可以直接计算P(X)P(X)了吗?还是不行,假如采用抽样的方式抽样出很多z来计算P(X)P(X)的话就会发现,对于绝大多数z来说,P(X|z)P(X|z)都接近于0(因为z是标准正态分布的采样),这种方式非常低效。
VAE的解决这个问题的核心思想就是,试图抽样出有更大可能性产生X的z。而做到这一点是通过另一个分布Q(z|X)Q(z|X)来实现的,这个分布产生的Q能够以较大的可能产生X。
但是我们使用了Q分布后,P(X)P(X)积分公式就变成了Ez∼QP(X|z)Ez∼QP(X|z),我们要找到后者和P(X)P(X)之间的关系。根据P(z|X)和Q(z|X)P(z|X)和Q(z|X)的KL散度的公式进行推导,可以推出:
其中左侧的部分就是目标函数,我们要最大化这个目标函数就是在最大化对数似然概率的同时,最小化我们预测的分布Q和真实分布P之间的差异。
3.目标函数优化
那么Q(z|X)Q(z|X)是一个什么分布呢?通常的选择是,也是一个多元高斯分布N(z|μ(X),σ(X))N(z|μ(X),σ(X)),其中的μ和σμ和σ都是由神经网络学习到的映射。
所以目标函数等号右侧的最后一项就变成了两个多元高斯分布的KL散度,因为我们假定P(z)P(z)是标准多元高斯分布。在得到了Q分布之后,这一项是能够计算出来的(当然也能够利用梯度下降来优化)。
而右侧的第一项,也就是Ez∼Q[logP(X|z)]Ez∼Q[logP(X|z)],通过当前时刻的Q分布,从中采样出若干个z,然后从这若干个z中计算出P(X|z)P(X|z)作为期望的逼近值。
但是这样做的话,由于采样操作对μμ和σσ不可导,反向传播无法进行,因此,实际的VAE中使用了一个叫做reparameterization的改进,以从N(0,I)N(0,I)中抽样出数值ϵϵ后,用ϵϵ乘以方差再加上均值的结果代替从N(z|μ(X),σ(X))N(z|μ(X),σ(X))中抽样,如下图。
所以最终,VAE的优化目标就是,让最终的输出f(z)f(z)与目标xx足够接近的同时,隐变量的分布Q∼N(μ,σ2)Q∼N(μ,σ2)接近真实先验分布P∼N(0,I2)P∼N(0,I2)。
4.条件变分自编码器
为了解决某种问题,比如说给定某个人的手迹,要求生成另一些与他的手迹很像的手迹。这时候需要制定输入计算输出P(Y|X)P(Y|X),为了解决这类问题,从变分自编码器衍生出条件变分自编码器。
模型在Encoder和Decoder的输入中,增加了条件输入X,如上图。当然这张图只是一个简化版本,实际的CVAE有很多论文提出了很多不同的版本。
原文地址: http://cairohy.github.io/2017/11/17/deeplearning/Tutorial%20on%20Variational%20AutoEncoders/
Tutorial on Variational AutoEncoders相关推荐
- 条件式变换自编码机(conditional variational autoencoders)学习笔记(一)
目录 前言 原文 Introduction VAE的功能 VAE的结构 隐空间的结构 用重参数化训练VAE 条件式变换自编码机(conditional variational autoencoders ...
- 【DL笔记】Tutorial on Variational AutoEncoder——中英文对照(更新中)
更新时间:2018-09-25 Abstract In just three years, Variational Autoencoders (VAEs) have emerged as one of ...
- 基于关联规则(Variational Autoencoders)疾病预测系统实战:(pyspark FPGrowth实现频繁项集挖掘、最后给出预测模型topK准确率和召回率)
基于关联规则(Variational Autoencoders)疾病预测系统实战:(pyspark FPGrowth实现频繁项集挖掘.最后给出预测模型topK准确率和召回率) 目录
- 基于变分自动编码器(Variational Autoencoders)疾病预测系统实战:(Keras实现并可视化训练和验证误差、最后给出topK准确率和召回率)
基于变分自动编码器(Variational Autoencoders)疾病预测系统实战:(Keras实现并可视化训练和验证误差.最后给出topK准确率和召回率) 本文中使用的VAE算法以病人病史为输入 ...
- 基于变分自动编码器(Variational Autoencoders)进行推荐系统的实施、Keras实现并可视化训练和验证误差、最后给出topK准确率和召回率
基于变分自动编码器(Variational Autoencoders)进行推荐系统的实施.Keras实现并可视化训练和验证误差.最后给出topK准确率和召回率 本著作改编自Dawen等人用于协同过滤目 ...
- 53_Auto-Encoders和Variational AutoEncoders(VAE)、PCA降维和Auto-Encoders降维的比较、Auto-Encoders变种、pytorch实现等
1.53.Auto-Encoders和Variational AutoEncoders(VAE) 1.53.1.无监督学习 1.53.2.Auto-Encoders 1.53.3.How to Tra ...
- Variational Autoencoders and Nonlinear ICA: A Unifying Framework
文章目录 概 主要内容 本文的模型 Identifiability Khemakhem I., Kingma D. P., Monti R. P. and Hyv"{a}rinen A. V ...
- 变分自编码器 (Variational Autoencoders, VAEs)
Contents Dimensionality reduction, PCA and autoencoders Dimensionality reduction Principal component ...
- (译) Conditional Variational Autoencoders 条件式变换自编码机
Conditional Variational Autoencoders --- 条件式变换自编码机 Goal of a Variational Autoencoder: 一个 VAE(variati ...
最新文章
- 给研发工程师的代码质量利器 | SOFAChannel#5 直播整理
- WEB前端:06_accordion手风琴效果
- 简单python画圣诞树图片-python圣诞树代码
- BAT笔试试题常见试题总结含答案(持续更新。。。)
- 理解JavaScript继承(二)
- android tv 蓝牙服务_打电话、看电话,听清大千世界,不单只有助听器,力斯顿的尖端配件“无线通”“TV伴侣”了解一下。...
- PowerShell对象排序(结合哈希表)
- Nginx 是如何实现高并发?常见的优化手段有哪些?
- script setup 实验性 vue 语法
- C++ string用法
- 使用DevExpress.XtraTabbedMdi.XtraTabbedMdiManager控件来加载MDI窗体
- c_数据结构_队的实现
- 技术升级成为Linux运维人前途的魔障,是跟进还是选择被淘汰?
- 大前研一《思考的技术》
- 使用TestCafe进行UI测试
- 单调队列java_单调队列单调栈
- 使用rotate()来做一个3d贺卡
- 文字符号设计方法整理1--笔画字形(体)处理方法
- unity中脚本之间传递信息的方式
- 自驾指南:元旦爱车出行全攻略