简介
文章第一次成功的实现了当时最大、最深的深度卷积神经网络(CNN),依据此模型在ImageNet LSVRC-2010图像分类比赛上一举夺魁,并大幅度领先其它方法。AlexNet网络模型即来源于此文,取自于文章一作Alex Krizhevsky,其也是深度学习三大巨头之一的Hinton的学生。
AlexNet网络对神经网络的发展产生了非常重要的影响,之后的ImageNet冠军全都采用了卷积神经网络结构,使得CNN架构成为图像分类的核心模型,并由此开启了深度学习新一波浪潮。其使用的卷积+池化+全连接的架构仍然是当前深度学习最主要的网络结构。
网络结构
整体结构
AlexNet网络的结构共有8层带权重层,其中前5层为卷积层(convolutional layer, conv),后面3层为全连接层(fully-connected layer, fc)。最后一层fc层(不带ReLU单元)输出连接到一个1000路的softmax层(1000-way softmax layer),最终输出1000类标签的预测概率。网络神经元个数约650k,网络参数约60M。
网络架构图中层(layer)与特征图(Feature Maps)的描述:通常文章中绘制的网络架构图,块状描述的都是特征图,而特征图之间的连线描述的是层。层中包含了需要学习的神经网络参数(权重),特征图只是层基于上层的输出和本层包含的权重,计算得到的输出特征的集合。
AlexNet网络的可视化描述如下所示:
原文中AlexNet将卷积核在通道方向上平均划为两部分,分配到两个GPU上进行训练,因此其网络结构拓扑图分为上下两个部分。两个GPU只在特定的网络层进行信息交换。
ReLU(整流线性单元)
在此之前,tanh、sigmoid等是标准的神经网络激活函数,可以将输入非线性的映射到[0,1]之间。这种激活函数的主要问题是容易导致梯度消失,即在远离零点输入的边缘区,输出随输入变化非常缓慢,出现“饱和”现象。在深度学习的训练过程中,反向传播的梯度是用于更新权重参数最重要的来源。梯度太小,就会造成学习速率的极速下降。而且,反向传播通过链式法则计算,越是远离损失函数的参数,在进行更新时梯度消失的越快,导致参数很难学习。
ReLU最早由Hilton等人提出,但直到AlexNet才首次应用于深度卷积神经网络中。由于ReLU在正向输入区是原样输出映射,不能存在“饱和”现象,其学习速率也远远超过tanh、sigmoid等饱和非线性。对于一个在CIFAR-10数据集上的四层卷积神经网络,采用ReLU作为激活函数的网络的学习速度是基于tanh的6倍。
使用ReLU作为激活函数还能在一定程度上缓解过拟合问题。由于ReLU将所有负输入重置为0,因此经过ReLU计算后,使得输出具有稀疏性。通过屏蔽掉负数输入,降低输入的相关性,增加输入的随机性,从而缓解了参数学习的过拟合问题。
使用ReLU虽然可以提升学习速率和改善过拟合问题,但也容易造成网络参数停止更新。一旦大部分或者输入都为负值,导致该层梯度都为零,网络参数停止更新,后续很难重新被激活。
Local Response Normalization(局部响应归一化)
LRN的思想来源于神经生物学中“侧抑制”(lateral inhibition)的现象,指的是被激活的神经元会抑制周围的神经元。LRN的计算公式为:
其中描述由卷积核
卷积计算(经过ReLU后)在输出位置
的激活值,
表示该层的卷积核数目。求和公式描述了以位置
为中心前后邻近的共
个卷积核在同一个位置处激活值的平方和。
为超参数,论文中设置为
。
通过增加LRN可以提高网络的泛化能力,测试实验中,增加LRN能使top 1/5的错误率分别下降了1.4%/1.2%。此外,LRN对原本在正向输入区线性输出的ReLU结果进行修正,使其边缘具有衰减特性,具备饱和非线性函数的特性。
LRN方法在之后的VGG论文中被证实效果其实并不明显,反而增加了内存以及计算量。随着批归一化(Batch Normalization, BN)的提出,而逐渐淡出使用。
Overlapping Pooling(重叠池化)
通常认为卷积结果中存在大量冗余信息,最大池化(Max Pooling)的目的就是希望进行信息压缩,只保留局部最明显的特征。常见池化操作中,滑动窗口之间是没有重叠的。在AlexNet中,池化窗口允许存在部分重叠。相对于非重叠池化操作,允许重叠使得top1和top5的错误率分别降低了0.4%和0.3%。
相比于常规的池化,部分重叠池化能够提高精度的原因可能在于传统池化在信息压缩时,同时丢掉一些有用的信息,而部分重叠能够降低信息压缩比,从而减少了有用信息的丢失。
Dropout(随机失活):
Dropout最早也是由Hinton提出,通过在训练过程中随机的将部分权值清零,提高网络的泛化能力。通过随机清零,每次训练相当于一个新的网络架构。
由于每次只有部分的权重参与更新,因此Dropout会降低网络训练的收敛速度,但其显著的提升了网络的泛化能力。在AlexNet中,Dropout位于每个全连接层之后,随机清零的神经元的概率为0.5,即每次只有一半的权重参数参与计算。
在早期Hinton提出Dropout的实现中,Dropout层通常只在全连接层中使用,位于激活函数之后,因此一般的顺序为fc->relu->dropout。
数据准备
数据集
训练和测试数据来源于ImageNet的ILSVRC-2010的比赛数据集,该数据集中训练集包含120万张图片,验证集包含5万张图片,测试集包含15万张图片,这些图片分为了1000个类别,并且有多种不同的分辨率。
此外AlexNet模型也在ILSVRC-2012的数据集上测试,但由于当时的测试集并没有标注,因此在验证集上进行测试。
数据处理
ImageNet中原始数据包含不同尺寸,但网络的输入为固定尺寸。AlexNet首先将原始图片进行缩放,使其短边的尺寸为256,然后以图片中心裁减出256*256的统一尺寸的图片。此处的裁减只是为了保证训练数据的尺寸一致,并不是图像增强,其尺寸也并不与网络输入要求的尺寸一致。后续将以此统一尺寸的数据集进行图像增强和训练。
此外,对于图像颜色也进行了均值处理。计算现有训练集上图像逐像素的平均值,得到一张同尺寸的平均值图像。每张训练图按照像素对应减去平均值图像,得到均值化处理的图像。
数据增强
对于规模较大的网络,如果训练数据量不够多,容易产生过拟合。深度学习中最常用的方法是使用标签保留转换(label-perserving transformations)来人为的扩充数据集。AlexNet在训练前采用了如下方式来扩充增强数据集:
裁减+翻转:对经过统一尺寸处理后的256x256图片,随机裁减到符合网络输入尺寸的224x224(实现过程采用227x227)。通过逐一在水平和垂直两个方向按照stride=1滑动224x224的裁减窗口,并对裁剪后的图片增加一次水平翻转(保留原图)。经过此操作后,数据增加2178倍(33x33x2,原论文为2048倍,疑似笔误)。
颜色扰动:针对训练样本中每个像素点位置,分别计算RGB在整个训练数据集上的均值和方差,归一化后进行PCA分解,得到特征向量和特征值
。在特征空间上计算如下的随机扰动项,增加回原始像素值。
其中为符合均值为0,方差为0.1高斯分布的随机变量。
协方差矩阵:描述的是不同维度之间的方差,而非不同样本之间的方差。例如,对于某个固定位置处的RGB像素值,不同图片同一位置的像素表示一个样本,而RGB表示的是维度。协方差矩阵计算的是RGB三个通道的方差,因此矩阵的维度是3x3。首先先计算RGB三通道各自在样本上的均值和方差,得到归一化之向量(例如,,其中n表示样本数量,类似有
计算),则对于任意两个颜色通道的方差为
,在任意两个通道之间计算方差,组合得到协方差矩阵。可以将RGB分别描述为三个随机变量,而样本值则为随机变量的采样值。
对于图像样本的244x244的每个像素位置,均进行上述的计算。同一个样本图片使用相同的随机变量,不同样本图片重新生成随机变量。
训练策略
初始化
在神经网络的训练过程中,权重的初始化方式对训练影响很大。在AlexNet中,所有层权重初始化服从均值为0,标准差为0.001的正态分布。其中第二、四、五层卷积以及所有全连接层的偏置量初始化为1.0,其它层偏置量初始化设置为0。偏置设置为1.0可以增加后续ReLU函数的正向激励概率,从而加速早期学习的速度。
超参策略
训练采用常规的基于批处理的,随机梯度下降法(Stochastic Gradient Descent, SGD)。批大小为128,momentum=0.9,权重衰减系数为0.0005。
学习率初始化值为0.01,每次验证集上错误率不再下降时,学习率降低到原值的1/10,整个过程调整三次后结束。训练的epoch次数约90次。
多GPU训练
由于AlexNet的网络神经元个数约650k,网络参数个数约60M,加上中间处理结果的存储量,训练所需存储空间超过了单GPU的显存(GTX 580 3G)。实际实现过程中采用两个GPU分别学习模型的一半。模型的两个部分只在第三、六、七、八层进行交换,即使用对方的特征图信息。例如第二层卷积核只在同一个GPU上的第一层输出的特征图上操作,第三层则会综合使用两个GPU上各自第二层的输出。同理,全连接层中的神经元和前一层中的所有神经元相连接。
使用两个GPU的训练时间并没有显著提升,但使top1和top的错误率分别下降了1.7%和1.2%。其原因在于AlexNet中的大部分参数位于第一个全连接层(37M/65M),为了保证分割后的网络与未分割的网络参数上能大概保持一致,在实现过程中,最后一个卷基层和之后连接的第一个全连接层并未进行分割。因此两个分割的网络实际要比未分割的网络参数要多一些,从而降低了错误率。
测试评估
在测试阶段,对测试图片分别在中心位置以及四个角做5次裁减,并增加水平翻转,共得到10组224x224的输入图片。最后的预测结果则是对10组图片测试结果的平均值。
在ILSVRC-2010的数据集上,AlexNet获得了当时最好的结果:top1和top5的误差分别为37.5%和17%,远低于其它非神经网络方法。此外通过ablation study研究(文章并未单独实验,而是针对每个模块进行测试实验)发现(均针对Top1错误率):减少一个卷基层,错误率会提升2%,因此证明了卷积层的有效性;使用双GPU架构,错误率降低1.7%;使用LRN处理,错误率降低1.4%;使用PCA进行颜色干扰,错误率降低降低1%;使用重叠池化,错误率降低0.3%。由此可见不同的策略对精度的影响不同。
通过可视化学习得到的卷积核,发现网络自动学习了图像中的特征。并且,两个GPU自主的分别学习不同的特征。其中第一个GPU学习了与颜色无关的几何结构特征,而第二个GPU学习了与颜色相关的块状特征。
此外抽取网络最后一个fc层的输出特征(4096-d的向量),通过比较实验发现:如果两幅图输出特征的欧式距离越小,表明原图之间约相似。而如果只是在原始像素空间计算像素的欧式距离,图片之间并不相似。因此实验也证明了通过卷积网络,能够学习到图像更本质的特征信息。
总结
AlexNet取得如此成功的原因是其使网络的宽度和深度达到了前所未有的高度,从而极大的提升了模型的容量(model capacity)。容量提升会带来两个问题:1)容易产生过拟合;2)计算量/存储量增大。针对这两个问题,文章分别采用了不同的策略,从而保证了在当时条件下的模型可训练,以及精度的极大提高。
针对模型容易过拟合问题,分别采用了整流线性激活单元(Rectified Linear Unit, ReLU)、Dropout单元、局部响应归一化单元(Local Response Normalization,LRN)、重叠池化(Overlapping Pooling)、数据增强(Data Augmentation)等方法。虽然很多策略都不是文章首创,但第一次集中使用,有效的降低了模型过拟合的问题。
针对计算量/存储量增大的问题,提出了多GPU实现方案,采用2块GPU并行化训练模型的一半,避免了单GPU无法存储整个网络计算所需显存。只是与直觉相反的是,多GPU并没有显著提高了训练速度。
参考文献
[1] Krizhevsky A, Sutskever I, Hinton G E. Imagenet classification with deep convolutional neural networks[C]//Advances in neural information processing systems. 2012: 1097-1105.
[2] Simonyan K, Zisserman A. Very deep convolutional networks for large-scale image recognition[J]. arXiv preprint arXiv:1409.1556, 2014.