AE、VAE、Beta-VAE学习记录

在现实的世界中,我们无时无刻不接受着大量的数据,这些数据可能是文本或者是声音等等。但是数据本身真正蕴含的信息可能仅仅用个低维向量表示就够用了,而不是像数据本身看起来那样复杂。机器学习中就有很多将数据压缩到低维空间中的技术。其中有一个最近论文中比较火的,那就是变分自编码。

在开启变分自编码的探索之前,先介绍一些常见的自编码机。这需要一些神经网络的基础知识,比如说反向传播等等的。自编码机实际要做的事情是喂给一些输入数据,比如说一个图像或一个向量,或者是其他的高维度的数据。通过神经网络的加持,数据能够压缩成一个低维度的表示。自编码机分有两个部分,第一部分叫做编码机,他通常是个多层神经网络,全连接的神经网络和卷积神经网络都可以。编码机接受输入数据,然后把输入数据压缩为一个向量,其维度远低于输入数据,我们管压缩出来的这个向量叫做“瓶颈”(bottleneck)。然后我们再给另外一个全连接的,或者是卷积神经网络(解码机),喂以“瓶颈”,重建输入数据。我们再来看看自编码机的loss函数,我们首先取出解码机所重建的数据,然后将重建的数据与原始的输入数据做loss。
AE、VAE、Beta-VAE学习记录_第1张图片
通过逐个像素的差异对比,我们就能够建立一个loss函数,来指导神经网络进行图像压缩。很显然,全连接版本的自编码机很容易实现,我们也可以使用差不多的方法来搞一个卷积的,用来处理图像或者是声音的数据。

AE、VAE、Beta-VAE学习记录_第2张图片
究其本真,当你训练一个深度卷积网络,来对一堆图像数据进行编码和解码的时候,你就创造了一种新的压缩算法(Entropy-based,hardcoded compression Data specific,learned compression!)。Google也正在考虑使用此类的神经网络,来减少手机的网络带宽占用。当你在下载一张图片的时候,在资源端,图像先被编码,然后将编码通过无线网络传输过来。手机接收以后,我们再使用一个解码器,输入编码将图像重建起来。我们使用mnist数据集来做自编码机的时候,你能很直观的感受到,这些低维的东西,到底表达了图像的什么。

AE、VAE、Beta-VAE学习记录_第3张图片
看这些图片,最左边的是一些准备输入自编码机的一些原始图像,右边的这两幅都是自编码机重建出来的图像。你可以很显然的看出,“瓶颈”的维度的不同对重建会有什么不同。仅仅使用两维隐含表示,其实就是两维的“瓶颈”,我们能将图像重建出来,但是有点模糊。模糊的主要原因是,你强制将图像压缩到两维的时候,丢失了很多信息。重建的时候,也就丢失掉了很多的细节,这也就是图片模糊的原因。如果扩大“瓶颈”的维度,你将会重建出更清晰更锐利的图像,但是你将耗费更多的维度。也有很多人使用这项技术来做图像分割(Image Segmentation),首先将一副图像输入给卷积编码器,拿到瓶颈处的数据,然后重建一副图像,但这一次我们并不去重建原始图像,取而代之的是重建一副分割了的图像。无人驾驶汽车就是用这样的神经网络来将摄取的图像,分割为我们需要进行检测的不同的部分。

变分自编码机的基础出发点是我们将原始的输入映射到一个分布,而不是像原来的那样映射为一个定长的向量。所以说在变分自编码器中,唯一不同的就是我们将瓶颈处的一个向量替换成了两个的向量,其中一个表示分布的平均值,另外一个表示分布的标准差(两个向量共同代表了一个分布)。当你需要喂给解码部分输入的时候,你需要做的事情就是在这两个向量中采样出一个数据来,然后将这个采样出来的数据喂给解码器。为了训练一个变分自编码器,loss函数也必须包含两个部分,其中一个部分是重建loss,这一部分跟其他的自编码机也一样,非要说不一样的话,也仅仅是这个期望符号,因为我们是采样出来的嘛。Loss函数的第二部分,我们叫做KL散度。

L(θ,ϕ;x,z)=E_(q_(ϕ(z│x) ) ) [logp_θ (x│z)]-D_KL (q_ϕ (z|x)∥p(z))

我不打算把所有的细节都讲清楚,因为这里所涉及的数学部分确实太多。但其实你仅需要搞清的,就是,它其实就是为了控制瓶颈部分的分布,尽量靠近一个标准正态分布。也就是说,你需要尽量控制瓶颈部分的分布是一个均值为0,标准差为1的分布。
在训练它之前还有一点要注意,我们还得再使用一个技巧。
AE、VAE、Beta-VAE学习记录_第4张图片
来看一下这个网络的计算图,这里有一个问题。在瓶颈部分,我们使用了一个采样操作,我们从两个向量代表的分布中采样出来了一个样本,然后将它喂给解码器,这样在梯度反传的时候就尴尬了,采样操作怎么反传梯度?为了在训练的时候,我们仍然能使用梯度下降,我们使用了一个参数再现的技巧(Reparameterization Trick),这个过程是这样的。你可以将这一个向量,视为一个值μ,也就是那个均值向 量加上σ,也就是那个标准差向量。然后再σ单独乘以一个随机部分ε,这个ε要服从标准正态分布,也就是ε的均值为0标准差为1。我们实际上是从标准正态分布中生成了一个ε,然后通过公式采样出来了一个瓶颈值。
AE、VAE、Beta-VAE学习记录_第5张图片
再反过来看,这里的μ和σ 才是我们想要训练的值,这样我们也就能够进行梯度反传了。至于那个ε呢,这个节点,时刻发生一个固定分布的随机数,我们不需要改变它,我们也就不关心ε了,这也就无所谓了。
AE、VAE、Beta-VAE学习记录_第6张图片
这就是整个采样的过程,也就是我们参数再现技巧,我们避免了完全随机采样的方式,也是出于梯度反向传播的原因。我们将采样过程分成两个可以使用反向传播的部分:一个可训练的参数部分,另外一个是随机的部分,而且不用训练。是不是很巧妙。然后,在这里他计算了KL散度,然后整合出loss函数,然后进行反传。
AE、VAE、Beta-VAE学习记录_第7张图片
视频链接:
https://www.bilibili.com/video/BV1cs411T7aH?t=346

你可能感兴趣的:(courses,人工智能,神经网络)