VAE和AAE的主要区别

转自:https://www.quora.com/What-is-the-main-difference-between-Adversarial-Autoencoder-AAE-and-Variational-Autoencoder-VAE,版权归原作者所有,本文只做个人记录学习使用。

The main difference between VAE and AAE is the loss computed on the latent representation.

First, let's consider the VAE model as shown in the following:

VAE和AAE的主要区别

z is the unobserved representation that comes from a prior distribution pθ(z). Given input x, we want to model the posterior distribution pθ(z|x), however, this posterior distribution is intractable. The encoder network shown above is a probabilistic encoder that models qϕ(z|x).

First, VAE relies on KL divergence between the distribution qϕ(z|x) obtained from the encoder, and the prior pθ(z), in order to enforce that the probabilistic encoder yields the prior distribution pθ(z).

On the other hand, Adversarial Autoencoder (AAE) uses the adversarial loss similar to Generative Adversarial Networks (GANs), as shown below:

VAE和AAE的主要区别

In AAE, the discriminator receives its  input from two sources:

1. the latent representation vector z which is generated by autoencoder,

2. samples which are directly drawn from the prior distribution of z(p(z))

and the job of discriminator is to distinguish between the two sources, while the encoder tries to generate z so that can fool the discriminator.

插播一条另外一个作者对VAE的解读,链接在这里https://kexue.fm/archives/5253,版权同样归原作者所有。

分布变换

通常我们会拿VAE跟GAN比较,的确,它们两个的目标基本是一致的——希望构建一个从隐变量ZZ生成目标数据XX的模型,但是实现上有所不同。更准确地讲,它们是假设了ZZ服从某些常见的分布(比如正态分布或均匀分布),然后希望训练一个模型X=g(Z)X=g(Z),这个模型能够将原来的概率分布映射到训练集的概率分布,也就是说,它们的目的都是进行分布之间的变换

VAE和AAE的主要区别
那现在假设Z服从标准的正态分布,那么我就可以从中采样得到若干个Z1,Z2,…,ZnZ1,Z2,…,Zn,然后对它做变换得到X^1=g(Z1),X^2=g(Z2),…,X^n=g(Zn)X^1=g(Z1),X^2=g(Z2),…,X^n=g(Zn)我们怎么判断这个通过g构造出来的数据集,它的分布跟我们目标的数据集分布是不是一样的呢?有读者说不是有KL散度吗?当然不行,因为KL散度是根据两个概率分布的表达式来算它们的相似度的,然而目前我们并不知道它们的概率分布的表达式,我们只有一批从构造的分布采样而来的数据{X^1,X^2,…,X^n}还有一批从真实的分布采样而来的数据{X1,X2,…,Xn}(也就是我们希望生成的训练集)。我们只有样本本身,没有分布表达式,当然也就没有方法算KL散度。虽然遇到困难,但还是要想办法解决的。GAN的思路很直接粗犷:既然没有合适的度量,那我干脆把这个度量也用神经网络训练出来吧。就这样,WGAN就诞生了,详细过程请参考《互怼的艺术:从零直达WGAN-GP》。而VAE则使用了一个精致迂回的技巧。

VAE漫谈

首先我们有一批数据样本{X1,…,Xn},其整体用X来描述,我们本想根据{X1,…,Xn}得到X的分布p(X),如果能得到的话,那我直接根据p(X)来采样,就可以得到所有可能的X了(包括{X1,…,Xn}以外的),这是一个终极理想的生成模型了。当然,这个理想很难实现,于是我们将分布改一改

VAE和AAE的主要区别
这里我们就不区分求和还是求积分了,意思对了就行。此时p(X|Z)就描述了一个由Z来生成X的模型,而我们假设Z服从标准正态分布,也就是p(Z)=N(0,I)。如果这个理想能实现,那么我们就可以先从标准正态分布中采样一个Z,然后根据Z来算一个X,也是一个很棒的生成模型。接下来就是结合自编码器来实现重构,保证有效信息没有丢失,再加上一系列的推导,最后把模型实现。框架的示意图如下:VAE和AAE的主要区别

看出了什么问题了吗?如果像这个图的话,我们其实完全不清楚:究竟经过重新采样出来的ZkZk,是不是还对应着原来的XkXk,所以我们如果直接最小化D(X^k,Xk)2D(X^k,Xk)2(这里DD代表某种距离函数)是很不科学的,而事实上你看代码也会发现根本不是这样实现的。也就是说,很多教程说了一大通头头是道的话,然后写代码时却不是按照所写的文字来写,可是他们也不觉得这样会有矛盾~

VAE初现

其实,在整个VAE模型中,我们并没有去使用p(Z)(隐变量空间的分布)是正态分布的假设,我们用的是假设p(Z|X)(后验分布)是正态分布!!

具体来说,给定一个真实样本Xk,我们假设存在一个专属于Xk的分布p(Z|Xk)(学名叫后验分布),并进一步假设这个分布是(独立的、多元的)正态分布。为什么要强调“专属”呢?因为我们后面要训练一个生成器X=g(Z),希望能够把从分布p(Z|Xk)采样出来的一个Zk还原为Xk。如果假设p(Z)p是正态分布,然后从p(Z)中采样一个Z,那么我们怎么知道这个Z对应于哪个真实的X呢?现在p(Z|Xk)专属于Xk,我们有理由说从这个分布采样出来的Z应该要还原到Xk中去。

事实上,在论文《Auto-Encoding Variational Bayes》的应用部分,也特别强调了这一点:

In this case, we can let the
variational approximate posterior be a multivariate Gaussian with a diagonal covariance structure:

VAE和AAE的主要区别

(注:这里是直接摘录原论文,本文所用的符号跟原论文不尽一致,望读者不会混淆。)

论文中的式(9)是实现整个模型的关键,不知道为什么很多教程在介绍VAE时都没有把它凸显出来。尽管论文也提到p(Z)是标准正态分布,然而那其实并不是本质重要的。

回到本文,这时候每一个Xk都配上了一个专属的正态分布,才方便后面的生成器做还原。但这样有多少个X就有多少个正态分布了。我们知道正态分布有两组参数:均值μ和方差σ2(多元的话,它们都是向量),那我怎么找出专属于Xk的正态分布p(Z|Xk)的均值和方差呢?好像并没有什么直接的思路。那好吧,那我就用神经网络来拟合出来吧!这就是神经网络时代的哲学:难算的我们都用神经网络来拟合,在WGAN那里我们已经体验过一次了,现在再次体验到了。

于是我们构建两个神经网络μk=f1(Xk),logσ2k=f2(Xk)来算它们了。我们选择拟合log⁡σk2而不是直接拟合σ2k,是因为σk2总是非负的,需要加**函数处理,而拟合log⁡σk2不需要加**函数,因为它可正可负。到这里,我能知道专属于Xk的均值和方差了,也就知道它的正态分布长什么样了,然后从这个专属分布中采样一个Zk出来,然后经过一个生成器得到X^k=g(Zk),现在我们可以放心地最小化D(X^k,Xk)2,因为Zk是从专属Xk的分布中采样出来的,这个生成器应该要把开始的Xk还原回来。于是可以画出VAE的示意图

VAE和AAE的主要区别
VAE和AAE的主要区别
 
VAE和AAE的主要区别
 
VAE和AAE的主要区别
 
VAE和AAE的主要区别VAE和AAE的主要区别
 
VAE和AAE的主要区别
 
VAE和AAE的主要区别
 
VAE和AAE的主要区别
VAE和AAE的主要区别