查看原文
其他

深度学习背景下的神经网络架构演变

极市平台 2019-03-28

↑ 点击蓝字关注极市平台 识别先机 创造未来


来源:论智

作者:Eugenio Culurciello

编译:weakish



深度神经网络和深度学习是强大、流行的算法。它们的成功常常源于神经网络架构的精心设计。

我想重温过去几年深度学习背景下的神经网络设计史。



我们(译者注:Alfredo Canziani、Adam Paszke、Eugenio Culurciello)在预印本文库上发表的An Analysis of Deep Neural Network Models for Practical Applications对本文提到的所有神经网络进行了更深入的分析和比较,可供参考。其中一张代表性的图片:



上图展示了在多个流行的神经网络架构的top-1精确度和单个前馈传播所需要的运算量。



LeNet5


Yann LeCun在1994年提出的LeNet5,是首次出现的卷积神经网络之一,推动了深度学习领域的发展。



LeNet5的架构是基础性的,特别是其中的两大洞见:图像特征分布在整张图像上,基于可学习参数的卷积是使用更少参数提取多个位置上的相似特征的有效方法。当时没有用于训练的GPU,CPU也很慢。因此能够节省参数和计算在当时是一个关键优势。LeNet5和将每个像素作为一个大型多层神经网络的单独输入的做法截然相反。LeNet5说明,由于图像是高度空间相关的,使用图像的单个像素作为单独输入特征无法利用这些相关性。


LeNet5的特性:

  • 卷积网络使用一个3层的序列:卷积、池化、非线性——这可能是自这篇论文以来面向图像的深度学习的关键特性!

  • 使用卷积提取空间特征

  • 使用映射的空间均值进行降采样

  • tanh或sigmoids非线性

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

  • 层间的稀疏连接矩阵以避免巨大的计算开销


总之,这一网络是近年来许多架构的源头,对这一领域中的许多人而言,这是一个真正的启发。



空当


1998年到2010年是神经网络的孵化期。大多数人没有注意到它们日益增长的力量,而许多其他研究人员缓慢地取得进展。随着手机拍摄和廉价数码相机的兴起,我们得到了越来越多的可用数据。算力也在不断提高,CPU越来越快,GPU成为通用计算工具。这两个趋势推动了神经网络的进展,尽管进展速度很慢。数据和算力使神经网络解决的任务变得越来越有趣。



Dan Ciresan Net


2010年,Dan Claudiu Ciresan和Jurgen Schmidhuber发表的Dan Ciresan Net是最早的GPU神经网络实现之一。Dan Ciresan Net在NVIDIA GTX 280上实现了前馈传播和反向传播,神经网络不超过9层。



AlexNet


2012年,Alex Krizhevsky发表了AlexNet,LeNet更深、更广的版本。AlexNet在困难的ImageNet竞赛中遥遥领先。



AlexNet将LeNet的洞见扩展到一个大得多的网络,该网络可以用于学习更复杂的对象和对象层级关系。这一工作的贡献是:

  • 使用ReLU作为非线性

  • 使用dropout技术选择性地忽略训练中的单个神经元,避免模型的过拟合

  • 重叠最大池化(overlapping max pooling),避免平均池化(average pooling)的平均效应

  • 使用NVIDIA GTX 580 GPU减少训练时间


当时,GPU比CPU提供了更多的核心,可以将训练速度提升10倍,从而允许使用更大的数据集和更大的图像。


AlexNet的成功开启了一场小革命。卷积神经网络成为深度学习的主力,深度学习是“可以完成有用任务的大型神经网络”的新名字。



Overfeat


2013年12月,Yann LeCun领导的NYU实验室提出了Overfeat,一个AlexNet的衍生物。这篇论文也提出了学习包围盒,成为之后许多其他论文的主题。我认为学习切分对象比学习人工包围盒更好。



VGG


Oxford的VGG网络率先在每个卷积层中使用了更小的3x3过滤器,将其组合为卷积序列。


这看起来违背了LeNet的原则,在LeNet中,大型的卷积用来刻画图像的相似特征。VGG没有使用AlexNet的9x9或11x11过滤器,VGG使用的过滤器开始变小了,和LeNet想要避免的不知名的1x1卷积太过接近了,至少在网络的表层是这样。然而,VGG的巨大进展是发现多个3x3卷积序列可以模拟更大、更具容受性的结构,例如5x5和7x7的卷积。这些想法也在近期的网络架构中得到了应用,例如Inception和ResNet。



VGG网络使用多个3x3卷积层来表示复杂的特征。注意上表VGG-E的3、4、5块:多次使用256x256和512x512的3x3过滤器构成序列,以提取更复杂的特征,以及这些特征的组合。这相当于3个大型的带有512x512过滤器的卷积层!显然这导向了大量的参数,以及更强的学习能力。然而,由于很难训练这些网络,需要将其拆分成逐层叠加的小型网络。这是因为缺乏正则化模型的强力方法,某种程度上这限制了大量参数提供的巨大搜索空间。


VGG使用多层巨大的特征尺寸,因而运行时推断的开销很大。后来的Inception的瓶颈层降低了特征的数量,从而节省了计算开销。



Network-in-network


Network-in-network(NiN,网中网)提出了伟大而简单的洞见,使用1x1卷积为卷积特征层提供更多的计算能力。


NiN架构在每一卷积后使用空间MLP层,以便在另一层之前更好的组合特征。同样,有人可能认为1x1卷积违背了LeNet的原则,但事实上1x1卷积确实有助于以更好的方式组合卷积特征,这无法通过简单地堆叠更多的卷积层来达成。这和使用原始像素作为下一层的做法不同。这里1x1的卷积用来在空间上组合卷积后特征映射上的特征,所以它们实际上使用非常少的参数,在所有像素间共享这些特征!



通过将卷积特征组合成更复杂的特征组,MLP的能力可以大大增强单个卷积特征的效用。最近的架构同样使用了这一想法,例如ResNet、Inception及其衍生物。


NiN也使用平均池化层作为最终的分类器的组成部分,另一个在之后的架构中变得常见的做法。这是为了在分类前平均网络对多张输入图像的反应。



Google 和 Inception


Google的Christian Szegedy开始探索减少深度神经网络的计算负担,提出了第一个Inception架构GoogLeNet。


到2014年秋为止,深度学习模型在分类图像与视频帧方面变得极其有用。大多数怀疑者已经放下了疑心,深度学习与神经网络这次是真的回归了,并将持续下去。鉴于这些技术的用处,Google这样的互联网巨头非常有兴趣面向他们的服务器农场设计高效的大规模部署架构。


Christian考虑了很多在保持深度神经网络的最先进表现(例如在ImageNet上的表现)的前提下,减轻其计算负担的方式。或者维持现有的计算开销的前提下改进表现。



他和他的团队提出了Inception模块:



乍看起来,这基本上是1×1、3×3、5×5卷积过滤器的并行组合。但是Inception的伟大洞见是用1×1的卷积块(NiN)在昂贵的并行模块之前减少特征的数量。这通常被称为“瓶颈(bottleneck)”。下面的“瓶颈层(bottleneck layer)”一节将具体解释。


GoogLeNet使用不带inception模块的主干作为初始层,之后是与NiN类似的一个平均池化层与softmax分类器。相比AlexNet和VGG,这个分类器的运算数量极少。这也促成了一种非常高效的网络设计。



瓶颈层


受NiN的启发,Inception的瓶颈层减少了每一层的特征数量,从而减少了运算量;因此得以保持较低的推断时间。在将数据传入昂贵的卷积模块前,特征的数量会减少,比方说,4倍。这大大节省了计算开销,也导致了架构的成功。


让我们验证下细节。假设你有256个特征输入,256个特征输出,同时假设Inception层只执行3×3的卷积。这意味着总共要进行 256×256×3×3的卷积(589000次乘积累加(MAC)运算)。这可能超出了我们的计算预算,比方说,在Google服务器上花0.5毫秒运行该层。作为替代,我们决定减少需要卷积的特征的数量,比如减少到64(256/4)个。在这种情况下,我们首先进行256到64的1×1卷积,然后在所有Inception的分支上进行64次卷积,接着再使用一个64到256的1×1卷积。现在运算如下:

  • 256×64×1×1 = 16000

  • 64×64×3×3 = 36000

  • 64×256×1×1 = 16000s


现在的计算量大约是70000,相比之前的约600000,几乎减少了10倍。


而且,尽管我们进行了更少的运算,我们在此层上并没有损失其概括性。事实证明瓶颈层在ImageNet这样的数据集上的表现达到了最先进的水平,而且瓶颈层也被用于之后出现的一些架构,比如ResNet。


瓶颈层取得成功的原因是输入特征是相关的,因此可通过1×1卷积适当结合以减少冗余。然后,对数量较少的特征进行卷积,并在下一层再次扩展成有意义的组合。



Inception V3(和V2)


Christian和他的团队是非常高产的研究人员。2015年2月,他们引入了作为Inception V2的Batch-normalized Inception。批量归一化(batch-normalization)在一层的输出上计算所有特征映射的均值和标准差,基于这些值归一化神经网络层的响应。这相当于“漂白”了数据,使所有神经映射在同一范围内响应,同时均值为零。这有助于训练,因为下一层不需要从输入数据中学习偏移量,得以重点关注如何最好地结合特征。


2015年12月,他们发布了Inception模块的新版本及相应的架构。这篇论文更好地解释了原始的GoogLeNet架构,给出了更多设计选择的细节。原本的想法如下:

  • 平衡深度与宽度,小心地构建网络,从而最大化进入网络的信息流。每次池化前,增加特征映射。

  • 当深度增加时,特征数量和网络层宽度也同步增加。

  • 在每一层增加宽度,以便在下一层之前增加特征的组合。

  • 在可能的情况下只使用3×3的卷积,因为5×5和7×7的过滤器能分解为多个3×3的卷积。见下图:



  • 因此新的Inception模块变为:



  • 过滤器也可以通过扁平化卷积分解为更复杂的模块:



  • 在进行inception运算时,inception模块也可以通过提供池化缩减数据的尺寸。这基本上等于基于一个简单的池化层并行跨距进行卷积操作。



Inception仍然使用池化层和softmax作为最终分类器。



ResNet


2015年12月,大约在Inception V3提出的同时,ResNet出世了,掀起了网络架构的革命。ResNet(残差网络)的想法很简单:将两个连续的卷积层的输出加上跳过了这两层的输入传给下一层。



这和之前的一些想法(比如这个)类似。ResNet跳过了两个网络层,并应用于更大规模的网络。跳过2层是一个关键的直觉,因为跳过1层并没有带来多少提升。2层网络可能被看成一个小型的分类器,或者一个网中网(Network-In-Network)!


这也是第一次训练超过一百,甚至一千层的网络。


具有海量网络层的ResNet开始使用一个瓶颈层,与Inception的瓶颈层类似:




这一层首先使用输出较小(通常是输入的 1/4)的1×1卷积,接着是一3×3的层,再接着是更多特征的1×1层,从而减少每一层的特征数量。和在Inception模块中的情形一样,这允许保持运算量处于较低水平的前提下,提供丰富的特征组合。参考“瓶颈层”一节(“GoogLeNet和Inception”一节之后)。


ResNet在输入(主干)上使用一个相当简单的初始层:一个7x7的卷积层,之后是2个池化。和使用更复杂、不那么直观的主干的Inception V3、V4大相径庭。


Inception也使用池化层和softmax作为最终分类器。


每天都产生关于ResNet的更多洞见:

  • ResNet既可以被看成并行的模块,也可以被看成序列化的模块。输入并行地进入多个模块,而每个模块的输出以序列化的方式连接。

  • ResNet也可以被看成并行或连续模块的多个系综。

  • ResNet通常在相对较浅的20-30层的网络块上以并行的方式运行,而不是序列化地流过整个网络。

  • 当ResNet像RNN一样把输出反向传播到输入时,该网络可以被看成更好的生物学上可解释的皮层模型。



Inception V4


Christian与其团队又提出了Inception的一个新版本。


Inception V4模块主干之后的部分和Inception V3很相似:



Inception V4也结合了ResNet模块:



不过,这次提出的方案,在我看来,不那么优雅,也更复杂了,充满了不那么透明的启发。其中的选择难以理解,作者也难以论证。


因此,基于这点考虑,我们认为ResNet更为优秀,因为它是一个易于理解和修改的简明清晰的网络。



SqueezeNet


最近发表的SqueezeNet重新整理了ResNet与Inception之中的许多概念,表明一个更好的架构设计无需复杂的压缩算法就能实现较小的网络尺寸和较少的参数数目。



ENet


我们组建了一个团队,结合最近的架构的所有特性,构建一个非常高效的轻量网络,该网络使用很少的参数和计算就能达到最先进的结果。该网络架构被称为ENet,由Adam Paszke设计。我们已经将其用于像素层次的标注和场景解析。这里是一些展示ENet效果的视频。这些视频展示的是在训练集之外的数据上的表现。


这里是ENet的技术报告。ENet是一个由编码器和解码器组成的网络。编码器是一个常规的用于分类的CNN,解码器是一个升采样网络,将分类反向传播到原始图像尺寸以切分图像。图像切分只使用了神经网络,没有使用其他算法。



你可以看到,在所有的神经网络中,折算参数数量后,ENet的精确度最高!


ENet从一开始就被设计为尽可能使用最小数目的资源。就此而言,它的尺寸很小,在16浮点精度下,编码器和解码器网络总共只使用0.7 MB。即使在这样小的尺寸下,ENet在切分精度上也达到或超过了其他纯神经网络方案。



模块分析


有一篇论文对各CNN模块进行了系统分析,提出了一些有益的发现:

  • 使用ELU非线性,但不使用批量归一化或ReLU。

  • 应用一个学习过的RGB彩色空间转换。

  • 使用线性学习率衰减策略。

  • 使用平均和最大池化层的和。

  • 使用约128或256的mini-batch大小。如果你的GPU无法承受这么大的batch,等比例缩小batch,并据此降低学习率。

  • 使用全连接层作为卷积,并平均其预测以得出最后的结果。

  • 计划增加训练集大小的时候,检查下是否未曾到达高原。

  • 数据的清洁度比数据的尺寸更重要。

  • 如果你不能增加输入图像的尺寸,减少作为结果的层的跨距(stride),大致上效果一样。

  • 如果你使用的网络是高度优化的复杂架构,例如GoogLeNet,谨慎修改。



XCeption


Xception改进了inception模块和架构,基于一个更为简单优雅的架构达到了ResNet和Inception V4的表现。


Xception模块如下所示:



这一网络架构上的简单性和优雅性将受到任何人的喜爱,如下所示:



这一架构有36个卷积阶段,和ResNet-34有些类似。Xception的模型和代码和ResNet一样简单,比Inception好理解太多。


这里有一个Torch7的实现。这里则是一个Keras/TF的实现。


有趣的是,我们的工作使用了可分卷积过滤器,最近的Xception架构受此启发,同样使用了可分卷积过滤器。



MobileNets


2017年4月,出现了一个新的MobileNets架构。该架构使用可分卷积以减少参数数目。可分卷积和前文提及的Xception相同。论文声称大大减少了参数——据论文报告,FaceNet案例中参数减少了一半。下面是该模型的完整架构:



不幸的是,我们在实际应用中测试了这个网络,发现在Titan Xp GPU上,batch尺寸为1张图像的情况下,这一网络异常缓慢。下面是单张图片的推断时间的比较:

  • resnet18: 0.002871

  • alexnet: 0.001003

  • vgg16: 0.001698

  • squeezenet: 0.002725

  • mobilenet: 0.033251


很清楚,MobileNets不是快速推断的竞争者!它可能降低了网络的参数数量和在硬盘上的尺寸,但并不可用。



其他值得关注的架构


FractalNet使用递归架构,在此之前,没有人在ImageNet上尝试过递归架构。FractalNet是ResNet的衍生物,或者说,ResNet的泛化版本。



未来


我们相信,打造神经网络架构对深度学习领域的进展至关重要。我们强烈建议仔细阅读并理解本文提到的所有论文。


但有人现在可能会想,为什么我们不得不花费这么多时间来打造架构,为什么我们不让数据来告诉我们要使用什么架构,以及如何组合模块。这个想法很好,但现在尚处于研究之中。这里有一些有趣的初步结果。


同时注意,我们这里主要讨论了用于计算机视觉的架构。其他领域也发展了类似的神经网络架构,研究所有其他任务的架构演化也很有趣。


我们最近的论文比较了上述神经网络架构及其计算性能,如果你对此感兴趣,请参阅我们的论文。(论文链接:https://arxiv.org/abs/1605.07678



致谢


本文受到了与Abhishek Chaurasia、Adam Paszke、Sangpil Kim、Alfredo Canziani及Purdue大学e-Lab的其他人的讨论的启发。





- 推荐分享 -


本周四(今晚)20点,电子科技大学张锋博士将为大家分享人体姿态估计相关内容

关注公众号后回复“24”即可参与分享~



    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存