Step 1
1. title+abstract

-
第一句:告诉我干了什么事情
我们训练了一个很大很深的卷积神经网络,用来对120w个图片作分类,这里面有1000个类
-
第二句:结果
在测试集上面,top-1 error=37.5%,top-5=17.0%,比前面的结果都要好
(这里的前两句是一种很少见的写法)
-
第三句:介绍
这个神经网络有6千万个参数和65w个神经元
神经网络有5个卷积层,一些MaxPooling层,三个全连接层,最后有一个100层的softmax
-
第4、5句:训练方式
为了训练快一点,我们使用了非饱和神经元和能高效进行卷积运算的GPU实现(GPU的使用在2012年左右已经算是比较正常了,2007年NVIDIA出了CUDA库之后,12年往后GPU在机器学习界使用的很多,当时很多还是用matlab,里面有很多GPU的加速包)
为了减少全连接层的过拟合,我们应用了最近在发展的正则化方法"dropout",这被证实非常有效
-
第6句:成果
我们把这个墨西哥放到了2012年的竞赛中,top-5=15.3%,这里第二名是26.2%
(这里的15.3开始会感觉和上面17.0有点矛盾,往后看)
不是一个非常好的摘要,更像一个技术报告
好处是很明确的告诉读者数据好,看到数据有需要的话就继续看
2. discussion
看完前面直接跳到最后
这篇文章是没有结论的,这只有一个讨论
讨论一般是吐吐槽,看看未来要干什么;结论一般是和摘要的一一对应
(所以没有结论通常说是比较少见的一个事)
- 总结一下是
- 深度卷积神经网络的表现:研究表明,使用纯监督学习的大型深度卷积神经网络在一个具有挑战性的数据库上取得了突破性的结果。
- 卷积层的作用:网络性能在去除任何一个卷积层后都会下降,尤其是去除中间层时,网络的top-1表现会下降约2%。这表明网络的深度对于取得这些结果至关重要。
(最后这个结论没错,但是前面,把一层conv拿掉然后数据降了2%,并不能说明深度一定是最重要的,也可能是参数没调好。AlexNet去掉一些层&更改中间参数,还是有办法达到同样效果的)
(除了深度很重要,宽度也是很重要的,不能很深2且很窄) - 无监督预训练的潜力:尽管实验中没有使用无监督预训练,但研究者认为无监督预训练有助于提升网络表现,尤其是在计算能力足够的情况下,能够增加网络规模而不增加标注数据的需求。
(深度神经网络的训练在当时是很难的,所以会用一些无标签的数据让他预热) - 未来方向:尽管当前实验结果随着网络规模和训练时间的增加而有所提高,但仍有许多进步空间,目标是接近人类视觉系统的推理时间路径。最终,研究者希望能在视频序列上使用非常大且深的卷积网络,利用时间结构来提供缺失或不明显的信息。
图表公式
(因为是看完discussion往上翻的,所以这里是倒着翻的)
左边展示测试结果
右边把神经网络最后的图片在倒数第二层的输出拿出来得到一个长的向量,给定一张图片,看一下这个向量上最近的图片是谁(横行),可以看出来找出来的内容都是和输入的图片是同一类的
(这篇文章没有讨论这个结果的重要性,但实际上这是整个实验里最重要的一个结果:深度神经网络的一个图片训练出来的最后的那个向量,在语义空间的表示特别好)

我的结果和其他结果的对比
上面是2个当前最好的结果,可以看到top1和top5的错误率都比这个文章要高的
视觉里面常见图
第一遍可能看不懂这张图,这里的细节可以放到最后一边来看
总结
第一遍读下来可以知道,这篇文章的工作结果特别好,是用神经网络做的
(具体为什么好,具体怎么做的,因为背景知识还不够,所以在第一遍可以跳过)
这个时候可以来决定要不要继续往下读
(在当时看到这篇文章的话,如果不是做这一部分可能就不看了,但是如果做图片分类领域,要继续看)
Step 2
第二遍:从头到尾读一遍,不懂的可以留到第三遍,主要目的是知道细节在做什么,去了解作者是怎么想的,作者是怎么表述内容的
(每篇文章都是有自己的观点的,每个作者对这个问题的认识是有一定的角度的,所以通过读论文我们可以清晰的感受到作者对整个问题的看法、他的角度、他是怎么认为的)
(经典论文现在看的时候会去看当时对技术的选择、对技术的描述在现在来看还是不是这个样子)
(其实里面对一个技术的描述、为什么做东西,在现在的观点来看都是错误的;而且里面有大量的细节在现在的角度来看是没有必要的)
1 Introduction
已经看过摘要和结论了,所以这里直接从intro往下读
一篇论文的第一段通常是在讲一个故事:
我们在做什么研究,在做哪个方向,这个方向有什么东西,他为什么很重要
这里介绍了 我们要用机器学习方法做目标识别,为了提升他的性能,我们要收集更大的数据集,学习更强的模型。使用更好的技术来避免过拟合(这基本是机器学习的正常途径,在之前大数据年代,大家一直关心收集更大的数据)
(过拟合代表了深度学习的一个派别,深度学习一般讲我可以用很大很大的模型,然后通过正则来使他不要过拟合--这是深度学习界在当时的认知--在当时很长一段时间大家都是这么做的,但是现在来看,正则好像没那么重要,不是最关键的,现在比较关键的是神经网络的设计)
后面开始讲数据,过渡到ImageNet数据集(这里因为title写的就是针对这个数据集,那一定要吹一波ImageNet特别好,因为他数据量大且类别多)
--第二段
直接讲如何做神经网络:这里用CNN来做(因为CNN在处理这类问题上是一个很好的模型),如何将CNN做的特别大(CNN做大不容易,会overfitting或者训练不动)
NT:这种写法有点问题,因为在当时主流大家不用CNN,大家用其他的模型,所以这里半句话不提别人的算法,直接只提CNN,是一个非常窄的视角
写论文的时候不要只说我这个领域这个小方向大概怎么样

-- 第三段
CNN虽然很好,但是很难训练,训练不动(但是现在有GPU了,算力能跟上了)
-- 第四段
我们的贡献:
- 我们训练了一个最大的神经网络,取得了特别好的结果,实现了一个GPU上2d的卷积
- 网络有一些新的和不常见的特性,能提升他的性能,降低他的训练时间,在第三章
- 如何避免过拟合,在第四章
- 我们的网络有5个卷积层,3个全连接层,并且发现深度很重要
2 The Dataset

这篇文章第二章就讲了dataset,毕竟标题第一个词就是ImageNet,卖点就是ImageNet的结果
第二段提到,2010年时公开测试集的,但是她们参加的2012年的竞赛不公开测试集,所以只能在网上提交,提交之后看到结果,所以只能报告一些结果(这也就是为什么摘要里面出现了两个不一样的top5)
第三段实际是非常重要的(但是在当时读的时候可能感觉不出来),这里提到ImageNet他的图片的分辨率是很不一样的,很多数据集是把图片裁好的,但是ImageNet没有,所以这里的处理是把每个图片做成256*256的图片
- 做法
- 将短边缩短到256,同时保证高宽比,长边也相应往下降(这时可能还是多于256的)
- 如果长边多于256,以中心为界把2个边裁掉
这里没有做图像的预处理,只做了裁剪,训练是在raw RGB values of the pixels上做的
(这篇文章没有将这里作为主要卖点,但是在之后的工作中,卖点就落在了end to end上,即原始数据直接输入,不做任何特征提取)
3 The Architecture(文章主要贡献1)

fig2是网络架构,包含8个学习层:5个conv+3个fully
后面描述网络里新的、不常见的特性,3.1-3.4小节按重要性降序排序
3.1 ReLu Nonlinearity
首先最重要的是使用了ReLu非线性函数
在标准的神经网络模型中,激活函数用的是tanh和sigmoid函数,但是这些饱和的非线性激活函数 要比非饱和的非线性激活函数要慢(这里没写原因,因为这是前人的成果,可以看引用20)
(现在的情况是不一定用relu,换别的激活函数也可以,但是现在也用relu,主要是因为简单)
3.2 多GPU训练
这部分第二遍可以不看这里(因为大概看不懂)
这种非常工程的细节可以放在第三遍或者后面浮现的时候再看
3.3 Local Response Normalization
第二遍可以忽略掉这里的公式(公式不复杂,但是对记号不熟悉的话 可以先忽略)
知道这里是一个normalization的东西,然后他能避免饱和
(放在现在看,这个东西不重要,几乎没人用到它,不是一个非常有必要的方案,且现在有更好的normalization技术)
3.4 overlapping Pooling
pooling层把前面的输出总结一下
一般来讲两个pooling之间是不会overlap的,但现在要overlap
这里要知道它对传统的pooling做了改动,改动不大但是他说效果会更好(知道他改的东西就ok)
3.5 Overall Architecture
(看原文)
这里存在的问题是,还是没有和其他工作的对比(比如强调卖点,我们和别人是不一样的,不需要预处理图片),所以这篇文章从文章上来讲就是一个技术报告,就讲了我做了什么东西,不讲我和别人的区别,也没有将为什么是这样为什么重要
但是工作重要一样可以是奠基之作哈哈
从现在的角度看这部分内容
一般讲神经网络的时候,经常会截Fig2来展示整个网络架构,但是这个图有点过分扣细节,不太好看懂
这里仔细看,第一张图往后都有上下两部分,这里实际是作者有2块GPU,他把图像横着切了一刀,一部分放到了GPU0,一部分放到了GPU1
在第三个卷积层的时候有一次输入的交叉
随着层数的增加,输入的宽高在减小,通道数在增加,后面可以理解为每一个通道识别输入的一种特定的模式(比如是识别毛腿还是边界等)------空间信息压缩,语义空间慢慢增加
最后(第五层)卷积完之后,进入全连接层
全连接层又有了两个GPU之间的通信
全连接层的输入 是 每个GPU在第五层卷积之后的输出 合并起来,合并成一个大的,但是在GPU上每个全连接层还是个做个的(每个做一个2048的全连接,但是最后的结果是两个GPU上的全连接要拼起来成一个4096的)
也就是说,全连接在进入最后一个分类层的时候,表示成了一个4096的向量
-
存在问题:
大家很多时候都没看过这个模型长设什么样子,因为他太复杂了,有两个原因
- Alex在做这个工作的时候,为了能在当时的2块卡上训练这个模型,他强行把这个模型切开,切成了一个上下都有的(他觉得这是一个贡献,因为大概花了很多时间写了很多代码才实现这个切分)但是在现代角度来看,这事一个过于复杂的技术细节(因为即使是3GB的内存,把代码实现好一点一样能训练,如caffe)
- 把模型做到了2个GPU上,那后面有3个or4个GPU怎么切分(所以这个仅仅是一个数据集在自己的机器上是这么训练的,没有一定的通用性)
所以也就导致在未来一段时间大家都忽略掉整个这一部分的工作了(模型并行,model parallel)
但是近几年随着模型规模的增长(如BERT的出现),现在大家发现模型又训练不动了,大家又回到了要把模型切成几块的部分,使得能训练100亿、1000亿甚至10000亿的模型
(在当时觉得没用,但是近几年发现又有用了)
(在CV领域用的不多,但是NLP领域现在又称为了一个主流的一个方法)
4 Reducing Overfitting(文章主要贡献2)
提到了处理过拟合的几个方法
这里提到他是在CPU上做模型,在GPU上跑训练
但是这放在现在是不可行的,GPU的发展远超CPU的速度
所以这就导致,要是把这个东西用python写在CPU上跑,此时做数据增强可能是最花时间的东西,模型训练要比他快很多了
所以这个结论在当时看是成立的,但是现在看起来,数据增强很可能成为性能的瓶颈,很有可能要把他搬到GPU上或者用很好的C++来实现
4.1 Data Augmentation
最简单最常见的处理图像数据过拟合的方法是人工的将数据集变大。
- 这里使用了两个方法,是用的别人的工作
- 空间上抠图
图片进来是256256,在里面随机的扣一块224224的区域出来,这样大小就会变成原来的2048倍 - 变色
把整个RGB的channel,在颜色通道上做一些改变
这用的是一个PCA的方法(后面有讲PCA是怎么做的,这里第二遍可以先忽略,但是要知道第二个方案是在颜色通道上做改变) 这一遍没看懂的地方可以先标记,等后面确定要继续看的时候再返回来看,可以去看一下这里引用的文章
- 空间上抠图
4.2 Dropout
为了减少测试误差,把多个模型放起来是很有用的(model ensemble)
但是这对深度学习消耗太大了(神经网络本来就很贵了,还搞模型融合)
所以这里用了Dropout技术(这是另外一篇文章,引用10,虽然也是这拨人做的)
这里随机的把一些隐藏层的输出 有50%的概率设成0
这相当于这个模型就变了,就每一次得到一个新的模型,但是这些模型之间的权重是共享的(除了那些设成0的层,非0层大家都是一样的)
作者的思路是,这样每一次都能得到一个新的模型,然后等价于是很多模型做融合
但是后来大家发现,Dropout好像也不是在做模型融合,更多时候Dropout就是一个正则项
(几年之后她们又重新写了一篇文章,来说明Dropout在线性模型上等价于一个L2正则项,在更复杂的模型上也等价于是一个正则的效果,但是无法构造出跟他相等的一个正则的东西)
文章把dropout放到了前面2个全连接层上,如果没有dropout的话,过拟合会非常严重;如果有dropout,训练回避别人慢2倍
所以这里,AlexNet用了3个全连接,最后一个输出是必须有的,中间2个很大的4096的全连接,是他的一个大瓶颈------>这是当时设计的一个缺陷,所以导致整个模型特别大,根本放不进GPU中
现在CNN的设计不会用这么大的全连接,所以dropout就显得没那么重要;而且GPU、内存也没那么吃紧了
不过dropout在全连接上还是非常有用的,在RNN、Attention相关内容中 dropout用的非常多
5 Details of learning
讲述模型是如何训练的
这里用了SGD(随机梯度下降)进行训练------>在这个文章之后SGD基本上在机器学习界称为了最主流的一个优化算法
(现在大家都知道SGD是训练深度学习很常用的方法,但是在当年不是,因为SGD调参相对来说比较难调,大家更愿意用一些更稳定的方法,比如L-BFGS甚至是GD来计算,相对调参更容易些。但是后来发现SGD里面的噪音对模型泛化是有好处的,所以现在都用SGD了)
这里提了几个参数,然后提到发现用了一点点weight decay在模型学习过程中是非常重要的(后面也提到了weight decay是怎么实现的)
weight decay当时在机器学习界主流上应该叫做L2 regularization,但是这篇文章以及整个神经网络里面喜欢用weight decay,这样这个东西他不是加在模型上,而是加在优化算法上。虽然她们两个是等价的关系,但是因为深度学习的觉醒,所以现在大家都交weight decay了
momentum参数:当优化的表面非常不平滑的时候,这个冲量使得不要被当下的梯度太多的去误导,可以保持一个冲量,从过去的方向沿着一个平缓的方向往前走。这样就不容易陷入到因为表面不那么平滑,掉到坑里面去
权重是用均值=0,方差=0.01的高斯随机变量来初始化的
0.01的取值是大家发现这个值还不错,也不大也不小,而且对很多网络都可以。
不过对一些很深的网络肯定还是要做更多优化,AlexNet从现在角度来看 是一个比较简单的神经网络,0.01是一个不错的选项。
像现在比较大的BERT,也就用了0.02
在第2、4、5的卷积层以及全连接层,将偏移初始化为1,剩下的初始化为0
这里就比较奇怪了,因为偏移本质上来说如果数据比较平衡的话一般是初始化为0的,但是他这里发现1比较好(后面发现初始化为0也可以,所以这个技术在后面用的是比较少的)
文章每一层用同样的学习率,学习率设置从0.01开始,发现验证误差不往下降了,就手动的将学习率降10倍
(在后面很长一段时间,都是这么做的;但是后来发现也没那么复杂,比如resnet,训练120轮,就每30个epoch下降0.1;还有一种主流做法,前面可以做更长一点,必须能够60轮或者100轮,再在后面再下降)
(不过现在不直接这么用了,一般采用更平缓的方式 比如cos曲线来降低学习率)
而且0.01的选择也很重要,太大会爆炸,太小学不动
所以现在的主流做法是,从0开始,然后慢慢上去,再慢慢下去。从曲线上看,随着epoch增加,初始是很小的值,然后先线性上去到一个很大的值之后,再cos曲线下降
AlexNet的做法是阶梯下降,每次下降10倍,但是什么时候下降是手动选的
后面提到他训练了90个cycle(也即90 epoch),每一遍是用ImageNet完整的120w张图片,需要5-6天在2个NVIDIA GTX上训练
(这个时间在当时算是比较长的了,调一次参需要等5-6天才能知道结果)
6 result
主要理解和别人相比的优势
这里看原文就可以
我们在看的时候很多时候并不关注实验是怎么做的,更多关注实验的结果
因为除非你是这个领域的专家,看一眼就大概能懂;如果是刚进入这个领域,很多时候不需要太关心这些细节,除非要去重复他的实验
只有在需要重复他的实验、审论文或者你是这一领域专家的时候,才会大概去看一下他的实验
这里比较有意思的是他报告了他在完整ImageNet上运行的时间
完整Image有890w个数据,10184个分类

对于表2,之前有提只有2010年时提供了测试数据,后面需要到网上提交他的数据才可以
所以这张表中只报告了5层和7层CNN的相对结果,其余两个是空掉了
右边他把2012的称测试集,把中间2010的叫验证集
这是文章非常好的一点,因为现在机器学习里面,很多时候大家是搞混测试集和训练集还有验证集的
(验证集可以一直测用来调参,测试集相对来说应该就测那么1次)
ImageNet也允许每天提交几次,所以也不是真正意义上的测试集
6.1 Qualitative Evaluation
来对网络进行评估
这里提到发现了一个比较奇怪的现象,因为他是在2个GPU上训练的(这样就是,比如卷积输出通道是256的话,两个GPU各算128),GPU1上学习到的基本都是和颜色无关的特征,GPU2上都是和颜色相关的特征
选择要不要接着看
这样看完一遍会比看博客等看到更多的细节
后面就可以选择要不要继续往下看
继续看的话里面还有很多东西不是很懂,这里就可以去看一下里面引用的那些文章(所以记得做标记!)看一下这些技术是怎么描述的,再回来看这里是怎么用的