Machine Learning,  Programming

AlexNet

首先来看AlexNet的特点:

  • 更深的网络结构
  • 使用层叠的卷积层,即卷积层+卷积层+池化层来提取图像的特征
  • 使用Dropout抑制过拟合
  • 使用数据增强Data Augmentation抑制过拟合
  • 使用Relu替换之前的sigmoid作为激活函数
  • 多GPU训练

Relu作为激活函数

最初,sigmoid和tanh函数是最常用的激活函数

1.sigmoid

avatar

在网络层数较少时,sigmoid函数的特性能够很好的满足激活函数的作用:它把一个实数压缩至0到1之间,当输入的数字非常大的时候,结果会接近1;当输入非常大的负数时,则会得到接近0的结果。这种特性,能够很好的模拟神经元在受刺激后,是否被激活向后传递信息(输出为0,几乎不被激活;输出为1,完全被激活)

但是sigmoid有一个很大的问题就是梯度饱和。当输入的数字较大或较小时,其函数值趋于不变,导数变得越来越小,这样,在层数很多的网络结构中,进行反向传播时,由于很多个很小的sigmoid导数累乘,导致其结果趋于0,权值更新较慢

2.Relu

avatar

针对sigmoid梯度饱和导致训练收敛慢的问题,在AlexNet中引入了ReLU。ReLU是一个分段线性函数,小于等于0则输出为0;大于0的则恒等输出。相比于sigmoid,Relu有以下优点:

  • 计算开销下,sigmoid的正向传播有指数运算,倒数运算,而Relu是线性输出;反向传播中,sigmoid有指数运算,而Relu有输出的部分,导数始终为1
  • 梯度饱和问题
  • 稀疏性。Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生

注意到,Relu本质上是个线性的分段函数,是怎么进行非线性变换的呢?

这里把神经网络看着一个巨大的变换矩阵M,其输入为所有训练样本组成的矩阵A,输出为矩阵B

B = M * A

如果M是一个线性分换,则A进行了线性变换输出为B

那么对于ReLU来说,由于其是分段的,0的部分可以看着神经元没有激活,不同的神经元激活或者不激活,其神经玩过组成的变换矩阵是不一样的。 设有两个训练样本 a1,a2,其训练时神经网络组成的变换矩阵为M1,M2。 由于M1变换对应的神经网络中激活神经元和M2是不一样的,这样M1,M2实际上是两个不同的线性变换。也就是说,每个训练样本使用的线性变换矩阵Mi是不一样的,在整个训练样本空间来说,其经历的是非线性变换

简单来说,不同训练样本中的同样的特征,在经过神经网络学习时,流经的神经元是不一样的(激活函数值为0的神经元不会被激活)。这样,最终的输出实际上是输入样本的非线性变换。

单个训练样本是线性变换,但是每个训练样本的线性变换是不一样的,这样整个训练样本集来说,就是非线性的变换。

 

数据增强

神经网络由于训练的参数多,表能能力强,所以需要比较多的数据量,不然很容易过拟合。当训练数据有限时,可以通过一些变换从已有的训练数据集中生成一些新的数据,以快速地扩充训练数据。对于图像数据集来说,可以对图像进行一些形变操作:

  • 翻转
  • 随机裁剪
  • 平移,颜色光照的变换

AlexNet对数据做了以下操作:

1.随机裁剪,对256 * 256的图片进行随机裁剪到 227 * 227,然后进行水平翻转

2.测试的时候,对左上,右上,左下,右下,中间分别做了5次裁剪,然后翻转,共10个裁剪,之后对结果求平均

3.对RGB空间进行PCA,然后做一个(0,0.1)的高斯扰动,也就是对颜色,光照作变换,使错误率又下降了1%

 

层叠池化

在LeNet中池化是不重叠的,即池化的窗口的大小和步长是相等的,如下

avatar

在AlexNet中使用的池化(Pooling)却是可重叠的,也就是说,在池化的时候,每次移动的步长小于池化的窗口长度。AlexNet池化的大小为3×3的正方形,每次池化移动步长为2,这样就会出现重叠。重叠池化可以避免过拟合,这个策略贡献了0.3%的Top-5错误率。与非重叠方案s=2,z=2相比,输出的维度是相等的,并且能在一定程度上抑制过拟合

局部归一化

在神经生物学有一个概念叫做“侧抑制”(lateral inhibitio),指的是被激活的神经元抑制相邻神经元。归一化(normalization)的目的是“抑制”,局部归一化就是借鉴了“侧抑制”的思想来实现局部抑制,尤其当使用ReLU时这种“侧抑制”很管用,因为ReLU的响应结果是无界的(可以非常大),所以需要归一化。使用局部归一化的方案有助于增加泛化能力。 LRN的公式如下,核心思想就是利用临近的数据做归一化,这个策略贡献了1.2%的Top-5错误率。 avatar

Dropout

这个是比较常用的抑制过拟合的方法了。 引入Dropout主要是为了防止过拟合。在神经网络中Dropout通过修改神经网络本身结构来实现,对于某一层的神经元,通过定义的概率将神经元置为0,这个神经元就不参与前向和后向传播,就如同在网络中被删除了一样,同时保持输入层与输出层神经元的个数不变,然后按照神经网络的学习方法进行参数更新。在下一次迭代中,又重新随机删除一些神经元(置为0),直至训练结束。 Dropout应该算是AlexNet中一个很大的创新,现在神经网络中的必备结构之一。Dropout也可以看成是一种模型组合,每次生成的网络结构都不一样,通过组合多个模型的方式能够有效地减少过拟合,Dropout只需要两倍的训练时间即可实现模型组合(类似取平均)的效果,非常高效。 如下图:

avatar

多GPU训练

AlexNet当时使用了GTX580的GPU进行训练,由于单个GTX 580 GPU只有3GB内存,这限制了在其上训练的网络的最大规模,因此他们在每个GPU中放置一半核(或神经元),将网络分布在两个GPU上进行并行计算,大大加快了AlexNet的训练速度

逐层解析

 

avatar

avatar

AlexNet网络结构共有8层,前面5层是卷积层,后面3层是全连接层,最后一个全连接层的输出传递给一个1000路的softmax层,对应1000个类标签的分布。

由于AlexNet采用了两个GPU进行训练,因此,该网络结构图由上下两部分组成,一个GPU运行图上方的层,另一个运行图下方的层,两个GPU只在特定的层通信。例如第二、四、五层卷积层的核只和同一个GPU上的前一层的核特征图相连,第三层卷积层和第二层所有的核特征图相连接,全连接层中的神经元和前一层中的所有神经元相连接。

第一层(卷积层)

avatar

该层的处理流程为:卷积–>ReLU–>池化–>归一化,流程图如下:

avatar

  • 卷积 输入的原始图像大小为224×224×3(RGB图像),在训练时会经过预处理变为227×227×3。在本层使用96个11×11×3的卷积核进行卷积计算,生成新的像素。由于采用了两个GPU并行运算,因此,网络结构图中上下两部分分别承担了48个卷积核的运算。 卷积核沿图像按一定的步长往x轴方向、y轴方向移动计算卷积,然后生成新的特征图,其大小为:floor((img_size – filter_size)/stride) +1 = new_feture_size,其中floor表示向下取整,img_size为图像大小,filter_size为核大小,stride为步长,new_feture_size为卷积后的特征图大小,这个公式表示图像尺寸减去卷积核尺寸除以步长,再加上被减去的核大小像素对应生成的一个像素,结果就是卷积后特征图的大小。 AlexNet中本层的卷积移动步长是4个像素,卷积核经移动计算后生成的特征图大小为 (227-11)/4+1=55,即55×55。
  • Relu 卷积后的55×55像素层经过ReLU单元的处理,生成激活像素层,尺寸仍为2组55×55×48的像素层数据。
  • 池化 RuLU后的像素层再经过池化运算,池化运算的尺寸为3×3,步长为2,则池化后图像的尺寸为 (55-3)/2+1=27,即池化后像素的规模为27×27×96
  • 归一化 池化后的像素层再进行归一化处理,归一化运算的尺寸为5×5,归一化后的像素规模不变,仍为27×27×96,这96层像素层被分为两组,每组48个像素层,分别在一个独立的GPU上进行运算。

第二层(卷积层)

avatar

该层与第一层类似,处理流程为:卷积–>ReLU–>池化–>归一化,流程图如下:

avatar

  • 卷积 第二层的输入数据为第一层输出的27×27×96的像素层(被分成两组27×27×48的像素层放在两个不同GPU中进行运算),为方便后续处理,在这里每幅像素层的上下左右边缘都被填充了2个像素(填充0),即图像的大小变为 (27+2+2) ×(27+2+2)。第二层的卷积核大小为5×5,移动步长为1个像素,跟第一层第(1)点的计算公式一样,经卷积核计算后的像素层大小变为 (27+2+2-5)/1+1=27,即卷积后大小为27×27。 本层使用了256个5×5×48的卷积核,同样也是被分成两组,每组为128个,分给两个GPU进行卷积运算,结果生成两组27×27×128个卷积后的像素层。
  • ReLU 这些像素层经过ReLU单元的处理,生成激活像素层,尺寸仍为两组27×27×128的像素层。
  • 池化 再经过池化运算的处理,池化运算的尺寸为3×3,步长为2,池化后图像的尺寸为(57-3)/2+1=13,即池化后像素的规模为2组13×13×128的像素层
  • 归一化 然后再经归一化处理,归一化运算的尺度为5×5,归一化后的像素层的规模为2组13×13×128的像素层,分别由2个GPU进行运算。

第三层(卷积层)

avatar

第三层的处理流程为:卷积–>ReLU

avatar

  • 卷积 第三层输入数据为第二层输出的2组13×13×128的像素层,为便于后续处理,每幅像素层的上下左右边缘都填充1个像素,填充后变为 (13+1+1)×(13+1+1)×128,分布在两个GPU中进行运算。 这一层中每个GPU都有192个卷积核,每个卷积核的尺寸是3×3×256。因此,每个GPU中的卷积核都能对2组13×13×128的像素层的所有数据进行卷积运算。如该层的结构图所示,两个GPU有通过交叉的虚线连接,也就是说每个GPU要处理来自前一层的所有GPU的输入。 本层卷积的步长是1个像素,经过卷积运算后的尺寸为 (13+1+1-3)/1+1=13,即每个GPU中共13×13×192个卷积核,2个GPU中共有13×13×384个卷积后的像素层。
  • ReLU 卷积后的像素层经过ReLU单元的处理,生成激活像素层,尺寸仍为2组13×13×192的像素层,分配给两组GPU处理。

第四层(卷积层)

avatar

与第三层类似,第四层的处理流程为:卷积–>ReLU

avatar

  • 卷积 第四层输入数据为第三层输出的2组13×13×192的像素层,类似于第三层,为便于后续处理,每幅像素层的上下左右边缘都填充1个像素,填充后的尺寸变为 (13+1+1)×(13+1+1)×192,分布在两个GPU中进行运算。 这一层中每个GPU都有192个卷积核,每个卷积核的尺寸是3×3×192(与第三层不同,第四层的GPU之间没有虚线连接,也即GPU之间没有通信)。卷积的移动步长是1个像素,经卷积运算后的尺寸为 (13+1+1-3)/1+1=13,每个GPU中有13×13×192个卷积核,2个GPU卷积后生成13×13×384的像素层。
  • ReLU 卷积后的像素层经过ReLU单元处理,生成激活像素层,尺寸仍为2组13×13×192像素层,分配给两个GPU处理。

第五层(卷积层)

avatar

第五层的处理流程为:卷积–>ReLU–>池化

avatar

  • 卷积 第五层输入数据为第四层输出的2组13×13×192的像素层,为便于后续处理,每幅像素层的上下左右边缘都填充1个像素,填充后的尺寸变为 (13+1+1)×(13+1+1) ,2组像素层数据被送至2个不同的GPU中进行运算。 这一层中每个GPU都有128个卷积核,每个卷积核的尺寸是3×3×192,卷积的步长是1个像素,经卷积后的尺寸为 (13+1+1-3)/1+1=13,每个GPU中有13×13×128个卷积核,2个GPU卷积后生成13×13×256的像素层。
  • ReLU 卷积后的像素层经过ReLU单元处理,生成激活像素层,尺寸仍为2组13×13×128像素层,由两个GPU分别处理。
  • 池化 2组13×13×128像素层分别在2个不同GPU中进行池化运算处理,池化运算的尺寸为3×3,步长为2,池化后图像的尺寸为 (13-3)/2+1=6,即池化后像素的规模为两组6×6×128的像素层数据,共有6×6×256的像素层数据。

第六层(全连接层)

avatar

第六层的处理流程为:卷积(全连接)–>ReLU–>Dropout

avatar

  • 卷积(全连接) 第六层输入数据是第五层的输出,尺寸为6×6×256。本层共有4096个卷积核,每个卷积核的尺寸为6×6×256,由于卷积核的尺寸刚好与待处理特征图(输入)的尺寸相同,即卷积核中的每个系数只与特征图(输入)尺寸的一个像素值相乘,一一对应,因此,该层被称为全连接层。由于卷积核与特征图的尺寸相同,卷积运算后只有一个值,因此,卷积后的像素层尺寸为4096×1×1,即有4096个神经元
  • ReLU 这4096个运算结果通过ReLU激活函数生成4096个值。
  • Dropout 然后再通过Dropout运算,输出4096个结果值。

第七层(全连接层)

avatar

第七层的处理流程为:全连接–>ReLU–>Dropout

avatar

第六层输出的4096个数据与第七层的4096个神经元进行全连接,然后经ReLU进行处理后生成4096个数据,再经过Dropout处理后输出4096个数据

第八层(全连接)

avatar

第七层输出的4096个数据与第八层的1000个神经元进行全连接,经过训练后输出1000个float型的值,这就是预测结果

avatar

avatar

发表评论

电子邮件地址不会被公开。 必填项已用*标注