摘要: 本章主要是关于自编码器的原理及其应用,自编码器是一种无监督学习方法,可用于数据降维及特征抽取。其中自编码器由编码器(Encoder)和解码器(Decoder)两部分组成。编码器通常对输入对象进行压缩表示,解码器对经压缩表示后的code进行解码重构。
Auto-encoder还可以对模型进行预训练,得到好的模型初始化的参数。以及Auto-encoder可以对数据进行降维处理,且降维后的数据可以很完整的保留原始数据的信息。本章将会介绍Auto-encoder在文本检索(Text Retrieval)、图像搜索(Image Search)、预训练深度神经网络(Pre-training DNN)以及在卷积神经网络(CNN)上的应用。
Auto-encoder本质上就是一个自我压缩和解压的过程,要求输入和输出的图片越接近越好,最后得到的code就是该input图片的降维结果。其中压缩得到的code代表了对原始数据的某种紧凑精简的有效表达,即降维结果。这个过程需要编码器(Encoder)和解码器(Decoder):
Encoder和Decoder单独拿出一个都无法进行训练,我们需要把它们连接起来,这样整个神经网络的输入和输出都是我们已有的图像数据,就可以同时对Encoder和Decoder进行训练,而降维后的编码结果就可以从最中间的那层hidden layer中获取。
实际上PCA用到的思想与之非常类似,PCA的过程本质上就是按组件拆分,再按组件重构的过程。
在PCA中,我们先把均一化后的 x x x根据组件 W W W分解到更低维度的c,然后再将组件权重c乘上组件的反置 W T W^T WT得到重组后的 x ^ \hat x x^ 同样我们期望重构后的 x ^ \hat x x^ 与原始的x越接近越好。
上述过程看作是神经网络,那么原始的x就是input layer,重构 x ^ \hat x x^ 就是output layer,中间组件分解权重c就是hidden layer,在PCA中它是linear的,通常又叫它瓶颈层(Bottleneck layer)。
自编码器可以是深度结构,对deep的自编码器来说,实际上就是通过多级编码降维,再经过多级解码还原的过程。
下图分别采用PCA和Deep Auto-encoder对手写数字辨识进行编码解码后的结果,用Auto-encoder最后输出的图片相比输入是不清晰的,也就是说输入的图片经过降维后的编码是没办法再完全还原出原来图片的很多信息的;而最下面使用Deep Auto-encoder,最后输出的图片还是很清晰的,也就是说得到的低维code是还是比较完整的保留了原始图片信息。可以看出,Deep的自编码器还原效果比PCA要更好。
一般的文本检索方法有向量空间模型(Vector Space Model),上图中蓝色的点代表的是文档(经过降维后),接着计算要查询的文档与其他的距离,选择较为接近,相似程度高的,但这个模型的好坏关键取决于向量化的好坏;单词包(Bag-of-word),通过建立一个词向量,若文档中存在某些词记1否则记0,然后再计算相似性,但此模型不能很好的表达语义层面。
自编码器可以很好的实现文本搜索。具有相同主题的文档会有相近的code。
虽然Bag-of-word不能直接用于表示文章,但我们可以把它作为Auto-encoder的input,通过降维来抽取有效信息,以获取所需的vector。
同样为了可视化,这里将Bag-of-word降维到二维平面上,下图中每个点都代表一篇文章,不同颜色则代表不同的文章类型。
用户做查询,就把查询的语句用相同的方式映射到该二维平面上,并找出属于同一类别的所有文章即可。(比LSA算法效果要好很多)
以图找图最简单的做法就是直接对输入的图片与数据库中的图片计算pixel的相似度,并挑出最像的图片,但这种方法的效果是不好的,因为单纯的pixel所能够表达的信息太少了。如下图:
使用Auto-encoder对图像进行降维和特征提取,并在编码得到的code所在空间做检索。
下图展示了Encoder的过程,并给出了原图与Decoder后的图像对比。
从以原图的pixel计算相似度和以auto-encoder后的code计算相似度的两种方法在图像检索上的结果。可以看出通过在code上计算相似度,有着很好的效果。
在深度学习中,自编码器可用于在训练阶段开始前,确定权重矩阵W的初始值。
以MNIST数据集为例,我们对每层hidden layer都做一次auto-encoder,详细介绍其工作过程:
为了方便表述,这里用 x − z − x ^ x−z−\hat x x−z−x^来表示一个自编码器,其中 x ^ \hat x x^表述输出层的维数,z 表示隐藏层的维数。
这是一种贪婪地逐层预训练。在预训练后得到权重初始值后,接着用Backpropagation反向传播算法对网络进行微调(fine-tune)。过程如下:
注意:
但是现如今强大的计算能力,使得深度学习并不使用自编码来预训练。在大量无标签的数据情况下,深度自编码器仍然有一定作用。
在卷积神经网络中,也可以应用自编码器。
处理图像通常都会用卷积神经网络CNN,它的基本思想是交替使用卷积层和池化层,让图像越来越小,最终展平,这个过程跟Encoder编码的过程其实是类似的。
CNN主要是卷积(Convolution)和池化(Pooling)操作。
因此相对应的就要有反卷积(Deconvolution)和反池化(Depooling)操作。
理论上要实现自编码器,Decoder只需要做跟Encoder相反的事即可,那对CNN来说,解码的过程也就变成了交替使用反卷积层和反池化层即可。
那什么是反卷积层(Deconvolution)和反池化层(Unpooling)呢?
做pooling的时候,假如得到一个4×4的matrix,就把每4个pixel分为一组,从每组中挑一个最大的留下,此时图像就变成了原来的四分之一大小。
如果还要做Unpooling,就需要提前记录pooling所挑选的pixel在原图中的位置,下图中用灰色方框标注:
当前的matrix放大到原来的四倍,也就是把2×2 matrix里的pixel按照原先记录的位置插入放大后的4×4 matrix中,其余项补0即可。
反池化很好理解,只需记住池化过程中的位置(最大值出现的地方),在反池化的过程中,将对应位置置相应的值,其余位置置0即可。
反卷积操作就有点难以理解。实际上,反卷积就是卷积。
两个过程是等价的卷积和反卷积的过程中,不同点在于,反卷积需要补零且过滤器的weight与卷积是相反的。
只需对卷积后的结果进行填充(padding)即补零,再进行池化操作,所得值就是所谓的反卷积结果。
去噪自编码器的基本思想是:把输入的 x x x加上一些噪声(noise)变成 x ′ x' x′,再对 x ′ x' x′ 依次做编码(encode)和解码(decode),得到还原后的 y y y 。
一般的自编码器都是让输入输出尽可能接近,但在去噪自编码器中,我们的目标是让解码后的y与加噪声之前的x越接近越好。
这种方法可以增加系统的鲁棒性,因为此时的编码器Encoder不仅仅是在学习如何做编码,它还学习到了如何过滤掉噪声这件事情。
在用自编码器的时候,通常是获取Encoder之后的code作为降维结果,但实际上Decoder也是有作用的,我们可以拿它来生成新的东西。
以MNIST为例,训练好编码器之后,取出其中的Decoder,输入一个随机的code,就可以生成一张图像。
本章主要讲述了自编码的原理,及其在文本检索(Text Retrieval)、图像搜索(Image Search)、预训练深度神经网络(Pre-training DNN)以及在卷积神经网络(CNN)上的应用。
自编码器(Auto-encoder)是一种特定的神经网络结构,其目的是为了将输入信息映射到某个更低维度的空间。另外,对Decoder解码也是有妙用的。现在也被扩展在生成模型中,比如某些生成模型也可以看做是一种特殊的自编码器,例如变分自编码器(variational auto-encoder)。