近期开始阅读cv领域的一些经典论文,本文整理计算机视觉的奠基之作——Alexnet
论文原文:ImageNet Classification with Deep Convolutional Neural Networks(有需要论文原文的可以私信联系我)
本文的阅读方法是基于李沐老师的B站讲解视频,需要细致去看的小伙伴可以去搜索,链接如下:
9年后重读深度学习奠基作之一:AlexNet【论文精读】_哔哩哔哩_bilibili
本文整理用于之后自己能够更快的回忆起这篇论文,所以有些地方记录的可能没那么严谨,有问题的地方欢迎各位指出和讨论,我及时修改,谢谢各位!
如果该论文笔记对你有所帮助,希望可以点个赞关注一下,之后会继续更新cv领域的一些经典论文的笔记,谢谢大家!
当我们在阅读一篇论文时,可以分为三遍阅读:
目录
第一遍阅读:
Abstract—摘要:
Discussion—讨论
Figure and Table—重要的图和表
第二遍阅读:
Introduce—介绍
The Dataset—数据集
The Architecture—网络结构
ReLU Nonlinearity—非线性激活函数ReLU
Training on Multiple GPUs—用多个GPU训练
Local Response Normalization——局部归一化
Overlapping Pooling—重叠池化
Overall Architecture—整体网络架构
Reducing Overfitting—减少过拟合
Data Augmentation—数据增强
Dropout—正则化
Details of learning—学习的细节
Results—实验结果
Qualitative Evaluations—定性评估
第三遍阅读
第一遍阅读:
Abstract—摘要:
摘要简单总结来说提出了以下四点:
- 表示了我们用了一个深度卷积神经网络来进行图片分类,取得了一个非常好的效果。
- 深度卷积网络由60million个参数,65w个神经元,以及五个卷积层和三个全连接层组成。
- 为了加快训练,用到了GPU加速实现。
- 用了dropout这个正则化方法来减少过拟合。
Discussion—讨论
总结来说讨论就是作者的一些吐槽以及后续的一些工作打算,大概分为了以下三点:
- 我们的研究表明深度很重要,如果去掉一个卷积层,那么准确率会下降2%。(这一点现在看来没那么准确,因为少一层导致准确率下降也有可能是因为参数没找好,找好参数也可以达到之前的准确率的,所以现在来看,深度和宽度都很重要)
- 没有使用无监督进行预训练。这个是有一定历史背景的,在Alexnet网络提出之前有监督学习打不过无监督学习,但是在Alexnet提出之后,引起了有监督学习的热潮,直到最新的语言模型bert的提出,才慢慢的将人们又拉回了无监督学习。
- 最后提出想将更大更深的神经网络应用到video上,因为video计算量非常大,且有时序信息(时序信息有很多能帮助你理解在空间的图片信息)。时序信息在现在来看发展也是比较慢的。
Figure and Table—重要的图和表
- 左侧图:八张ILSVRC-2010测试图像和我们的模型认为最可能的五个标签。正确的标签写在每张图片下面,分配给正确标签的概率也用红色条显示(如果恰好位于前5位)。
- 右侧图:第一列中有五幅ILSVRC-2010测试图像。剩下的列显示了在最后一个隐藏层中生成特征向量的六个训练图像,这些特征向量与测试图像的特征向量之间的欧氏距离最小(简单来说可以理解为倒数第二层提取出的特征向量最相似的几个图像,也就是说我们的神经网络在最后第二层输出的特征,在语义空间里面表现的非常好)。
下面两张表格是与之前最好的模型做的对比以及一些数据,这里不做详细解释了:
结构流程图非常重要,在第二遍阅读时再详细解释:
第二遍阅读:
Introduce—介绍
Introduce部分主要说了以下几点:
- 引出ImageNet这个数据集很大很好。
- 对于ImageNet这个很大的模型,我们采用CNN来作为我们的模型。
- 对于CNN计算成本高(容易overfitting+训练不动),我们利用GPU以及高度优化的2D卷积来实现CNN的训练。
- 主要贡献:我们训练了一个很大很好的模型,结果特别好。我们是怎么做的?用了一些不寻常的方法以及用了什么方法来避免过拟合,并且说明深度似乎很重要。
- 网络的大小受到了GPU的可用内存以及我们可容忍时间的影响,说了一下他们用的GPU。
The Dataset—数据集
- ImageNet数据集包含超过1500万张高分辨率图像的数据集,这些图像属于大约22000个类别。ILSVRC的比赛,ILSVRC使用ImageNet的一个子集,1000个类别中的每一个都有大约1000个图像。总共大约有120万张培训图像、50000张验证图像和150000张测试图像。
- 图像处理:ImageNet这个数据集不像其他数据集一样,它没有对数据进行裁剪。所以我们要先对数据集进行裁剪,裁剪为:256*256的尺寸大小。具体裁剪方法:先对原始图片进行缩放,将短边变成256的大小,另一个长边在这一步操作中也会根据长宽比进行调整,然后第二步从图片中心对长边进行两侧的裁剪,得到256*256的尺寸大小。
- 我们没有对图像进行任何的预先处理,比如抽取特征、抽取SIFT特征等等,我们实现了一个end to end 的方式,也就是说直接将原始图片(原始文本)输入到神经网络模型,他就能实现我们想要的功能。
The Architecture—网络结构
网络架构分为八个层,其中有五个卷积层和三个全连接层。下面每一小节都介绍了一些新颖的不同寻常的功能:
ReLU Nonlinearity—非线性激活函数ReLU
讲述了一下我们采用的激活函数是非线性的ReLU函数。这个非线性激活函数是不饱和的,但是训练速度要比饱和的非线性激活函数tanh和sigmoid要快的多。(但具体为什么快没具体说,现在的视角看来也没快多少,都差不多,但是ReLU函数要简单所以用的多)
下图的实线为采用ReLU的误差下降率,虚线则是tanh的下降率,明显ReLU下降起来要快得多。
Training on Multiple GPUs—用多个GPU训练
这一部分偏工程型,不用太注意这些细节,主要是说了图片太多我们无法在一个GPU上训练,所以把网络切开训练,之后的架构图中会说明怎么切的,切完之后用了两个GPU去训练。
Local Response Normalization——局部归一化
总结来说,在ReLU层之前我们应用了normalization得到了一个更好的效果。(注:这个现在看来不重要了,因为之后没人用过这种normalization技术,而且我们有了更好的normalization方法,下述方法也不用了,所以不重要)
首先说了ReLU虽然有一个性质是说不需要input normalization来避免饱和,但是用一下normalization效果会更好
下面复杂的公式可以忽略掉,但是这里我们也放上了:
Overlapping Pooling—重叠池化
采用了重叠pooling。
总结一些:一般来说两个pooling是不重叠的,但是这里采用了一种对传统的pooling改进的方式,效果很好。知道这些即可。
Overall Architecture—整体网络架构
上图为整体流程图,说明几点:
- 因为在两个GPU上运行,所以网络结构被一切为二,上下两部分各自训练各自的,各有各的参数核,结构都是一样的;
- 整个结构有八层,前五层为卷积层,后三层为全连接层,最后再跟一个1000路的分类激活函数softmax,相当于多个logistic回归来进行多元分类。
- 二、四、五层只与自己之前的核有关系,就是只与自己这个GPU前一层训练的输出有关系。第三层卷积层与前一层的两个GPU训练出来的都有关系,在通道维度上做了一个融合。全连接层就与前一层中所有神经元相连。
- 之前提到的Response-normalization应用在了第一层和第二层的卷积层。
- 上一节提到的Max—pooling应用在了有Response-normalization的层以及第五卷积层。
- 八层每一层都应用了ReLU函数。
- 这些层的顺序:Response-normalization放在ReLU之前,然后Max—pooling跟在ReLU之后。
- 规律:我们输入的图片从一个又高又宽又扁的一个形状,慢慢变为了一个宽和高都很小,但是很长的一个张量,这是说我们的空间信息被压缩了也就是从一开始的224变为了后面的13,也就是13中的一个像素能表示之后一大片像素。通道数变多也就是变长了,通道数可以理解为对于一个模式的识别,例如通道数为192那么说明可以识别图中192个模式,例如猫腿、爪子这种模式。所以说整个过程就是空间信息被压缩,但是语义信息空间慢慢增加。
总结:整个过程就是一张图片,经过模型处理变为了一个4096维的向量,这个向量可以把中间的语义信息表示出来。机器学习可以认为是一个压缩知识的过程;具体来讲就是我们原始的一个图片,文字或者视频输入到一个模型中,这个模型就会把它压缩为一个向量,这个向量机器可以识别,用来实现别的任务,例如分类等等。
Reducing Overfitting—减少过拟合
避免过拟合采用了两种方法:数据增强和dropout
Data Augmentation—数据增强
减少图像数据过度拟合的最简单也是最常见的方法是使用保留标签的变换人为地放大数据集。这里用了两种方式:
- 通过从256×256图像中随机提取224×224的图像,并在这些提取的图像上训练我们的网络来实现这一点。这将使我们的培训集的规模增加了2048倍。但是有个问题也不能说就是2048倍,因为很多图片都是相似的。
- 采用PCA的方式对RGB图像的channel进行了一些改变,使图像发生了一些变化,从而扩大了数据集。
Dropout—正则化
随机的将隐藏层的输出以50%的概率设为0,相当于一个L2的正则化,只不过用了这种方式实现了L2正则化的功能。
Details of learning—学习的细节
-
SGD:我们使用随机梯度下降法(SGD)训练我们的模型,批量大小为128,momentum为0.9(对传统SGD增加了动量这个观点,来解决传统SGD的一些问题,例如优化过程非常不平滑或者梯度下降很低效的时候),weight decay为0.0005(可以理解为是一个L2的正则化项,用在优化算法上而不是模型上)。我们发现,这种少量的weight decay对模型的学习很重要。换句话说,这里的weight decay不仅仅是一个正则化器:它减少了模型的训练误差。权重w的更新规则为
-
初始化参数:用均值为0 ,方差为0.01的高斯随机变量去初始化了权重参数(0.01是一个非常好的数,不大也不小,如果网络过大,例如BERT ,我们才用到0.02)。然后偏置bias也进行了初始化,不过这里不太重要,因为数据平衡的话初始为0最好,但是这里初始1效果更好一些,这个地方也没有继续深入研究。
-
学习率:我们在所有层上使用相同的学习率,设为0.01。但验证误差不降的时候我们就手动的乘以0.1,也就是降低十倍。也有自动的方法,例如Resnet,训练120轮epoch,初始学习率也是设为0.01,每30轮降低十倍,本文是训练了90个epoch,每一次是120w张图片。当然现在我们都不采用十倍十倍去降低了,我们采用更平滑的降低方式,例如利用cos函数去降低,如下图,蓝色线为本文中的降低方式,十倍十倍去降,红色线是我们现在用的,一开始学习率设的大一些,慢慢下降,这样更高效。
Results—实验结果
实验部分就知道效果就可以了,具体怎么实验的不用关心,除非你需要重复他的实验。
小知识:训练集、验证集、测试集。验证集就是说用来调参的数据集,可以一直用来调参,但是测试集就运行几次用来看这个模型的效果怎么样。
Qualitative Evaluations—定性评估
第一遍阅读时讲的图,不作详述了。
这里记录一点:就是说神经网络一直被人诟病的一个问题,不知道神经网络内部到底训练了一个什么东西,这里右边这个图展示出了最后4096维的向量,可以在一定程度证明神经网络内部的特征到底是一个什么东西。
总结:偏底层的神经元学习的是一些纹理、方向等;偏上的神经元则是学到的是全局点,例如一个手、一个头之类的。
第三遍阅读
再看一些第二遍未看懂的细节,例如激活函数的饱和和非饱和,这里不带着读第三遍了。