您的位置:首页 > 运维架构

AlexNet : ImageNet Classification with Deep Convolutional Neural Networks

2017-11-24 17:13 309 查看
1.摘要

       2010年ImageNet LSVRC -2010竞赛中,AlexNet用来在1.2millon高分辨率图片上辨别1000个类别,并取得了top1,top5错误率为37.5%和17%。取得了当前的最高水平。该网络使用了60millon参数和650000个神经元,包含5个卷积层 ,3个全连接层。为了使训练更加快速,我们使用了非饱和神经元和两个GPU进行运算。为了减少过拟合,文中首次提出了dropout正则化方法。在ILSVRC2012年的比赛中,我们的top5错误率达到了15.3%,远低于第二名的26.3%。

2.数据集:

      ImageNet数据集包括15millon张高分辨率图片,22000个类别,ILSVRC 使用ImageNet数据集中1000个类别,且每个类别大约1000张图片。因此,大约有1.2millon训练图片,50000张验证集,150000张测试集。ILLSVRC-2010是ILSVRC系列比赛中唯一一个提供测试集的,因此我们在2010的比赛中取得了最好的效果。

     实验中,我们会经常使用top1,top5错误率,top5错误率是对一个图片类别预测的前五个类别不包含正确的比例.

     ImageNet中包含不同分辨率的图片,但是我们的系统需要输入统一的尺寸。所以,我们采用下采样得到固定大小256*256大小的图片。下采样的方法是:我们首先重新缩放图像,使得短边长度为256,然后从得到的图像中裁剪出中央256×256的一片,除了遍历训练集从每个像素中减去平均活跃度外,我们没有以任何其他方式预处理图像。所以我们用这些像素(中央那一片的)原始RGB值训练网络。(这里也就是对图像的每个像素进行中心化处理,即对每个图像对应像素的R,G,B三个值分别求均值,然后每个图像的每个像素的R值-R平均,G值-G平均,B值-B平均)

3.结构

   AlexNet包括5个卷积层,3个全连接层

3.1Relu不饱和非线性激活函数

      3.1.1为什么我们要引入激活函数?

       如果不用激励函数(其实相当于激励函数是f(x) = x),在这种情况下你每一层输出都是上层输入的线性函数,很容易验证,无论你神经网络有多少层,输出都是输入的线性组合,与没有隐藏层效果相当,这种情况就是最原始的感知机(Perceptron)了。非线性激活函数的作用就是增加神经网络非线性特性,进而增加其表示能力。

       3.1.2为什么要使用relu(不饱和非线性激活函数)?而使用sigmoid,tanh?

       sigmoid神经元有一个不好的特性,就是当神经元的激活在接近0或1处时会饱和:在这些区域,梯度几乎为0。回忆一下,在反向传播的时候,这个(局部)梯度将会与整个损失函数关于该门单元输出的梯度相乘。因此,如果局部梯度非常小,那么相乘的结果也会接近零,这会有效地“杀死”梯度,几乎就有没有信号通过神经元传到权重再到数据了。还有,为了防止饱和,必须对于权重矩阵初始化特别留意。比如,如果初始化权重过大,那么大多数神经元将会饱和,导致网络就几乎不学习了。

       而ReLU线性部分能很好的传播梯度,不会产生梯度消失问题。ReLu只有负值才会被稀疏掉,即引入的稀疏性是可以训练调节的,是动态变化的,且减少了参数的相互依存关系,缓解了过拟合问题的发生。

      3.1.3生物神经的稀疏激活性

     在神经科学方面,除了新的激活频率函数之外,神经科学家还发现了神经元的稀疏激活性。

     还是2001年,Attwell等人基于大脑能量消耗的观察学习上,推测神经元编码工作方式具有稀疏性和分布性。

     2003年Lennie等人估测大脑同时被激活的神经元只有1~4%,进一步表明神经元工作的稀疏性。

     从信号方面来看,即神经元同时只对输入信号的少部分选择性响应,大量信号被刻意的屏蔽了,这样可以提高学习的精度,更好更快地提取稀疏特征。

     从这个角度来看,在经验规则的初始化W之后,传统的Sigmoid系函数同时近乎有一半的神经元被激活,这不符合神经科学的研究,而且会给深度网络训练带来巨大问题。

     因而, 校正函数max(0,x)成了近似符合该模型的最大赢家。

     3.1.4 这种稀疏性有何作用?

      换句话说,我们为什么需要让神经元稀疏?不妨举个例子来说明。当看名侦探柯南的时候,我们可以根据故事情节进行思考和推理,这时用到的是我们的大脑左半球;而当看蒙面唱将时,我们可以跟着歌手一起哼唱,这时用到的则是我们的右半球。左半球侧重理性思维,而右半球侧重感性思维。也就是说,当我们在进行运算或者欣赏时,都会有一部分神经元处于激活或是抑制状态,可以说是各司其职。再比如,生病了去医院看病,检查报告里面上百项指标,但跟病情相关的通常只有那么几个。与之类似,当训练一个深度分类模型的时候,和目标相关的特征往往也就那么几个,因此通过ReLU实现稀疏后的模型能够更好地挖掘相关特征,拟合训练数据。

  

 综上:我们引入relu非线性激活函数有两个原因:

    1.采用sigmoid等函数,算激活函数时(指数运算),计算量大,反向传播求误差梯度时,求导涉及除法,计算量相对大,而采用Relu激活函数,整个过程的计算量节省很多。

    2.ReLU由于非负区间的梯度为常数,因此不存在梯度消失问题(Vanishing Gradient Problem),使得模型的收敛速度维持在一个稳定状态

    3.Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,ReLU实现稀疏后的模型能够更好地挖掘相关特征,拟合训练数据

3.2在两个GPU上训练

       受当时的条件限制,AlexNet采用2个GTX 580 GPU(3G memory)进行训练,我们采用的方案基本上是在每个GPU中放置一半核(或神经元),GPU间的通讯只在某些层进行,例如,第3层的核需要从第2层中所有核映射输入。然而,第4层的核只需要从第3层中位于同一GPU的那些核映射输入,但其实在现有的条件下,使用单个GPU就可以运算,因此,在这里我们就不必过多讨论。

3.3Local Response Normalization(局部响应归一化):

     3.3.1什么叫做鲁棒性:

      鲁棒性我认为指的是对个别异常点的反应不敏感,即个别异常点对分类器设计(神经网络的连接权)的影响不大。

      这个方法源自生物学的“侧抑制”。就是指被激活的神经元会抑制相邻神经元。归一化的目的就是抑制。特别是对于Relu函数的抑制作用特别大。用在卷积层(卷积后再激活)之后,因为激活函数是一个非线性变换,会影响数据的分布,激活函数改变了数据分布,就需要进行归一化。

      LRN处理类似于生物神经元的横向抑制机制,可以理解为将局部响应最大的再放大,并抑制其他响应较小的(我的理解这是放大局部显著特征,作用还是提高鲁棒性)

   

     此处论文中给的公式为:
   


 

表示第i个核在位置(x,y)运用Relu非线性神经元的输出,n是同一个位置上临近位置kernel map的数目,N是kernel总数,

         k是偏置,

是放缩比例(因为不一定所有的数据本身的分布都是以0为中心的,如果强制归一化就会出问题,所以稍微增加一点偏移和放缩)

          举个例子:i=10,N=96(经过卷积与激活之后信道的维度),n=4表示第i=10个卷积核在位置x,y处输出为a,用a/第8/9/10/11/12在位置x,y处提取到的特征之和

   如下图:下面是一批卷积(包括激活)后的特征图,红点是正在归一化的点,该点值等于与其他相邻的特征图上的对应位置的点(蓝点)归一化后的输出值

     


   通常使用 k = 2,n= 5,α=
10-4, andβ= 0:75

   响应归一化将我们的top-1与top-5误差率分别减少了1.4%与1.2%

不妨我们举个极端的例子,即当

很大时, 当a10很大时,a9很小,n=N-1,则a9,a10都除以所有的激活值,很显然,a9很小,a10较大,除以相同的值,a9变小很多,a10并没有比a9小的那么多

3.4重叠pooling

    AlexNet采用的步长s小于池化核的大小,这样池化层的输出之间会有重叠和覆盖,提升了特征的丰富性

3.5总体结构

  我这里介绍的是采用单个GPU进行训练的,因为现有的条件已经可以实现

    conv1:输入-卷积-relu-LRN-max pooling

    conv2:conv-relu-LRN-max pooling

    conv3:conv-relu

    conv4:conv-relu

    conv5:conv-relu-max pooling

    fc1:Fc-relu-dropout

    fc2:Fc-relu-dropout

    fc3:softmax
下面是论文中的图,采用的是两个GPU

  


我们现实中实现的是下面的图



4.减少过拟合

AlexNet网络有60millon参数,因此过拟合问题是我们急需考虑的,下面提供两种方式来减少过拟合

此处我先解释一下什么叫过拟合:

  当学习器把训练样本学的太好了,很可能把训练样本身的一些特点当成所有潜在样本都具有的一些性质,这样会导致泛化性能下降,这种现象就是过拟合

       例如: 当用训练器去识别树叶时,它把树叶具有锯齿特征也学了下来,而认为没有锯齿的都不是树叶,这就是学的太好了,导致不能适用于所有的样本

当使用过多参数的时候,以至于太适应当前情况,而不适用于一般情况,也就是不能很好的预测未来。

4.1增加数据

最常见的解决过拟合的方法是人工增大数据集,我们使用两种方式来增加数据集。

        第一种由图片转化和水平翻转实现,我们从256*256中抽出224*224图片,并进行反转,得到(256-224)*(256-224)*2=2048,因此数据集扩大了2048倍,但是由此产生的数据有一定的相互依赖性。

  第二种是改变训练图片中rgb通道的强度,我们在遍历ImageNet训练集的RGB像素值集合中使用PCA?

 此处使用PCA达到降维的目的,具体分析看http://blog.codinglabs.org/articles/pca-tutorial.html

4.2dropout正则化

       首先解释什么是dropout: dropout会遍历神经网络的每一层,并设置消除神经网络节点的概率,假设,神经网络的每一层的每一个节点都以抛硬币的方式设置概率,每个节点得以消除和保留的概率都是0.5,设置完节点概率,我们会消除一些节点,然后删掉从该节点近处的连线,最后得到一个节点更少,规模更小的网络,然后用反向传播进行训练,右边就是网络节点精简后的一个样本,对于每一个样本,我们都采用精简后的神经网络来训练它.因此使用dropout随机忽略神经元减少过拟合。

      dropout在全连接层使用,为什么dropout会可以减少过拟合?

     通过dropout,该单元的输入神经与几乎被消除,因此,输出不能依靠任何一个特征,因为该单元的任何一个输入都有可能被随机清除,我不愿意把所有的赌注都放在一个节点上,不愿意给任何一个输入加入太多的权重,因为它有可能被删除,因此该神经网络将以这种方式传播,并为每个单元的四个输入增加一点权重,通过传播所有权重,dropout会产生收缩权重的平方范数的效果,和L2范式类似,dropout的结果是它会压缩权重,并完成一些预防过拟合的外层正则化,为了防止过拟合,当某一层的节点数过多(更容易过拟合),设置keep-prob较低,对于最后一层,keep-prob=1,意味着保留其所有的节点现实中,我们对输入层不用dropout。

5.使用momentum 梯度下降法进行训练

  momentum梯度下降法的运行速度几乎快于普通的梯度下降算法,其基本思想时计算梯度的指数加权平均,那么什么叫做指数的加权平均?点击
http://blog.csdn.net/liyinhua123456/article/details/78625764 并利用该梯度更新权重。使用梯度的指数加权平均,可以减少纵轴的幅度,而不改变横轴的幅度,使得损失函数尽快降到最小,尽快得到最优的模型,之前的普通的标准的梯度下降法就类似与人喝醉酒了一样,当他站在山顶,往下走的时候,经常出现摇摇晃晃,偏离正确的路线很远,因此,到达山底的速度也会很慢。而momentum梯度下降,就类似于一个石头从山顶滚下,很少出现左右摇晃,即使摇晃,幅度也很小,因此能很快到达山底。这样也就形象的表示了momentum与普通的梯度下降法的区别了。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐