机器心灵专栏
作者: axdhk
在这次CVPR 2017大会上出现了许多值得关注的优秀论文。 国内自动驾驶创业公司Momenta与机械合作发表了CVPR 2017精彩论文解读专栏。 此外,Momenta还受邀在CVPR 2017 imagenet Workshop上演讲,介绍了Momenta在ImageNet 2017挑战赛中夺冠的网络架构SENet。 作者是Momenta高级研究开发工程师axdhk。
我是Momenta的高级研究开发工程师axdhk。 很高兴和大家分享SENet。 利用我们提出的SENet,我们的团队WMW )以最大的优势获得了最后的ImageNet 2017大赛Image Classification任务的冠军,获得了CVPR 2017的workshop 健壮的小虾ImageNet )。 这里介绍一下我们提出的SENet。 论文和代码将于近期公布在arXiv上。 欢迎你跟进我们的工作,提供宝贵的建议和意见。
让我们从基本的卷积操作开始。 近年来,卷积神经网络在许多领域取得了重大突破。 另一方面,卷积核作为卷积神经网络的核心,通常被认为是在局部感觉领域汇集了空间spatial )信息和特征维度channel-wise )信息的信息集合体。 卷积神经网络由一系列的卷积层、非线性层、下采样层构成,它们可以从全局感受领域拍摄图像的特征来描述图像。
但是,学习非常强大的网络非常困难,其难点来自很多方面。 最近,提出了许多从空间维度层面提高网络性能的工作,如在Inception结构中嵌入多尺度信息,聚合多种不同感受野的特征来获得性能增益等; Inside-Outside网络考虑空间中的上下文信息; 有时将注意机制引入空间维度。 这些工作都取得了相当好的成果。
可以看到,为了提高网络性能,许多工作都在空间维度上进行。 那么,网络是否会考虑从其他层面提高性能,例如考虑特色渠道之间的关系呢? 我们的工作基于这一点,提出了Squeeze-and-Excitation Networks 简称SENet )。 在我们提出的结构中,Squeeze和Excitation是两个非常重要的操作,所以我们取这个名字。 我们的动机是想明确地建模特征渠道之间的相互依存关系。 另外,并不打算为了进行特征通道间的融合而引入新的空间维度,而是采用了新的“特征再标定”战略。 具体来说,就是通过学习自动获得各特征通道的重要度,根据其重要度提高有用的特征,抑制对当前任务没什么用的特征。
上图是我们提出的SE模块的示意图。 给定输入x,其特征通道数为c_1,通过一系列卷积等常见变换得到特征通道数为c_2的特征。 与以往的CNN不同,接下来通过3个操作重新标定前面得到的特征。
首先是Squeeze操作,沿着空间维度进行特征压缩,将每个二维的特征通道变为实数。 该实数在一定程度上具有全局感受野,且输出维数与输入特征通道数一致。 表示特征通道上响应的全局分布,即使在接近输入的层也能得到全局感受野,这在很多任务中非常有用。
接下来是Excitation操作。 这是一种类似循环神经网络门的机制。 由为了明确地建模特征信道之间的相关而学习的参数w,为每个特征信道生成权重。
最后是Reweight的操作。 将Excitation的输出权重视为特征选择后各特征信道的重要性,通过乘法对各信道上一个特征进行加权,完成信道维度上原始特征的重新标定。
的左图是将SE模块并入Inception结构的示例。 框旁边的维信息表示该层的输出。
在本例中,使用全局平均轮询作为Squeeze操作。 紧接在两个完全连接的层组之后
成一个 Bottleneck 结构去建模通道间的相关性,并输出和输入特征同样数目的权重。我们首先将特征维度降低到输入的 1/16,然后经过 ReLu 激活后再通过一个 Fully Connected 层升回到原来的维度。这样做比直接用一个 Fully Connected 层的好处在于:1)具有更多的非线性,可以更好地拟合通道间复杂的相关性;2)极大地减少了参数量和计算量。然后通过一个 Sigmoid 的门获得 0~1 之间归一化的权重,最后通过一个 Scale 的操作来将归一化后的权重加权到每个通道的特征上。
除此之外,SE 模块还可以嵌入到含有 skip-connections 的模块中。上右图是将 SE 嵌入到 ResNet 模块中的一个例子,操作过程基本和 SE-Inception 一样,只不过是在 Addition 前对分支上 Residual 的特征进行了特征重标定。如果对 Addition 后主支上的特征进行重标定,由于在主干上存在 0~1 的 scale 操作,在网络较深 BP 优化时就会在靠近输入层容易出现梯度消散的情况,导致模型难以优化。
目前大多数的主流网络都是基于这两种类似的单元通过 repeat 方式叠加来构造的。由此可见,SE 模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构的 building block 单元中嵌入 SE 模块,我们可以获得不同种类的 SENet。如 SE-BN-Inception、SE-ResNet、SE-ReNeXt、SE-Inception-ResNet-v2 等等。
从上面的介绍中可以发现,SENet 构造非常简单,而且很容易被部署,不需要引入新的函数或者层。除此之外,它还在模型和计算复杂度上具有良好的特性。拿 ResNet-50 和 SE-ResNet-50 对比举例来说,SE-ResNet-50 相对于 ResNet-50 有着 10% 模型参数的增长。额外的模型参数都存在于 Bottleneck 设计的两个 Fully Connected 中,由于 ResNet 结构中最后一个 stage 的特征通道数目为 2048,导致模型参数有着较大的增长,实验发现移除掉最后一个 stage 中 3 个 build block 上的 SE 设定,可以将 10% 参数量的增长减少到 2%。此时模型的精度几乎无损失。
另外,由于在现有的 GPU 实现中,都没有对 global pooling 和较小计算量的 Fully Connected 进行优化,这导致了在 GPU 上的运行时间 SE-ResNet-50 相对于 ResNet-50 有着约 10% 的增长。尽管如此,其理论增长的额外计算量仅仅不到 1%,这与其在 CPU 运行时间上的增长相匹配(~2%)。可以看出,在现有网络架构中嵌入 SE 模块而导致额外的参数和计算量的增长微乎其微。
在训练中,我们使用了一些常见的数据增强方法和 Li Shen 提出的均衡数据策略。为了提高训练效率,我们使用了我们自己优化的分布式训练系统 ROCS, 并采用了更大的 batch-size 和初始学习率。所有的模型都是从头开始训练的。
接下来,为了验证 SENets 的有效性,我们将在 ImageNet 数据集上进行实验,并从两个方面来进行论证。一个是性能的增益 vs. 网络的深度; 另一个是将 SE 嵌入到现有的不同网络中进行结果对比。另外,我们也会展示在 ImageNet 竞赛中的结果。
首先我们来看一下网络的深度对 SE 的影响。上表分别展示了 ResNet-50、ResNet-101、ResNet-152 和嵌入 SE 模型的结果。第一栏 Original 是原作者实现的结果,为了进行公平的比较,我们在 ROCS 上重新进行了实验得到 Our re-implementation 的结果(ps. 我们重实现的精度往往比原 paper 中要高一些)。最后一栏 SE-module 是指嵌入了 SE 模块的结果,它的训练参数和第二栏 Our re-implementation 一致。括号中的红色数值是指相对于 Our re-implementation 的精度提升的幅值。
从上表可以看出,SE-ResNets 在各种深度上都远远超过了其对应的没有 SE 的结构版本的精度,这说明无论网络的深度如何,SE 模块都能够给网络带来性能上的增益。值得一提的是,SE-ResNet-50 可以达到和 ResNet-101 一样的精度;更甚,SE-ResNet-101 远远地超过了更深的 ResNet-152。
上图展示了 ResNet-50 和 ResNet-152 以及它们对应的嵌入 SE 模块的网络在 ImageNet 上的训练过程,可以明显地看出加入了 SE 模块的网络收敛到更低的错误率上。
另外,为了验证 SE 模块的泛化能力,我们也在除 ResNet 以外的结构上进行了实验。从上表可以看出,将 SE 模块嵌入到 ResNeXt、BN-Inception、Inception-ResNet-v2 上均获得了不菲的增益效果。由此看出,SE 的增益效果不仅仅局限于某些特殊的网络结构,它具有很强的泛化性。
上图展示的是 SE 嵌入在 ResNeXt-50 和 Inception-ResNet-v2 的训练过程对比。
在上表中我们列出了一些最新的在 ImageNet 分类上的网络的结果。其中我们的 SENet 实质上是一个 SE-ResNeXt-152(64x4d),在 ResNeXt-152 上嵌入 SE 模块,并做了一些其他修改和训练优化上的小技巧,这些我们会在后续公开的论文中进行详细介绍。可以看出 SENet 获得了迄今为止在 single-crop 上最好的性能。
最后,在 ILSVRC 2017 竞赛中,我们的融合模型在测试集上获得了 2.251% Top-5 错误率。对比于去年第一名的结果 2.991%, 我们获得了将近 25% 的精度提升。
更多技术上和实验上的细节将会展示在即将公开的论文中。