Press "Enter" to skip to content

神经网络架构

深度神经网络和深度学习是强大并流行的算法。它们所取得的成功源自于对于神经网络架构的精细设计。
我想在深度学习的环境中重温一下过去几年神经网络设计的历史。
有关此处讨论的关于神经网络的更为深入的分析和比较,请阅读我们最近的文章。这篇文章中的一个具有代表性的表格如下:

LeNet5

卷积神经网络(CNN)推动了深度学习领域的发展,而出现在1994年的LeNet5是最早的CNN之一。Yann LeCun的这项开创性的工作在1988年以来的多次成功迭代之后被命名为LeNet5.

LeNet5架构是基础性的,尤其是关于图像的特征是分布在整个图像上的洞见和 【具备可学习参数的卷积操作】 【是用少量参数】 在多个区域提取相似特征的有效的方式。那时候还没有使用GPU来辅助训练,并且GPU也很慢。因此能够节省参数和计算是一个关键优势。这与使用单个像素作为单独输入的大规模的多层神经网络的情况正好相反。LeNet5说明了那些做法不应该在第一层使用,因为图像是高度空间相关的,而使用图像的单个像素作为单独的输入特征并不会利用到这些像素空间相关的优势。
LeNet5的特征可以总结如下:

  • 卷积神经网络有3层:卷积层、池化层和非线性层。从这篇论文之后,这些方法可能是利用深度学习方法对图片进行处理的关键特征。
  • 使用卷积提取空间特征
  • 使用了空间平均的子样本
  • 使用了tanh或者sigmoid非线性函数
  • 多层神经网络(多层感知器MLP)作为最后的分类器
  • 层与层之间使用了稀疏连接矩阵以避免大的计算开销

总而言之,这项工作是最近许多架构的起源,并且给了在这个领域的人很多灵感。

The gap

从1998年到2010年,神经网络正在孕育之中。许多人没有注意到它们慢慢增长的能力,而另一些研究者也进展缓慢。由于手机摄像头和廉价的数码相机的兴起,获得了越来越多的数据。硬件的计算能力也在增长,GPU变得更快,并且变成了一个通用计算工具。这些趋势使得神经网络不断发展,虽然缓慢。数据和计算力使得神经网络处理的问题越来越有趣。并且未来可期…

Dan Ciresan Net

在2010年,Dan Claudiu Ciresan 和 Jurgen Schmidhuber发表了GPU神经网络的第一个实现。他们在NVIDIA GTX 280图形处理器上训练了一个将前向传播和反向传播都实现了的9层的神经网络。

AlexNet

在2012年,Alex Krizhevsky发布了AlexNet,AlexNet是一个更深更宽的LeNet,并且在很大程度上赢得了困难的ImageNet比赛。

AlexNet将LeNet的洞见放大了,认为更大的神经网络可以学习到更复杂的对象特征和对象层次。这项工作的主要贡献如下:

  • 使用了ReLU非线性函数
  • 使用了的dropout技术在训练过程中选择性的忽略单个神经元,这是避免模型过拟合的一种方式
  • 重叠最大池化,避免平均池化的平均化影响
  • 使用GPUNVIDIA GTX 580 来减少训练时间

那时候GPU提供了远超过CPU的核心,并且带来10倍的训练时间加速,这又促进了使用更大的数据集和更大的图像。
AlexNet的成功带来了一场小的革命。CNN现在是深度学习的主力,而深度学习变成了“解决有趣的任务的更大的神经网络”新的名字。

Overfeat

在2013年12月,Yann LeCun所在的 NYU 实验室提出了Overfeat,这是AlextNet 的衍生物。这篇文章还提出了 learning bounding boxes ,后来又引发了许多关于同一主题的论文。我认为这种方法更适合于学习 segment object 而非 artificial bounding boxes 。

VGG

来自牛津大学的VGG网络最先在卷积层中使用了更小尺寸的 的卷积核,并且将它们组合为一个卷积序列。
这个方法似乎与LeNet的原理相反,后者使用大的卷积核来捕捉在图像中的相似的特征。不同于AlextNet的 或 的卷积核,卷积核开始变得更小,很快就要接近LeNet想要避免的 的大小,至少是在第一层快要接近。但是VGG最大的优势是关于多个 卷积核序列可以模拟更大感受野的效果,如 和 . 这些想法也被最近一些网络架构所使用,如Inception和ResNet。

VGG使用了多个 卷积层来表示复杂的特征。注意到VGG-E的3,4,5构建块: 、 和 大小的卷积核序列多次使用已提取更为复杂的特征和特征的组合。这实际上就像3层 的大分类器,这就是卷积。这显然相当于大量的参数,以及学习能力。但是训练这样的网络是很困难的,所以必须分成更小的网络,而这些网络的层(layer)是一层一层添加的。需要这样做的原因是缺乏强力的方法来对模型进行正则化,或者不知如何来限制由大量参数导致的巨大的搜索空间。
VGG在许多层都使用了大的特征尺寸,因此在运行时推理时成本很高。减少特征数量,正如Inception bottlenecks中所做的,会节省一些计算开销。

Network-in-network

Network-in-network(NiN) 具有使用 卷积来提供更强大的关于卷积层特征组合能力的洞见。
为了更好地在其它层之前组合特征,NiN架构在每个卷积后使用了洗漱MLP层。再一次可以认为 的卷积违反了LeNet的原则,但是实际上它们有助于以更好的方式组合卷积特征,而这通过简单的堆叠更多的卷积层是不可能做到的。这不同于使用原始像素作为下一层的输入。在这里 的卷积被用来在卷积之后来对特征映射的特征进行空间组合,所以它们能够使用很少的参数,在这些特征的所有像素之间共享。

MLP的强大功能可以通过将它们组合(combine)成更复杂的组(groups)来极大地提高单个卷积特征的有效性。这些想法在之后的大多数神经网络架构中,如ResNet、Inception和其他衍生。
NiN也使用了平均池化层作为最后分类器的一部分,这又是之后另一个常见的做法。这样做是为了在分类之前平均网络对多个输入图像的响应。

GoogLeNet and Inception

来自谷歌的Christian Szegedy开始寻求旨在减少神经网络计算负担的方法,并设计出了第一个Inception架构的GoogLeNet。
到目前为止,2014年秋季,深度学习模型在分类图像内容和视频帧中变得非常有用。许多怀疑论者都认为深度学习和神经网络这次回来了。鉴于这些技术的有效性,向谷歌这样的互联网巨头对于在他们的服务器上有效和大规模部署这些架构。
Christian 对于减少深度神经网络的计算负担并能获得最好的表现(例如在ImageNet上)思考了很多。或者在同样计算开销的前提下也能获得性能的改善。
他和他的队伍提出了Inception模块:

这第一眼看上去基本上是 , 和 大小的卷积核的并行化组合。但是inception模块的非凡的洞见是在昂贵的并行块之前使用了 大小的卷积块来减少特征的数量。这通常被称为“bottleneck”. 这值得使用单独一节来解释:见下面的“bottleneck layer”章。
GoogLeNet没有使用inception模块的初始层和类似于NiN的平均池化和softmax分类器。相较于AlexNet和VGG,这个分类器也是只需要非常少量的操作。这对于非常有效的网络设计也有贡献。

Bottleneck layer

由NiN得到的灵感,Inception的bottleneck层觉少了特征的数量,因此每一层的操作也相应减少,所以执行推理所花的时间能够保持在一个较低的水平。在将数据传递到昂贵的卷积模块之前,特征的数量减少了4倍。结果就是节省了大量的计算开销,所以最终也导致了这个架构的成功。
让我们详细研究一下。比如说现在我们有256个输入特征,256个输出特征,并且Inception层只进行 的的卷积。那就是说必须执行 此的卷积操作(589,000s乘法累加或MAC运算)。这也许超过我们在谷歌服务器上0.5ms的计算预算。换一种方式,我们决定减少必须要参与卷积的特征的数量,像是64或者 。这样,我们首先执行 的卷积,然后在所有的Inception分支上执行64次卷积,然后对来自 的特征再次执行 的卷积。这些操作如下:

现在只需要70,000操作,而之前我们需要执行600,000次操作。几乎减少了10倍的操作。
虽然我们减少了操作,并没有损失这层的泛化能力(losing generality)。实际上,bottleneck层被证明在诸如ImageNet的数据集上具有最好的表现,在之后像ResNet的架构中也使用了bottleneck层。
bottleneck成功的原因是输入的特征是相关的,因此使用 的卷积操作来将这些特征进行合适的组合可以去除冗余。之后经过具有更少数量特征的卷积层,对于下一层而言,它们可以再次扩展为更有意思的组合。

Inception V3 (and V2)

Christian和他的团队是非常有效率的研究者。在2015年2月, Batch-normalized Inception 被引入为Inception V2。Batch-normalization 在每一层的输出计算所有特征图的平均以及标准差,并且使用这些值来对它们的响应进行规范化。这相当于对数据进行“白化”,因此使得所有的神经映射的响应值都有相同范围,并且平均值为0。这有助于训练,因为下一层不需要学习输入数据的偏置,因此能够聚焦于如何最好的组合这些特征。
在2015年12月,他们发表了Inception模块的一个 新的版本以及相应的架构 。这篇文章更好的解释了原来GoogLeNet的架构,在设计选择上给出了更多的细节。原始的想法陈列如下:

  • 最大化进行入网络的信息流,通过仔细的构建能够平衡深度和宽度的网络。在每次池化之前,增加特征映射的数量。
  • 当深度增加时,特征的数量,或者说层的宽度也系统性的增加。
  • 在下一层之前,在每一层使用宽度增加来增加特征组合。
  • 只使用 的卷积,如果可能, 和 的卷积核可以使用多个 的卷积来分解。如下图:
  • 因此新的inception模块变成了:
  • 卷积核通过 flattened convolutions 变成更复杂的部分:
  • inception 模块通过在池化时进行inception计算也能减少数据的尺寸。这基本上与使用简单的池化层并行执行卷积(with strides)相同:

Inception 仍然使用了加上softmax法人池化层作为最后的分类器。

ResNet

演变来到了2015年12月,差不多与Inception V3同时。ResNet有一个简单的想法,绕过两个连续的卷积层直接将输入传到下一层。

这与这篇文章的想法很相似。但是他们绕过了两层并且应用到大尺度的网络上。绕过两层是一个关键直觉,因为绕过一层并没有得到很大的改进。通过两层可以看做一个小的分类器,或者Network-in-Network。
这也是第一次超过上百层甚至是1000层的网络能够被训练。
有很多层的ResNet开始使用类似于Inception bottleneck的bottleneck层:

通过首次使用带有更小输出(通常是输入的1/4)的 卷积,这个层觉少了在每一层的特征的数量,然后是一个 的层,接着通过 的卷积得到更多的特征。就像在Inception模块中一样,这使得计算开销很低,但是提供了更丰富的特征组合。见“GoogLeNet and Inception”这节之后的“bottleneck layer”节。
ResNet在输入时使用了一个相当简单的初始层:一个 的卷积层,接着是大小为2的池化层。这与在Inception V3、V4中更负责且不直观的输入相反。
ResNet也使用了加上softmax的池化层作为最后的分类器。
其他关于ResNet架构的洞见就很常见了:

  • ResNet既可以看成是并行模型,又可以看成是序列模型,只用把进入许多模块的输入看成是并行的,或者每个模块的输出看成是按照序列连接的。
  • ResNet也可以看做是 并行或序列模块的多个集成
  • 已经发现ResNet通常在相对低深度~20-30层的块上运行,这是并行的操作,而不是连续的流过整个网络的长度。
  • 当输出反馈到输入时,就像RNN,ResNet可以看做是一个更好的 bio-plausible model of the cortex 。

Inception V4

Christian 和他的团队再一次发布了新的Inception。
在Inception V4输入层之后的Inception模块和Inception V3非常类似:

他们也将Inception模块和ResNet模块结合在一起:

这次虽然解决方案在我看来不那么优雅和复杂,但也充满了不太透明的启发式。很难理解做出的选择,对于作者说调整它们也很难。
这次能够被简单的理解和调整的清晰而又简单的网络归于ResNet。

SqueezeNet

SqueezeNet最近被发表。它是来自ResNet和Inception的许多概念的重新哈希(re-hash),但是无论如何还是展现了一个更好的架构设计,而这个架构能够传送更小的网络尺寸和参数而不需要复杂的压缩算法。

ENet

我们的团队将最近架构的所有功能组合到一个非常高效和轻量级的网络中,该网络使用极少的参数和计算来实现最先进的结果。这个网络架构被称为ENet,由Adam Paszke所设计。我们使用它来执行 pixel-wise labeling 和 scene-parsing。这里是ENet的一些视频。这些视频不是训练集的一部分。
关于ENet的技术报告可在此处获得。ENet是一个编码器-解码器网络。编码器就是一个常规的CNN设计以进行分类,而解码器是一个上采样网络被设计为传播类别到原始图像的大小以执行分割(segmentation)。只使用了神经网络而没有使用别的算法来执行图像分割。

正如你在此图中所见,ENet在每个参数中使用的任何神经网络都具有最高的精度。
ENet旨在从一开始就使用尽可能少的资源。因此,它实现了如此小的占用空间,使得编码器和解码器网络一起仅占用具有fp16精度的0.7MB空间。即使在这么小的尺寸下,ENet在分割精度方面与其他纯神经网络解决方案相似或更高。

An analysis of modules

关于CNN架构的系统性的评估已经发表。其中的发现有利于使用:

  • 使用非线性ELU并且不加上batchnorm或者ReLU。
  • 使用一个关于RGB的学习的颜色空间变换。
  • 使用线性学习率衰减策略。
  • 使用一系列的平均和最大池化层。
  • 使用大小像是128或者256的mini-batch。如果这个对于你的GPU来说还是太大了,根据batch大小相应的降低学习率。
  • 使用全连接层作为卷积,并且对预测进行平均以做出最后的决策。
  • 在增加训练集大小时,检查是否未达到高原(plateau)。
  • 数据的清洁度(cleanliness )比大小更重要。
  • 如果不能增加输入图像的尺寸,减少后续层中的步幅(stride),它具有大致相同的效果。
  • 如果你的网络有一个复杂且高度优化的架构,像是GoogLeNet,一定要仔细的做出调整。

Xception

Xception用一个更简单且优雅的加否改善了inception模块和架构,并且与ResNet和Inception V4一样有效。
Xception模块如下:

考虑到架构的简洁和优雅,这个网络可以是任何人的最爱,如下所示:

该架构有36个卷积阶段,与ResNet-34相似。但是模型和代码和ResNet一样简单,并且比Inception V4更加易于理解。
一份使用Torch7的实现的这个网络的代码在 这里 ,使用Keras/TF实现的在这里。
很有趣的注意到最近的Xception架构也被我们在单个卷积核的工作所激励。

MobileNets

在2017年4月之后,一个新的MobileNets架构也可以得到。这个架构使用单独的卷积来减少参数的数量。单独的卷积有上述的Xception一致。现在这篇文章声称在参数方面有巨大的减少–这篇文章中说的大约是FaceNet的1/2。下面是完整的模型架构:

不幸的是,我们在实际的应用中测试了这个网络,但是发现当batch为1时在Titan Xp GPU上运行慢的可怜。看一看这儿关于每个图像推理时间的比较:

  • resnet18 : 0.002871
  • alexnet : 0.001003
  • vgg16 : 0.001698
  • squeezenet : 0.002725
  • mobilenet : 0.033251

明显在快速推理中不是一个竞争者。它也许能够减少参数和网络尺寸,但是并不可用。

Other notable architectures

FractalNet使用了一个递归的架构,没有在ImageNet上测试,是一个衍生物,或者是更一般化(general)的ResNet。

The future

我们认为设计神经经网络架构对于深度学习领域的进展是至关重要的。我们小组强烈建议您仔细阅读并理解本文中的所有论文。
但是现在可以想一下为什么我们必须花很多时间设计网络架构,为什么我们不利用数据来告诉我们应该使用什么和怎么组合这些模块。这个想法很好,但是这样的想法这在进展中。一些初步的有趣的结果在这里。
同样注意到我们主要谈论的是关于计算机视觉(computer vision)的架构。类似的神经网络架构也在其他领域有所发展,学习所有其他任务的架构的演变也同样十分有趣。
如果你对于比较神经网络架构和计算性能也很感兴趣,请阅读我们最近的论文。

Acknowledgments

This post was inspired by discussions with Abhishek Chaurasia, Adam Paszke, Sangpil Kim, Alfredo Canziani and others in our e-Lab at Purdue University.

About the author

I have almost 20 years of experience in neural networks in both hardware and software (a rare combination). See about me here:Medium, webpage , Scholar ,LinkedIn, and more…
文章使用jupyter notebook[1][2]编辑。 翻译完后发现已经有人翻译过,这里。anyway, i got something 🙂

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注