随着深度学习的普及开来,设计一个网络结构变得越来越“简单”,如果一个新的网络只是简单的卷积、池化、全连接,改改其中的参数,那就大错特错了。所以网络在应用中,往往要面临的问题是:如何设计一个好的网络结构。
目前常见的网络结构:AlexNet、ZF、GoogLeNet、VGG、ResNet等等都可谓曾一战成名,它们都具有自身的特性,它们都提出了创新点。设计一个优秀网络的第一步是学习这些优秀的网络。
LeNet
是由Yann LeCun完成的具有开拓性的卷积神经网络,是大量网络结构的起点。网络给出了卷积网络的基本特性:
1.局部感知。人对外界的认知是从局部到全局的,相邻局部的像素联系较为紧密。每个神经元没必要对全局图像进行感知,只需要对局部进行感知,然后更高层将局部的信息综合起来得到全局的信息。
2.多层卷积。层数越高,学到的特征越全局化。
3.参数共享。每个卷积都是一种提取特征的方式,大大降低了参数的数目。
4.多卷积核。提取多类特征,更为丰富。
5.池化。降低向量维度,并避免过拟合。
特性1自然引出了特性2,特性3自然引出了特性4。
网络用于mnist手写体识别任务,网络结构用 http://ethereon.github.io/netscope/#editor 查看,常见网络:http://ethereon.github.io/netscope/quickstart.html 。down
AlexNet
2012年,深度学习崛起的元年,Alex Krizhevsky 发表了Alexet,它是比LeNet更深更宽的版本,并以显著优势赢得了ImageNet竞赛。贡献有:
1.使用RELU作为激活单元。
2.使用Dropout选择性忽略单个神经元,避免过拟合。
3.选择最大池化,避免平均池化的平均化效果。
AlexNet是目前应用极为广泛的网络,结构讲解见:http://blog.csdn.net/sunbaigui/article/details/39938097。 down
网络整体上给我们带来了三个结构模块:
1、单层卷积的结构:conv-relu-LRN-pool。前面的卷积步长大,快速降低featureMap的大小(较少后面的计算量),后面深层卷积保持featureMap大小不变。LRN的功能放在今天来看是无关痛痒的,并不是很强。
2、多层卷积的结构,网络更深,特征更抽象。
3、全连接的结构,drop避免过拟合。down
CaffeNet
AlexNet网络的变体,网络结构的变动主要是调整了pool和norm的位置。 down
ZFNet
由 Matthew D Zeiler和Rob Fergus于2013年在“Visualizing and Understanding Convolutional Networks”论文中提出,属于AlexNet网络的变体。论文具有重要意义,阐述了卷积网络为什么有效,ZF网络是他们顺带提出来的。ZF在faster rcnn等应用中做为特征提取模块被广泛应用,一般来讲比AlexNet略优。
主要的改动是:减少第一层卷积的size和stride(11->7、4->2),提取更多的底层特征,增加第二层卷积的步长stride(1->2)。从而取得到了和AlexNei基本相同的感知野,featureMap的大小相同,后面的卷积计算量也保持不变。 down
VGG
VGG-16又称为OxfordNet,是由牛津视觉几何组(Visual Geometry Group)开发的卷积神经网络结构。该网络赢得了ILSVR(ImageNet)2014的冠军。时至今日,VGG仍然被认为是一个杰出的视觉模型——尽管它的性能实际上已经被后来的Inception和ResNet超过了。
网络结构:http://ethereon.github.io/netscope/#/preset/vgg-16
我们就看D(VGG16)和E(VGG19)好了。因为前面的网络效果没有D和E的效果好,而且比起D和E来讲不够简洁。
VGG是把网络分为5组(模仿AlexNet的五层),然而它使用了3*3的过滤器,并把它们组合起来作为一个卷积序列进行处理。特征:
1.网络更深DCNN,channel数目更大。
2.采用多个3*3的卷积,模仿出更大的感受野的效果。这些思想也被用在了后续的网络架构中,如 Inception 与 ResNet。
NIN
NIN中的MLPconv是对conv+relu的改进,conv+relu构建的是一个广义线性模型。举例子解释:假设现在有一个3x3的输入,用一个9维的向量x代表,卷积核大小也是3x3,也9维的向量w代表。
1.对于常规卷积层,直接x和w求卷积,然后relu一下就好了。
2.maxout,有k个的3x3的w(这里的k是自由设定的),分别卷积得到k个1x1的输出,然后对这k个输入求最大值
3.NIN,有k个3x3的w(这里的k也是自由设定的),分别卷积得到k个1x1的输出,然后对它们都进行relu,然后再次对它们进行卷积,结果再relu。(这个过程,等效于一个1*1的卷积网络)
maxout想表明它能够拟合任何凸函数,也就能够拟合任何的激活函数;NIN想表明它不仅能够拟合任何凸函数,而且能够拟合任何函数。
使用多层感知机这种微网络结构后,可以抽象出更好的局部特征,增加局部模型的表达能力。基于MLPconv,在最后类别输出时可以不采用全连接操作,而是将特征图和类别之间建立一致性,采用全局平均池化的方法,每个特征图的平均值即为每个类别的置信度。
例如:一共有100类,那么在最后一层的输出feature map则为100,计算这100张feature map的平均值,作为这100类的置信度。
NIN的优点:
1.更好的局部抽象能力,这是MLPconv带来的。
2.全局平均池化,不需要全连接的参数优化,避免过拟合。
3.参数更少,模型更小。
网络结构见:http://ethereon.github.io/netscope/#/preset/nin
GoogLeNet
Christian Szegedy开始追求减少深度神经网络的计算开销,并于2014年设计出 GoogLeNet——第一个 Inception 架构。
“Going Deeper with Convolutions”中google提出了Inception模块:
受NIN的启发,Inception的思路是减少每一层的特征过滤器的数目,从而减少运算量。用 1*1的卷积块在昂贵的并行模块之前减少特征的数量,比 AlexNet 与 VGG 的分类器的运算数量少得多。这种做法一般称为瓶颈层(Bottleneck)。
而且,尽管我们做了更好的运算,我们在此层也没有损失其通用性(generality)。事实证明瓶颈层在 ImageNet 这样的数据集上已经表现出了顶尖水平,而且它也被用于接下来介绍的 ResNet 这样的架构中。
它之所以成功是因为输入特征是相关联的,因此可通过将它们与 1×1 卷积适当结合来减少冗余。然后,在小数量的特征进行卷积之后,它们能在下一层被再次扩展成有意义的结合。down
Inception
Christian 和他的团队都是非常高产的研究人员。2015 年 2 月,Batch-normalized Inception 被引入作为 Inception V2(论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift)。Batch-normalization 在一层的输出上计算所有特征映射的均值和标准差,并且使用这些值规范化它们的响应。因此使得所有神经图(neural maps)在同样范围有响应,而且是零均值,这有助于训练,还能重点关注如何最好的结合这些特征。
2015 年 12 月,该团队发布 Inception 模块和类似架构的一个新版本V3(论文:Rethinking the Inception Architecture for Computer Vision)。该论文更好地解释了原始的 GoogLeNet 架构,在设计选择上给出了更多的细节。
1.通过谨慎建筑网络,平衡深度与宽度,从而最大化进入网络的信息流。
2.当深度增加时,网络层的深度或者特征的数量也系统性的增加。使用每一层深度增加在下一层之前增加特征的结合。
3.只使用 3×3 的卷积,可能的情况下给定的 5×5 和 7×7 过滤器能分成多个 3×3。新的Inception结构为:
也可以通过将卷积平整进更多复杂的模块中而分拆过滤器:将3*3拆分为3*1和1*3的两个过滤器。在进行 inception 计算的同时,Inception 模块也能通过提供池化降低数据的大小。
ResNet
2015 年 12 月又出现了新的变革,这和 Inception V3 出现的时间一样。ResNet 有着简单的思路:供给两个连续卷积层的输出,并分流(bypassing)输入进入下一层(论文:Deep Residual Learning for Image Recognition),在imagenet2015夺得冠军。
计算机视觉领域,特征随着网络加深而愈加抽象,而且深层网络也会带来梯度弥散/爆炸等问题。而且在实践中,深层网络(很深)的性能会劣于浅层网络,这反映了一个事实:非线性网络无法逼近恒等映射网络(y=x)。所以我们转而去学习恒等映射的扰动。
ResNet要学习的便是残差函数:,残差块的结构是:
这是第一次网络层数超过一百,甚至还能训练出 1000 层的网络。实际中,考虑计算的成本,对残差块做了计算优化,即将两个3x3的卷积层替换为1x1 + 3x3 + 1x1。
通过首先是由带有更小输出(通常是输入的 1/4)的 1×1 卷积较少特征的数量,然后使用一个 3×3 的层,再使用 1×1 的层处理更大量的特征。类似于 Inception 模块,这样做能保证计算量低,同时提供丰富的特征结合。
Inception V4
Inception V4 也结合了 Inception 模块和 ResNet 模块:
满满的启发式应用,很难给出良好的解释,考虑到网络的间接性,ResNet就很不错了。