ImageNet Classification with Deep ConvolutionalNeural Networks - 论文笔记

原文地址:ImageNet Classification with Deep ConvolutionalNeural Networks
AlexNet是2012年ILSVRC的冠军, Top1和Top5的Error Rate分别为: 37.5%, 17.0%.

1 简介

在此论文发表时, 基于已标记的小型图片数据集(如:NORB, Caltech-101/256, and CIFAR-10/100)的简单物体识别工作已经取得了相当优异的结果。例如MNIST数字识别的当前(即论文发表时间:2012)最优异的Error Rate(<0.3%)已经超越了人类的水平。
然而真实情况下的物体识别要更复杂,同时也需要更大的数据集。但是这种大量的已标注的数据集直到最近才有收集到的可能,包括LabelMe和ImageNet等。

为了从大量图片数据中学习,需要一个具有巨大Learning Capacity的模型。同时因为物体识别的复杂性,其问题即使诸如ImageNet这种量级的数据集也不可能完全指定,因此选用的模型也必须有较好的泛化能力。卷积神经网络(CNN)则是满足这些要求的一种模型。CNN的Capacity可以由它的的深度和广度来控制,同时对于自然图像其也能给出强且几乎正确的预测。另外相对于拥有近似层数的标准前馈神经网络,CNN由于更少的连接数和参数个数因而更容易训练同时只会略微降低理论最佳表现。

尽管CNN有如此之多的好处,但将其大规模用于高分辨率图像上仍然花费巨大。幸运的是,如今(2012)的GPU对2D卷积计算进行了大量优化,已经足够训练大型CNN,而且最近(2012)诸如ImageNet的数据集也包含了足够多的已标记数据可以训练如此规模的模型同时又不会引起严重的过拟合。

2 数据集

ImageNet的图像分辨率并不固定,而AlexNet需要一个固定维数的输入。因此,作者将图片降采样到固定分256x256的分辨率上。
对于一个给定图像,首先将最短边(保持比例)拉伸到256个像素长度,再从拉伸后图像裁剪出中间的一个256x256像素的区块。然后除了在整个训练集图像上计算出的每个像素均值以外,对图像不再做其他操作。总的来说作者基于中心化的原始RGB像素值训练网络。

3 网络结构

ALexNet共有8个层:5个卷积层和3个全连接层。
以下将按照论文作者对于其重要性的评估先后描述一些AlexNet中新的或原先不常用的特性:

3.1 ReLU非线性激活函数

原先常用的饱和非线性激活函数 f(x) = tanh(x) 或 f(x) = 1/(1 + e^-x)在使用梯度下降法训练时远远慢于使用不饱和非线性激活函数 f(x) = max(0, x) 称之为Rectified Linear Unit(ReLU).

对一个在CIFAR-10上训练的四层卷积神经网络,ReLU达到25%错误率的时间比tanh快了6倍。

3.2 多GPU训练

单张GTX 580只有3GB显存,这限制了可在其上训练的网络最大大小。 因此我们将网络分在两张GPU上。

这里还有一个额外的技巧:GPU之间只在特定的层通信。例如第三层卷积核使用第二层的所有输出做输入,而第四层的则只使用同一GPU上第三层的输出做输入。

3.3 局部响应归一化(Local Response Normalization, LRN)

先看方程式:
lrn-func.jpg

这个方程式对空间位置相同的n个相邻卷积核(已经过ReLU变换的)输出做Normalization操作,N则是这一层卷积核数量。
常量k, n, α, β是超参数。这种操作启发于真实神经元的侧抑制机制(lateral inhibition)。

更为具体的操作过程如下图所示:
lrn.jpg

不过根据CS231n的描述:这些归一化层已经不太常用,应为在实践中它们的作用较小。

3.4 重叠池化(Overlapping Pooling)

传统的Pooling层是不重叠的,而本论文提出使Pooling层重叠可以降低错误率(此处理使Top 1/5错误率下降了0.4/0.3%),而且对防止过拟合有一定(slightly)的效果。

3.5 整体结构

alexnet-arch.jpg

其中第一层输入大小采用227x227更为合适(这样就不用padding),根据CS231n此处作者可能采用了3个像素的zero-padding,有96个11x11x3步长为4的卷积核(每个GPU有48个),第二层接受(响应归一化和池化后的)底层的输出,第3、4、5层间则没有Normalization和Pooling层。最后每个全连接层有4096个神经元。

4 降低过拟合

AlexNet模型共有6000万个参数,现有数据不足以学习这么多参数而不引起过拟合,作者主要采用两种方法来对抗过拟合:

4.1 数据扩增(Data Augmentation)

最简单和常见的减少过拟合的方法就是对图像数据做标签不变变换(label-preserving transformations)来人为增大数据集。
在作者实现中,在CPU上使用Python代码生成变换后的图像(而不存储在硬盘上)同时GPU根据前一个batch的数据在做训练。

第一种方法是图像裁剪和水平翻转。从256x256中裁出随机位置的224x224像素并加上水平翻转。在测试时使用4角+中心+翻转的10张图预测值取平均。

第二种方法是加调整图像RGB通道强度。对整个训练集求来RGB值的PCA,然后不降维但对特征向量乘上一个均值0标准差0.1的高斯随机变量。此处理使top 1错误率下降了1%。

4.2 Dropout

整合多个模型的预测结果对于减少错误率有显著效果,但这样对于花费数天来训练的神经网络来说花费巨大。但是一种更加高效的方法就是使用dropout。

把神经元的输出以0.5的概率置零,相当于扔掉了(dropped out),被扔掉的神经元在前馈和反馈中都不起作用。所以每当有一个新输入时,由于Dropout的随机性,相当于在训练一个新的网络,但是这些网络都共享参数。
这种策略减少了神经元之间的相互影响,强制网络学习出更鲁棒的features能整合多个随机神经元的输出而不依赖某一个特别的神经元。
测试的时候则不dropout了,但每个神经元输出值乘以0.5,作为引入了dropout后预测分布的均值的估计。

作者在前两个全连接层使用了dropout,同时dropout几乎倍增了网络收敛时间。

5 具体训练过程

使用Mini-batch stochastic gradient descent,batch_size=128, momentum=0.9, weight_decay=0.0005。

权重更新规则如下:
weight.jpg

其中i是迭代次数,v是动量变量(momentum variable), ε是学习率,学习率后面的则是整个batch对于w的平均梯度。

作者使用均值0标准差为0.01的高斯分布初始化权重,对于2、4、5和全连接层的bias初始值1(给ReLU单元提供正的输入加速早期学习),其他层bias初始值为0。

同时其在每一层使用相同学习率并在训练过程中手动调整:每当验证集错误率不再下降时就对学习率除以10.学习率初始值为0.1,并且最后训练完成时下降了3次。整个网络大概在120万张图片训练集上跑了90遍,使用两块GTX580 3G花了5到6天。

6 结论

  1. 对最终正确率最关键的因素:网络深度(减一层2%、加一层1.7%)> 单层容量(双GPU约1.7%)> LRN(1.4%)> PCA干扰(1%)> 重叠Polling(0.4%)。即,虽然其他的Trick也有明显效果,但决定性的,还是尽可能保持一个足够深、足够大规模的网络。

  2. 文中除了常规的case展示,还把倒数第二层的欧氏距离用于衡量图片是否相似,展示了很多图片查询的例子。