ResNet, AlexNet, VGG, Inception: 理解各种卷积网络的结构

本文翻译自 Koustubh 的博文 :ResNet, AlexNet, VGG, Inception: Understanding various architectures of Convolutional Networks

       卷计神经网络(Convolutional Neural Networks, CNN)对于视觉识别任务是绝佳的。好的卷积网络具有上百万参数和很多隐藏层。事实上,一个糟糕的经验法则(?,a bad rule of thumb)是:“隐藏层的个数越多,网络越好”。AlexNet, VGG, Inception, ResNet 是很流行的网络。你会好奇:为什么这些网络性能好?它们是怎么设计的?为什么它们的结构会如此?这些问题的答案不是平凡的和确定的,单单这篇博文不能全部涉及。然而,在博文中,我会尝试去讨论部分问题。网络结构设计是一个复杂的过程,需要花一段时间去学习,而要实验设计自己的结构则要花更长的时间。但首先,让我们分几个部分来看:

为什么卷积网络可以打败传统的计算机视觉?


这里写图片描述

       图像分类是把给定的图像分到预先指定的一个类别中。传统的图像分类包含两个模块: 特征提取(feature extraction)和 分类(classification)。

       特征提取是从原始像素值中提取高层次信息以捕获各类别中的差异。特征提取以无监督的方式完成,从像素中提取信息时与图像的类别无关。传统应用广泛的特征包括 GIST,HOG,SIFT,LBP 等。在特征提取之后,分类模块在图像和对应的类别上进行训练。一些分类模块例子有支持向量机(SVM),逻辑斯蒂回归(Logistic Regression),随机森林(Random Forest),决策树(Decision tree)等。

       传统图像分类的问题是特征提取不能基于类别和图像进行调整(tweaked)。所以,当选中的特征对区分类别缺乏代表性时,不管采用了什么类型的分类策略,分类模型的准确率都会差很多。在传统分类框架下,取得最好结果的模型都包含了共同的主题,即选取多个特征提取器然后组合它们来获得更好的特征。但是这需要很多的启发,以及大量的人力来调整参数以使准确率达到相当好的水平。这里的相当好是指接近人类的准确率水平。这就是为什么使用传统的计算机视觉,建立一个能用于实际遇到的大量数据的好的计算机视觉系统(像OCR,face verification,image classifiers,object detectors等)需要很多年。我曾经使用卷积网络在6周内为一家公司取得很好的效果,而这若用传统的计算机视觉需要将近一年。

       这种方法的另一个问题是它与我们人类学习识别事物的方式完全不同。小孩刚出生时是没有能力感知周围事物的,但随着不断的处理数据,他就能对事物进行识别。这是深度学习基于的哲学,在深度学习内不需要硬编码(hard-coded)的特征提取器。它把提取和分类模块组合到一个整合的系统,基于监督数据,学习从图像中提取判别表示和对图像分类。

       其中一个这样的系统是多层感知器(Multilayer Perceptrons, MLP),也就是由稠密连接的多层神经元组成的神经网络。由于缺乏足够的训练样本,一个含有大量参数的深度神经网络不可能训练出不过拟合的系统。但对于卷积神经网络(Convolutional Neural Networks, ConvNets/CNN),使用像 ImageNet 这样的大型数据集来训练整个网络是可以避免过拟合的。这背后的原因是神经元之间的参数共享和卷积层之间的稀疏连接(参见图2)。在卷积运算中,同一层的神经元局部连接到输入神经元,而参数集在 2-D 特征映射(feature map)之间共享。


这里写图片描述

       为了理解卷机网络的设计哲学,你可能会问:这里的目标是什么?

a. 准确率

       如果你正在建造一个智能机器,一个绝对的判别标准是它要尽可能的准确。这里也有一个公平的问题,因为准确率不仅依赖于网络,也依赖于可用于训练的数据量。因此,这些网络需要在像 ImageNet 这样的标准数据集上进行比较。

       ImageNet是一个持续进行中的工程,目前它有21841个类别和14197122张图片。从2010年开始,ImageNet 举办了视觉识别的年度竞赛,它从 ImageNet 数据集中提供给参赛者120万张属于1000个不同类别的图像,每一个参赛的网络结构基于这些图像上报准确率。

b. 计算量

       大量的卷积网络在训练时需要大量的内存和计算资源,因此,这是一个特别要关注的问题。类似的,如果你要在移动设备上部署模型,那么最终训练好的模型的大小也尤其需要考虑。正如你所猜的,要产生更高的准确率需要更多计算消耗的网络。因此,永远要在准确率和计算量之间进行折衷。

       除此之外,还有很多的因素需要考虑,比如训练的容易程度、网络的泛化能力等。下面描述的都是最流行的网络,并以它们发表的先后顺序列举,越往后准确率越高。

AlexNet

       这个结构是相对于传统方法在 ImageNet 分类准确率上具有显著提升的最早的网络之一。它由5个卷积层和3个全连接层组成,见下图。


这里写图片描述

       由 Alex Krizhevshy 提出的 AlexNet,使用 ReLU (Rectified Linear Unit)作为非线性激活,来替代传统神经网络的早期标准激活函数 Tanh 或 Sigmoid。ReLU 定义为


f(x) = max{0, x}

ReLU 的好处是,相比于 Sigmoid 来说,训练速度更快,因为 Sigmoid 在饱和区域的导数很小,从而几乎没有权重的更新(图4)。这称为 梯度消失问题(vanishing gradient problem)

这里写图片描述

       在 AlexNet 中,ReLU 层紧跟在每一个卷积层和全连接层(fully-connected layer,FC)之后。

       这个网络还通过在每一个 FC 层之后使用 Dropout 层来减小过拟合。Dropout 层有一个概率 p 与它关联,而且这个概率独立的应用到每一个神经元。它随机的以概率 p 来关闭神经元的激活,如图5。


这里写图片描述

为什么 Dropout 有效?

       Dropout 背后的思想类似于模型集成。源于 Dropout 层,不同的被关闭的神经元集合表示不同的结构,而且这些不同的结构并行的训练。对 n 个神经元使用 Dropout,子结构共有 2^n 个。所以它相当于对所有这些模型的集成进行平均来作出预测。这提供了一个结构化的模型正则化来避免过拟合。Dropout 有用的另一种看法是,因为每一个神经元都是随机选择的,这可以避免它们之间的相互适应从而独立的建立有意义的特征。

VGG16

       这个结构是牛津的VGG组(Visual Geometry Group)提出的,它是通过用多个 3x3 的过滤器来替换核大小较大的过滤器(11 和 5,分别对应于第一、第二个卷积层)自AlexNet 改进而来的。对于给定的感知野(输出依赖的输入图像的有效区域大小),堆叠多个小的卷积核比一个大的卷积核要好,因为多个非线性层能增加网络的深度,而这有助于学习更多复杂的特征,而且是以代价更小的方式。

       例如,3 个步幅为 1 的 3x3 过滤器具有 7 的感知大小,但是它的参数个数只有 3*(9C^2),而大小为 7 的卷积核却有 49C^2个参数(假设输入、输出的特征映射个数都是C)。另外,3x3 的卷积核有助于保留图像更细水平的特征。VGG 网络的结构如下表:


这里写图片描述

       从表中可见,在 VGG-D 中的模块多次使用了相同大小的过滤器来提取更复杂和更有代表性的特征。模块(blocks/modules)的概念成为 VGG 之后的网络的共同主题。

       VGG 卷积层之后有 3 个全连接层。网络的宽度从小的 64 开始,在每一个降采样层/池化层之后增长 2 倍。它在 ImageNet 上的 top-5 准确率为 92.3%。

GoogLeNet/Inception

       尽管 VGG 在 ImageNet 数据集上取得了现象级的准确率,但因为大量的计算需求(包括内存和时间),把它部署在当前最适度大小的 GPU 上仍然存在问题。它因为卷积层的宽度过大而变得不再高效。

        例如,输入、输出都具有 512 个通道且卷积核大小为 3x3 的卷积层,它的计算量(?,the order of calculations)是 9x512x512。

       在一个位置的卷积运算中,每一个输出通道(在上面的例子中是512个)都连接到每一个输入通道,我们称之为稠密连接结构。GoogLeNet 基于的思想是,因为激活之间的相关性,深层网络中的大部分激活或者是不必要的(0 值),或者是冗余的。因此,深层网络的最有效的结构是激活之间是稀疏连接,这说明所有的 512 个输出通道并不与所有的 512 个输入通道都相连。当前存在一些产生稀疏权重/连接的剪枝技术。但是稀疏矩阵乘法在 BLAS 或 CuBlas包(用于 GPU 的 CUDA)中并没有做优化,因而比它们的稠密版本还要慢。

       GoogLeNet 设计了一个称为 Inception 的模块,它近似一个具有正常稠密结构(见图)的稀疏CNN。如前所述,因为只有少量的神经元是有效的,特定核大小的卷积过滤器个数(或宽度)保持很小。另外,它还使用不同大小的卷积来捕获可变尺度(5x5,3x3,1x1)的细节。


这里写图片描述

       关于这个模块的另一个显著特点是它具有所谓的瓶颈层(bottleneck layer,图中1x1的卷积层),它能显著的减少所需的计算量(解释如下)。

       让我们以 GoogLeNet 的第一个 Inception 模块为例, 它有 192 个输入通道。它有 128 个 3x3 的过滤器和 32 个 5x5 的过滤器。5x5 过滤器的计算量是 25x32x192,当随着网络深度变深,网络宽度和 5x5 过滤器的个数进一步增长时,计算量就会达到爆炸的程度。为了避免这样,Inception 模块在应用大的卷积核进行卷积之前使用 1x1 的卷积来减少输入通道的维数。因此,在第一个 Inception 模块,在做 5x5 卷积之前,输入首先喂给仅仅只有 16 个过滤器的 1x1 卷积。这样把计算量下降到 16x192 + 25x32x16。所有这些改变使得网络具有更大的宽度和深度。

       GoogLeNet 另一个改变是,在最后一个卷积层之后,使用一个整体的全局池化层(它对所有的 2D 特征映射的通道值取平均)来替换全连接层。这极大的减少了参数的个数。这可以用 AlexNet 来进行理解,它大概 90% 的参数都在 FC 层。使用大的网络宽度和深度使得 GoogLeNet 去掉 FC 层之后并没有影响准确率。它在 ImageNet 上的 top-5 准确率达到 93.3%,而且比 VGG 更快。

Residual Networks

       到目前为止,我们看到随着深度的增加,只要网络不产生过拟合,网络的准确率也增加。但是增加深度带来的问题是在比较浅层的时候权重改变所需的信号(它来源于网络最后真实和预测之间的比较)会变得很小,这实质意味着在浅层的时候网络就几乎学不到什么了。这称之为梯度消失(vanishing gradient)。训练深层网络的第二个问题是,在巨大的参数空间进行优化,当增加层数时会导致训练误差更大。这称为恶化(degradation)问题。残差网络通过残差模块来构造网络使得可以训练深层模型。可以通过下图来直观的感受这种方式为什么会起作用:


这里写图片描述

想象一个网络 A,它产生 x 大小的训练误差。在 A 的顶端加入一些层(我们把这些额外的层称为 C)来构造一个网络 B,并且新加入层的参数值设定为对 A 的输出不做任何变化。这就意味着这个新的网络的训练误差也是 x。因此,当我们训练网络 B 时,训练误差不会高于 A 的训练误差。但实际情况却相反,唯一的原因说明加入这些层 C 之后学习恒等映射(对输入不做任何改变,仅仅是复制)并不是一个平凡的问题,因为求解器并没有得到这个解。为了解决这个问题,上面的模块在模块的输入和输出之间使用恒等映射直接建立了一条路径,这样加入的层 C 就只需要去学习可用输入的顶部的特征。因为 C 只需要学习残差,整个模块被称为残差模块(residual module)

       另外,类似于 GoogLeNet,在分类层之前使用整体平均池化。通过上面所述的变化,ResNets 在高达 152 层的网络深度下也可以学习。它的准确率比 VGGNet 和 GoogLeNet 都要高,而且比 VGGNet 计算更高效。ResNet-152 的 top-5 准确率达到 95.51。

       ResNet 的结构类似于 VGGNet,大都由 3x3 的过滤器组成。以 VGGNet 为基础,通过插入上面描述的快捷连接(shortcut connection)来形成残差网络。这可以从下图中看出:从 VGG-19 来合成浅层的一些小片段。


这里写图片描述

       残差网络的威力可以从论文4(译注:Deep residual learning for image recognition)的一个实验来作出判断。普通的 34 层网络比普通的 18 层网络具有更高的验证误差。这就是恶化问题(degradation problem)的体现。而 34 层的残差网络却比 18 层的残差网络具有更小的训练误差。

       随着我们设计越来越精细的结构,某些网络并不会保留很多年,但他们的核心原理却可以让它们的设计更被理解。希望这篇文章可以在神经网络设计方面给你提供一些好的看法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值