这是一片十年前的文章(2012年),让我们回到十年前来看看Alex小哥、Hinton大佬和他的小伙伴们是怎么设计神经网络的。
论文下载地址:https://papers.nips.cc/paper/2012/hash/c399862d3b9d6b76c8436e924a68c45b-Abstract.html
李沐老师的精读视频:https://www.bilibili.com/video/BV1ih411J7Kz/?spm_id_from=333.788&vd_source=9e5b81656aa2144357f0dca1094e9cbe
AlexNet实现:https://www.jianshu.com/p/d364a03dce2b
一、标题 Title
Title:ImageNet Classification with Deep Convolutional Neural Networks
- ImageNet 当时最大的图片数据集,120万张图片,1000类。
- Deep Convolutional Neural Networks 神经网络我们比较熟悉,但是当时主流的神经网络是SVM,树等等,deep convolution是一个新颖的概念。
二、摘要 Abstract
大概内容:我们训练了一个很大很深的神经网络,在ImageNet上对1000类进行分类。错误率比其他人都要低,网络中有6000万的参数,65000个神经元。网络结构中有5个卷积层,三层全连接层,有max-pooling和softmax。为了加速神经网络的训练使用GPU加速计算。为了减少过拟合,使用了dropout。然后又拿着这个模型参加了比赛,拿了第一且比第二名的成绩要好一些。
三、讨论 Discussion
比较清奇的是这篇文章没有结论,是一个讨论discussion。讨论一般为吐吐槽啥的,看看未来需要干什么事情。
结论一般是和摘要的一一对应,是一种总结性的段落。
大致内容:结果显示大的深的网络是很有用的。如果将网络中的某个层拿掉的话,例如,去掉中间层的话大概会下降2%左右的精度。
(但是这个逻辑似乎是错误的,不能说拿掉一层,精度下降就说深度很重要。因为有可能是参数没调好所导致的问题。)
为了简化模型,我们没有使用非监督的图片进行预训练,我们期待这是有帮助的,如果我们有足够强大的计算资源能够将网络变大,不使用预训练也没关系。(现在的bert出来之后,发现其实预训练的方法会更好更快的提高模型精度和模型收敛速度)只要网络够大,训练时间足够长,结构就能够得到改善,但是依然比不上人类的视觉系统。 我们还想使用更大更深的网络在视频序列上。
四、精读
1. 简介 introduction:
第一段:目前目标识别的主要方法依然是机器学习的方法。为了更好地证明他们的性能,我们可以收集更大的数据集,学习更强大的模型,并利用更好的技术来防止过拟合。现如今的数据集相对较小(NORB[16], Caltech, CIFAR)简单的识别任务都能够被很好的解决,尤其是使用了标签保存转换(label-preserving transformations)进行数据增强的话。例如,MINIST手写数字识别。但是显示世界中的物体具有多样性,所以想要学会去识别他们就需要更大的训练数据集。小数据集的缺点已经被人们认识到了,直到最近才出现了数百万张图象组成的数据集,其中ImageNet就是由超过1500万张标记的高分辨率图片组成,并且种类超过22000个类别。
大概内容:以前的数据集太小了,而现实世界的事物拥有多样性,我们需要更大的数据集,其中ImagetNet就是一个很大的数据集。
第二段:
为了在上百万的图片中学会上千个物品的种类,我们需要一个具有大的学习能力的模型。即使是ImageNet这样大的数据集也不一定能够解决该问题,因此我们的模型也需要许多先验知识来补偿数据集不足带来的缺陷。卷积神经网络就是这样的一类模型(CNNs)模型的能力可以通过改变宽度和深度进行控制,而且CNN还对图像的性质做出了强有力的、大部分是正确的假设。因此,与具有类似大小的层的标准前馈神经网络相比,CNN 的链接参数少得多,更加容易训练,而理论上可能只是稍微差一点。
第三段:
即使CNN有着良好的性能和架构,但是被用于高分辨率的图像中依旧是昂贵的。幸运的是现在的GPU配合高度优化的二维卷积实现,足够强大能够训练大型的CNN。最近的数据集,如ImageNet包含足够的标记示例,以训练此类模型,而不会出现严重的过拟合
第四段:
本文的具体贡献:训练了迄今为止最大的神经网络,参加了两个比赛(ILSVRC-2010 and ILSVRC-2012, 都用了ImageNet的子集),在这些数据集上取得了最好的成绩。我们写了一个基于高度优化GPU的二维卷积和徐连神经网络所需要的其他操作,并且将其公开。
在文章的第三部分,我们会介绍一些新的,并且不同寻常的特点来提高模型的表现和缩短训练时间。
在文章的第四部分,我们会介绍:由于我们模型的规模会导致严重的过拟合问题,即使有120万个标签,我们用了一些特殊的技术来阻止过拟合问题。
我们最后的模型包含了五层卷积层,三个全连接层。模型的深度似乎也是一个问题:我们发现一走任何一个卷积层都会导致较差的结果。(每个层包含的参数不超过模型参数的1%)
第五段:
最后,网络的大小受限于GPU上的可用内存,以及我们愿意容忍的训练时间。我们的网络需要5到6天的时间来训练两台GTX 580 3GB GPU。
我们所有的实验结果都表明,我们的结果能够被简单地提高:等待更好性能的GPU或者可用的更大的数据集。
总结: 简介部分主要讲述了现实世界面临的图像识别问题更加复杂,所以我们需要更大的数据集,现在比较大的数据集是ImageNet,这样大的数据集也能够减少过拟合的情况。CNN这种模型似乎能够高效的训练模型,并且能保证精度。而且由于GPU的加速,使得用CNN模型训练神经网络成为了可能。接下来,介绍本文的贡献是,训练了迄今为止最大的模型,在一个比赛中取得了最好的成绩,其中用到了一些新的技术来缩短训练时间,解决过拟合问题。
2. 数据集
数据集:ImageNet
样本数:1500万
样本类别量:22000
数据来源:web,人工标注
分辨率:不固定
ILSVRC比赛中用到的数据集:
ILSVRC使用ImageNet的一个子集,每个子集大约有1000张图像,1000类别。总共大约有120万张训练图像,5万张验证图像,以及150000测试图像。
在ImageNet中会有两种错误率(top1和top5):
- top1错误率,预测标签不是正确标签的比例。
- top5错误率,正确标签不在预测图象最有可能的五个标签中的比例。
图像处理:将图像采样到256*256
- 缩放图片,短边为256
- 中心裁剪,256*256
- 使用像素的原始RGB值训练网络
3. 模型架构 Architecture
该图AlexNet 的网络架构了,当时由于算力的约束,所以需要两个GPU并行训练。
模型包含了8层可学习的层:5个卷积层和3个全连接层。
3.1 ReLU 非线性
当时激活函数通常会选取:
上述的这些激活函数被称之为:饱和的非线性函数,他们通常会比非饱和的非线性函数的模型收敛速度要慢许多。
其中,ReLU就是一个非饱和的非线性激活函数。
下图是作者用四层神经网络在CIFAR10上的迭代次数。实线是relu,虚线是tanh。
结论是:如果使用传统的饱和非线性函数,就无法用大的神经网络进行本文的工作。
(当然在现在看来,关于激活函数的选取,对收敛速度的影响并没有这么大的差距)
文中还提到了 Jarrett . 也做了关于激活函数的研究。
(K. Jarrett, K. Kavukcuoglu, M. A. Ranzato, and Y. LeCun. What is the best multi-stage architecture for object recognition? In International Conference on Computer Vision, pages 2146–2153. IEEE, 2009.)
3.2 多GPU训练模型:
当时使用的GPU是 GTX 580, 这个GPU只有3G的显存,然而120万个训练样本一个GPU是放不下去的,所以将模型部署在两个GPU上。
两个GPU直接通过显存通信而不经过主机内存,但是仅在特定的层进行通信,在第三层和全连接层的第一层。
如果你对多GPU训练不了解的话,可以参考以下链接:
【简单使用多GPU笔记】:https://www.jianshu.com/p/ad415cb1f673
【pytorch 多卡并行训练教程】:https://www.bilibili.com/video/BV1yt4y1e7sZ/?vd_source=9e5b81656aa2144357f0dca1094e9cbe
需要注意的是,这里的GPU并行计算是属于模型并行,但是要区别于笔记中的模型并行(笔记中的模型并行是将模型拦腰截断,变成左右两部分,前面模型的输出是后面模型的输入)。这里是将模型输入输出数据横切为两部分,两块GPU上模型的对应层的输出数据首尾相接起来才是一个单GPU模型的数据大小。在现在来看,这样的操作似乎过于复杂了,而且并不好实现。
3.3 局部响应归一化 Local Response Normalization
译文:relu有一个理想的特性,即它们不需要输入归一化来防止饱和。如果至少有一些训练实例产生正向输入到ReLU,学习就会在那个神经元中发生。然而,我们仍然发现下面的局部归一化方案有助于泛化。用ai x,y表示在(x, y)位置应用核i计算神经元的活动,然后应用ReLU非线性,响应归一化活动bi x,y由表达式给出
其中求和在同一空间位置的n个“相邻”核映射上运行,n为层中核的总数。内核映射的顺序当然是任意的,并且是在训练开始之前确定的。这种反应正常化实现了一种由真实神经元中发现的类型激发的横向抑制形式,在使用不同核计算的神经元输出之间创造了对大型活动的竞争。常数k, n, α和β是超参数,其值由验证集确定;我们使用k = 2, n = 5, α = 10−4,β = 0.75。我们在某些层中应用了ReLU非线性之后应用了这个归一化(见3.5节)。该方案与Jarrett等人[11]的局部对比度归一化方案有一些相似之处,但我们的方案更准确地称为“亮度归一化”,因为我们没有减去平均活度。响应归一化将我们的前1和前5错误率分别降低了1.4%和1.2%。我们还在CIFAR-10数据集上验证了该方案的有效性:一个四层CNN在未归一化的情况下实现了13%的测试错误率,在归一化后实现了11%的测试错误率3.
(不大理解什么是饱和,什么不饱和,不过在现在看来不那么重要)
3.4 重叠池化 Overlapping Pooling
没看懂,原文+译文
译文:cnn中的池化层汇总了同一内核映射中相邻神经元组的输出。传统上,由相邻池单元总结的邻域不重叠(例如,[17,11,4])。更准确地说,池化层可以被认为是由池化单元网格组成,池化单元之间间隔s个像素,每个单元汇总以池化单元位置为中心的大小为z × z的邻域。如果我们设置s = z,我们得到传统的本地池,通常在cnn中使用。如果我们设置s < z,我们得到重叠池。这是我们在整个网络中使用的,s = 2 z = 3。与非重叠方案s = 2, z = 2相比,该方案将top-1和top-5错误率分别降低了0.4%和0.3%,且输出的维数相等。在训练过程中,我们通常观察到重叠池的模型过拟合难度略高。
大概是说,对传统的polling做了一些改变,提升了一些精度。
3.5 总体架构 Overall Architecture
AlexNet = 5*conv + 3*dense
由于当时的硬件限制用了两个GPU,所以这个网络结构看起来比较复杂,如果在单CPU上还是挺简单的。图中的方框是输入输出的大小,包括长宽和通道数。两个GPU上有自己独立的卷积核,所以说是各学各的,论文中提到的卷积核的数量是指两个GPU上的总数。第一层,先从256256的图片中随机裁取244244作为图片的输入,使用原始的RGB,3个通道的的原始值直接进行输入(这其实是一个很厉害的操作)。第一层到第二层之间GPU之间不通信,每个GPU依然都更新自己的权重;在第三层卷积层会将第二个卷积层中GPU0和GPU1的卷积结果作为输入,两个GPU之间会通讯一次。
第一层:卷积层,卷积核11*11,stride=4, 卷积核数量为96/2,输出大小为55*55*48。后面有一个max pooling(最大池化层)stride=2。
第二层:卷积层,卷积核5*5,padding=2,卷积核数量为256/2, 输出大小为:27*27*128。后面有一个max pooling(最大池化层)stride=2。
第三层:卷积层,卷积核3*3,stride=2,卷积核数量为384/2, 输出大小为:13*13*192。
第四层:卷积层,卷积核3*3,padding=1,卷积核数量为384/2, 输出大小为:13*13*192。
第五层:卷积层,卷积核3*3,padding=1,卷积核数量为256/2, 输出大小为:13*13*128。后面有一个max pooling(最大池化层)stride=2。
高宽慢慢变小、深度慢慢增加,随着深度的增加,慢慢地将空间信息压缩,直到最后每一个像素能够代表前面一大块的像素,然后再将通道数慢慢增加,可以认为每个通道数是去看一种特定的模式(例如192个通道可以简单地认为,能够识别图片中的192种不同的模式)
慢慢将空间信息压缩,语义空间慢慢增加,到最后卷积完之后,进入全连接层
全连接层中又出现了GPU之间的通讯,全连接层的输入是每个GPU第五个卷积的输出合并起来做全连接
4. 减少过拟合 Reducing Overfitting
我们的模型有六千万个参数,虽然有1000类,但依旧是非常容易过拟合的。
4.1 数据增强 Data Augmentation
文中指出从数据的角度较少过拟合,就需要增大我们的数据集,文中提出了两个方法。
- 方法一:我们原始的图片是256*256的,那么如果我们在中间随机的裁剪出224*224大小的图片,并且经过平移和翻转。数据集就扩大了约2048倍,(但实际是有很多图片都是及其相似的)。
- 方法二:我们对ImageNet上的训练集的所有RGB像素值执行PCA(主成分分析),对于每个训练图像,我们添加找到的主成分的倍数。该方案近似地捕捉了自然图像的一个重要特性,即物体的一致性不受光照强度和颜色的变化影响。该方案将top1错误率降低了1%以上。
关于数据增强的笔记:https://www.jianshu.com/p/8ba8e8e708df
4.2 Dropout
不熟悉dropout的话可以看我的另一篇笔记:https://www.jianshu.com/p/ad00cf171353
文中提到使用多个模型共同对数据进行预测往往是非常成功的减少测试误差的一种方法,及模型融合,但是算力代价往往也是昂贵的。所以文中使用了dropout技术。随机的把一些隐藏层的输出变成用50%的概率设为0,每一次都是把一些东西设置为0,所以模型也就发生了变化,就好像每次得到一个新的模型,但是这些模型之间权重是共享的除了设置成0的,非0的东西都是一样的,这样就等价于做了模型融合。
后来大家发现dropout其实也不是在做模型融合,更多的dropout就是一个正则项(dropout在现行模型上等价于一个L2正则项)
这里将dropout用在了前面的两个全连接层上面
文章说没有dropout的话,overfitting会非常严重,有dropout的话,训练会比别人慢两倍。这是由于后面有两个非常大的全连接层(4096*4096)这也是为什么GPU上放不下这么大模型的原因,但现在CNN的设计通常不会使用那么大的全连接层,所以dropout也不那么重要,而且GPU、内存也没那么吃紧了
当然dropout在全连接上还是很有用的,在RNN和Attension中使用的非常多
5 模型学习的细节 Details of learning
这里是一些训练过程中的实现细节。首先是我们的一些超参数和优化器的选择:
- 优化器:SGD(随机梯度下降)
- 批量大小:128
- 动量(momentum):0.9
- 权重衰退系数:0.0005
这里选择了使用SGD作为优化器在当时是不多见的,因为SGD比较难调参,但是后来发现SGD里面的噪音对模型的泛化性其实是有好处的,所以现在深度学习中普遍使用SGD对模型进行训练。在这个文章之后SGD基本上在机器学习界成为了最主流的一个优化算法。关于weight decay可一看我的另一篇笔记:https://www.jianshu.com/p/995516301b0a
-
关于权重初始化,就是使用了均值为0,方差为0.01的正态分布进行权重的初始化,对于一些简单的网络来说,这往往就足够了,但是对于更深的网络来说,可以考虑更多的优化方法。
-
关于偏差,在第二层、第四层和第五层的卷积层把初始的偏移量(bias)初始化成1,剩下的全部初始化成0。但是现在来说的话,我们习惯于将bias初始化为0.
-
关于学习率,每个层使用同样的学习率,从0.01开始,然后呢如果验证误差不往下降了,就手动的将他乘以0.1,就是降低十倍。
在Alex之后的很多训练里面,都是做规则性地将学习率往下下降十倍,这是一个非常主流的做法,例如,ResNet就是每隔30个epoch下降0.1。但是现在很少用了,现在使用更加平滑的曲线来降低学习率,比如果用一个cos的函数比较平缓地往下降。一开始的选择也很重要,如果选的太大可能会发生爆炸,如果太小又有可能训练不动,所以现在主流的做法是学习率从0开始再慢慢上升,慢慢下降。 -
关于epoch,模型训练了90个epoch,然后每一遍用的是ImageNet完整的120万张图片,需要5-6天在两个GTX GPU上训练
6 结果 result
在2010年的ILSVRC比赛中,本文中设计的模型拿到了最好的成绩。
在2012年的ILSVRC比赛中,本文中设计的模型依然是拿到了最好的成绩。下表中带有*号的是有预训练的AlexNet。
有意思的是,我们似乎并没有注意过ImageNet的完整数据集是890万张图片,共有10184类。我们往往只记住了比赛中用到的120万张图片和1000个分类。并且结果显示用完整的ImageNet的结果更好一些。
6.1 定性评估 Qualitative Evaluations
作者在实验中发现了一个奇怪的现象,我们的模型使用两块GPU训练的,然而作者发现在GPU1上,卷积核学习到的都是和颜色无关的内容。在GPU0上卷积核学习到的都是和颜色有关的内容。作者说,他经过多次试验后依旧是这样的结果,他表示很不理解。(就现在来看,其实我们也不大能解释这其中发生了什么,很有可能就是说其实和GPU并没有什么关系)
左边的部分就是说,有可能我们预测出来的结果虽然不正确,但是我们把前几个的预测结果拿出来看一下,其实发现,里面有很多标签是很合理的,是有可能被认错的。
右边的图片就是说,我们把相似的几张图片放进模型中,并且分别将全连接层的4096的向量提取出来,我们对这些向量进行欧氏距离的计算,发现他们的距离是很近的。就有可能就是说,神经网络认为他们是相似的。作者提到说,他更倾向于认为模型是在检索具有相似边缘模式的图像,无论他们语义是否相似。
网友评论