CNN网络架构




神经网络架构发展纵览




从1998年开始,近18年来深度神经网络的架构发展情况如下:







神经网络轻量化框架 神经网络 框架_卷积核




上图,横坐标是操作的复杂度,纵坐标是精度。

ResNet、GoogleNet、Inception等网络架构之后,在取得相同或者更高精度之下,其权重参数不断下降。


CNN网络发展情况如下图所示:


神经网络轻量化框架 神经网络 框架_卷积核_02

LeNet5




1998年,LeCun乐春大神发布了LeNet网络架构,从而揭开了深度学习的神秘面纱。从1998年开始,深度学习这一领域就开始不断地被人们所熟知,也是因为这个网络架构,不断地推动着深度学习这一领域。当然啦,为什么不叫LeNet而叫LeNet5呢,因为YannLeCun经过了很多次反复的试验之后的结果,同时也因为有5个卷基层因此以lenet5命名!

lenet5架构是一个开创性的工作,因为图像的特征是分布在整个图像当中的,并且学习参数利用卷积在相同参数的多个位置中提取相似特性的一种有效方法。回归到1998年当时没有GPU来帮助训练,甚至CPU速度都非常慢。因此,对比使用每个像素作为一个单独的输入的多层神经网络,Lenet5能够节省参数和计算是一个关键的优势。


lenet5论文中提到,全卷积不应该被放在第一层,因为图像中有着高度的空间相关性,并利用图像各个像素作为单独的输入特征不会利用这些相关性。因此有了CNN的三个特性了:1.局部感知、2.下采样、3.权值共享。


神经网络轻量化框架 神经网络 框架_深度学习_03

LeNet5小结





  • 卷积神经网络使用3层架构:卷积、下采样、非线性激活函数;


  • 使用卷积提取图像空间特征;


  • 下采样使用了图像平均稀疏性;


  • 激活函数采用了tanh或者sigmoid函数;


  • 多层神经网络(MLP)作为最后的分类器;


  • 层之间使用稀疏连接矩阵,以避免大的计算成本;


总的来说LeNet5架构把人们带入深度学习领域,值得致敬。从2010年开始近几年的神经网络架构大多数都是基于LeNet的三大特性。



GAP




1998年2010年这10年当中,神经网络的发展却变得非常缓慢,就连人工智能领域的大牛吴恩达教授在2003年的公开课花了2节课的时间讲解SVM的推导,而对于神经网络只用了不到20分钟带过。在2012年coresea新的人工智能公开课上面反而SVM用了不到一节课的时间讲解,神经网络却用了2节课的时间进行算法介绍,可见科学家们对神经网络越来越重视。并且随着CPU和GPU的速度不断提升之下,带来了性能上的飞跃、也带来存储上的飞跃,让深度神经网络变得更加可算,于是从2010年开启了深度学习的大门。




AlexNet





2012年,AlexKrizhevsky发表了AlexNet,相对比LeNet它的网络层次更加深,从LeNet的5层到AlexNet的7层,更重要的是AlexNet还赢得了2012年的ImageNet竞赛的第一。AlexNet不仅比LeNet的神经网络层数更多更深,并且可以学习更复杂的图像高维特征。

AlexNet小结




  • 使用ReLU函数作为激活函数,降低了Sigmoid类函数的计算量;


  • 利用dropout技术在训练期间选择性地剪掉某些神经元,避免模型过度拟合;


  • 引入max-pooling技术;


  • 利用双GPU NVIDIA GTX 580显著减少训练时间;


神经网络轻量化框架 神经网络 框架_深度学习_04





GPU提供越来越强悍的性能,同时允许超过10x倍数的训练增长时间,于是可以处理越来越大的图片和越来越庞大的数据集。暴风雨来临了,AlexNet的成功开始了一场小革命,卷积神经网络CNN现在是深度学习的主力,于是有人称“网络越复杂处理的任务越厉害”。

Network-in-network




2013年年尾,Min Lin提出了在卷积后面再跟一个1x1的卷积核对图像进行卷积,这就是Network-in-network的核心思想了。NiN在每次卷积完之后使用,目的是为了在进入下一层的时候合并更多的特征参数。同样NiN层也是违背LeNet的设计原则(浅层网络使用大的卷积核),但却有效地合并卷积特征,减少网络参数、同样的内存可以存储更大的网络。

Min Lin的NiN论文,他们说这个“网络的网络”(NIN)能够提高CNN的局部感知区域。例如没有NiN的当前卷积是这样的:3x3 256 [conv] -> [maxpooling],当增加了NiN之后的卷积是这样的:3x3 256 [conv] -> 1x1 256 [conv] -> [maxpooling]。


神经网络轻量化框架 神经网络 框架_卷积_05

MLP多层感知的厉害之处就在于它把卷积特征结合起来成为一个更复杂的组合,这个思想将会在后面ResNet和Inception中用到。



VGG




2014年是个绽放年,出了两篇重要的论文:VGG、GoogLeNet。

VGG网络是第一个在每个卷积层使用更小的3×3卷积核对图像进行卷积,并把这些小的卷积核排列起来作为一个卷积序列。通俗点来讲就是对原始图像进行3×3卷积,然后再进行3×3卷积,连续使用小的卷积核对图像进行多次卷积。

VGG一开始提出的时候刚好与LeNet的设计原则相违背,因为LeNet相信大的卷积核能够捕获图像当中相似的特征(权值共享)。AlexNet在浅层网络开始的时候也是使用9×9、11×11卷积核,并且尽量在浅层网络的时候避免使用1×1的卷积核。但是VGG的神奇之处就是在于使用多个3×3卷积核可以模仿较大卷积核那样对图像进行局部感知。后来多个小的卷积核串联这一思想被GoogleNet和ResNet等吸收。

VGG使用多个3x3卷积来对高维特征进行提取。因为如果使用较大的卷积核,参数就会大量地增加、运算时间也会成倍的提升。例如3x3的卷积核只有9个权值参数,使用7*7的卷积核权值参数就会增加到49个。因为缺乏一个模型去对大量的参数进行归一化、约减,或者说是限制大规模的参数出现,因此训练核数更大的卷积网络就变得非常困难了。

VGG相信如果使用大的卷积核将会造成很大的时间浪费,减少的卷积核能够减少参数,节省运算开销。虽然训练的时间变长了,但是总体来说预测的时间和参数都是减少的了。


神经网络轻量化框架 神经网络 框架_卷积_06

GoogleNet




2014年,在google工作的Christian Szegedy为了找到一个深度神经网络结构能够有效地减少计算资源,于是有了这个GoogleNet了(也叫做Inception V1)。

2014年尾到现在,深度学习模型在图像内容分类方面和视频分类方面有了极大的应用。在这之前,很多一开始对深度学习和神经网络都保持怀疑态度的人,现在都涌入深度学习的这个领域,理由很简单,因为深度学习不再是海市蜃楼,而是变得越来越接地气。就连google等互联网巨头都已经在深度学习领域布局,成立了各种各样的额人工智能实验室。

Christian在思考如何才能够减少深度神经网络的计算量,同时获得比较好的性能的框架。即使不能两全其美,退而求其次能够保持在相同的计算成本下,能够有更好的性能提升这样的框架也行。于是后面Christian和他的team在google想出了这个模型:


神经网络轻量化框架 神经网络 框架_卷积核_07

1×1,3×3和5×5卷积核的并行合并。但是,最重要的是使用了1×1卷积核(NiN)来减少后续并行操作的特征数量。这个思想现在叫做“bottleneck layer”。


Inception-V3




Christian的团队确实很厉害,2015年2月他们又发表了新的文章关于在googleNet中加入一个Batch-normalized层。Batch-normalized层归一化计算图层输出处所有特征图的平均值和标准差,并使用这些值对其响应进行归一化。这对应于“白化”数据非常有效,并且使得所有神经层具有相同范围并且具有零均值的响应。这有助于训练,因为下一层不必学习输入数据中的偏移,并且可以专注于如何最好地组合特征。


2015年12月,他们发布了一个新版本的GoogLeNet(Inception V3)模块和相应的架构,并且更好地解释了原来的GoogLeNet架构,GoogLeNet原始思想:


  • 通过构建平衡深度和宽度的网络,最大化网络的信息流。在进入pooling层之前增加feature maps;


  • 当网络层数深度增加时,特征的数量或层的宽度也相对应地增加;


  • 在每一层使用宽度增加以增加下一层之前的特征的组合;


  • 只使用3x3卷积;


因此最后的模型就变成这样了:


神经网络轻量化框架 神经网络 框架_卷积_08


GoogleNet一样使用pooling层+softmax层作为最后的分类器。



ResNet




2015年12月ResNet发表了,时间上大概与Inceptionv3网络一起发表的。其中ResNet的一个重要的思想是:输出的是两个连续的卷积层,并且输入时绕到下一层去。这句话不太好理解可以看下图。


神经网络轻量化框架 神经网络 框架_神经网络轻量化框架_09

2层之后绕过是一个关键,因为绕过单层的话实践上表明并没有太多的帮助,然而绕过2层可以看做是在网络中的一个小分类器!看上去好像没什么感觉,但这是很致命的一种架构,因为通过这种架构最后实现了神经网络超过1000层。傻了吧,之前我们使用LeNet只是5层,AlexNet也最多不过7层。


神经网络轻量化框架 神经网络 框架_卷积_10

1x1卷积然后输出原来特征数的1/4,然后使用3×3的卷积核,然后再次使用1x1的卷积核但是这次输出的特征数为原来输入的大小。如果原来输入的是256个特征,输出的也是256个特征,但是这样就像Bottleneck Layer那样说的大量地减少了计算量,但是却保留了丰富的高维特征信息。

ResNet一开始的时候是使用一个7x7大小的卷积核,然后跟一个pooling层。当然啦,最后的分类器跟GoogleNet一样是一个pooling层加上一个softmax作为分类器。下图左边是VGG19拥有190万个参数,右图是34层的ResNet只需要36万个参数:


神经网络轻量化框架 神经网络 框架_神经网络轻量化框架_11

ResNet网络特征





  • ResNet可以被看作并行和串行多个模块的结合;


  • ResNet上部分的输入和输出一样,所以看上去有点像RNN,因此可以看做是一个更好的生物神经网络的模型;




SqueezeNet




2016年11月才发表的文章,直接说SqueezeNet有着跟AlexNet一样的精度,但是参数却比Alex少了接近50倍并且参数只需要占用很小的内存空间。这里的设计就没有SegNet或者GoogleNet那样的设计架构惊艳了,但SqueezeNet却是能够保证同样的精度下使用更少的参数。


神经网络轻量化框架 神经网络 框架_卷积_12

Xception




Xception模型使用与ResNet和Inception V4一样简单且优雅的架构,并且改进了Inception模型。

Xception模型我们可以看出来Xception模型的架构具有36个卷积层,与ResNet-34非常相似。但是模型的代码与ResNet一样简单,并且比Inception V4更容易理解。


神经网络轻量化框架 神经网络 框架_卷积_13




总结




AlexNet一类的模型没有考虑太多权重参数的问题,因此圆圈比较大。

AlexNet只是希望用深度网络能够找到更多图像当中的高维特征,后来发现当网络越深的时候需要的参数越多,硬件总是跟不上软件的发展,这个时候如果加深网络的话GPU的显存塞不下更多的参数,因此硬件限制了深度网络的发展。为了能够提高网络的深度和精度,于是大神们不断地研究,尝试使用小的卷积核代替大的卷积核能够带来精度上的提升,并且大面积地减少参数,于是网络的深度不再受硬件而制约。

2-3年我们能够亲眼目睹比现有网络更深、精度更高、运算时间更少的网络出现。因为硬件也在快速地发展,特斯拉使用的NVIDIA Driver PX 2的运算速率已经比现在Titan X要快7倍。