caffe study(5) - AlexNet 之算法篇

原文地址:caffe study(5) - AlexNet 之算法篇 作者:机器学习讲座
在机器学习中,我们通常要考虑的一个问题是如何的“以偏概全”,也就是以有限的样本或者结构去尽可能的逼近全局的分布。这就要在样本以及结构模型上下一些工夫。

在一般的训练任务中,考虑的关键问题之一就是数据分布是否合理:首先是数据集的覆盖度,也就是数据集是否能够覆盖样本空间;其次还要尽可能的保证具有和真实数据一样的分布(注意数据分布是未知的,你只能根据一些先验来近似),这样的数据才是有效的。当然这些方式只是增大了得到正确解的概率,而并不能保证一定可以得到正确解。当你不知道你所取的训练集合是否和真实分布一致的时候,那么就要多取几次,每一个数据集都算算,对于分类器也是这样,单个分类器往往不能精确描述一个分界面,那么我们就组合一下,每个都算算。从方法论上讲,对于事物观察到的往往是局部,因此会犯以偏概全的错误,如果能够将所得到的“偏” ensambling 一下,那么就生成了相对的“全”,从而可以更大的概率逼近总体分布。这种思想在好多方面都体现出来,如交叉验证,经典的RANSAC,Random Tree(forest),Adaboost 等方法。

下面将从数据和模型两个方面来学习一下AlexNet中的一些技巧,主要参考的是Alex 2012 年的 NIPS论文ImageNet classification with deep convolutional neural networks.
 
1. 数据的处理:

到目前为止 ,还没有人看到数据集的大小对deeplearning算法理论上限造成的影响,也就是说数据集合还没有达到临界点,所以增加数据集只有好处,没有坏处。

在Alex的论文中,采用了两个方法对于图像进行了增强。

a. 增大训练样本:通过对于图像的变换实现了对于数据集合的enlarge。首先对于输入的图像(size 256*256)随机提取224*224的图像集合,并对他们做一个horizontal reflections。变换后图像和原图像相差了32个像素,因此主体部分应该都包含在训练集合中,相当于在位置这个维度上丰富了训练数据。对horizontal reflections来说,相当于相机在主轴方向做了镜像,丰富了反方向的图像。数据集合增大了2048倍,直接结果就是降低了overfitting同时降低了网络结构设计的复杂层度。

在测试阶段,取每一个测试样本四个角以及中间区域,一共5个patch然后再镜像后得到10个样本输入到网络中,最后将10个softmax输出平均后作为最后的输出。

b.使用PCA对于训练数据进行增强:对于每一个RGB图像进行一个PCA的变换,完成去噪功能,同时为了保证图像的多样性,在eigenvalue上加了一个随机的尺度因子,每一轮重新生成一个尺度因子,这样保证了同一副图像中在显著特征上有一定范围的变换,降低了overfitting的概率。

以上的策略是不是真的有必要,这个还是要打一个问号,因为对于a部分来说,样本少,可以在结构设计上下下功夫,可能达到相同的效果。对于b来说,deeplearning还需要对于图像加入增强处理吗?如果这样的话,自然也可以用一些传统人工特征先来一遍,再deeplearning了。我想关键的原因是deeplearning还没有真正的被证明的规则,所以你用什么策略都有点道理,但是谁敢保证不是“以偏概全”呢?

2. 模型结构:

在模型的设计上,AlexNet做了一个Local Response Normalization的处理,同时在节点的选择上采用了一个dropout策略。

a. Local Response Normalization.

公式如下,其中a是每一个神经元的激活,n是在同一个位置上临近的kernel map的数目,N是可kernel的总数目,k,alpha,beta都是预设的一些hyper-parameters,其中k=2,n=5,alpha = 1*e-4,beta = 0.75。

caffe study(5) - AlexNet 之算法篇_第1张图片

从这个公式中可以看出,原来的激活a被加一个归一化权重(分母部分)生成了新的激活b,相当于在同一个位置(x,y),不同的map上的激活进行了平滑,但是至于为什么k,alpha,beta这样来设置,没有想太清楚。

这个平滑大概可以将识别率提高1-2个百分点。

b. Dropout策略

使用多个model来共同进行预测是一个降低test errors的基本方法,但是单独的训练多个model组合会导致整个的训练成本增加,毕竟训练一个单一的网络需要很长的时间,即便计算资源足够,在不影响精度的情况下降低整个运算时间还是我们追求的目标。

由此Hinton提出了dropout策略,这个策略很简单,对于每一个隐层的output,以50%的概率将他们设置为0,不再对于forward或者backward的过程起任何作用。对于每一个input来说,使用的不同的网络结构,但是权重是共享的。这样求得的参数能够适应不同的情况下的网络结构,也就是提高了系统的泛化能力。

在AlexNet中最后的两个full-connected层中使用了这个策略。

3. 优化算法的参数

论文中使用SGD算法,基本参数设置在前面优化算法的总结中已经提到了。这里要说几个个人体会。

 a. 原文中输入的batch数目是256,应该Alex经过调节后的结果,我实际用到的机器性能比较低,内存8G,显存4G,所以不得不就将batch数目往下调到64,以免产生out of memory的错误。这样就需要调节其他的参数来保证数据的收敛。原因是batch比较小,导致本文开篇提到的样本覆盖面过低,产生了非常多的局部极小点,在步长和方向的共同作用下,导致数据产生了震荡,导致了不收敛。

b.在这种情况下,把learning rate调节到了0.02,相当于加大了步长,这样可以在一定程度上避免震荡,可以越过局部极小点往比较大的极值点行走。

c. 对于每一层的bias从1设置为了0.1,在一定程度上限制了激活的大小,这样就限制了某一过大的误差的影响,这样可以避免迭代方向出现过大的变化。

d. 经过b c后,系统终于收敛了,但带来的不良后果就是整个收敛速度变慢,因此还需要增加最大迭代次数,经过测试迭代次数成了从45w修改成了70w。

e. 在整个运行过程中,出现了几次平稳点,20w以及40w左右的时候,因此迭代的learning rate应该随着迭代的接近平稳点的时候有意的减小一些,目前是以每10w次减小为1/10,调参数用了5天,最后运行时间为15天。

f. 关于调参策略,上面只是按照一些简单的理解设置的,如果没有一个合理的解释,调参就变成了一个很low的工作。还好发现了好几篇关于调参的论文,主要是优化算法理论方面的,学习完再回来测试一下。

你可能感兴趣的:(深度学习)