AlexNet学习笔记

时间:2024-03-16 20:05:16

1 概述

      AlexNet 是 Alex 等人在 2012 年提出的经典深度神经网络模型,该模型在 ImageNet ILSVRC-2010 测试数据上的 top-1[注解1] 和 top-5[注解2] 错误率分别为 37.5% 和 17.0%,是当年 ImageNet 的最好成绩。该网络含有 6000 万个参数、650,000 个神经元,包括五个卷积层 (其中第一、二、五个卷积层后接了最大池化层) 和三个全连接层 (其中最后一层是 1000 路的Softmax) 。作者使用两个 GPUs 训练该模型,并使用了 ReLU 替代了传统的饱和线性函数(如 tanh 和 Sigmoid );同时,为了减小过拟合,作者在全连接层 (fc6 和 fc7)使用了 dropout。AlexNet 论文的主要贡献如下:

  1. 在 ILSVRC-2010 和 ILSVRC-2012 比赛用到的 ImageNet 子集上训练了一个当时最大的卷积神经网络,并取得了当时基于这些数据集的最好的结果;(ILSVRC:ImageNet 大尺度视觉识别挑战)
  2. 编写了一个高度优化的二维卷积的 GPU 实现,并随着训练卷积神经网络的所有其他固有操作一并开源。

2 数据集

      ImageNet 上图片的像素并不都相等,而 AlexNet 的输入层的大小是固定的,因此作者将这些图片下采样为固定的 256×256 像素。给定一幅矩形图,首先将图片短边的长度调整到 256,然后从*裁剪出 256×256 的区域。作者对图像做了唯一 一个预处理,即将图像 (包括训练集和测试集) 减去训练集图像的像素均值。

3 网络结构

      AlexNet 包含 8 个学习层,包括 5 个卷积层和 3 个全连接层,其结构如下图 3.1 所示。


AlexNet学习笔记
图 3.1 AlexNet 网络结构图

3.1 ReLU 非线性函数

      作者认为 AlexNet 中最重要的单元就是 ReLU 非线性函数。通常模型会使用 tanh 和 Sigmoid 等函数作为**函数,但是,就使用梯度下降进行模型训练的时间而言,使用这些饱和的非线性函数模型的训练时间要比使用非饱和线性函数要长。通常,使用 ReLU 的深度卷积神经网络的训练速度要比同样情况下使用 tanh单元的速度要快上好几倍。AlexNet 使用 ReLU 的目的就是加速模型对训练集的拟合速度,而快速学习对于在大规模数据集上训练的大型模型的性能来说有很大的影响。

3.2 多GPU训练

      作者训练模型时使用的GPU的型号是 GTX 580,该 GPU 只有 3 G 的内存,从而限制了在其之上能够训练的网络的最大规模。为了突破该限制,作者使用两个 GPU 并行进行模型的训练,并行策略的本质就是在每个 GPU 上放一半的核 (或者神经元) 。此外,作者还使用了一个小技巧:GPU 只在特定的层之间通信。例如,第三个卷积层的输入为第二个卷积层的左右特征图,但是第四个卷积层的输入仅仅是同一个 GPU 上的第三个卷积层的输出。作者通过交叉验证选择网络的连接模式,从而实现通信单元数量的精确调整。

3.3 局部响应归一化

      经典的 AlexNet 还用到了 LRN(Local Response Normalization,局部响应归一化),使用了 LRN 后 AlexNet 的泛化性能得到了些微的提升。用 ax,yi 表示核 i 在 (x,y) 处计算后的**值,其相应的局部归一值 bx,yi 由如下公式给出。

bx,yi=ax,yi/(k+αj=max(0,in/2)min(N1,i+n/2)(ax,yj)2)β

      其中,n 是邻接核的个数 (即,求和发生在核 i 的 n 个邻接核内),N 是该层的总核数,(knαβ) 是超参数,它们的值用一个验证集确定。

3.4 重叠池化

      CNN中的池化层是对相同核特征图相邻组神经元输出的一个归纳。通常,相邻池化单元归纳的邻域并不重叠。更确切地说,可以将池化层看作一个由 z×z 大小的核,步长为 s 的池化单元栅格。当s<z 时,就属于重叠池化。作者在训练中发现,使用重叠池化的模型稍微更易发生过拟合。

3.5 网络的总体结构

      网络训练的目标是最大化多项逻辑回归,也就是最大化训练集预测正确的标签的对数概率 (相当于极大化对数似然)。
      第二、四、五卷积层的所有核只与同一个 GPU 内前层的核特征图相连,第三个卷积层的所有核与第二层的所有核特征图相连,全连接层的神经元与其前层的所有神经元相连,如图3.2所示。


AlexNet学习笔记
图 3.2 AlexNet 结构示意图

      对第一、二个卷积层使用了局部归一化以及最大池化,对第五个卷积层仅使用了最大池化。此外,对所有的神经元都使用了 ReLU。输入图像的大小为 224×224×3 ,实际在 AlenNet 的 caffe 实现中会对输入进行预处理,将其变换为 227×227×3 的大小。

4 降低过拟合

      AlexNet 有 6000 万个参数,需要考虑模型的的过拟合问题。在减小过拟合方面,作者主要采取了两种策略:① 数据扩增;② 使用 dropout。

4.1 数据扩增

      作者使用了两种数据扩增的方法:
      ① 图像平移和水平翻转。256×256 的图片上随机提取 224×224 大小的块 (以及它们的水平翻转),从而将训练集扩大了 2048 倍((256224)2×2)。当然,这么做使得训练集高度相互依赖,但是如果不这么做,那么模型将会出现严重的过拟合。在测试阶段,取输入图片的五个块 (四个角及*,每个块的大小为 224×224) 以及它们的水平翻转,取 Softmax 层对这 10 个块预测值的平均作为输入图片的预测结果。
      ② 改变训练图片的 RGB 通道强度。在 ImageNet 所有训练图片的 RGB 像素值进行 PCA,对每一个训练图片都加上所发现主成分的多倍,倍数的值为相应的特征值乘以一个由高斯函数产生的均值为0,标准差为 0.1 的随机变量。因此,每一个 RGB 图像像素 Ixy=[IxyR,IxyG,IxyB] 都会加上如下的量:

[P1,P2,P3][α1λ1,α2λ2,α3λ3]T

      其中,piλi 分别是 RGB 像素值协方差矩阵的特征向量和特征值。

4.2 Dropout

      结合多种不同的模型的预测结果是一个减少测试误差的好方法,但是对于一个已经需要花费几天训练的大型神经网络来说代价很大。Dropout 是一种非常有效的模型结合方法,作者利用 Dropout 将每一个隐藏神经元的输出以 50% 的概率设为 0,那些输出被设为 0 的神经元不会参与网络的前向传播和反向传播。因此,每次有输入时,神经网络都会采用一个不同的结构,但是这些结构共享权值参数。Dropout 降低了神经元间的联合适应性,因此一个神经元将不会特别依赖于其它任何一个特定的神经元。在测试时,使用所有的神经元,但是将其输出乘以0.5,对采用多指数 Dropout 网络生成的预测分布的几何平均来说是一个合理的近似。使用 Dropout后,模型大致达到收敛的迭代次数增加了一倍。

5 学习细节

      作者使用SGD进行模型的训练,batch size 设为 128,动量为常用值 0.9,权重衰减设为0.0005。作者发现这一小小的权重衰减对于模型的学习来说很重要,换句话说,这里的权重衰减不仅仅是一个正则化项,它降低了模型的训练错误率。权重 w 的更新规则为:

vi+1:=0.9·vi0.0005·ε·wiε·<Lw|wi>Di

wi+1:=wi+vi+1

      这里 i 是迭代索引,v 是动量变量,ε 是学习率,<Lw|wi>Di 是在第 i 个 batch Di 上目标函数对 wi 的偏导数。
      对每一层的权重,作者使用服从均值为 0,标准差为 0.01 的高斯分布的变量对其进行初始化,第二、四、五卷积层以及全连接层的偏置项初始化为 1,其余层偏置项初始化为 0。部分层的偏置项初始化为 1可以为 ReLU 提供正的输入,从而加快网络初始阶段的学习。
      在学习率的设置上,作者采用了启发式的方法。所有层使用相同的学习率,并初始化为0.01。在验证错误率停止下降时将当前的学习率除以 10,整个训练过程学习率共减小了 3 次。


[注解1] top-1错误:模型预测结果中概率最大的类与真实类不相符。
[注解2] top-5错误:模型预测结果中概率最大的前五类不包含真实类别。

参考文献

[1] https://www.cnblogs.com/gongxijun/p/6027747.html
[2] https://blog.csdn.net/tinyzhao/article/details/53035944
[3] https://blog.csdn.net/qianqing13579/article/details/71381016?locationNum=15&fps=1


版权声明:本文为博主原创文章,转载请注明出处。