AlexNet研读

ImageNet Classification with Deep Convolutional Neural Networks,【中文翻译

网络优点

ReLU非线性单元

AlexNet使用的神经元激活函数是ReLU激活函数 f(x)=max(0,x) ,相比于饱和非线性函数如Sigmoid和tanh函数,不饱和非线性函数如ReLU在梯度下降时具有更快的收敛速度,更快地学习,在大型网络中训练大量数据具有非常好的效果。作者通过在CIFAR-10数据集上做的实验证明了此论点。如下图,实线表示使用ReLUs的CNN,虚线表示使用tanh函数的CNN,可以看出使用ReLUs的CNN能更快地把训练错误率降低到25%(迭代次数比tanh的CNN快约5倍)。

ReLU是本文作者Hinton在2010年提出来改善RBM性能的,把ReLU引入深度CNN中,使得ReLU成为以后深度网络普遍使用的非线性函数,从而在这个领域替代经典的sigmoid、tanh函数。ReLU有三个好处:

  1. 简单的max计算,大大减少了计算量,可以提高训练速度;
  2. 梯度在ReLU中是直接传递的,鉴于深度网络的梯度衰减现象,ReLU可以保持梯度,减缓梯度衰减的趋势;
  3. bp过程中没有了梯度换算的操作,加快了训练。

跨GPU并行化操作

一个GTX580的内存只有3GB,有限的内存限制了可以在GPU上训练的最大网络。目前的GPU很适合于跨GPU并行化操作,故作者把网络一分为二,分配到2个GPU上,通过并行计算来解决,不用通过主机的缓存,当前GPU相互间可以很好进行读写操作。

这里作者有一个小技巧,GPU相互“沟通”:例如,网络中layer-3的filter把layer-2的所有特征图作为输入,而其它卷积层,只从同一个GPU内的上一层特征图作为输入。为什么layer-3把layer-2的全部特征图作为输入而其它层却不这样,这个作者并没有解释理论依据,通过交叉验证实验得来的。最终的结构有点类似Cresian提出的多列卷积网络,但是本文的网络不是完全独立的,这种方式可以提高1.2%的准确率。

局部响应归一化层(Local Response Normalization)

LRN(Local Response Normalization)层是用来做归一化的。ReLU函数不需要归一化来防止饱和现象,即对于很大的输入x,ReLU仍然可以有效的学习,但是作者发现即使这样,对数据进行局部归一化对于学习来说还是有帮助的,可以增强模型的泛化能力。

局部响应归一化公式:

img

具体方式:

选取临近的n个特征图,在特征图的同一个空间位置(x,y)依次平方,然后求和,在乘以α,在加上 k。这个局部归一化方式与论文“What is the best multi-stage architecture for Object Recognition”中的局部归一化方法不同:本文的归一化只是多个特征图同一个位置上的归一化,属于特征图之间的局部归一化(属于纵向归一化),作者命名为亮度归一化;“what……”论文中在特征图之间基础上还有同一特征图内邻域位置像素的归一化(横向、纵向归一化结合);“what……”归一化方法计算复杂,但是没有本文中 α、k、n 等参数,本文通过交叉验证来确定这三个参数;此外,本文的归一化方法没有减去均值,感觉是因为ReLU只对正值部分产生学习,如果减去均值会丢失掉很多信息。

简言之,LRN是“What is the best multi-stage architecture for Object Recognition”论文使用的方法,本文简化改进了该归一化方法,将模型错误率降低1.2%左右

为什么要引入LRN层?

首先要引入一个神经生物学的概念:侧抑制(lateral inhibitio),即指被激活的神经元抑制相邻的神经元。归一化(normaliazation)的目的就是“抑制”,LRN就是借鉴这种侧抑制来实现局部抑制,尤其是我们使用RELU的时候,这种“侧抑制”很有效 ,因而在alexnet里使用有较好的效果。

归一化有什么好处?

1.归一化有助于快速收敛;
2.对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。

【补充:神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另外一方面,一旦每批训练数据的分布各不相同(batch 梯度下降),那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都要做一个归一化预处理的原因。
深度网络的训练是复杂的过程,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度。】

作者:LiBiscuit
链接:https://www.jianshu.com/p/c014f81242e7
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

重叠池化

正常池化是步长 = 窗口尺寸如步长s=2、窗口z=2,重叠池化是指步长<窗口尺寸如步长s=2、窗口z=3。

Pooling层一般用于降维,将一个 k × k 的区域内取平均或取最大值,作为这一个小区域内的特征,传递到下一层。传统的Pooling层是不重叠的,而本论文提出使Pooling层重叠可以降低错误率,而且对防止过拟合有一定的效果。

个人理解,使Pooling层重叠,可以减少信息的损失,所以错误率会下降。但是对防止过拟合的效果,文章也只是说slightly,目测意义不大。

Dropout

Dropout是Hinton在2012年提出以改善深度网络泛化能力的。文中采用Dropout技术,在每次训练网络时,每个神经元都会以0.5的概率“丢失”,丢失的神经元不参与前向传播和反向传播,但是神经元的权值在每次训练时都是共享的。这个技术降低了神经元之间的联合适应性,从而学习更具鲁棒性的特征。在测试阶段,神经网络会使用所有的神经元,但每个神经元的输出会乘以0.5。Dropout技术用在前两个全连接层中,会减少过拟合

缺点:就是会使最终网络收敛所需要的迭代次数翻倍