Stacked autoencoder理论简析

出处:http://www.fengchang.cc/post/92

上次总结了了PCA的东西,提到PCA的目的主要是降维。

stacked autoencoder也可以做类似的事情。然而讲stacked autoencoder之前,先讲其基础,简单版本:autoencoder,

先来建立直觉,这个东西思想很简单,也是利用神经网络的结构,最基础的一个形式如下:

Stacked autoencoder理论简析_第1张图片

Stacked autoencoder理论简析_第2张图片

假设从图的下方输入,上方输出,这个autoencode看起来个 神经网络没什么区别,但是注意两点,第一,是输入跟输出的维度完全一样,例如上图都是5,第二是中间这个隐藏层为比输入维度要低。

 

神经网络嘛,说白了就是要确定这些层数结构,每层有几个神经元,是否全连接,连接的参数矩阵是什么。

 

在一般的MLP中,大家知道是一个有监督学习的过程,除了给定输入数据X之外,还要给定label Y,然后把X feed 到神经网络,并最小化神经网络的输出与label Y之间的差值,通过这种方法来训练神经网络的参数。

 

然而autoencoder的区别是这是个非监督学习的过程,也就是说不需要label Y, 训练时的优化目标是让输出值跟输入值尽可能接近,最好完全一样。这是在干什么呢?这里的思想其实就有趣了,可以这样理解,输入数据代表了一些信息,起初以一定维度的数据来表示,然后经过中间隐藏层编码后,维度被压缩(降低)了,但是最后还是还原成了一个与原始信息非常接近的数据,这个过程,就好像把文件先压缩,再解压缩,或者把文件加密再解密,数据的中间的形式(维度)发生了变化,但数据的信息量不变。这就是核心思想,类似PCA,假如我们把1000个维度的数据压缩到3个维度,这种操作我们需要他尽可能少地丢失信息,否则就没意义了。

 

所以根据以上思想,只要训练一个简单的,单隐藏层的神经网络,就可以用无监督的方式实现数据降维。

 

这就是最基本的autoencoder

 

那么stacked autoencoder其实就是上面讲的autoencoder的堆叠,如何堆叠呢,可以参考 这里

我这里总结一下,首先就是把上面的单层autoencode,变成多层,但训练的时候是一层一层训练的。

很多国内的博文说到这里就嗝屁了,非常讨厌,如果不说清楚什么叫“一层一层训练”,那TM等于没说。我把上面维基百科的解释自己总结如下:

第一层训练过程如下:

Stacked autoencoder理论简析_第3张图片

就是一个最基本的autoencode,需要构建一个临时的输出层(也就是图中最右边那层,维度跟原始输入完全一样),记住,输出目标还是尽可能还原原始输入,训练完后,得到第一层参数,W和b,保存下来,然后丢弃这个输出层,因为实际上这个输出层除了在训练过程中有用之外,之后并没有什么卵用。

 

随后把上面训练好的这个包含一个隐藏层的神经网络看做一个整体,任何灌入到它的数据都会以一个更低维的数据表示作为输出(比如我们可以记为h1~h4),然后对这个整体后面再添加第二层的神经元(维度更低),并添加构造一个临时输出层,然后同样的方式训练第二层,这里特别注意,我们把前面的整体输出(h1~h4)当成这第二层的输入了,那么构建第二个autoencoder时,添加的临时输出层就不再是原始的(x1~x6)了,而是第一部分的输出,即(h1~h4)。这一点是避免训练方式的误解的关键所在。

Stacked autoencoder理论简析_第4张图片

 

之后就是以此类推了。那么训练完这些层次之后,用来干什么呢?

前面已经解释了,从“信息量”的角度来说,这一层层保持得很好,跟原始数据差距不大,只不过它们用更低的维度来表示了数据,那么可以理解为更“精炼”版本的数据,接下来的工作,就是用这更“精炼”的数据了,比如feed到普通的神经网络或其他什么分类器当中whatever。下图就是一个例子,把多层降维后的数据feed到一个softmax分类器:

Stacked autoencoder理论简析_第5张图片

你可能感兴趣的:(Stacked autoencoder理论简析)