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:
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:
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漫谈
首先我们有一批数据样本{X1,…,Xn},其整体用X来描述,我们本想根据{X1,…,Xn}得到X的分布p(X),如果能得到的话,那我直接根据p(X)来采样,就可以得到所有可能的X了(包括{X1,…,Xn}以外的),这是一个终极理想的生成模型了。当然,这个理想很难实现,于是我们将分布改一改
这里我们就不区分求和还是求积分了,意思对了就行。此时p(X|Z)就描述了一个由Z来生成X的模型,而我们假设Z服从标准正态分布,也就是p(Z)=N(0,I)。如果这个理想能实现,那么我们就可以先从标准正态分布中采样一个Z,然后根据Z来算一个X,也是一个很棒的生成模型。接下来就是结合自编码器来实现重构,保证有效信息没有丢失,再加上一系列的推导,最后把模型实现。框架的示意图如下:
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:
(注:这里是直接摘录原论文,本文所用的符号跟原论文不尽一致,望读者不会混淆。)
论文中的式(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的示意图