Variational Auto-Encoder 变分自编码器详解

在我最近研读各种文献的过程中,变分自编码器(VAE)经常出现在各种方法中,往往紧接着VAE之后,就是一串我看不懂的公式。后来,我找到了VAE的原始文献,Auto-Encoding Variational Bayes,直接被劝退,实在是太难以理解了。直到最近,又看了几篇讲解VAE的文章,看了几个视频,请教了几位同学,感觉对VAE的理解深入了那么一点点,所以决定把这些理解永久地保存在博客上。下一步的目标是读懂Representation Learning with Contrastive Predictive Coding。

生成式模型

在讲解变分自编码器之前,我们先来解释清楚,变分自编码器是用来解决什么问题的。相较于预测股价,图片分类等这样有明确标签的有监督问题,我们面对的一个更大的挑战是,如何处理无监督的问题。如何生成一张接近真实世界的图片?这个问题就是一个无监督学习的问题,我们没有任何的标签,只给你一组真实的图片,让你去生成可以以假乱真的图片,为了完成这个事情,我们要做的就是去学习真实图片的分布,根据这个分布产生以假乱真的图片,这就是生成式模型要解决的问题。说到这个任务,大家最熟悉的模型一定是对抗神经网络(GAN)。在对抗神经网络中,我们通过一个生成器去生成假图片,用一个鉴别器去区分图片的真假,这样,我们就把问题变成了一个2-player game。生成器和鉴别器不断对抗博弈,最终我们的生成器学习到了真实图片的分布。GAN是一种隐形学习分布的模型,那么有没有显式学习分布的模型呢?如果大家感兴趣,大家可以更深入地去了解下生成式模型,比如PixelRNN这样的模型,这个模型就是去显式地学习模型分布,用一个p_\theta(X)去拟合真实的p(X),最小化这两个的差距,也可以说使用的是最大似然估计的方法,在显示学习分布的模型中,还有一种近似去拟合分布的方法,这个那就要讲到我们这篇博文要用到的变分自编码器。

Encoder-Decoder模型

Encoder-Decoder是在深度学习中非常常见的学习框架,Encoder-Decoder不是一个具体的算法,而是一类框架,我们把视频,图片,语句等输入通过编码器,将其压缩成一个指定维度的context,而编码器,则能根据这个context,生成视频,图片,语句等。在这里,我们也没有指定具体使用的神经网络模型,比如CNN,RNN等都没有问题。我们思考下Encoder-Decoder模型的想法和思路,先编码再解码,看似多此一举,但是其实是符合我们人类大脑处理信息的方式的,当我们大脑看到一个事物,记录它的方式肯定不是原原本本刻录它,而是把它的关键特征记录下来,需要时再通过特征对这个东西进行还原重现。在Encoder-Decoder模型中,Encoder解码得到的信息有很大的作用,我们可以想象,这个信息一定包含了原始数据的关键信息,这个Encoder也可以理解为是对原始数据进行了降维,提取了关键特征,在后续的很多场景中也可以对其加以利用。在无监督学习中使用的自编码器(Auto Enocoder),可以完成图像去噪,降维,图像压缩等很多任务。

Variational Auto-Encoder 变分自编码器详解_第1张图片

变分自编码器

问题定义

对于输入数据\{X_1,X_2,...,X_n\},我们希望根据X的数据集\{X_1,X_2,...,X_n\},得到数据背后的分布p(X),有了这个分布,我们就可以根据p(X)进行采样,得到所有可能的X

解决问题

变分自编码器的想法是这样的,我们认为,我们所有数据的产生,都是由一个内部隐藏的变量,Z决定了,拿到这个Z,我们就可以去得到一个X,也就是p(X|Z)。也就是说我们其实可以将原来的分布p(X)表示为p_{\theta}(x)=\int p_{\theta}(z) p_{\theta}(x \mid z) d z。(在这里,不区分表示成求和还是积分)。其中θ代表的是这个分布对应的参数,我们可以假设Z的分布p_\theta(Z)满足正态分布。讲到这里,大家肯定都不知所以,我们用贝叶斯公式,做了这个变换,意义是什么?哪怕我们假设了一个正态分布,我们也不可能凭空把这个分布模拟出来,这个式子到底包含了哪些信息?给了我们什么启发?这是我们接下来要解决的重点。

再来看这个积分的式子,如下图所示,这个积分可以看作由三个部分构成,p_\theta(Z)满足正态分布,可以解决,p_{\theta}(x \mid z),我们用一个decoder去求解,输入一个z输出一个x,也没有问题。但是我们却无法处理前面的积分符号,因为对于连续变量z,我们无法穷举其值。因此这个式子看似很美好,给我们开辟了新的道路,但是却因为无法穷举被堵死了,在山穷水尽疑无路的时候,柳暗花明在哪里呢?

Variational Auto-Encoder 变分自编码器详解_第2张图片

我们再转过头来看,这个后验概率有没有解决的方法p_{\theta}(z \mid x)=p_{\theta}(x \mid z) p_{\theta}(z) / p_{\theta}(x)。很可惜,显然无法解,因为那个p_\theta(x)显然就是我们要求的量。为了解决这个问题,我们需要引入一个编码器\mathrm{q}_{\phi}(\mathrm{z} \mid \mathrm{x}),去拟合这个后验分布,在后面,我们会看到,这个拟合可以让我们对上面我们要求解的p_\theta(x)获得一个lower bound。

Variational Auto-Encoder 变分自编码器详解_第3张图片

如上图所示,在这个框架中,有一个\mathrm{q}_{\phi}(\mathrm{z} \mid \mathrm{x})拟合后验分布,有一个p_{\theta}(x \mid z)做decoder。接下来,我们来看,最大化似然真实生成的概率,会得到怎样的式子。

Variational Auto-Encoder 变分自编码器详解_第4张图片

经过几步变换,我们将这个似然函数分成了三部分,这三个部分各自有各自的含义,将上面的式子再转化一下,得到\mathbf{E}_{z}\left[\log p_{\theta}\left(x^{(i)} \mid z\right)\right]-D_{K L}\left(q_{\phi}\left(z \mid x^{(i)}\right) \| p_{\theta}(z)\right)+D_{K L}\left(q_{\phi}\left(z \mid x^{(i)}\right) \| p_{\theta}\left(z \mid x^{(i)}\right)\right),第一部分是解码器可以得到的,,第二部分是z先验分布和编码器的KL散度,这是一个好处理好计算的量。最后一部分,很可惜,p_\theta(z|x^{(i)})这个东西,我们没法求(前文已经提到),但是KL散度一定是大于等于0的。因此,我们可以考虑不处理这一项,而是专心最大化前两项,也就是说,我们最后是在优化这个似然函数的lower bound。

我们要optimize的式子长这个样子:\underbrace{\mathbf{E}_{z}\left[\log p_{\theta}\left(x^{(i)} \mid z\right)\right]-D_{K L}\left(q_{\phi}\left(z \mid x^{(i)}\right) \| p_{\theta}(z)\right)}_{\mathcal{L}\left(x^{(i)}, \theta, \phi\right)},左侧代表的是真实数据的概率,是一个常量,把要优化的部分最大化,那么我们丢弃的那个部分就会最小,也就是真实的根据x生成z的概率分布和拟合的根据x生成z的分布。我们来介绍一下求解\mathrm{q}_{\phi}(\mathrm{z} \mid \mathrm{x})需要用到的一个技巧,叫做重采样。

重参数

在VAE中,为了得到z,我们使用的其实是采样,但是一般的采样是无法保留梯度信息的,也就是说,我们没法通过反向传播来优化神经网络。重参数给我提供了一种手段,既可以进行采样,也可以保留参数的信息进行反向传播。重参数具体是怎么做的呢?我们以正态分布为例,重参数就是“从\mathcal{N}\left(z ; \mu_{\theta}, \sigma_{\theta}^{2}\right)中采样一个z”变成“从\mathcal{N}(\varepsilon ; 0,1)中采样一个ε,然后计算\varepsilon \times \sigma_{\theta}+\mu_{\theta}”,所以\mathbb{E}_{z \sim \mathcal{N}\left(z ; \mu_{\theta}, \sigma_{\theta}^{2}\right)}[f(z)]=\mathbb{E}_{\varepsilon \sim \mathcal{N}(\varepsilon ; 0,1)}\left[f\left(\varepsilon \times \sigma_{\theta}+\mu_{\theta}\right)\right]。为什么这样就有梯度信息了呢?因为假设我们直接从原始正态分布中取,\mathcal{N}\left(z ; \mu_{\theta}, \sigma_{\theta}^{2}\right),比如取到了5,这个5,我们没法看出和θ有什么关系,但是如果我告诉你,我们先取一个0.2,然后得到的是0.2σθ+μθ,这样子,我们的参数信息就有了。(引用自漫谈重参数:从正态分布到Gumbel Softmax)

实验结果

Variational Auto-Encoder 变分自编码器详解_第5张图片

我们使用VAE生成人像和手写数字,这两张图中,都是横纵坐标都是z在发生变化,比如左边这张图,可以看到纵向z决定的是笑的幅度,而横向则是头的角度,右侧手写数字体的生成中也可以观察到类似的平滑变化。

你可能感兴趣的:(模式识别,神经网络,机器学习,VAE,变分自编码器,生成式模型,人工智能)