本文翻译自ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks原作者保留版权

卷积神经网络在视觉识别任务上的表现令人称奇。好的 CNN 网络是带有上百万参数和许多隐含层的 “庞然怪物”。事实上,一个不好的经验规则是:网络越深,效果越好。AlexNet,VGG,Inception 和 ResNet 是最近一些流行的 CNN 网络。为什么这些网络表现如此之好?它们是如何设计出来的?为什么它们设计成那样的结构?回答这些问题并不简单,但是这里我们试着去探讨上面的一些问题。网络结构设计是一个复杂的过程,需要花点时间去学习,甚至更长时间去自己动手实验。首先,我们先来讨论一个基本问题:

为什么 CNN 模型战胜了传统的计算机视觉方法?

[转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图1

图像分类指的是给定一个图片将其分类成预先定义好的几个类别之一。图像分类的传统流程涉及两个模块:特征提取分类

特征提取指的是从原始像素点中提取更高级的特征,这些特征能捕捉到各个类别间的区别。这种特征提取是使用无监督方式,从像素点中提取信息时没有用到图像的类别标签。常用的传统特征包括 GIST, HOG, SIFT, LBP 等。特征提取之后,使用图像的这些特征与其对应的类别标签训练一个分类模型。常用的分类模型有 SVM,LR,随机森林及决策树等。

上面流程的一大问题是特征提取不能根据图像和其标签进行调整。如果选择的特征缺乏一定的代表性来区分各个类别,模型的准确性就大打折扣,无论你采用什么样的分类策略。采用传统的流程,目前的一个比较好的方法是使用多种特征提取器,然后组合它们得到一种更好的特征。但是这需要很多启发式规则和人力来根据领域不同来调整参数使得达到一个很好的准确度,这里说的是要接近人类水平。这也就是为什么采用传统的计算机视觉技术需要花费多年时间才能打造一个好的计算机视觉系统(如 OCR,人脸验证,图像识别,物体检测等),这些系统在实际应用中可以处理各种各样的数据。有一次,我们用了 6 周时间为一家公司打造了一个 CNN 模型,其效果更好,采用传统的计算机视觉技术要达到这样的效果要花费一年时间。

传统流程的另外一个问题是它与人类学习识别物体的过程是完全不一样的。自从出生之初,一个孩子就可以感知周围环境,随着他的成长,他接触更多的数据,从而学会了识别物体。这是深度学习背后的哲学,其中并没有建立硬编码的特征提取器。它将特征提取和分类两个模块集成一个系统,通过识别图像的特征来进行提取并基于有标签数据进行分类。

这样的集成系统就是多层感知机,即有多层神经元密集连接而成的神经网络。一个经典的深度网络包含很多参数,由于缺乏足够的训练样本,基本不可能训练出一个不过拟合的模型。但是对于 CNN 模型,从头开始训练一个网络时你可以使用一个很大的数据集如 ImageNet。这背后的原因是 CNN 模型的两个特点:神经元间的权重共享和卷积层之间的稀疏连接。这可以从下图中看到。在卷积层,某一个层的神经元只是和输入层中的神经元局部连接,而且卷积核的参数是在整个 2-D 特征图上是共享的。

[转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图2

为了理解 CNN 背后的设计哲学,你可能会问:其目标是什么?

(1)准确度

如果你在搭建一个智能系统,最重要的当然是要尽可能地准确。公平地来说,准确度不仅取决于网路,也取决于训练样本数量。因此,CNN 模型一般在一个标准数据集 ImageNet 上做对比。

ImageNet 项目仍然在继续改进,目前已经有包含 21841 类的 14,197,122 个图片。自从 2010 年,每年都会举行 ImageNet 图像识别竞赛,比赛会提供从 ImageNet 数据集中抽取的属于 1000 类的 120 万张图片。每个网络架构都是在这 120 万张图片上测试其在 1000 类上的准确度。

(2)计算量

大部分的 CNN 模型都需要很大的内存和计算量,特别是在训练过程。因此,计算量会成为一个重要的关注点。同样地,如果你想部署在移动端,训练得到的最终模型大小也需要特别考虑。你可以想象到,为了得到更好的准确度你需要一个计算更密集的网络。因此,准确度和计算量需要折中考虑。

除了上面两个因素,还有其他需要考虑的因素,如训练的容易度,模型的泛化能力等。下面按照提出时间介绍一些最流行的 CNN 架构,可以看到它们准确度越来越高。

AlexNet

AlexNet是一个较早应用在 ImageNet 上的深度网络,其准确度相比传统方法有一个很大的提升。它首先是 5 个卷积层,然后紧跟着是 3 个全连接层,如下图所示:

[转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图3

Alex Krizhevs 提出的 AlexNet 采用了 ReLU 激活函数,而不像传统神经网络早期所采用的 Tanh 或 Sigmoid 激活函数,ReLU 数学表达为:

[转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图4

ReLU 相比 Sigmoid 的优势是其训练速度更快,因为 Sigmoid 的导数在稳定区会非常小,从而权重基本上不再更新。这就是梯度消失问题。因此 AlexNet 在卷积层和全连接层后面都使用了 ReLU。

[转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图5

AlexNet 的另外一个特点是其通过在每个全连接层后面加上 Dropout 层减少了模型的过拟合问题。Dropout 层以一定的概率随机地关闭当前层中神经元激活值,如下图所示:

[转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图6

为什么 Dropout 有效?

Dropout 背后理念和集成模型很相似。在 Drpout 层,不同的神经元组合被关闭,这代表了一种不同的结构,所有这些不同的结构使用一个的子数据集并行地带权重训练,而权重总和为 1。如果 Dropout 层有 [转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图7个神经元,那么会形成 [转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图8个不同的子结构。在预测时,相当于集成这些模型并取均值。这种结构化的模型正则化技术有利于避免过拟合。Dropout 有效的另外一个视点是:由于神经元是随机选择的,所以可以减少神经元之间的相互依赖,从而确保提取出相互独立的重要特征。

VGG16

VGG16是牛津大学 VGG 组提出的。VGG16 相比 AlexNet 的一个改进是采用连续的几个 3x3 的卷积核代替 AlexNet 中的较大卷积核(11x11,5x5)。对于给定的感受野(与输出有关的输入图片的局部大小),采用堆积的小卷积核是优于采用大的卷积核,因为多层非线性层可以增加网络深度来保证学习更复杂的模式,而且代价还比较小(参数更少)。

比如,3 个步长为 1 的 3x3 卷积核连续作用在一个大小为 7 的感受野,其参数总量为 [转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图9,如果直接使用 7x7 卷积核,其参数总量为 [转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图10,这里 [转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图11指的是输入和输出的通道数。而且 3x3 卷积核有利于更好地保持图像性质。VGG 网络的架构如下表所示:

[转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图12

可以看到 VGG-D,其使用了一种块结构:多次重复使用同一大小的卷积核来提取更复杂和更具有表达性的特征。这种块结构( blocks/modules)在 VGG 之后被广泛采用。

VGG 卷积层之后是 3 个全连接层。网络的通道数从较小的 64 开始,然后每经过一个下采样或者池化层成倍地增加,当然特征图大小成倍地减小。最终其在 ImageNet 上的 Top-5 准确度为 92.3%。

GoogLeNet/Inception

尽管 VGG 可以在 ImageNet 上表现很好,但是将其部署在一个适度大小的 GPU 上是困难的,因为需要 VGG 在内存和时间上的计算要求很高。由于卷积层的通道数过大,VGG 并不高效。比如,一个 3x3 的卷积核,如果其输入和输出的通道数均为 512,那么需要的计算量为 9x512x512。

在卷积操作中,输出特征图上某一个位置,其是与所有的输入特征图是相连的,这是一种密集连接结构。GoogLeNet基于这样的理念:在深度网路中大部分的激活值是不必要的(为 0),或者由于相关性是冗余。因此,最高效的深度网路架构应该是激活值之间是稀疏连接的,这意味着 512 个输出特征图是没有必要与所有的 512 输入特征图相连。存在一些技术可以对网络进行剪枝来得到稀疏权重或者连接。但是稀疏卷积核的乘法在 BLAS 和 CuBlas 中并没有优化,这反而造成稀疏连接结构比密集结构更慢。

据此,GoogLeNet 设计了一种称为 inception 的模块,这个模块使用密集结构来近似一个稀疏的 CNN,如下图所示。前面说过,只有很少一部分神经元是真正有效的,所以一种特定大小的卷积核数量设置得非常小。同时,GoogLeNet 使用了不同大小的卷积核来抓取不同大小的感受野。

[转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图13

Inception 模块的另外一个特点是使用了一种瓶颈层(实际上就是 1x1 卷积)来降低计算量:

这里假定 Inception 模块的输入为 192 个通道,它使用 128 个 3x3 卷积核和 32 个 5x5 卷积核。5x5 卷积的计算量为 25x32x192,但是随着网络变深,网络的通道数和卷积核数会增加,此时计算量就暴涨了。为了避免这个问题,在使用较大卷积核之前,先去降低输入的通道数。所以,Inception 模块中,输入首先送入只有 16 个卷积核的 1x1 层卷积层,然后再送给 5x5 卷积层。这样整体计算量会减少为 16x192+25x32x16。这种设计允许网络可以使用更大的通道数。(译者注:之所以称 1x1 卷积层为瓶颈层,你可以想象一下一个 1x1 卷积层拥有最少的通道数,这在 Inception 模块中就像一个瓶子的最窄处)

GoogLeNet 的另外一个特殊设计是最后的卷积层后使用全局均值池化层替换了全连接层,所谓全局池化就是在整个 2D 特征图上取均值。这大大减少了模型的总参数量。要知道在 AlexNet 中,全连接层参数占整个网络总参数的 90%。使用一个更深更大的网络使得 GoogLeNet 移除全连接层之后还不影响准确度。其在 ImageNet 上的 top-5 准确度为 93.3%,但是速度还比 VGG 还快。

ResNet

从前面可以看到,随着网络深度增加,网络的准确度应该同步增加,当然要注意过拟合问题。但是网络深度增加的一个问题在于这些增加的层是参数更新的信号,因为梯度是从后向前传播的,增加网络深度后,比较靠前的层梯度会很小。这意味着这些层基本上学习停滞了,这就是梯度消失问题。深度网络的第二个问题在于训练,当网络更深时意味着参数空间更大,优化问题变得更难,因此简单地去增加网络深度反而出现更高的训练误差。残差网络ResNet设计一种残差模块让我们可以训练更深的网络。

[转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图14

深度网络的训练问题称为退化问题,残差单元可以解决退化问题的背后逻辑在于此:想象一个网络 A,其训练误差为 x。现在通过在 A 上面堆积更多的层来构建网络 B,这些新增的层什么也不做,仅仅复制前面 A 的输出。这些新增的层称为 C。这意味着网络 B 应该和 A 的训练误差一样。那么,如果训练网络 B 其训练误差应该不会差于 A。但是实际上却是更差,唯一的原因是让增加的层 C 学习恒等映射并不容易。为了解决这个退化问题,残差模块在输入和输出之间建立了一个直接连接,这样新增的层 C 仅仅需要在原来的输入层基础上学习新的特征,即学习残差,会比较容易。

与 GoogLeNet 类似,ResNet 也最后使用了全局均值池化层。利用残差模块,可以训练 152 层的残差网络。其准确度比 VGG 和 GoogLeNet 要高,但是计算效率也比 VGG 高。152 层的 ResNet 其 top-5 准确度为 95.51%。

ResNet 主要使用 3x3 卷积,这点与 VGG 类似。在 VGG 基础上,短路连接插入进入形成残差网络。如下图所示:

[转]ResNet, AlexNet, VGG, Inception: 理解各种各样的CNN架构 - 图15

残差网络实验结果表明:34 层的普通网络比 18 层网路训练误差还大,这就是前面所说的退化问题。但是 34 层的残差网络比 18 层残差网络训练误差要好。

总结

随着越来越复杂的架构的提出,一些网络可能就流行几年就走下神坛,但是其背后的设计哲学却是值得学习的。这篇文章对近几年比较流行的 CNN 架构的设计原则做了一个总结。

译者注:可以看到,网络的深度越来越大,以保证得到更好的准确度。网络结构倾向采用较少的卷积核,如 1x1 和 3x3 卷积核,这说明 CNN 设计要考虑计算效率了。一个明显的趋势是采用模块结构,这在 GoogLeNet 和 ResNet 中可以看到,这是一种很好的设计典范,采用模块化结构可以减少我们网络的设计空间,另外一个点是模块里面使用瓶颈层可以降低计算量,这也是一个优势。这篇文章没有提到的是最近的一些移动端的轻量级 CNN 模型,如 MobileNet,SqueezeNet,ShuffleNet 等,这些网络大小非常小,而且计算很高效,可以满足移动端需求,是在准确度和速度之间做了平衡。

欢迎交流与转载,文章会同步发布在公众号:机器学习算法全栈工程师 (Jeemy110)
https://zhuanlan.zhihu.com/p/32116277