ImageNet Classification with Deep Convolutional Neural Networks
NIPS 2012
Alex Krizhevsky , Ilya Sutskever , Geoffrey E. Hinton
这篇文章比较“老”,但是很多文章经常提及,回顾一下经典也是有必要的。
概述
这篇文章是2012年的ImageNet比赛冠军模型,ImageNet这个数据集是一个比较大的数据集,当时的模型都是比较小的模型,大多数用到了机器学习的方法,学习能力有限。为了学习这个比较大的数据集,就需要一个有更强学习能力的模型,文章就提出了这样一个比较深的CNN。
文章提出了的网络有8层结构——5层卷积层和三层全连接层,再加上一个1000-way的分类器softmax,
结构有如下几点特点:
- 使用非饱和神经元ReLU和多个GPU来加速训练。
- 局部响应归一化,我理解为在输出的通道维做归一化,为神经元的活动创造了竞争机制,达到了一种“侧抑制”的效果,有助于提高泛化能力。
- Overlapping Pooling,通过控制步长和size的关系使pooling的窗口有交叠,可以达到提高精度的效果,同时减少过拟合。
- 网络太大,需要减少过拟合的方法(两种方法):
- 数据增强:随机抓取224x224的小块,以及它的水平翻转 、改变训练图像中的RGB通道的强度;
- Dropout:以0.5的概率将每个隐层神经元的输出设置为零
总的来说,这篇文章的主要贡献有4点:
- 训练了最大的CNN之一(在ImageNet数据的子集上),达到了当时最好的结果。
- 写了一个当时比较优化的GPU实现。
- 提出了一些提升性能,并且减少训练时间,新颖独特的提取特征的方法。
- 用了几种有效的方法来减少过拟合。
AlexNet的结构
总体结构
可以看到,它总共有8层结构:5层卷积层加上三层全连接层,最后加上一个1000-way的softmax分类器。
受当时显存的限制,AlexNet是分成两部分放在两个GPU上跑的。
所以每个GPU有一半的kernel;且只在一些特定的层,GPU之间才进行通信,即
- 第2、4、5卷积层的输入只连接了位于同一GPU的前一层的kernel;
- 第3层连接了第2层所有kernel(两个GPU的);
- 全连接层是与前一层所有神经元连接的(两个GPU的)。
另外,响应归一化作者只在第1、2层卷积后使用,跟在max-pooling后面,第5层卷积后也有一层pooling。
Details
上述结构还涉及到一些细节,可以具体讨论一下。
- 使用了ReLU来加速训练,ReLU已经广泛地使用在了各种CNN结构中,它没有梯度损失,所以是非饱和神经元,可以加速收敛速度。
- 局部响应归一化:响应归一化的公式如下:
这个我的理解是,它在输出的通道维度上,对第i个通道的点(x,y)的前后n/2个通道做归一化。
这样的做法对局部神经元的活动创造了竞争机制,产生了一种侧抑制的效果,我的理解即是这样会使得输出的神经元中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,作者也通过实验发现这样做能增强模型的泛化能力。
3. 重叠Pooling
不同于传统的pooling,作者通过设置步长小于size的边长z,来达到重叠的目的。
这样做池化层的输出之间会有重叠和覆盖,个人认为,这样保留了更多的位置信息,即文章前面提到的先验知识,同时也提升了特征的丰富性,有助于模型提高泛化能力。
作者也通过实验证明了,使用这种方案确实能降低top-1和top5的错误率以及减少过拟合。
减少过拟合
AlexNet虽然只有8层结构,但是参数却达到了6000万,是一个非常大的网络了,如果不采取一些措施,模型很容易会过拟合。在本文中,作者提出了两种方法来解决过拟合的问题:数据增强和dropout。
数据增强
文章提出了两种比较有效的数据增强方法;
- 随机抓取224x224的小块,以及它的水平翻转:
- 从256x256的图片中抓取224x224的小块,并用这抓取的小块来训练网络;
- 使训练集增加了2048倍,但是样本间有高度依赖性;
- 不使用这个方案时,出现大量的过拟合;
- 测试阶段时,抓取5个224x224的小块以及它们的水平翻转(共10个)来做预测,并对这10个小块的softmax预测值做平均。
- 改变训练图像中的RGB通道的强度:
- 遍历ImageNet训练集,在RGB像素值的集合上使用PCA
- 使已知的主成分加倍
- 比例为对应特征值乘以一个随机变量
- 随机变量服从均值为0,标准差为0.1的高斯分布
- 遍历ImageNet训练集,在RGB像素值的集合上使用PCA
至于为什么要这样做数据增强,我认为,这样做网络能学习到了更加鲁棒性的特征,它能适应不同亮度,不同颜色,甚至不同位置的识别,提高了模型的泛化能力,同时作者的实验结果也说明了这个方法的有效性:错误率降低了1%。
dropout
文章是以0.5的概率将每个隐层神经元的输出设置为零。
dropout在现在是一个耳熟能详的正则化方法了,它减少了神经元互适应性的复杂度,因为神经元无法依赖于其他特定的神经元而存在,因为隐层中任何一个神经元都可能会以0.5的概率被丢弃;因此这会迫使网络学习更为健壮、鲁棒的特征。
实验
实验一:验证AlexNet的效果
为了验证AlexNet结构的有效性,作者进行了使用SGD进行训练,达到了top1和top5分别为37.5%和17.0%的错误率,而当时最好的成绩是45.7%和25.7%的成绩;有效地提升了模型的性能,提高了识别精度。
实验二:进一步提升AlexNet的性能
- 对5个相似的CNN的预测值求平均,top5达到了16.4%的错误率,提升了0.6%;
- 训练一个CNN,在最后的pooling层后额外加一个第六层卷积,再进行“微调”,会变成16.6%的错误率,性能反而降低了;
- 前面提到的5个CNN再加上两个预训练过的CNN,并对它们的预测值做平均,达到了15.3%的错误率,而当时最好的成绩是top5,26.2%。
定性评价
文章最后对网络的效果做了一个定性的评价:
- 作者从其中两个数据层的表现中发现网络学习到很多和频率、方向相关的特征,以及各种颜色的斑点。
- 发现两个GPU上学习到的特性是不一样的,而且这种特性是独立于初始化的,因为每一次的结果都有这种特性。
- 发现一些实体偏离中心的图片也可以将实体识别出来,并且top-5中大多数标签都是合理的。
以上三点实验结果,都可以说明网络有很好的鲁棒性,即体现了前面提到的适应不同亮度,不同颜色,甚至不同位置的识别,体现了模型很强的泛化能力。
总的来说,AlexNet提供了一个具有很强的学习能力的模型,但是由于结构的“庞大”,不得不采取一些方法来加速和减少过拟合。即使用了ReLU和多个GPU并行的方法来加速,使训练时间在可接受的范围内;同时使用了局部响应归一化、重叠池化、数据增强、dropout的方法来达到提高泛化能力的目的。