AlexNet是2012年ImageNet图像分类竞赛冠军。
首次将卷积神经网络CNN和深度学习DL用于大规模图像分类。
性能优异,相比之前获得巨大飞跃,是后续一系列优秀网络的奠定者。
创新点:
训练了一个大而深的卷积神经网络去分类ImageNet2010年比赛1千200万张1000个类别的高分辨率图像。实现top-1的37.5%错误率和top-5的17.0%错误率。比之前最高水平的网络都好。
所使用的该神经网络有5个卷积层(后接最大池化层)+3个全连接层,有65万个神经元和6千万个参数。
为了使训练更快,使用了非饱和激活函数ReLU和双GPU运行。
为了避免过拟合,在全连接层使用正则化方法Dropout。
在ILSVRC-2012比赛中,top-5错误率为15.3%,比第二名的26.2%有明显优势。
过去的图像识别方法都是基于机器学习的。
为了提升性能:
过去的网络在小数据集上可以刷到很高的分,比如在MINIST手写数字数据集上的错误率能抵御0.3%,但现实世界很复杂,需要更大的数据集。为了在大数据集上学习,我们需要一个更大学习能力的网络。 CNN具备很多优点,可以用于大规模图像识别。CNN的深度、宽度都可以控制这个网络的容量,局部链接、权值共享、下采样具有更少的参数。
该网络使用5个卷积层和3个全连接层。通过实验也发现深度很重要,去掉任何一个卷积层都会有更差的表现。
ILSVRC-2010是唯一一年公开了测试集标签的,因此2010年版本的数据是在实验中使用得最多的。
ImageNet包含了大小不一分辨率的数据集,但模型的输入需要固定尺寸256×256,因此需要对数据集进行下采样。
预处理:减去训练集图像中每个像素的均值
网络结构如图2所示。包含8个学习权重的层——5个卷积+3个全连接。接下来介绍该网络的重点部分。先说最重要的。
ReLU(修正线性单元)非线形激活函数
由上图可知,饱和的激活函数容易梯度消失,而非饱和的激活函数有助于避免梯度消失。
经过实验发现,非饱和的激活函数比饱和的激活函数收敛快。
由于ImageNet数据集规模很大,因此核心问题是:加速训练。
由图1可知,ReLU激活函数可以加速训练,比tanh收敛快6倍。
多GPU模型并行
由反向传播原理可知,显存中不仅要存储模型参数,还需存储正向传播时每一层整个batch的中间结果。batch size越大,占用显存越大。我们这个网络会对显存造成压力,所以使用双GPU并行的策略。
每个GPU各占一半的神经元,而且两个GPU可以读取对方的显存,并行计算。两个GPU只在某些层进行交流,在具体讲解网络结构组成部分会进行具体说明。
双GPU(全参数)的训练时间比单GPU(半参数)更短。
单GPU模型中,最后一个卷积层和全连接层参数数量与双GPU模型相同,因此“半参数”并非真的只有一半。
top-1错误率降低了1.7%,top-5错误率降低了1.2%。
LRN局部对比度归一化
该方法在VGG中已经被证明没有什么作用,因此不过多进行讲解。原理是侧向抑制,兴奋的神经元对周围的神经元抑制作用。(强者愈强,弱者愈弱)
该操作就是指:与附近的神经元做归一化。
公式:
如下图,n=2,就是和周围的2个神经元做归一化操作。
文章表明, k = 2 , n = 5 , α = 1 0 − 4 , β = 0.75 k=2,n=5,α=10^{-4},β=0.75 k=2,n=5,α=10−4,β=0.75
该操作在ReLU激活函数之后。
top-1错误率降低了1.4%,top-5错误率降低了1.2%。
重叠的池化(池化窗口是重叠的)
这个操作后期也不怎么用了。
池化的作用:
该文章发现,重叠池化有助于避免过拟合。top-1错误率降低了0.4%,top-5错误率降低了0.3%。
整体网络架构
上下各一个GPU,在C2和C3层两个GPU可相互通信,是全部连接的,C5和F1、 F1和F2、F2和F3也是全部连接,其余都是各自一半连接。
5个卷积层+3个全连接层,分类1000类。
数据增强
人为地去扩充数据集,扩充的数据集无需硬盘存储,且有CPU负责。GPU在上一批训练时,CPU已经将下一批的准备好了。有两种方法:
(1) 平移、水平翻转
训练阶段:假设需要224×224的图片,输入图片是256×256。256-224=32,所以有32×32个位置可以裁剪,并且对裁剪所得图片进行水平翻转。因此有32×32×2=2048个图片。裁出来的这些图片虽然都很相像,但是可以有效防止过拟合。
测试阶段:从左上角、左下角、右上角、右下角以及中心位置裁出5张图片,并进行翻转,因此共10张图片。取结果的平均。
(2)颜色光照变换
这一部分我不是很理解,感觉就是对图像RGB像素值进行主成分分析。该方法近似地捕捉原始图像的一些重要属性,对象的身份不受光照的强度和颜色变化影响。
多个不同的模型集合可有效防止过拟合,但对大型网络不太经济。
在F1和F2层使用该操作。虽然使用dropout操作需要double训练轮次,但是也很值得。