AlexNet 论文精读

188 阅读9分钟

 声明:本博客为记录自己的学习过程,不做商业用途,引用部分会注明

Overview

今天精读的是2012年的一篇文章,主要是为了形成一套自己的读论文的方法。

我在读这篇文献的时候,是站在当时的角度,而非现在技术的角度。在2012年之前的传统主流还是machine learning,对卷积(convolution)还未展开研究,因此当我以后如果读到类似的作者原创的内容时,不要细究去百度,而是继续耐心读下去。

首先,我们可以根据标题和摘要大概浏览一下文章是否和自己的领域相关,如果相关就继续读下去,不相关就跳过,去读下一篇;然后,可以看看作者信息,了解这篇文章的价值,以及它源自于哪个实验小组,了解他们团队的风格。

例如,这篇文章的最后一个作者(Hinton)是深度学习之父。

Abstract

We trained a large, deep convolutional neural network to classify the 1.2 million

high-resolution images in the ImageNet LSVRC-2010 contest into the 1000 dif

ferent classes. 

开门见山,交代了工作,他们训练了一个大型的CNN网络,将ImageNet LSVRC-2010比赛中的120万张高分辨率图像分类为1000个不同的类别。

On the test data, we achieved top-1 and top-5 error rates of 37.5%

and 17.0% which is considerably better than the previous state-of-the-art. 

然后说自己的指标有多棒,打败了之前的sota,这里有一个小技巧,自己在写论文的时候,不要只单纯的摆指标数据,要进行对比,没有对比没有伤害。

 The neural network, which has 60 million parameters and 650,000 neurons, consists of five convolutional layers, some of which are followed by max-pooling layers, and three fully-connected layers with a final 1000-way softmax.

这里介绍了这篇文章的神经网络组成,在此之前的网络模型参数没有这么庞大,因此作者把这种亮眼的信息摆出来,能够吸引到读者。

 To make training faster, we used non-saturating neurons and a very efficient GPU implementation of the convolution operation.

这里他们用了非饱和神经元和有效的GPU实现,在这个时候我会很迷惑,但不要急,带着问题继续读下去。

 To reduce overfitting in the fully-connected layers we employed a recently-developed regularization method called “dropout” that proved to be very effective.

为了防止过拟合,他们使用了全连接层,和当时很有用的“dropout”的正则化方法。

 We also entered a variant of this model in the ILSVRC-2012 competition and achieved a winning top-5 test error rate of 15.3%, compared to 26.2% achieved by the second-best entry.

这里作者又开始对比了,他们也参加了比赛,比第二名高了15.3个百分点,这是非常夸张的,令人震惊的效果,在国际大赛上很难得,于是很多人想搞明白原理。

从写作技巧来说,这个摘要更像一个报告,而非一个好的模板。

Discussion

这个部分一般来讲就是讲一些调参或者未来的工作,俗称“挖坑”,给同行们看看。有哪些地方还没来得及做,哪些地方还可以延申。  

It is notable that our network’s performance degrades if a single convolutional layer is removed.

这句话的意思是,这篇文章的任何一个卷积层都不能被取代,都很重要,值得学习这个表述:如果移除任意一个卷积层,性能将会衰减。

 So the depth really is important for achieving our results.

深度对我们的结果是非常重要的!

 but we still have many orders of magnitude to go in order to match the infero-temporal pathway of the human visual system.

即便达到了很好的效果,但是离人类视觉的精度还有很远距离。

 Ultimately we would like to use very large and deep convolutional nets on video sequences where the temporal structure provides very helpful information that is missing or far less obvious in static images.

原作者认为,Alexnet在视频处理方面也是有搞头的,可以增加一些时序结构,比静态的时候获取的信息更加全面。

至此,我们第一遍论文就读完了,我们可以知道,这篇文章干了什么事情,效果怎么样,还有什么可以研究的地方,如果跟我手头的工作相关,则开始第二遍阅读。

第二遍阅读,我采用顺序阅读,但不用关注一些工艺的东西,甚至可以不读,多注意图和表的内容,很多时候文字是对图表的一个解释。

Introduction

 Current approaches to object recognition make essential use of machine learning methods. To improve their performance, we can collect larger datasets, learn more powerful models, and use better techniques for preventing overfitting.

近年来的工作,machine learning的范式是:比较大的datasets,比较强的models,以及防止过拟合的techniques。后面介绍整个发展可以扫一眼,主要介绍的是研究历史,然后引入本文用到的ImageNet数据集。在介绍CNNs时候本文作者直接引用,这个写作方法有待考量,更标准的风格应该是与之前的方法进行对比,他们研究的问题分别是什么。

这部分比较重要的内容是specific contributions

 Our network contains a number of new and unusual features which improve its performance and reduce its training time, which are detailed in Section 3.

这里的unusual字眼很关键,审稿人比较喜欢看到novel,unusual这种字眼。当一篇文章对标sota的时候,不一定是它的方法和模型有多新颖,有可能是强行堆叠了很多方法。但是本文对标sota是用一些新颖的方法,所以审稿人会更喜欢。

我们可以根据introduction的部分进行论文大概框架的浏览,去读自己更需要的部分,有时候一篇文章我可能只对某一点比较感兴趣,introduction这时候就起到一个定位的作用。

Datasets

在第二遍读论文的时候这部分不必要仔细阅读,但是这里有一个比较亮眼的地方就是:

 We did not pre-process the images in any other way, except for subtracting the mean activity over the training set from each pixel. So we trained our network on the (centered) raw RGB values of the pixels.

他们没有对图像做任何的预处理,这实际上是非常重要的一点。在传统的cv,很多时候不是在原始图像上做一些处理,更多的是进行特征的提取,在模型里进行进一步计算。特征工程是传统的machine learning非常重要的一点,但是深度学习是一种end-to-end的模式,给算法工程师节省了特征工程的时间。

如果我在自己写论文的时候,可能会详细展开说明,但是作者放在了比较不起眼的角落。

The Architecture

The architecture of our network is summarized in Figure 2.

看到这句话,我会选择直接去看图,图看懂了,文字就懂了。

输入数据是224*224*3,分别代表高、宽、颜色通道,第一层的卷积核是11*11的;第二个矩形实际上是第一个卷积得到的结果,是55*55*48,由此可见第一层使用了48个卷积核,每一个卷积核都在提取一种特征,而高宽是在减小的,这也是卷积的必然结果。

这里实际上把输入数据分为了上下两组,当时是一种迫于无奈的选择,算力不够大才将数据分成两组,但在此之后的研究中,这也是一种妥协的小技巧。在第三组矩形里,作者实际上是把这两组数据进行了一个交互。

在梯度下降的训练里,本文选用了ReLU Nonlinearity,在梯度下降的训练时间方面,tanh这些饱和非线性比非饱和非线性f (x) = max(0,x)要慢得多。这里作者手绘了一个结果图:

在多GPU的训练问题,在第二遍阅读,我们没必要关注,很多已经被淘汰了。这里的Local Response Normalization也是被后世质疑的一个工作,这里不展开说明,我们有更好的替代方法。实际上这种局部响应正则是模仿了人类神经元的工作状态,当一个神经元的权重(活动值)很高的情况下,会降低周边神经元的权重(活动值)。

**Overlapping Pooling :**这种池化操作在Alex之前是没有的,基本都是无重叠的池化,例如step=2时,size=2,在滑动的过程中是没有重叠的,互不影响。但是Alex这里是当step=2时,size=3,因此发生了滑动过程中的重叠的效果。这样的操作,会给模型带来0.4%的精度效益,看起来还不错。

Reducing Overfitting

最有效的减少过拟合的方法必然是扩大数据集,但是耗时耗力,研究人员需要不断地拍摄,然后一个一个进行标注工作,这显然不太现实。作者这里提出了更合理的方法,他们随机的拿出原数据集的一些图片,并对图片进行裁剪,翻转等等数据增强的方法,再丢回原有的模型里进行训练,这样就可以省去了再次标注的工作(因为经过数据增强后的图片仍然是有标签的)。

Dropout也是一种防止过拟合的方法,但是区别与数据增强。我们知道一个复杂的模型会更容易出现过拟合, 所以作者原创了一中丢弃的方法,去减少模型的复杂度。具体操作过程就是,把全连接的神经网络的做部分节点的随机**“失活”**,也就是随机置零操作。

Details of learning 

本文在训练原始数据时是分为两组的,因此跑出来的结果不太一样,以下是原文对GPU跑出来结果的一个可视化:

可以发现上下前三行是一组,它更注重于图片的纹理特征,而后三行是另外一组,它更注重于图片的色彩。这也为后续的group卷积做了起步工作,但是Alex本人当时没有去深入研究。这种思想有点类似于集成学习的思想,不同group相当于不同的弱model。

至此,我们完成了对该论文的两遍阅读,第三遍阅读是当我们要复现论文的时候以及尝试去理解一些不懂的概念的时候才需要去细究。

下一篇blog我会仔细研究以下AlexNet的具体实现过程,在此挖坑。