深度学习经典卷积神经网络之AlexNet

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/marsjhao/article/details/72953256

论文地址:http://papers.nips.cc/paper/4824-imagenet-classification-with-deep-convolutional-neural-networks.pdf

中文翻译:http://blog.csdn.net/liumaolincycle/article/details/50496499

1. 网络结构

2012年,Hinton的学生AlexKrizhevsky提出了深度卷积神经网络模型,可以算是LeNet的一种更深更宽的版本,其获得了2012年ILSVRC比赛分类项目的冠军,top-5错误率16.4%,使用额外数据可达到15.3%。AlexNet包含了八个学习层——5个卷积层和3个全连接层。

1.1 修正线性单元ReLU

相对于饱和非线性函数如tanh和sigmoid函数,不饱和非线性函数f(x)=max(0,x)在梯度训练时间上表现要快得多,称这种不饱和非线性的神经元为修正线性单元ReLU。训练带ReLUs的深度卷积神经网络比带tanh单元的同等网络要快好几倍。

如图,对于特定的4层卷积网络,在CIFAR-10数据集上达到25%训练误差多需要的迭代次数显示。带ReLU网络比带tanh网络快六倍。

另外,使用ReLU作为CNN的激活函数,在较深的网络中成功解决了sigmoid在较深网络中的梯度弥散问题。

1.2 在多个GPU上训练

通过多个GPU加速训练过程,跨GPU并行化时,GPU之间的读写通信不需要通过主机内存。同时,AlexNet的设计让GPU之间的通信只在网络的某些层进行,控制了通信的性能损耗。

1.3 局部响应归一化层

局部响应归一化层,LocalResponse Normalization(LRN)。

表示点(x,y)处通过应用核计算出的神经元激活度,然后应用ReLU非线性,响应归一化活性由下式给出 

其中求和覆盖了n个“相邻的”位于相同空间位置的核映射,N是该层中的核总数。核映射的顺序当然是任意的,且在训练开始前就确定。受到在真实神经元中发现的类型启发,这种响应归一化实现了一种侧向抑制,在使用不同核计算神经元输出的过程中创造对大激活度的竞争,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。常数k,n,α和β是超参数,它们的值要用验证集来确定;我们使用。我们在某些层应用ReLU归一化后再应用这种归一化。

1.4 重叠的最大池化

此前的CNN普遍使用平均池化,AlexNet全部使用最大池化,避免了平均池化的模糊化效果,并且AlexNet提出步长比池化层的尺寸小,池化层的输出之间就会有重叠和覆盖,提升了特征的丰富性。

2. 减少过拟合

2.1 数据增强 Data Augmentation

减少数据图像过拟合最简单最常用的方法,是使用标签保留转换(label-preserving transformations),人为地扩大数据集。这里采用了两种方法,随机裁取和水平镜像翻转,即随机地从256*256的原始图像中截取224*224大小的区域及它们的水平翻转镜像,相当于增加了2*(256-224)^2=2048倍的数据量,且由此产生的扩充训练集一定是高度相互依赖的。如果没有数据增强,参数众多的CNN会陷入严重的过拟合中,采用了数据增强后,大大减轻了过拟合,增强了模型的泛化能力。

在模型预测的时候,对图片的四个角加中心位置共5个位置并进行水平镜像翻转得到10张图片,对他们进行10次预测后求平均值。

论文中还提到了会对图像的RGB数据进行PCA处理,并对主成分做一个标准差为0.1的高斯扰动,增加一些噪声。这个Trick可以让错误率再下降1%。

2.2 Dropout

一种非常有效的模型组合版本,起到多模型组合预测的作用,且在训练中只花费两倍于单模型的时间。Dropout技术做的就是以0.5的概率将每个隐层神经元的输出设置为0,即随机忽略一部分神经元,以避免模型过拟合。在AlexNet结构中,对前两个全连接层使用Dropout,若没有Dropout我们的网络会表现出大量的过拟合,Dropout使收敛所需的迭代次数大致增加了一倍。

3. 整体结构

如图所示,AlexNet包括了8个参数层(不包括池化层和LRN层),5层卷积层和3层全连接层,最后一个全连接层的输出送到一个1000-way的Softmax层,产生一个覆盖1000类标签的分布。

LRN层出现在第1个及第2个卷积层后,最大池化层(3*3,步长为2)出现在2个LRN层及最后一个卷积层后。ReLU激活函数应用在这8层每一层后面。

CNN体系结构示意图,明确显示了两个GPU之间的职责划分。一个GPU运行图中顶部的层次部分,而另一个GPU运行图中底部的层次部分。GPU之间仅在某些层互相通信。该网络的输入是150,528维的,且该网络剩下各层的神经元数分别为253,440–186,624–64,896–64,896–43,264–4096–4096–1000。


第一个卷积层利用96个大小为11×11×3、步长为4个像素(这是同一核映射中邻近神经元的感受野中心之间的距离)的核,来对大小为224×224×3的输入图像进行滤波。第二个卷积层需要将第一个卷积层的(响应归一化及池化之后的)输出作为自己的输入,且利用256个大小为5×5×48的核对其进行滤波。第三、第四和第五个卷积层彼此相连,没有任何介于中间的pooling层与归一化层。第三个卷积层有384个大小为3×3×256的核被连接到第二个卷积层的(归一化的、池化的)输出。第四个卷积层拥有384个大小为3×3×192的核,第五个卷积层拥有256个大小为3×3×192的核。全连接层都各有4096个神经元。

4. 学习过程

我们使用随机梯度下降法和一批大小为128、动力为0.9、权重衰减为0.0005的样例来训练我们的网络。我们发现,这少量的权重衰减对于模型学习是重要的。换句话说,这里的权重衰减不仅仅是一个正则化矩阵:它减少了模型的训练误差。对于权重w的更新规则为 

其中i是迭代指数,v是动力变量,ε是学习率,是目标关于w、对 wi求值的导数在第i批样例 Di上的平均值。

我们用一个均值为0、标准差为0.01的高斯分布初始化了每一层的权重。用常数1初始化了第二、第四和第五个卷积层以及全连接隐层的神经元偏差。该初始化通过提供带正输入的ReLU来加速学习的初级阶段。在其余层用常数0初始化神经元偏差。

我们对于所有层都使用了相等的学习率,这是在整个训练过程中手动调整的。遵循的启发式是,当验证误差率在当前学习率下不再提高时,就将学习率除以10。学习率初始化为0.01,在终止前降低三次。训练该网络时大致将这120万张图像的训练集循环了90次,在两个NVIDIA GTX 580 3GB GPU上花了五到六天。

阅读更多

没有更多推荐了,返回首页