卷积神经网络模型(2)-AlexNet解读

卷积神经网络模型(2)-AlexNet解读

最近要开始找工作啦,准备将自己看过的文章及其实现通过专栏的方式记录一下,也希望能一起交流。主要内容包括:深度学习模型、目标检测、语义分割、细粒度识别、目标追踪、迁移学习、通用学习等,主要是论文及自己的思考,目前在一步步构建中。


说起深度学习在图像领域的应用,不得不提Hinton实验室的AlexNet在ILSVRC-2012上的瞩目表现,也是卷积神经网络在大规模数据集的开篇巨作。同时我把该专栏第一篇文章留给了LeNet-5,由于要写BP传播、卷积池化的作用比较繁琐,所以先写了第二篇文章AlexNe本文组织框架如下:AlexNet的创新点及其意义、网络结构及特点、实验结果。同时我正在通过TensorFlow实现AlexNet,争取下一篇文章放出。

1、意义

AlexNet首次在大规模图像数据集实现了深层卷积神经网络结构,点燃了深度学习这把火。其在ImageNet LSVRC-2012目标识别的top-5 error为15.3%,同期第二名仅为26.2%,碾压其他传统的hand-craft 特征方法,使得计算机视觉从业者从繁重的特征工程中解脱出来,转向思考能够从数据中自动提取需要的特征,做到数据驱动。得益于GPU计算性能的提升以及大规模数据集的出现,自此后每年的ImageNet LSVRC挑战赛都被深度学习模型霸占着榜首。

2、创新点

  • 训练出当前最大规模的卷积神经网络,此前LeNet-5网络仅为3个卷积层及1个全连接层。
  • 实现高效的GPU卷积运算结构,也使得此后GPU成为深度学习的主要工具,老黄做梦都要笑醒了。
  • 通过众多的skills(dropout、RELU、Data Augmentation)解决深层神经网络的过拟合问题,使得该网络在60 million参数的情况下依旧能很好收敛。这些方法现在已经成为了CNN不可或缺的一部分。

3、网络结构

由于当时的GPU运算能力比较低,AlexNet通过两个GPU协同训练,因此文章给出的网络结构不如NetScope的清晰,参见Netscope


该网络共包含8个权重层,其中5个卷积层,3个全连接层。1,2卷积层后连有LRN层,不过此后的网络也证明LRN并非CNN中必须包含的层,甚至有些网络加入LRN后效果反而降低。每个LRN及最后层卷积层后跟有最大池化层,并且各个权重层均连有RELU激活函数。全连接层后使用了dropOut这一神器以解决过拟合。上面这幅图的feature map 维度需要综合上下两个GPU的结果,其输入为224*224*3的图片,第一层卷积层的kernel个数为96,size为11*11*3,步伐为4,其得到的feature map size为55*55*48。有个细节,计算feature map size时我们发现,(224-11)/4 并不能整除,也就是说kernel在水平移动时的最后一个感受野并非为11*11。不过这个细节在NetScope中已经修改了,里面的输入被resize到227*227*3。其后的卷积、池化及全连接就比较好理解了,当我们发现卷积的kernel size不能整除时,自动pad就好啦。

卷积1步伐为4,kernel size为11*11*96,feature map 为55*55*96

Pooling1步伐为2,kernel为3*3,feature map 为27*27*96

卷积2步伐为1,kernel size 为5*5*256,feature map 为27*27*256,feature map大小未变说明卷积前左右各pad 2

Pooling2步伐为2,kernel 为3*3,feature map 为13*13*256

卷积3步伐为1,kernel size 为3*3*384,feature map 为13*13*384

卷积4步伐为1,kernel size 为3*3*384,feature map 为13*13*384

卷积4步伐为1,kernel size 为3*3*256,feature map 为13*13*256

Pooling3步伐为2,kernel 为3*3,feature map 为6*6*256

全连接6、7的神经元个数为4096,全连接层8神经元个数为1000,对应于ImageNet的1000类。

4、网络特点

  • RELU的使用

我们知道神经网络需要使用激活函数,一般激活函数具有两个作用。其一、无论卷积还是全连接层,实质上都是线性运算,通过加入非线性的激活函数可以增强网络的非线性映射能力,相当于kernel method。其二、神经网络一般通过BP算法优化,激活函数可以加快网络收敛速度。传统神经网络激活函数通常为反正切或是sigmoid,AlexNet使用RELU作为激活函数,相比于反正切,该方法训练速度大约有6倍提升。RELU激活函数简单到难以置信,f(x)=max(0,x),也就是说我们放弃了小于0的那部分导数,同时正数部分的导数为1啊!BP时自然会快啦!
  • LRN

虽然后来的很多网络都不屑于使用LRN,甚至直接说LRN对于网络没有任何提升,但是思路真的很新奇呀。

LRN加在RELU的激活后面,能够增加网络的泛化能力,并在ILSVRC-2012上降低1%的错误率。传说思路来源于神经元的侧向抑制机制,不同的神经元都在做特征提取这件事,能否让他们相互竞争呢?

其中a_{x,y}^{i} 为kernel i 在x,y坐标的feature map,j为x,y位置的其他相邻kernel的feature map,这样我们就可以通过其他kernel的响应抑制我们的我们的feature map啦。文章给出了超参数的经验值,估计试了很多很多次吧。成功开启深度学习调参之路。

  • Overlapping Pooling

也算是创新点之一吧,毕竟此前的文章的池化没有重叠的,不过后续的其他文章也鲜有重叠。重叠池化的意思是,池化步伐小于kernel size,这样池化后的feature map的感受野其实是有部分重叠的。
  • Data Augmentation

文章使用Random Crop、flip从而上千倍的扩充训练样本的数量,也使得随机裁剪成为通用方法。具体做法就是首先将图片resize到256*256大小,然后从中随机crop出224*224大小的patch训练,测试时就从四个角及中心crop,然后水平翻转图像形成10个测试图片,然后对于这10个结果取一下平均值就好啦。另一种增强为转换RGB通道的强度,在之后的模型中很少用到,对于该模型,大约降低了1%错误率。
  • DropOut

Hinton自家的东西,当然要用上啦,可以看到卷积神经网络的计算量其实主要集中在全连接层,这些层参数太多了,也最容易发生过拟合。DropOut通过训练时随机使得一部分结点失效,不贡献连接权重而减少过拟合风险。同时强迫这些神经元去学习互补的一些特征。现在已经是主流做法啦,训练时全连接层50%结点不工作,测试时工作就好啦。

5、实验结果

比第二名高出太多,其实FV方法直到现在都是很常用的方法,也衍生出了FV-CNN,可以说当时是非常流弊的方法了。关于代码部分,第三篇文章补上。

6、参考

论文下载地址:machinelearning.wustl.edu




编辑于 2017-06-07

文章被以下专栏收录