AlexNet是一个卷积神经网络,由亚历克斯·克里泽夫斯基(Alex Krizhevsky)设计,与伊尔亚‧苏茨克维(Ilya Sutskever)和克里泽夫斯基的博士导师杰弗里·辛顿共同发表,而辛顿最初抵制他的学生的想法。
AlexNet参加了2012年9月30日举行的ImageNet大规模视觉识别挑战赛,达到最低的15.3%的Top-5错误率,比第二名低10.8个百分点。原论文的主要结论是,模型的深度对于提高性能至关重要,AlexNet的计算成本很高,但因在训练过程中使用了图形处理器(GPU)而使得计算具有可行性。
目录
问题背景
本文在如下背景下展开研究:
- 当前图像分类任务主要是通过传统机器学习的方法进行的,模型容量小,且不易于实际使用,容易过拟合
- 实际目标多样性丰富,标记好的数据集的样本数越来越大,需要更高容量的模型进行学习。而卷积神经网络可以通过调节深度和宽度来控制模型的容量,且充分利用了自然图像的局部空间相关性的特性
GPUs
等硬件以及高度优化的2-D
卷积运算的实现发展成熟,以足够强大,可用于训练较大的CNNs
,结合如今的大数据集,不用过分担心过拟合
本文主要贡献
本文的模型,即 AlexNet
,其由多伦多大学,Geoff Hinton
实验室设计,夺得了 2012
年 ImageNet ILSVRC
比赛的冠军,且其 top-5
错误率远低于第二名,分别为 15.3%
和 26.2%
。
AlexNet
在深度学习发展史上的历史意义远大于其模型的影响。在此之前,深度学习已经沉寂了很久。在此之后,深度学习重新迎来春天,卷积神经网络也成为计算机视觉的核心算法模型。
本文的主要内容有:
- 使用
ReLU
激活函数加速收敛 - 使用
GPU
并行,加速训练。也为之后的分组卷积(group convolution
)理论奠定基础。 - 提出局部响应归一化(
Local Response Normalization
,LRN
)增加泛化特性 (虽然被后人证明无效 ) - 使用交叠池化 (
Overlapping Pooling
) 防止过拟合 - 提出
Dropout
,数据增强等手段防止过拟合
ImageNet 数据集
ImageNet 和 ILSVRC
(截至论文发表时)ImageNet
数据集包含 15 million
(1500
万) 张标记好的高分辨率的图像,其包含仅 22000
个类别。从 2010
年始,作为 Pascal Visual Object Challenge
的一部分,一个新的年度比赛 ImageNet Large-Scale Visual Recognition Challenge
(ILSVRC
) 拉开帷幕。
ILSVRC 数据集
ILSVRC
使用 ImageNet
数据集的子集,包含 1000
类目标,每类目标约 1000
张图片,共 1200
万张训练图像,50000
张验证图像,15000
张测试图像。
ILSVRC-2010
是唯一一届公开测试集 label
的ILSVRC
,因此我们的实验测试在该数据集上进行。评判标准为 top-1
和 top-5
错误率,分别表示预测类别正确,以及正确值位于预测概率最高的 5
个类别时的错误率。
本文中对图像的预处理
由于 ImageNet
包含多种分辨率,而我们的模型要求输入维度固定,因此,我们对图像进行处理,使之固定为。具体做法是,对于给定的图像,我们先将其进行缩放,使其短边尺寸为 256
,然后进行中心裁剪,得到输入图像。除了在每个像素上,减去整个数据集对应像素上的均值之外,我们并未对输入图像进行其他预处理。
网络架构
ReLU 激活函数
在此之前,激活函数主要使用的是以及, 但是这些都是饱和激活函数,输入值处于饱和区时,其梯度几乎为 0,因此收敛极慢!
针对这一问题,我们使用线性整流单元 (Rectified Linear Units,ReLU
) 作为激活函数,即: 。其不存在饱和区,导数始终为 1,梯度更大,计算量也更少,因此收敛更快。
如下图所示,为 tanh
和 ReLU
的收敛速度对比:
GPU 并行训练
单个 GTX 580 GPU
只有 3GB
的显存,这将限制可训练的网络的最大尺寸和 batch size
大小。因此,我们将模型分为两部分,分布到两个 GPU
上进行训练。由于 GPU
之间可以直接进行数据交换,而无需经过主机的内存,因此可以很容易进行并行。
该方式大大的加快了训练速度,具体细节详见模型的详细结构
该技术使得 top-1
和 top-5
误差分别降低 1.7%
和 1.2%
。
局部响应归一化 (LRN)
在神经生物学有一个概念叫做侧抑制(lateral inhibitio
),指的是被激活的神经元抑制相邻神经元。归一化(normalization
)的目的是“抑制”,局部归一化就是借鉴了侧抑制的思想来实现局部抑制。
当使用 ReLU
时,这种侧抑制很管用,因为 ReLU
的响应结果是无界的,所以需要归一化。使用局部归一化的方案有助于增加泛化能力。
局部响应归一化 (Local Response Normalization
) 的核心思想就是利用近邻数据进行归一化,其公式如下所示:
其中:
- 表示第 i 个卷积核,作用于位置 ,然后进行
ReLU
后,得到的神经元输出。 N
表示该层卷积核的总数目- 为超参数,其值通过验证集确定
- 表示同一位置上,邻近的卷积核的数目
我们使用 。我们在 ReLU
层之后使用 LRN
。局部响应归一化使得 top-1
和 top-5
误差分别降低 1.4%
和 1.2%
。
LRN
的直观解释就是,在第 i 个特征图上的 出的神经元的值,通过其邻近的 个特征图上,同一位置的值平方和的相关运算,最后得到的值作为该特征图上,对应位置的新值。
可想而知,其计算量不小!后面的研究者也发现,LRN
并无实际作用,反而增加不少的计算量,因此一般都不再使用。
交叠池化 (Overlapping Pooling)
在一般池化中,池化窗口 z 与滑动步长 s 相等。而交叠池化指的就是 s < z 的池化,此时相邻的滑窗之间会有重叠。在本文实现中,我们使用 z=3,s=2 ,这时的我们的 top-1
和 top-5
误差率分别降低 0.4%
和 0.3%
。
同时我们发现,使用 overlapping pooling
方式,更不易发生过拟合。
模型的详细结构
AlexNet
的整体结构如下所示:
如上图所示,AlexNet
共包含 8
个可学习的层,其中前 5
层为卷积层,后为全连接层,最后接一个 1000
路的 softmax
层,用于分类。
参数详细图:
conv1 阶段
输入数据:227×227×3
卷积核:11×11×3;步长:4;数量(也就是输出个数):96
卷积后数据:55×55×96 (原图N×N,卷积核大小n×n,卷积步长大于1为k,输出维度是(N-n)/k+1)
relu1后的数据:55×55×96
Max pool1的核:3×3,步长:2
Max pool1后的数据:27×27×96
norm1:local_size=5 (LRN(Local Response Normalization) 局部响应归一化)
最后的输出:27×27×96
conv2 阶段
输入数据:27×27×96
卷积核:5×5;步长:1;数量(也就是输出个数):256
卷积后数据:27×27×256 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu2后的数据:27×27×256
Max pool2的核:3×3,步长:2
Max pool2后的数据:13×13×256 ((27-3)/2+1=13 )
norm2:local_size=5 (LRN(Local Response Normalization) 局部响应归一化)
最后的输出:13×13×256
conv2中使用了same padding,保持了卷积后图像的宽高不缩小。
conv3 阶段
输入数据:13×13×256
卷积核:3×3;步长:1;数量(也就是输出个数):384
卷积后数据:13×13×384 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu3后的数据:13×13×384
最后的输出:13×13×384
conv3层没有Max pool层和norm层
conv4 阶段
输入数据:13×13×384
卷积核:3×3;步长:1;数量(也就是输出个数):384
卷积后数据:13×13×384 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu4后的数据:13×13×384
最后的输出:13×13×384
conv4层也没有Max pool层和norm层
conv5 阶段
输入数据:13×13×384
卷积核:3×3;步长:1;数量(也就是输出个数):256
卷积后数据:13×13×256 (做了Same padding(相同补白),使得卷积后图像大小不变。)
relu5后的数据:13×13×256
Max pool5的核:3×3,步长:2
Max pool2后的数据:6×6×256 ((13-3)/2+1=6 )
最后的输出:6×6×256
conv5层有Max pool,没有norm层
fc6 阶段
输入数据:6×6×256
全连接输出:4096×1
relu6后的数据:4096×1
drop out6后数据:4096×1
最后的输出:4096×1
fc7 阶段
输入数据:4096×1
全连接输出:4096×1
relu7后的数据:4096×1
drop out7后数据:4096×1
最后的输出:4096×1
fc8阶段
输入数据:4096×1
全连接输出:1000
fc8输出一千种分类的概率。
整体来看,AlexNet的卷积核从11到5再到3不断变小,而feature map也通过重叠式max pool在第1、2、5层折半式缩小,到第5个卷积层后,图像特征已经提炼得足够充分,便用两个全连接层和一个softmax层组合得出最终的分类结果。
AlexNet相对于前辈们有以下改进:
1、AlexNet采用了Relu激活函数:ReLU(x) = max(x,0)
2、AlexNet另一个创新是LRN(Local Response Normalization) 局部响应归一化,LRN模拟神经生物学上一个叫做 侧抑制(lateral inhibitio)的功能,侧抑制指的是被激活的神经元会抑制相邻的神经元。LRN局部响应归一化借鉴侧抑制的思想实现局部抑制,使得响应比较大的值相对更大,提高了模型的泛化能力。LRN只对数据相邻区域做归一化处理,不改变数据的大小和维度。
3、AlexNet还应用了Overlapping(重叠池化),重叠池化就是池化操作在部分像素上有重合。池化核大小是n×n,步长是k,如果k=n,则是正常池化,如果 k<n, 则是重叠池化。官方文档中说明,重叠池化的运用减少了top-5和top-1错误率的0.4%和0.3%。重叠池化有避免过拟合的作用。
4、AlexNet在fc6、fc7全连接层引入了drop out的功能。dropout是指在深度学习网络的训练过程中,对于神经网络单元,按照一定的概率(AlexNet是50%,这种情况下随机生成的网络结构最多)将其暂时从网络中丢弃(保留其权值),不再对前向和反向传输的数据响应。注意是暂时,对于随机梯度下降来说,由于是随机丢弃,故而相当于每一个mini-batch都在训练不同的网络,drop out可以有效防止模型过拟合,让网络泛化能力更强,同时由于减少了网络复杂度,加快了运算速度。还有一种观点认为drop out有效的原因是对样本增加来噪声,变相增加了训练样本。
5、数据增强:在数据处理这部分作者提到过将每张图片处理为256××256的大小,但网络结构图中的输入却为224××224,这是因为作者在256××256大小的图片上使用了一个224××224的滑动窗口,将每个滑动窗口中的内容作为输入,这样就能将整个数据集扩大到原来的(256−224)×(256−224)=1024(256−224)×(256−224)=1024倍
同时,为了进行多 GPU
并行训练,我们将几乎所有层均分,分别放置于两个 GPU
上进行训练。其中,两个 GPU
之间仅在特定层上进行通信:
- 在第
3
层卷积层的时候,同时以前一层在两个GPU
上的输出进行联合输入,其他卷积层中,GPU
之间数据不互通 - 在全连接层,
GPU
数据始终互通
接下来梳理一下各层的参数情况:
- 输入层:图片大小:宽高通道(RGB)依次为W * H * C = 224 x 224 x 3, 即150528像素。
- 第1个隐层, 卷积层,使用96个11 x 11 x 3的卷积核,如图所示节点数量为:55(W) x 55(H) x 48(C) x 2 = 290400(注:这个地方的节点数与论文中提到的要高,有点奇怪。因为这层跟其他层计算方法一样,其他层的节点数跟论文中完全一致)。根据卷积层的参数 = 卷积核大小 x 卷积核的数量
+ 偏置数量(即卷积的核数量),本层参数数量为:
(11 * 11 * 3 * 96) + 96 = 34848, 注:参数分为2部分 ww 和 bb ,“+”前面一部分是 ww 的数量, “+”后面那部分是 bb 的数量,后面的层也按这个思路来计算。 - 第2个隐层,卷积层, 使用256个5x5x48卷积核,只跟同一个GPU的上一层连接,节点数量:27*27*128*2 = 186624,参数数量:(5*5*48*128+128)*2 = 307456,最后"*2"是因为网络层均匀分布在两个GPU上,先计算单个GPU上的参数,再乘以GPU数量2。
- 第3个隐层,卷积层,使用384个3x3x256卷积核,节点数量:13*13*192*2 = 64896,参数数量:3*3*256*384+384 = 885120。
- 第4个隐层,卷积层,使用384个3x3x192卷积核,只跟同一个GPU的上一层连接,节点数量:13*13*192*2 = 64896,参数数量:(3*3*192*192+192)*2 = 663936。
- 第5个隐层,卷积层,使用256个3x3x192卷积核,只跟同一个GPU的上一层连接,节点数量:13*13*128*2 = 43264,参数数量:(3*3*192*128+128)*2 = 442624。
- 第6个隐层,全连接层,节点数为4096。根据全连接层的参数数量 = 上一层节点数量(pooling之后的) x 下一层节点数量 + 偏置数量(即下一层的节点数量),参数数量为:(6*6*128*2)*4096+4096 = 37752832,可以看到这个参数数量远远大于之前所有卷积层的参数数量之和。也就是说AlexNet的参数大部分位于后面的全连接层。
- 第7个隐层,全连接层,节点数量为4096。参数数量为:4096*4096 + 4096= 16781312。
- 第8个隐层,全连接层,也是1000-way的softmax输出层,节点数量为1000。参数数量为: 4096*1000 + 1000 = 4097000。
最后,为了方便查看,汇总为表格如下,其中最后一行给出了Alex的参数总量。
减缓过拟合
我们的神经网络包含 60 million
参数。尽管 1000
累的 ILSVRC
数据集较为庞大,但是仍不足以抵制模型的过拟合。因此,我们使用如下技巧来减缓过拟合。
数据增强
最简单常用的减缓过拟合的方式就是人工扩充数据集。我们使用了两种不同的方式进行数据增强,且不额外增加过多的计算量,因此可以在线转换。在我们的实现中,我们使用 Python
在 CPU
上进行数据增强,而 GPU
用于训练数据,因此无需占用额外的 GPU
计算资源。
第一种方式是,从256×256的图像及其水平镜像中,随机crop 224×224,然后在这种 patches
上训练模型。相当于训练集的增长倍数为。
不使用这种方式时,模型会发生过拟合,因此我们不得不使用更小的模型。在测试期间,分别对输入图像及其水平翻转抽取 5
个 224×224 的 patches
(4
角 + 中心),进行预测。然后将 10
个预测值进行平均。
另一种方式是,对 RGB
空间做 PCA
,然后对主成分进行 0 均值,0.01 标准差的高斯扰动,也就是对颜色,光照等做变换。通过这种方式,top-1
误差率减少了 1%
。(这一段不太懂,所以未解释清楚)
Dropout
结合不同模型的预测值,是一种减小测试误差的不错的方式,但是其代价极其昂贵。因此,使用 dropout
技术,以 0.5
的概率,将每个隐藏神经元的值设定为 0
。被 dropout
的神经元将不参与前向和反向传播。
在训练阶段的每次前向传播中,都会重新进行 dropout
。因此,每次有新的输入时,模型会被随机采样成不同的架构,但是所有的架构共享权值。该技术可以减少神经元之间的相互依赖性。因此,模型被强制学习更加稳健的特征。
在测试期间,我们使用所有的神经元,只不过将其输出值乘以 0.5
,以保证总的等效输出值不变。我们在网络的的前两层全连接层之间使用 dropout
。
如果不使用 dropout
,模型可能会过拟合,但是使用 dropout
,模型训练将需要近两倍的迭代次数。
dropout
图示如下所示:
我们使用随机梯度下降来训练模型,batch size = 128
,动量系数为 0.9
,权值衰减系数为 0.0005
。我们发现,这种小的权值衰减对于模型的学习很重要。换言之,权值衰减不仅仅是一个正则器,其同时降低了训练误差。
权值 w 的更新规则如下:
其中,i 为迭代索引,v 表示动量值,表示学习速率,表示第i个batch 中,目标函数对 的梯度的均值。
我们初始化每一层的权值为 0
均值,标准差为 0.01
的高斯分布。我们初始化第 2,4,5
层卷积层,以及全连接隐藏层的偏置为 1
。这种初始化通过给 ReLU
输出正值,加速了网络早期的训练。我们初始化剩余层的偏置为 0
。
对于每一层,我们使用相同的学习速率,在训练过程中手动调节:每次当验证误差不再下降时,学习速率减小为原来的十分之一。学习速率初始化为 0.01
,并共减小三次。我们的模型最终在 1.2 million
张训练图片上,训练了 90
个周期,在两张 NVIDIA GTX 580 3GB GPUs
上,花费了 5
到 6
天的时间。
实验结果
我们在 ILSVRC-2010
上的结果如下表所示。其中,top-1
和 top-5
的测试误差分别为 37.5%
和 17.0%
。
我们同时将模型在 ILSVRC-2012
上进行了测试,如下表所示。由于 ILSVRC-2012
测试集的 label
并未公开,因此无法知晓所有我们测试过的模型的误差。
如上表所示,为各模型在 ILSVRC-2012
验证集和测试集上的误差率。其中,* 表示在 ImageNet 2011
完整数据集上进行预训练的模型。
1 CNN
表示一个上文中的模型,其top-5
的误差率为18.2%
5 CNNs
表示5
个上文中的模型组成的集成模型,其top-5
的误差率为16.4%
- 表示在上述模型的最后一层
pooling
之后,额外加一个卷积层得到的模型。先在整个ImageNet 2011
数据集上预训练,然后在ILSVRC-2012
数据集上进行fine-tune
,得到的模型的top-5
误差率为16.6%
。 - 将
3
中的模型,与5
个前面提到的模型的预测值进行平均,对应的top-5
误差率为15.3%
。