经典论文之AlexNet

经典论文之AlexNet

Reference::Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.

基本信息

简介:AlexNet参加了2012年9月30日举行的ImageNet大规模视觉识别挑战赛,达到最低的15.3%的Top-5错误率,比第二名低10.8个百分点。原论文的主要结论是,模型的深度对于提高性能至关重要,AlexNet的计算成本很高,但因在训练过程中使用了图形处理器(GPU)而使得计算具有可行性(Wikipedia)。AlexNet的出现标志着深度学习正式进入现代图像处理的视野。

贡献:最重要的是训练了ALexNet,取得当时的SOTA,这个很了不起,应该是当时最大的网络了(这得益于imageNet,不然早就GG了),其他的这篇论文还专门设计了针对GPU的优化,采用Relu等等

几个Tricks

利用GPU加速计算

采用两个GPU(GTX 580 3GB)并行计算,突然想哭,我现在还是用自己的950M在计算。。。在原始的AlexNet的设计中也是采用了两个GPU并行计算的策略,将架构分路设计,并在部分地方(第二层和第三层)进行GPU数据交流(具体操作会在下文中提到),Alex在原文中提到:

This scheme reduces our top-1 and top-5 error rates by 1.7% and 1.2%, respectively, as compared with a net with half as many kernels in each convolutional layer trained on one GPU.

然后由于条件限制,很多时候在初学阶段的implementation大多都忽略了这一点。。。

池化方案

Alex首次提出池化步长的概念,前面介绍LeNet-5的时候说过LeNet的池化方案是没有重叠的,也就是没有步长的概念,Alex提出了池化的步长概念,池化核大小3×3,步长为2,按他老人家的话说也是降低了错误率,也降低了过拟合。。。

数据增强

增加数据量是众所周知避免过拟合最简单粗暴的办法(虽然大多时候简单不代表成本低)。Alex采用如下两种方案进行数据增强:
第一种:由于ImageNet本身图像大小为256×256×3,Alex将图像按224×224×3进行横向移动,就像卷积那样,同时将数据进行水平翻转,所以数据集就增大为原来的(256-224)× (256-224)× 2 = 2048,虽然这样多生成的图片之间具有高度依赖,但是总比过拟合好吧。再测试的时候就直接选取四个边角和中心的图片以及他们翻转后的图片求均值作为概率。

第二种:改变图像RGB通道颜色值,因为改变照明的强度和颜色不会改变对象的身份。首先用PCA对imageNet图像RGB数据进行分析(个人觉得这种方案有点得不偿失。虽然Alex说明了数据增强是在CPU上进行的,但是CPU真的等于Computationally Free?)。对于每一张训练图片,它们的大小比例是相应的特征值乘以一个随机值(来自均值为0,标准差为0.1的高斯分布),只针对特定图像生成一次,直到该图像下一次再用于训练的时候再重新生成。那么增加多少呢:,其中是3×3的RGB像素值的协方差矩阵中第 i个特征向量,是3×3的RGB像素值的协方差矩阵中第i个特征值。(其实这里我没咋看懂)

Dropout

在AlexNet中两大用于减少过拟合的技术之一——dropout,Dropout会随机挑选全连接层一些节点在BP过程中失活(Alex设定失活概率为0.5),这也就相当于我们在训练很多个权重共享的不同网络。如果是测试过程中则将每个节点的输出×0.5

激活函数

激活函数经历了从最开始的sigmoid->tanh->Relu->Leaky Relu->Maxout,AlexNet中选用了Relu激活,下面从这几个函数谈谈:

sigmoid的函数表达式,其函数图像如下:

center

由图可以看出,Sigmoid函数的值域为[0, 1],这就非常符合概率0-1的特性,这也是早起sigmoid受欢迎的原因。函数在0处的梯度最大。但是在和的梯度基本上接近于0,这对于梯度更新来说就是一个问题了,技术上把这种问题成为gradient vanish,这样会导致梯度更新亨曼,或者是直接不更新。第二,我们发现sigmoid的输出不是zero-centered,我们上文讲过不是zero-center的话回降低gradient decent的速度!同时,由于计算机本身对于


tanh的函数表达式,函数图像如下:

center

咋一看tanh和sigmoid没什么差别,凑近点发现tanh的梯度还是比sigmoi 还是要大得多。同时tanh解决了zero-centered的问题。但是也没有解决gradient vanish的问题


然后就是本文的Relu出现了,relu的全称叫做Rectified Linear Unit,其表达式为,这个线性袖中单元的函数图像如下:

center

映入眼帘的Relu一看就没有解决zero-centered的问题,但是当时,函数导数就是1,整个函数的收敛效果还是很不错的。然鹅,问题在于当时这个怎么肥四,考虑一种情况,当变量w的分布中心时0.01(反正就是和0很接近),刚开始一切正常,然后在某次较大的梯度流过的过程中(可能是当时梯度的确很大,也可能是learning rate设置过大)使得w的分布中心变成了-0.1,问题来了,Loss对于w的梯度变为0,而且以后永远就为0了???喵喵喵,这个单元就死掉了,这个在技术上称为Dead Relu,Relu的死亡是一种不可逆的过程,这是Relu面临的比较大的问题(听说现在有人提出了方法,貌似可以式Dead Relu再次起死回生,等我去了解一下,到时候写一篇文章)

为了解决传统Relu的Dead问题,后来又提出了Leaky Relu:,大致图像如下,解决方案一看便知:

center

直接给部分添加一个梯度,能够更新就行。


至于这个Maxout,这个是一种新型的激活函数,这个我们后面会单独拿出一篇文章来讲这个,它的拟合能力很强,可以拟合任意凸函数。

Normalization

前一篇博客我们提到了几种常规的normalization方案,在原生AlexNet中使用了一种叫做局部响应归一化(Local Response Normalization, LRN),借这个机会我们聊一聊这几种特殊的归一化。

Local Response Normalization(LRN)的原理很简单,计算公式如下:

这一层里没有任何需要训练的参数,但是需要设定四个参数,就是上面那个,其中n为邻域深度,是根据验证集设定的超参。LRN其实就是针对一个样本深度进行归一化,知乎有一个文章写的很好,链接微信貌似放不出来:/zhuanlan.zhihu.com/p/87117010,懂的人可以康康。

Batch Normalization(BN)是后来提出的一种新的归一化方案,也基本上替代了LRN,你看到这个Batch,能不能下意识想到mini-batch,对就是他!原本的LRN是针对单个样本做Normalization,但是Batch Normalization是针对整个样本进行归一化,具体操作是先计算一个batch所有等位像素点的均值和方差,将每个像素值减去均值除以方差(这里还可以增加两个可训练参数和,用法见下),就得到最终结果。公式如下:

然后进行归一化:

既然有了归一化的操作,那么为什么要做归一化?LRN归一化的作用AlexNet的解释为:这个想法来源于生物神经网络的横向抑制(lateral inhibition),就是兴奋的神经细胞会抑制周围神经细胞,我其实一直都不太敢苟同深度学习这个“仿生”,效果不错,至于原因就仁者见仁了吧。至于BN,BN在一定程度上减少了Internal Covariant Shift,Covariant Shift是因为输入的每一个batch的分布不同,导致收敛速度振荡,这个是针对输入数据而言的。Internal Covariant Shift是针对内部节点出现的Covariant Shift,所以叫做Internal Covariant Shift。将每一层的输入都进行0-1归一化。

Architecture

不多说,先看图:


center

通过图像很容易看到我们前面提到的Alex的GPU分路策略,并且第二、四、五的卷积都是采用当前GPU的前一次输出作为输入,第三层不一样,采用了两个GPU所有的特征图作为输入,全连接也是采用所有GPU的输入。AlexNet的结构如下(我自己没有按照GPU分路的设计来implement,但我觉得问题不大):

第一层输入大小为224×224×3(这里有问题,可以清楚看到上图中的输入大小是224×224×3,图来自原论文,但是明显224算出来不对,所以有人说是Alex用了2个padding,也有人说是Alex写错了,应该是227×227×3,我更倾向于前一种),然后采用96个11×11×3的卷积核,以步长为4,0padding,卷积后的图像大小为55×55×96,然后做LRN和池化,池化层采用3×3,步长为2做最大池化。

第二层输入大小27×27×96,采用256个5×5×48的卷积核,以步长为1,2padding(原文没提,根据后文推算的),卷积后的图像大小为27×27×256,然后做LRN和最大池化,池化层采用3×3,步长为2做最大池化。

第三层输入大小13×13×256,采用384个3×3×256的卷积核,以步长为1,1padding,卷积后的图像大小为13×13×384;第四层输入大小13×13×384,采用384个3×3×256的卷积核,以步长为1,1padding,卷积后的图像大小为13×13×384;第五层输入大小13×13×384,采用256个3×3×384的卷积核,以步长为1,1padding,卷积后的图像大小为13×13×256,再做了一次最大池化,变成6×6×256的特征图。

然后输入一个有4096个神经元节点带Dropout的全连接,再输入一个有4096个神经元节点带Dropout的全连接,再输入一个有1000个节点的全连接作为输出。

整个网络在SGD下,以Batch size为128,learning rate为0.01递减,weight decay 为 0.0005,momentum为0.9,90个epoch,120万张图,以0均值,0.01方差高斯分布初始化权重,第二、四、五层偏置初始化为1,其他层设置为0.

后记

由于笔者本身能力有限,文章内容和文字可能出现一些错误,欢迎各位批评指正,共同讨论,共同学习。硬核引流:欢迎大家推广关注我的公众号啊!!!


center

你可能感兴趣的:(经典论文之AlexNet)