本文是《Tutorial on Variational AutoEncoders》一文部分翻译的内容。
1.介绍
generative model,学习高维数据的概率分布 P(X) 。学习到不同维度之间的相互依赖关系,比如手写数字的生成模型如果生成了8的左边一半像素,那么剩下的像素也就能够随之确定。
latent variable,给予生成模型一些信息用来生成数据。比如一个生成手写数字的生成模型,隐变量z就可以是从[0,…,9]中随机采样的整型,确定了隐变量模型才能生成像素点。
但是隐变量又不可能那么简单,因为对于一个能够表达出数据集特性的生成模型,对于每个数据点,生成模型都要能够产生出一个隐变量来生成一个非常相似的东西。对手写数字数据集来说,同样的一个8,可能大一点或者小一点,往左歪一点或者往右歪一点,字迹是粗一点还是细一点。所以,生成模型中隐变量需要表达更多的信息,需要一个高维度的向量来表示隐变量 z∈RZ ,隐变量要能够自动的学习到这些信息的表示,而且这些影响手写数字生成的信息之间的相互影响和依赖,即隐变量的latent structure,也应该自动的学习。
2.目标函数
VAE的过程是:从概率密度函数P(z)中采样隐变量z之后,从确定性函数 f(z;θ) 得到的值,这个值要大概率和数据集中的数据很相似。
所以我们的目标是对数据集中的所有数据x,最大化:
其中的条件概率 P(X|z;θ) 等于 N(X|f(z;θ),σI) ,也就是在标准VAE中,如果输出是实数向量,通常输出的分布是均值为 f(z;θ) 方差为 σI 的高斯分布。
VAE要最大化P(x),就要解决两个问题:
- 隐变量z如何表示?
使用标准正态分布 N(0,I) ,因为只要有一个n维标准正态分布的z,再找到一个足够复杂的函数g,那么g(z)就可以表示任意一个n维分布。
对上面的公式而言, f(z;θ) 就是一个多层神经网络组成的函数逼近器。可以将将隐变量映射到最后的输出。
- P(X) 的积分如何计算?
现在我们得到了 P(z)=N(0,I) ,可以直接计算 P(X) 了吗?还是不行,假如采用抽样的方式抽样出很多z来计算 P(X) 的话就会发现,对于绝大多数z来说, P(X|z) 都接近于0(因为z是标准正态分布的采样),这种方式非常低效。
VAE的解决这个问题的核心思想就是,试图抽样出有更大可能性产生X的z。而做到这一点是通过另一个分布 Q(z|X) 来实现的,这个分布产生的Q能够以较大的可能产生X。
但是我们使用了Q分布后, P(X) 积分公式就变成了 Ez∼QP(X|z) ,我们要找到后者和 P(X) 之间的关系。根据 P(z|X)和Q(z|X) 的KL散度的公式进行推导,可以推出:
其中左侧的部分就是目标函数,我们要最大化这个目标函数就是在最大化对数似然概率的同时,最小化我们预测的分布Q和真实分布P之间的差异。
3.目标函数优化
那么 Q(z|X) 是一个什么分布呢?通常的选择是,也是一个多元高斯分布 N(z|μ(X),σ(X)) ,其中的 μ和σ 都是由神经网络学习到的映射。
所以目标函数等号右侧的最后一项就变成了两个多元高斯分布的KL散度,因为我们假定 P(z) 是标准多元高斯分布。在得到了Q分布之后,这一项是能够计算出来的(当然也能够利用梯度下降来优化)。
而右侧的第一项,也就是 Ez∼Q[logP(X|z)] ,通过当前时刻的Q分布,从中采样出若干个z,然后从这若干个z中计算出 P(X|z) 作为期望的逼近值。
但是这样做的话,由于采样操作对 μ 和 σ 不可导,反向传播无法进行,因此,实际的VAE中使用了一个叫做reparameterization的改进,以从 N(0,I) 中抽样出数值 ϵ 后,用 ϵ 乘以方差再加上均值的结果代替从 N(z|μ(X),σ(X)) 中抽样,如下图。
所以最终,VAE的优化目标就是,让最终的输出 f(z) 与目标 x 足够接近的同时,隐变量的分布 Q∼N(μ,σ2) 接近真实先验分布 P∼N(0,I2) 。
4.条件变分自编码器
为了解决某种问题,比如说给定某个人的手迹,要求生成另一些与他的手迹很像的手迹。这时候需要制定输入计算输出 P(Y|X) ,为了解决这类问题,从变分自编码器衍生出条件变分自编码器。
模型在Encoder和Decoder的输入中,增加了条件输入X,如上图。当然这张图只是一个简化版本,实际的CVAE有很多论文提出了很多不同的版本。
原文地址: http://cairohy.github.io/2017/11/17/deeplearning/Tutorial%20on%20Variational%20AutoEncoders/