本文为雷锋字幕组编译的技术博客 A Simple Guide to the Versions of the Inception Network,原标题,作者为 Bharath Raj。
翻译 | 胡瑛皓 乔月 整理 | 凡江
原文链接:
https://towardsdatascience.com/a-simple-guide-to-the-versions-of-the-inception-network-7fc52b863202
Inception 网络是卷积神经网络 (CNN) 分类器发展中的一个重要里程碑。在 inception 之前, 大多数流行的 CNN 只是将卷积层堆叠得越来越深,以期获得更好的效果。
这就是 CNN 架构设计。有趣的是这个说法在第一篇 inception 网络的论文(https://arxiv.org/pdf/1409.4842v1.pdf)中被引用。
从另个方面来看 Inception network 是复杂的(大量工程优化)。使用很多的技巧以提高其性能 (同时从速度和准确率)。随着不断演进,也产生了几个不同版本的网络。以下是几个流行的版本:
Inception v1(https://arxiv.org/pdf/1409.4842v1.pdf)
Inception v2 与 Inception v3(https://arxiv.org/pdf/1512.00567v3.pdf)
Inception v4 与 Inception-ResNet(https://arxiv.org/pdf/1602.07261.pdf)
上面每个版本均是对其前一个版本的迭代改进。理解版本升级的细节可以帮助我们构建自定义分类器,同时提高速度和准确率。另外,依赖于你的数据,低版本可能实际上效果更好。
本文旨在阐明 inception network 的演进。
Inception v1
这个版本是一切开始的地方。让我们分析一下,最初的版本打算解决什么问题,以及它是如何解决问题的。(https://arxiv.org/pdf/1409.4842v1.pdf)
前提:
图像中的特征部分尺寸变化很大。比如包含狗的图像可以是以下任一种形式,如下所示。狗在每幅图像中所占面积不同。
从左边到右:狗占据了图片的大部分,狗占据了图片的一部分,狗仅占据了图片的很小一部分(图片来自 Unsplash)。
正是由于在信息所在位置的巨大差异,为卷积操作选择适当的核尺寸变得艰难。当信息分布更全局时,倾向选择一个较大的核;当信息分布的更局部时,倾向选择一个较小的核。
深度网络容易过拟合,同时也很难将梯度更新传递至整个网络。
单纯堆砌大量卷积操作计算昂贵。
解决方案:
那为什么不能在同一层上采用多个尺寸的过滤器呢?网络本质上会变得更宽一些,而不是更深。作者设计 inception 模块就是用了这个想法。
下图就是「最初的」inception 模块。在输入图像上用 3 个不同尺寸的过滤器(1x1, 3x3, 5x5)实施卷积操作。然后,执行了最大池化操作 (max pooling)。输出被连接(concatenated)后,送往下一层 inception 模块。
最初的 inception 模块(原文:Inception v1:https://arxiv.org/pdf/1409.4842v1.pdf)。
如前所述,深度神经网络计算非常昂贵。为了使计算更快,作者通过在 3x3 和 5x5 卷积操作前增加一个额外的 1x1 卷积,限制输入通道数量。虽然增加一个额外的操作看起来与直觉相反,1x1 卷积比 5x5 卷积操作快很多,减少输入通道数量也有帮助。值得注意的是,1x1 卷积是在最大池化后执行,而不是之前。
降维的 inception 模块(原文:Inception v1:https://arxiv.org/pdf/1409.4842v1.pdf)
采用降维的 inception 模块构建神经网络,这就是我们知道的 GoogLeNet(Inception v1)。网络架构如下:
GoogLeNet. 橙色框是 stem,包含一些基础的卷积操作。紫色框是辅助分类器。网络中宽阔部分是 inception 模块(原文:Inception v1:https://arxiv.org/pdf/1409.4842v1.pdf)
GoogLeNet 由 9 组 inception 模块线性堆叠组成。深 22 层(如算上池化层共 27 层)。在最后一个 inception 模块,采用了全局平均池化操作。
它确实是一个很深的深度分类器。对于任意深度神经网络都会发生梯度消失问题。
为防止网络中间部分不会「梯度消失」,作者引入了 2 个辅助分类器(图中紫色框)。它们本质上对 2 个 inception 模块的输出执行 softmax,并计算对同一个标签的 1 个辅助损失值。总损失函数是对辅助损失值和真实损失值的加权和。论文中辅助损失值的权值取 0.3。
毋庸置疑,辅助损失值纯粹是为训练构建,分类推断时将被忽略。
Inception v2
Inception v2 、Inception v3 出现在同一篇论文(https://arxiv.org/pdf/1512.00567v3.pdf)。作者提出了大量的改进以提升准确度同时降低计算复杂度。Inception v2 探索了以下内容:
前提:
降低 representational bottleneck。其思路是,当卷积不会大幅改变输入尺寸,神经网络的性能会更好。减少维度会造成信息大量损失,也就是所说的 representational bottleneck;
采用智能分解方法,卷积操作在计算上更高效。
解决方案:
将 1 个 5x5 卷积分解为 2 个 3x3 卷积操作以提升速度。虽然这可能看起来与直觉相反,5x5 卷积比 3x3 卷积操作在计算上要昂贵 2.78 倍。因此,事实上 2 个 3x3 卷积的堆叠提高了性能。见下图:
最左边 inception v1 模块中的 5x5 卷积现在表示为 2 个 3x3 卷积(原文: Inception v2:https://arxiv.org/pdf/1512.00567v3.pdf)
此外,他们将 nxn 的卷积过滤器分解为一个 1xn 和 nx1 卷积的组合。比如一个 3x3 的卷积等价于执行一个 1x3 的卷积后执行一个 3x1 的卷积。他们发现,这个方法较之前的 3x3 卷积在算力上便宜 33%。如下图所示:
这里,假设 n=3 获得与之前等价的图像。最左边 5x5 的卷积可以表示为 2 个 3x3 卷积,然后进一步表示为 1x3、3x1 卷积组合(原文:Inception v2:https://arxiv.org/pdf/1512.00567v3.pdf)
模块中的滤波器组(filter banks)被扩展(使得更宽而不是更深)以消除 representational bottleneck。如果模块变得更深,尺度将会过度缩小,从而导致信息的丢失。如下图所示:
使 inception 模块更宽。这种类型等同于上面显示的模块。(原文: Incpetion v2:https://arxiv.org/pdf/1512.00567v3.pdf)
上述三个原则被用来构建三种不同类型的 inception 模块(我们将它们按照引入的顺序称为模块 A,B,和 C,这些名称是为了清楚而引入的,并不是官方的名字)体系结构如下:
这里,图 5是模块 A,图 6是模块 B,图 7是模块 C。(原文: Incpetion v2:https://arxiv.org/pdf/1512.00567v3.pdf)
Inception v3前提:
作者指出,辅助分类器(auxiliary classifiers)直到训练过程结束,准确性接近饱和时,没有太多的贡献。他们认为,他们的功能是正规化(regularizes),特别是如果他们有 BatchNorm 或 Dropout 操作。
研究不在大幅度改变模块的情况下,改进 Inception v2 的可能性。
解决方案:
Inception Net v3 包含了针对 Inception v2 所述的所有升级,并且增加使用了以下内容:
RMSProp 优化器。
分解为 7x7 卷积。
辅助分类 BatchNorm。
标签平滑(添加到损失公式中的正则化组件类型,防止网络过于准确,防止过度拟合。)
Inception v4
Inception v4 和 Inception-ResNet 被介绍在同一篇论文。为了清晰起见,让我们分别讨论他们。
前提:
为了使模块更加统一,作者还注意到一些模块比必要的还要复杂。这可以使我们通过添加更多的统一模块提高其性能。
解决方案:
Inception v4 中 stem 被修改了。这里的 stem,指的是在介绍 Inception 块之前执行的最初一组操作。
上图是 Inception-ResNet v1 的 stem,底部图像是 Inception v4 和 Inception-ResNet v2 的 stem (原文: Inception v4:https://arxiv.org/pdf/1602.07261.pdf)
他们有三个主要的 inception 模块。分别为 A,B 和 C (与 Inception v2 不同 这些模块的实际名字为 A,B 和C)。它们看起来非常类似与 Inception v2 (or v3) 副本。
(左图)Inception 模块 A,B,C 使用 Inception v4。注意它们与 Inception v2(或 v3)模块相似。(原文: Inception v4:https://arxiv.org/pdf/1602.07261.pdf)
Inception v4 采用专门的「Reduction Blocks」用于更改网格的宽度和高度。早期的版本没有明确的减少块(reduction blocks)但是功能已经实现。
(左图) Reduction Block A (将 35x35 尺寸缩小至 17x17 ) Reduction Block B (将 17x17 尺寸缩小至 8x8)。请参阅本文以获取确切的超参数设置 (V,l,k). (原文: Inception v4:https://arxiv.org/pdf/1602.07261.pdf)
Inception-ResNet
v1 and v2受到 ResNet 性能的启发,提出一种混合 inception 模块。Inception ResNet 有两个子版本分布为 v1 和 v2。在我们检查显著特征之前,让我们看看这两个版本之间的细微差别。
Inception-ResNet v1 有类似于 Inception v3 的计算成本。
Inception-ResNet v2 有类似于 Inception v4 的计算成本。
它们有不同的 stems 如插图 Inception v4 部分所示。
两个子版本对于模块 A,B,C 和 reduction blocks 具有相同的结构。只有超参数设置不同。本节中,我们只关注结构。请参阅本文中的确切超参数设置 (图像是 Inception-Resnet v1)。
前提:
在 inception 模块输入中引入残差连接(residual connections),它增加了卷积运算的输出。
解决方案:
对于剩余工作的补充,卷积后的输入和输出必须具有相同的尺寸。因此,我们在原始卷积之后使用 1x1 卷积来匹配盛大尺寸(深度在卷积之后增加)。
(左图) 在 Inception ResNet 中初始化 Inception 模块 A,B,C。注意如何用残差连接(residual connection)代替池化层(pooling layer),另外在增加前,注意附加 1x1 卷积。(原文: Inception v4:https://arxiv.org/pdf/1602.07261.pdf)
在主 inception 模块中,池化操作被代替,有利于残差连接(residual connections)。但是,你仍然在 reduction blocks 中找到这些操作。reduction blocks A 与 Inception v4 相同。
(左图) Reduction Block A (35x35 尺寸缩小至 17x17 ) Reduction Block B (17x17 尺寸缩小至 8x8 )。请参阅本文中的精确超参数设置 (V,l,k). (原文: Inception v4:https://arxiv.org/pdf/1602.07261.pdf)
如果滤波器(filters)数目超过 1000,那么网络中的残差单元(residual units) 更深的网络会导致网络「死亡」。为了提高稳定性,作者将残差(residual) 激活的比例调整为 0.1 至 0.3 左右。
激活按常数缩放,以防止网络崩溃。(原文:Inception v4https://arxiv.org/pdf/1602.07261.pdf)
原始论文在求和之后没有使用 BatchNorm 在单个 GPU 上训练模型(为了将整个模型安装在单个 GPU 上)。
发现 Inception-ResNet 模型能够在更低的 epoch 获得更高的精度。
Inception v4 和 Inception-ResNet 最终的网络布局如下:
顶部图像是 Inception v4 的布局,底部图像是 Inception-ResNet 的布局。(Source: Inception v4:https://arxiv.org/pdf/1602.07261.pdf)