《ImageNet Classification with Deep Convolutional Neural Networks》在2012年发表,将深度卷积神经网络应用于物体识别(图片分类),引发广泛的学界关注并引领深度学习研究的浪潮,成为近年来深度学习发展的奠基作之一。
(抱歉各位读者,这是我自己读论文过程中整理的笔记,参考了B站李沐大佬的解读,目前一些细节还没整理完整,有待补充,见谅)
Abstract 摘要
(摘要部分是论文的充分概括,第一遍读论文主要是读摘要和结论,了解论文的目标、实现方法和成果,筛选一篇论文是否适合去精读。)
本文摘要:
1.我们训练了一个很大的深度卷积神经网络,在ImageNet数据集上ILSVRC-2012比赛中达到远超第二名的最好效果
2.网络结构简单介绍(5个卷积层 & 池化层 & 3个全连接层 & 1000-way softmax)
3.加速训练:卷积的GPU实现
4.降低过拟合:“dropout”
正文也是根据以上几个方面按顺序进行介绍的。
1. Introduction
· 先讲自己的故事:
目前的物体识别主要用机器学习方法。为了提高性能,我们要收集更大的数据集,训练更强大的模型,并且用更好的技术来避免过拟合。然后吹一下ImageNet是很庞大的带有标记的数据集,毕竟是依赖于ImageNet提供的数据做出了成果。
【PS:此处的表达背后是当时深度学习的主要观点是利用正则避免过拟合。但现在的观点认为正则Regularization没那么重要,更重要的是神经网络结构的设计。】
· 提出自己的工作:
用卷积神经网络CNN,可以通过改变深度和广度来控制它的能力,而且它们还可以对图像的性质(即统计的平稳性和像素依赖的局部性)做出强大且基本正确的假设。与相似层大小的标准前馈神经网络相比,CNN的连接和参数少得多,训练更加容易,理论上最好的性能只会稍微差一点。在GPU上实现了高度优化的2D卷积计算,加速网络训练。ImageNet上包含的大量数据可以训练这样的模型,不会出现严重的过拟合。
【PS:当时的主流模型并不是CNN,但本文半句不提当时的主流方法,只阐述了CNN是很好的方法。这可能不是值得学习的论文写法。】
· 列出自己的具体贡献:
1.在ILSVRC-2010和ILSVRC-2012比赛中使用的ImageNet子集上训练了迄今为止最大的卷积神经网络之一,并在这些数据集上取得了迄今为止最好的结果。
2.编写了高度优化的2D卷积的GPU实现并公布
3.网络包含了许多新的不寻常的特征,提高性能,减少训练时长(第三章重点介绍)
4.网络规模很大,采用了放置柜拟合的几种技术(第四章重点介绍)
我们发现深度很重要(5个卷积层和3个全连接层,去掉任何一层都会导致性能下降,即使每个卷积层包含的模型参数占比不超过1%)
最后作者说明了网络的训练受限于GPU内存和训练时间,展望了一下,如果有更快的GPU和更大的数据集,结果还可以得到改善。
2. Dataset
首先介绍ImageNet数据集和ILSVRC比赛:
ImageNet是包含1500多万张经过标记的高分辨率图像的数据集,大致属于22,000个类别。
每年都会举办一场名为ImageNet大规模视觉识别挑战赛(ILSVRC)的比赛。ILSVRC使用ImageNet的一个子集,在1000个类别中每个类别大约有1000张图片。总共大约有120万张训练图片、5万张验证图片和15万张测试图片。
ILSVRC-2010是ILSVRC中唯一一个可以使用测试集标签的版本,因此我们在这个版本上进行了大多数实验。
ILSVRC-2012是参与的竞赛,测试集标签不可用。
在ImageNet上通常报告两种错误率:top-1和top-5(top-5错误率是测试图像中正确标签不在模型认为最有可能的五个标签中的部分)
作者介绍了数据处理的方法:
由于ImageNet所给的数据并不是相同分辨率的,而神经网络的输入需要恒定的分辨率。需要将图片降采样至256×256的固定分辨率。
作者采用的方法是:对于给定的矩形图像,先重新缩放图片使得较短边长度为256,然后从中心裁剪出256×256的部分(即舍弃图片的部分边缘信息保证输入格式恒定)
【PS:作者并没有用到当时常用的SIFT等特征提取方法,而是直接基于raw pixel values进行计算。这是非常重要的工作,但是作者没有在文中强调这一点。后来我们发现直接输入原始图片输出结果的端到端模型是非常重要且简洁的。在后来的研究中这样的思想融入了深度学习的核心价值,只有简单有效的方法才能持久。】
3. The Architecture
下面作者开始介绍核心部分,即深度卷积神经网络的结构
3.1 ReLU Nonlinearity
当时最标准最常用的激活函数是tanh和sigmoid函数,但从训练时间来看,上述饱和非线性函数要比 f(x) = max(0,x) 非饱和非线性慢得多,本文将此函数称为修正线性单元 Rectified Linear Units(ReLUs),发现学习速度成倍数加快。
本文提到 f(x) = |tanhx| 在。但本文关注的是防止过拟合,所以观察到的效果不同。
(需要提到的一点是,近几年技术不断发展,ReLU相较于其他激活函数更快的优势也没那么大,而且当时认为ReLU更快的原因在现在看来并不完全正确。现在人们常用ReLU的原因更多地是它简洁,而不像其他函数那样有更复杂的形式难以记住)
3.2 Training on Multiple GPUs
由于当时的GPU内存限制,作者选择将网络分散在两个GPU上并行化训练,并且使用了GPU只在特定层进行通信的技巧。在当时技术条件限制,训练规模较大的网络是非常困难的。作者需要花费大量时间和工程量来完成跨GPU训练的实现。在近年来GPU的迅速发展,各种硬件软件的支持越来越完备,如今来看这个问题已经没那么重要。
3.3 Local Responce Normalization
作者提到ReLU的一个好处就是不需要输入的正则化来避免饱和,只要有至少一个训练示例产生了正输入,学习过程就会发生。但作者下面提到,如果采用一个正则化的技术,可以有利于模型的泛化。
下面的数学公式一看就令人头大,但不必担心。
现在我们不认为这种技术是必要的,在这之后也几乎没有人用到这种方法。相对于模型整体来说没有那么重要。
3.4 Overlapping Pooling
池化技术可以成倍地降低图片维度,提取图片在局部区域的关键信息。在池化方法上,作者采用了池化层的池化单元间隔为2, 大小为 3×3 的方法有重叠地进行池化,相比于大小 2×2 不重叠的池化略微有错误率的降低。(作者只告诉了我们他是怎么做的有设么效果,没有告诉我们为什么有效或者重要之处在哪里,更像是一篇技术报告)
3.5 Overall Architecture
【上图中的方框代表每一层的输出结果,定量地标出了数据规模和维度】
输入(224×224×3):直接输入长宽为224的图片,RGB 3通道
(以下的5个卷积层分布在两个GPU上训练)
卷积层1(2×55×55×48):2×48个大小为11×11×3的卷积核进行步长为4的卷积,结果为2个55×55×48的特征图,两个GPU不存在通讯
卷积层2(2×27×27×128):2×128个大小为5×5×48的卷积核进行步长为卷积,结果为2个27×27×128的特征图
卷积层3(2×13×13×192):
卷积层4(2×13×13×192):
卷积层5(2×13×13×128):
全连接层1:4096个神经元产生4096维向量输出
全连接层2:4096个神经元产生4096维向量输出
全连接层3:1000个神经元产生1000维向量输出
输出:1000维向量,预测图片属于每个类别的概率大小
维度不断减小,通道数不断增加。(每个通道识别不同的模式)
现在来看,4096的全连接层是网络设计的一个缺陷,导致网络过大无法放入一个GPU里训练。现在的CNN几乎不会用到4096这么大的全连接层。
4. Reduce Overfitting
4.1 Data Augmentation
作者在文中写道,减少图像数据过拟合最简单和最常见的方法是在保持标签的情况下做变换,人为地扩大数据集。
作者采用了两种不同的数据增强形式,只需要从原始图像经过少量计算生成,不需要存储在磁盘上占据内存。用CPU上的Python代码转换图像而同时在GPU上训练网络,所以实质上不需要额外的时间成本。
【PS:在当时的技术条件下,上述结论是成立的。但是随着GPU的发展,GPU上模型训练的速度远远超过CPU进行数据增强的速度,如果还是采用上述方法,数据增强反而会成为性能的瓶颈。】
1.图像平移和水平反射:
从原始图片256×256中提取224×224部分(以及她们的水平反射),可以计算出增加了32×32×2=2048倍的图像数据量(即使这些图片之间有高度依赖性,但是如果不用数据增强,会有严重的过拟合,只能被迫使用更小的网络)。
文中提到,在测试时取出四个角以及中心的224×224图像以及它们的水平反射进行预测,取10个结果的平均值作为预测结果。
2.用PCA主成分分析改变RGB通道的强度:
具体来说,我们对整个ImageNet训练集的RGB像素值集进行PCA(主成分分析)。blablabla…
(专业性比较强,后面有时间再补充)
4.2 Dropout
融合许多不同模型的预测结果是有效的方法,但对于深度神经网络来说太昂贵了。
作者采用dropout作为一种效率很高的模型融合技术:以0.5的概率将隐藏层的输出结果设为0,这些被忽略的神经元不参与前馈也不参与反向传播(即有一定概率忽略掉某些输出,表现出可变的网络结构)。每次输入时都经过不同架构的神经网络,但它们共享权重。
Dropout有效减少神经元之间复杂的依赖关系,学习到更robust的特征,以至于和其他某些随机的神经元子集共同工作都有效。
作者在前2个全连接层中使用dropout(在不适用dropout时遇到严重的过拟合),使得收敛所需的时间翻倍,也就是只需要大约两倍的时间,训练出一个更好的神经网络。
【PS:目前的观点认为Dropout是一个正则项】
5. Details of Learning
作者采用了SGD随机梯度下降做参数优化(batch size = 128, momentum = 0.9, weight decay = 0.0005)
作者提到,微小的weight decay对于学习是很重要的,并不仅仅是一个正则化,而是降低了模型的错误率。
原文中给出了上述参数优化的表达式:
(v—动量变量, ε—学习率, 偏导项—目标函数L对于参数w求偏导代入wi的值在batch Di上取平均值)
每一层的权重都初始化为高斯分布(期望为0,标准差为0.01);
我们在第2层、第4层和第5层卷积层以及全连接层中初始化 bias = 1;其余层中初始化 bias = 0;
【PS:在某些层的bias设为1是不常见的操作,作者给出的说法是通过向ReLUs提供正值输入,这种初始化加快了早期阶段的学习;但现在我们发现全部初始化为0效果也不错,所以很少再用到这种方法。】
对于所有层使用相同的学习率并手动调整:初始化为0.01,;当错误率不再下降时,将学习率除以10,在终止学习前调整了三次。
最终训练了90个epoch,用时5-6天。
【当时的做法更多地是时刻关注训练效果并且需要手动调整参数。后来更多的是先前确定在某些训练阶段自动进行学习率调整。目前的主流做法是:学习率从很小的值开始线性增加,再平滑地下降】
【PS:由于SGD调参相对难一些,当时并不是主流的优化算法。而现在我们发现SGD里面的噪音对于模型的泛化性是有好处的。这篇论文发表之后SGD基本成为了主流的优化算法。】
6. Results
定量评估:
作者通过图表展示CNN得出的结果明显优于其他主流方法。
定性评估:
Specialization:GPU 1上的内核在很大程度上是颜色不可知的,而GPU 2上的内核在很大程度上是颜色特定的。这种专门化发生在每次运行期间,并且独立于任何特定的随机权重初始化(对gpu的重新编号取模)。
7. Discussion
结果表明,在大型的深度卷积神经网络上应用监督学习,可以在一个有挑战性的数据集上实现创纪录的结果。
深度对于结果很重要(去掉任何一层都会使得性能损失约2%)。
没有使用任何无监督的预训练(在当时是很常用的手段)。
最后提出了希望在视频上应用,并强调在时间结构上会提供许多静态图片所不具有的信息。