一文概览Inception家族的「奋斗史」
本文简要介绍了 Inception 家族的主要成员,包括 Inception v1、Inception v2 和 Inception v3、Inception v4 和 Inception-ResNet。它们的计算效率与参数效率在所有卷积架构中都是顶尖的,且根据 CS231n 中所介绍的,Inception V4 基本上是当前在 ImageNet 图像分类任务 Top-1 正确率最高的模型。
Inception 网络是 CNN 分类器发展史上一个重要的里程碑。在 Inception 出现之前,大部分流行 CNN 仅仅是把卷积层堆叠得越来越多,使网络越来越深,以此希望能够得到更好的性能。
例如第一个得到广泛关注的 AlexNet,它本质上就是扩展 LeNet 的深度,并应用一些 ReLU、Dropout 等技巧。AlexNet 有 5 个卷积层和 3 个最大池化层,它可分为上下两个完全相同的分支,这两个分支在第三个卷积层和全连接层上可以相互交换信息。与 Inception 同年提出的优秀网络还有 VGG-Net,它相比于 AlexNet 有更小的卷积核和更深的层级。
VGG-Net 的泛化性能非常好,常用于图像特征的抽取目标检测候选框生成等。VGG 最大的问题就在于参数数量,VGG-19 基本上是参数量最多的卷积网络架构。这一问题也是第一次提出 Inception 结构的 GoogLeNet 所重点关注的,它没有如同 VGG-Net 那样大量使用全连接网络,因此参数量非常小。
GoogLeNet 最大的特点就是使用了 Inception 模块,它的目的是设计一种具有优良局部拓扑结构的网络,即对输入图像并行地执行多个卷积运算或池化操作,并将所有输出结果拼接为一个非常深的特征图。因为 1*1、3*3 或 5*5 等不同的卷积运算与池化操作可以获得输入图像的不同信息,并行处理这些运算并结合所有结果将获得更好的图像表征。
另一方面,Inception 网络是复杂的(需要大量工程工作)。它使用大量 trick 来提升性能,包括速度和准确率两方面。它的不断进化带来了多种 Inception 网络版本的出现。常见的版本有:
- Inception v1
- Inception v2 和 Inception v3
- Inception v4 和 Inception-ResNet
每个版本都是前一个版本的迭代进化。了解 Inception 网络的升级可以帮助我们构建自定义分类器,优化速度和准确率。此外,根据你的已有数据,或许较低版本工作效果更好。
Inception v1
这是 Inception 网络的第一个版本。我们来分析一下它可以解决什么问题,以及如何解决。
在《Going deeper with convolutions》论文中,作者提出一种深度卷积神经网络 Inception,它在 ILSVRC14 中达到了当时最好的分类和检测性能。该架构的主要特点是更好地利用网络内部的计算资源,这通过一个精心制作的设计来实现,该设计允许增加网络的深度和宽度,同时保持计算预算不变。为了优化质量,架构决策基于赫布原则和多尺度处理。作者向 ILSVRC14 提交使用该架构的模型即 GoogLeNet,这是一个 22 层的深度网络,它的质量是在分类和检测领域进行了评估。
- 论文:Going deeper with convolutions
- 论文链接:https://arxiv.org/pdf/1409.4842v1.pdf
问题:
- 图像中突出部分的大小差别很大。例如,狗的图像可以是以下任意情况。每张图像中狗所占区域都是不同的。
从左到右:狗占据图像的区域依次减小(图源:https://unsplash.com/)。
- 由于信息位置的巨大差异,为卷积操作选择合适的卷积核大小就比较困难。信息分布更全局性的图像偏好较大的卷积核,信息分布比较局部的图像偏好较小的卷积核。
- 非常深的网络更容易过拟合。将梯度更新传输到整个网络是很困难的。
- 简单地堆叠较大的卷积层非常消耗计算资源。
解决方案:
为什么不在同一层级上运行具备多个尺寸的滤波器呢?网络本质上会变得稍微「宽一些」,而不是「更深」。作者因此设计了 Inception 模块。
下图是「原始」Inception 模块。它使用 3 个不同大小的滤波器(1x1、3x3、5x5)对输入执行卷积操作,此外它还会执行最大池化。所有子层的输出最后会被级联起来,并传送至下一个 Inception 模块。
原始 Inception 模块。(图源:https://arxiv.org/pdf/1409.4842v1.pdf)
如前所述,深度神经网络需要耗费大量计算资源。为了降低算力成本,作者在 3x3 和 5x5 卷积层之前添加额外的 1x1 卷积层,来限制输入信道的数量。尽管添加额外的卷积操作似乎是反直觉的,但是 1x1 卷积比 5x5 卷积要廉价很多,而且输入信道数量减少也有利于降低算力成本。不过一定要注意,1x1 卷积是在最大池化层之后,而不是之前。
实现降维的 Inception 模块。(图源:https://arxiv.org/pdf/1409.4842v1.pdf)
利用实现降维的 Inception 模块可以构建 GoogLeNet(Inception v1),其架构如下图所示:
GoogLeNet。橙色框是 stem,包含一些初始卷积。紫色框是辅助分类器。较宽的部分是 inception 模块。(图源:https://arxiv.org/pdf/1409.4842v1.pdf)
GoogLeNet 有 9 个线性堆叠的 Inception 模块。它有 22 层(包括池化层的话是 27 层)。该模型在最后一个 inception 模块处使用全局平均池化。
不用多说,这是一个深层分类器。和所有深层网络一样,它也会遇到梯度消失问题。
为了阻止该网络中间部分梯度的「消失」过程,作者引入了两个辅助分类器(上图紫色框)。它们对其中两个 Inception 模块的输出执行 softmax 操作,然后在同样的标签上计算辅助损失。总损失即辅助损失和真实损失的加权和。该论文中对每个辅助损失使用的权重值是 0.3。
# The total loss used by the inception net during training. total_loss = real_loss + 0.3 * aux_loss_1 + 0.3 * aux_loss_2
辅助损失只是用于训练,在推断过程中并不使用。
Inception v2
Inception v2 和 Inception v3 来自同一篇论文《Rethinking the Inception Architecture for Computer Vision》,作者提出了一系列能增加准确度和减少计算复杂度的修正方法。
在这一篇论文中,作者表示非常深的卷积网络自 2014 年以来就成为了计算机视觉领域的主流,它在各种基准测试中都获得了非常多的提升。只要有足够的标注数据,增加模型大小与计算成本可以在大多数任务中快速提升模型质量。在这篇论文中,作者积极探索扩展网络的方法,旨在通过适当的分解卷积与积极的正则化尽可能高效地利用添加的计算。他们在 ILSVRC 2012 分类任务挑战赛的验证集上证明了模型的优秀性能,使用每个推断过程有 50 亿次乘加运算的模型,作者实现了单帧评估 21.2% top-1 和 5.6% top-5 误差率,且模型的总参数还不到 250 万。
- 论文:Rethinking the Inception Architecture for Computer Vision
- 论文地址:https://arxiv.org/pdf/1512.00567v3.pdf
以下首先介绍 Inception V2。
问题:
- 减少特征的表征性瓶颈。直观上来说,当卷积不会大幅度改变输入维度时,神经网络可能会执行地更好。过多地减少维度可能会造成信息的损失,这也称为「表征性瓶颈」。
- 使用更优秀的因子分解方法,卷积才能在计算复杂度上更加高效。
解决方案:
- 将 5×5 的卷积分解为两个 3×3 的卷积运算以提升计算速度。尽管这有点违反直觉,但一个 5×5 的卷积在计算成本上是一个 3×3 卷积的 2.78 倍。所以叠加两个 3×3 卷积实际上在性能上会有所提升,如下图所示:
最左侧前一版 Inception 模块中的 5×5 卷积变成了两个 3×3 卷积的堆叠。(图源:https://arxiv.org/pdf/1512.00567v3.pdf)
- 此外,作者将 n*n 的卷积核尺寸分解为 1×n 和 n×1 两个卷积。例如,一个 3×3 的卷积等价于首先执行一个 1×3 的卷积再执行一个 3×1 的卷积。他们还发现这种方法在成本上要比单个 3×3 的卷积降低 33%,这一结构如下图所示:
此处如果 n=3,则与上一张图像一致。最左侧的 5x5 卷积可被表示为两个 3x3 卷积,它们又可以被表示为 1x3 和 3x1 卷积。(图源:https://arxiv.org/pdf/1512.00567v3.pdf)
模块中的滤波器组被扩展(即变得更宽而不是更深),以解决表征性瓶颈。如果该模块没有被拓展宽度,而是变得更深,那么维度会过多减少,造成信息损失。如下图所示:
使 Inception 模块变得更宽。这种类型等同于前面展示的模块(图源:https://arxiv.org/pdf/1512.00567v3.pdf)
前面三个原则用来构建三种不同类型的 Inception 模块(这里我们按引入顺序称之为模块 A、B、C,这里使用「A、B、C」作为名称只是为了清晰期间,并不是它们的正式名称)。架构如下所示:
这里,「figure 5」是模块 A,「figure 6」是模块 B,「figure 7」是模块 C。(图源:https://arxiv.org/pdf/1512.00567v3.pdf)
Inception v3
问题:
- 作者注意到辅助分类器直到训练过程快结束时才有较多贡献,那时准确率接近饱和。作者认为辅助分类器的功能是正则化,尤其是它们具备 BatchNorm 或 Dropout 操作时。
- 是否能够改进 Inception v2 而无需大幅更改模块仍需要调查。
解决方案:
Inception Net v3 整合了前面 Inception v2 中提到的所有升级,还使用了:
- RMSProp 优化器;
- Factorized 7x7 卷积;
- 辅助分类器使用了 BatchNorm;
- 标签平滑(添加到损失公式的一种正则化项,旨在阻止网络对某一类别过分自信,即阻止过拟合)。
Inception v4
Inception v4 和 Inception -ResNet 在同一篇论文《Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning》中介绍。为清晰起见,我们分成两个部分来介绍。
在该论文中,研究者介绍道,Inception 架构可以用很低的计算成本达到很高的性能。而在传统的网络架构中引入残差连接曾在 2015ILSVRC 挑战赛中获得当前最佳结果,其结果和 Inception-v3 网络当时的最新版本相近。这使得人们好奇,如果将 Inception 架构和残差连接结合起来会是什么效果。在这篇论文中,研究者通过实验明确地证实了,结合残差连接可以显著加速 Inception 的训练。也有一些证据表明残差 Inception 网络在相近的成本下略微超过没有残差连接的 Inception 网络。研究者还展示了多种新型残差和非残差 Inception 网络的简化架构。这些变体显著提高了在 ILSVRC2012 分类任务挑战赛上的单帧识别性能。作者进一步展示了适当的激活值缩放如何稳定非常宽的残差 Inception 网络的训练过程。通过三个残差和一个 Inception v4 的模型集成,作者在 ImageNet 分类挑战赛的测试集上取得了 3.08% 的 top-5 误差率。
- 论文:Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
- 论文地址:https://arxiv.org/pdf/1602.07261.pdf
问题:
- 使模块更加一致。作者还注意到某些模块有不必要的复杂性。这允许我们通过添加更多一致的模块来提高性能。
解决方案:
Inception v4 的 stem 被修改了。这里的 stem 参考了在引入 Inception 块之前执行的初始运算集。
图上部是 Inception-ResNet v1 的 stem。图下部是 Inception v4 和 Inception-ResNet v2 的 stem。(图源:https://arxiv.org/pdf/1602.07261.pdf)
- 它们有三个主要的 Inception 模块,称为 A、B 和 C(和 Inception v2 不同,这些模块确实被命名为 A、B 和 C)。它们看起来和 Inception v2(或 v3)变体非常相似。
(左起)在 Inception v4 中使用的 Inception 模块 A、B、C。注意它们和 Inception v2(或 v3)模块的相似性。(图源:https://arxiv.org/pdf/1602.07261.pdf)
- Inception v4 引入了专用的「缩减块」(reduction block),它被用于改变网格的宽度和高度。早期的版本并没有明确使用缩减块,但也实现了其功能。
缩减块 A(从 35x35 到 17x17 的尺寸缩减)和缩减块 B(从 17x17 到 8x8 的尺寸缩减)。这里参考了论文中的相同超参数设置(V,I,k)。(图源:https://arxiv.org/pdf/1602.07261.pdf)
Inception-ResNet v1 和 v2
受 ResNet 的优越性能启发,研究者提出了一种混合 inception 模块。Inception ResNet 有两个子版本:v1 和 v2。在我们分析其显著特征之前,先看看这两个子版本之间的微小差异。
- Inception-ResNet v1 的计算成本和 Inception v3 的接近。
- Inception-ResNetv2 的计算成本和 Inception v4 的接近。
- 它们有不同的 stem,正如 Inception v4 部分所展示的。
- 两个子版本都有相同的模块 A、B、C 和缩减块结构。唯一的不同在于超参数设置。在这一部分,我们将聚焦于结构,并参考论文中的相同超参数设置(图像是关于 Inception-ResNet v1 的)。
问题:
- 引入残差连接,它将 inception 模块的卷积运算输出添加到输入上。
解决方案:
- 为了使残差加运算可行,卷积之后的输入和输出必须有相同的维度。因此,我们在初始卷积之后使用 1x1 卷积来匹配深度(深度在卷积之后会增加)。
(左起)Inception ResNet 中的 Inception 模块 A、B、C。注意池化层被残差连接所替代,并在残差加运算之前有额外的 1x1 卷积。(图源:https://arxiv.org/pdf/1602.07261.pdf)
- 主要 inception 模块的池化运算由残差连接替代。然而,你仍然可以在缩减块中找到这些运算。缩减块 A 和 Inception v4 中的缩减块相同。
(左起)缩减块 A(从 35x35 到 17x17 的尺寸缩减)和缩减块 B(从 17x17 到 8x8 的尺寸缩减)。这里参考了论文中的相同超参数设置(V,I,K)。(图源:https://arxiv.org/pdf/1602.07261.pdf)
- 如果卷积核的数量超过 1000,则网络架构更深层的残差单元将导致网络崩溃。因此,为了增加稳定性,作者通过 0.1 到 0.3 的比例缩放残差激活值。
激活值通过一个常数进行比例缩放,以防止网络崩溃。(图源:https://arxiv.org/pdf/1602.07261.pdf)
- 原始论文并没有在求和之后使用批归一化,以在单个 GPU 上训练模型(在单个 GPU 上拟合整个模型)。
- 研究发现 Inception-ResNet 模型可以在更少的 epoch 内达到更高的准确率。
- Inception v4 和 Inception-ResNet 的网络完整架构如下图所示:
图上部是 Inception v4 的架构。图下部是 Inception-ResNet 的架构。(图源:https://arxiv.org/pdf/1602.07261.pdf)