前言:
最近一直在思考,如果我使用SCSAE(即stacked convolution sparse autoendoer)算法来训练一个的deep model的话,其网络的第二层开始后续所有网络层的训练数据从哪里来呢?其实如果在这个问题中,当我们的样本大小(指提供的最原始数据,比如大的图片集)和我们所训练第一个网络的输入维度是一样的话,那么第二层网络的输入即第一层网络的输出(后续的网络依次类推),但是这种情况下根本就不会涉及到convolution(一般有convolution的地方也会有pooling),所以不属于我想要讨论的SCSAE框架。后面根据自己对deep learning的理解(刚接触DL不到2个月,菜鸟一个)认为第二层网络的输入需要将原始的训练样本集通过covolution的方法经过第一层网络(已训练好了的网络)的输出采样(如果输出的特征图尺寸比第二层网络的输入尺寸大的话,就需要通过随机采样方法了)得到。
最近同时还在思考的另一个问题是,如果我们的SCASE网络预训练成功后,后期的fine-tuning该怎样进行呢?当然了,fine-tuning的过程肯定会用到BP算法的,但是此时的SCASE网络并没有清晰直观的网络结构(不像非convolution网络那样,虽然有多层,但是前一层网络的输出直接连接到后一层网络的输入,结构清晰,一目了然,其fine-tuning过程容易理解),所以在使用BP算法时会不会有什么不同呢?特别是其中convolution后的pooling部分,比如max-pooling,该部分就不需要学习任何参数,但它也是SCASE结构中的一层,所以感觉其对BP算法计算会有影响。
内容:
带着这2个问题而是就在网络上开始寻找答案了。首先,找到了一篇文章Stacked Convolutional Auto-Encoders for Hierarchical Feature Extraction,看这个标题感觉就是我想要的,只是它没有预训练网络时不是用的SAE,而是标准的AE,这点影响不大。大致浏览了下文章,下面是一些笔记:
DAE(denoised autoencoder)是在训练网络参数时,先计算下输入样本的统计特性,并根据这个统计特性给这些样本加入一定的噪声,再把这些带噪声的图像输入到网络中训练。这样做的好处是,如果网络能够重构带噪声的样本,那么它的泛化能力就更强。
SCAE(本文作者的方法)中每个隐含层的节点都是用来做covolution的,因此针对某个隐含层节点,给定一张大图片通过convolution就可以得到一张特征图,然后对这张特征图用刚才那个节点的权值转置矩阵就可以还原出对应的那幅大图。
关于梯度下降的一些小总结:
标准梯度下降也就是batch梯度下降,其更新过程的增量是一次用所有样本的误差来计算得到的。
随机梯度下降和标准梯度下降法类似,区别在于它每次更新权值时只是用一个随机的样本来计算其增量。
共轭梯度下降是前面梯度下降的基础上采用某种策略来更改学习率,其策略是通过一系列线搜索来找到误差函数最小值的方向,然后在该方向上找到一个适合的学习率,当然,其第一次的线搜索为梯度的负方向。
Max-pooling可以提高提取特征的不变性,最初的目标是用在有监督的学习中的。作者所使用的max-pooling一般是无重叠的,它有公开max-pooling相关的matlab源码:http://www.idsia.ch/~masci/software.php文章指出使用了max-pooling层后就没有必要隐含层或者权值作L1或者L2的规则化了,why?
作者用一个隐含层(或者后面再加一个max-pooling层)对数据库MNIST和CIFAR10提取出了20个7*7的特征,其实验结果显示如下:
其中的a为不加噪声,不用pooling层学习到的特征;b是加了噪声但没用pooling层时的特征;c是用了2*2大小的pooling层后但没加噪声时对应的特征;d是用了2*2大小的pooling层且加了噪声学习到的特征。
从上面可以看到,c图学习到的特征比较不错。C图是没有加入噪声且用了pooling层。由于a图和b图学到的都是不重要的特征,而d图学到特征的又不太像人脑视觉皮层那样,所以作者认为加噪声用处不大,且max-pooling功能特别强大,大到像作者说的那样有了max-pooling后什么约束就可以不用了,好像神器一样。我不太赞同作者的观点,一是它只是用了普通的AE(没有其他任何的约束,纯属一个压缩),且特征的个数不多,训练样本的个数也少,所以学习不到特征也是很正常的。
后面作者构建了一个含6个隐含层的深度网络来对MNIST和CIFAR10这2个数据库来做识别,使用的是没有经过任何处理的raw数据。由于一开始作者已经得到结论只用max-pooling和标准AE,不用加噪声,所以这个网络也是按照他的结论设定的。第1个隐含层实现100个5*5的filter,第2个隐含层为2*2的max-pooling,第3个隐含层为150个5*5的filter,第4个隐含层也为2*2的max-pooling,第5个隐含层为200个3*3的filter,第6个隐含层有300个节点,实现全连接,最后的输出层四softmax分类器。这个网络适用于这2个数据库,只是在CIFAR10数据库是,由于它的数据库是rgb的,所以讲rgb分成3个通道的图像分别输入到刚刚那个6隐含层网络中识别(这点比较有意思)。
下面是它的实验结果:
总结:
从这篇文章(文章没太多内容,没必要细读)没有找到我要的2个问题的答案,不过个人推测它预训练的过程有点像第一个问题我猜测的那样。第二个问题,作者根本就没有展开说(只是说用了5%的样本进行有监督微调),可能是这个方法默认为大家都知道了吧。
所以后面打算读CNN方面的文章,因为如果把CNN过程弄懂了,那么我的这2个问题就不是问题了,哈哈。
参考资料:
http://www.idsia.ch/~masci/software.php
Stacked Convolutional Auto-Encoders for Hierarchical Feature Extraction