首页 > 编程知识 正文

Variational AutoEncoder 变分自编码器详解,变分自编码器

时间:2023-05-04 11:08:31 阅读:271916 作者:241

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

生成式模型

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

Encoder-Decoder模型

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

变分自编码器 问题定义

对于输入数据,我们希望根据的数据集,得到数据背后的分布,有了这个分布,我们就可以根据进行采样,得到所有可能的。

解决问题

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

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

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

如上图所示,在这个框架中,有一个拟合后验分布,有一个做decoder。接下来,我们来看,最大化似然真实生成的概率,会得到怎样的式子。

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

我们要optimize的式子长这个样子:,左侧代表的是真实数据的概率,是一个常量,把要优化的部分最大化,那么我们丢弃的那个部分就会最小,也就是真实的根据x生成z的概率分布和拟合的根据x生成z的分布。我们来介绍一下求解需要用到的一个技巧,叫做重采样。

重参数

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

实验结果

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

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。