博文内容参照网页Stacked Autoencoders,Stacked Autocoders是栈式的自编码器(参考网页Autoencoder and Sparsity和博文自编码与稀疏性),就是多层的自编码器,把前一层自编码器的输出(中间隐藏层)作为后一层自编码器的输入,其实就是把很多自编码器的编码部分叠加起来,然后再叠加对应自编码器的解码部分,这样就是一个含有多个隐含层的自编码器了。本博文介绍栈式自编码、微调栈式自编码算法,然后用栈式自编码算法实现MNIST的数字识别。
1、栈式自编码概述
前面博文Self-Taught Learning to Deep Networks说到训练深度网络可以采用逐层贪婪训练方法,每次只训练一个隐藏层,训练时可以采用有监督(比如对每一层隐藏层输入到softmax回归计算分类误差)或无监督(比如稀疏自编码),这里就采用无监督的稀疏自编码算法来学习隐藏层的特征。由于是多层的稀疏自编码神经网络,并且是逐层编码的,我们把它叫做stacked autocoders。
栈式自编码神经网络的编码步骤:
解码步骤为:
其实就类似hinton用栈式RBM组成的神经网络模型(论文是06年在science上发表的,有兴趣可以看看):
只是我们这里是用稀疏自编码器,而不是用RBM。
如果我们把最后一层隐藏层,即对原数据最高阶的特征表示,输入到softmax回归模型,就可以实现分类啦。把整个网络模型合起来得到:
栈式自编码具有更强大的表达能力及深度网络的所有优点,自编码器倾向于学习到数据的特征表示,那么对于栈式自编码器,第一层可以学习到一阶特征,第二层可以学到二阶特征等等,对于图像而言,第一层可能学习到边,第二层可能学习到如何去组合边形成轮廓、点,更高层可能学习到更形象且更有意义的特征,学到的特征方便我们更好地处理图像,比如对图像分类、检索等等。
2、微调栈式自编码算法
前面也说过微调可以改善深度网络的学习效果,微调就是在原来训练好的模型参数下再稍微修改各层权重以更好地学习数据,哪该如何微调呢?没错,就是用BP算法(参考网页Backpropogation algorithm和博文浅谈神经网络),利用BP微调的算法如下:
要注意的是第二步中对输出层即softmax的输入层求导时,不是BP算法中的平方损失函数,而是softmax损失函数对x的求导,认真推算是可以得到那个表达式的。
3.Exercise:Implement deep networks for digit classification
该实验是用两层隐藏层是stacked autocoders + softmax对MNIST数字进行分类。
实验步骤:
- 初始化参数;
- 在原数据上训练第一个自编码器,然后算出L1 features;
- 在L1 features上训练第二个自编码器,然后算出L2 features;
- 在L2 features上训练softmax分类器;
- stacked autocoders+softmax模型,用BP算法微调参数;
- 测试模型