ImageNet Classification with Deep Convolutional Neural Networks
这篇文章提出了很多卷积神经网络的先驱——AlexNet。
和其他的很多前馈神经网络相比,由于CNN的卷积层不是全相联的,所以CNN的参数会少很多,而且训练起来会更加地容易。
作者在训练AlexNet的时候,为了加快速度,使用了两块GTX 580 3GB GPU,并且对网络的结构进行了一定的改造以更好地适应GPU的性质。
1 总体框架
AlexNet的网络基本结构为:输入层——5层卷积层——三层fully connected。
详细可见:https://github.com/BVLC/caffe/blob/master/models/bvlc_alexnet/deploy.prototxt
Layer | Filter Size | Stride | Normalization | Single GPU | Dropout | Activation Function |
Conv1 |
11*11*3 | 4 | 1 |
ReLU |
||
Max Pooling | 3*3 | 2 | ||||
Conv2 | 5*5*48 | 1 | 1 | 1 | ReLU | |
Max Pooling | 3*3 | 2 | ||||
Conv3 | 3*3*256 | 1 | ReLU | |||
Conv4 | 3*3*192 | 1 | 1 | ReLU | ||
Conv5 | 3*3*192 | 1 | 1 | ReLU | ||
Max Pooling | 3*3 | 2 | ||||
Fc6 | 4096 | 1 | ReLU | |||
Fc7 | 4096 | 1 | ReLU | |||
Fc8 | 4096 | Softmax |
1.1 ReLu Nonlinearity
使用ReLU function而不是Sigmoid function或者tanh的原因是ReLU的导数计算会更加的方便,因此在训练速度上有明显的优势。
同时ReLU也不要求输入标准化来防止饱和。
1.2 Local Response Normalization
继续使用标准化的原因是local normalization可以帮助提升泛化能力,这一点是有生物学基础——侧抑制,使得相邻的有大活跃度的神经元彼此之间产生竞争。(具体原因我也不是很清楚Orz...)
文中采用的方式为
1.3 在多GPU上的训练
作者采用了两块GPU进行训练,在上面表格中Single GPU一栏为1的layer,GPU只使用上一层存储在该GPU上的输出作为下一层的输入,禁止了在这一步两个GPU的connection。(第一幅途中,如果层与层之间的虚线是交叉的,就说明GPU是可以相互connect的)
1.4 超参数
作者使用了SGD(sochastic gradient descent)进行梯度下降,具体选用的参数如下
其中0.9是惯性,0.0005是weight decay,ε是learning rate。learning rate初始化为0.01,但是如果validation error rate停止改进的时候会将learning rate除以10.
2 Reducing overfitting
2.1 data augmentation
作者使用了两个data augmentation的方式。
第一个方法是image translation & horizontal reflection:对一张256*256的原始图片上随机提取224*224的patch和他们的horizontal reflection作为输入。
第二个方法是改变RGB通道的intensity,采用了PCA的方法。这一方式降低了1%的error rate。
2.2 Dropout
在fully connected layer的前两层,作者使用0.5的drop rate的dropout方法。