从2012年AlexNet横空出世,一直到后来的ZFNet、VGG,增加网络深度可以显著提高特征学习的表示质量,到后来引入Inception模块堆叠的GoogLeNet-v1,通过调节输入到每一层的分布,BN层(批归一化)的引入加快了深度网络的训练学习,增加了学习过程中的稳定性,再到后来引入基于跳跃连接残差学习的ResNet、ResNeXt、以及Inception与残差结合的GoogLeNet-v4,CNN已经被证明是解决各种视觉任务的有效模型。
CNN是这样运作的:在网络的每个卷积层中,通过一组滤波器(也即多个卷积核)在局部感受野内将空间和通道信息融合在一起,通过一系列层操作(卷积层、激活函数层、池化层等),能够生成我们所要提取的层级特征。
计算机视觉领域中,最值得研究的热点就是如何去找到更强大的特征表示,这个强大的特征表示体现在:我们直奔主题,直接去提取对于给定任务最重要的图像特征,而其余对任务的价值意义不大的特征,可以直接剔除掉,这样可能会需要一个额外的机制/模块去进行设计,也许会增加一些模块的参数,但性能的提高或许会是很大幅度的。
最近的研究表明,我们可以考虑将参数学习机制嵌入到网络中来增强CNN产生的特征表示,能够帮助网络捕捉到特征之间存在的空间相关性(Inception堆叠嵌入的GoogLeNet系列就是一个很好的例子,能够多尺度提取特征并进行融合,这是一种针对空间维度的方法)。
以往在研究通道之间关系时,采用的都是局部信息,而本文提出的方法采用全局方法进行通道特征信息的提取。
注意力机制(Attention Mechanism):来源于对人类视觉的研究。人眼的视觉范围其实是很大的,但是我们不能够将所有的信息都囊括在我们的视觉系统中,我们人类对于信息的处理也是有一定的限制的,所以说人类视网膜不同的部位具有不同的信息处理能力,也即不同部分的敏锐度不同,人类视网膜中央凹部位具有最高的敏锐度。为了合理利用有限的视觉信息处理资源,人类需要选择视觉区域中的特定部分,然后重点去关注他。比如说,我们在影院看电影时我们会重点关注此时正在播放的屏幕窗口范围内的视觉,而会忽视掉窗口之外的其他背景等信息,这就是注意力机制的一个体现。从计算机的角度来看,可以解释为将可用计算资源的分配偏向信号中最有用的部分的一种手段。
注意力机制最早用于自然语言处理(NLP)的领域,后来在计算机视觉(CV)领域也得到了广泛的应用。(比如,序列学习;图像理解、定位;图像描述;唇语识别任务)
实际上,在SENet这篇论文之前,就有很多对注意力机制的相关研究。首先是STNet,Spatial-Transform Net 空间变换网络,考虑到CNN对平移不变性支持不足,因此设计一个空间变换模块来变换特征图,使CNN可以适应更多变换,例如放大、旋转、平移等,空间变换模块通过将上图中手写的形变的、位置偏离的、有一些噪点的符号图像给他变换到图像中间区域的位置,这样就可以提高对图形变换的鲁棒性。
下图是变换的原理,对特征图通过特征定位(Localisation net)、网格生成(Grid generator)对特征图的像素点进行网格对应,然后采样(Sample)得到变换后的图像,这是主要针对空间维度上考虑,并进行设计的。
第二个相关研究就是残差注意力网络的设计,这是一种使用注意力机制的卷积神经网络,可以以端到端的训练方式与最新的前馈网络体系结构相结合,通过堆叠注意力模块构建,这些模块会生成注意力感知功能。如上图左面的部分,网络对给出的特征图进行一系列的另一个网络层的操作,得到一些权重用于注意力机制,然后再与原来的特征图进行乘法操作,从而加强对重要特征部分的关注度;而右面的部分是热气球图像的不同注意类型的示例。我们会发现,天空注意力的mask会减少背景响应,而气球实例的mask会突出显示气球的底部,这也就体现了可以在不同的注意力模块中捕获不同类型的关注点。
这种机制的实现就是通过与残差结构相结合而提出的残差注意力模块,它是采用自下而上、自上而下的前向Attention机制,在原有网络基础上,新增了一个Mask分支来计算权重,提取带有注意力权重的特征图,并进行单独训练,同样,与右分支卷积得到的特征图做乘法运算,增强有意义的特征,而抑制无意义的信息。同时也借鉴了ResNet恒等映射的思想,M(x)为0时,该层处理后的输入就等于T(x),这样就能够很容易的将模型的深度达到很深的层次,并且具有非常好的性能,如下图所示:
CBAM:Convolutional block attention module。
我们知道CNN的核心是卷积操作,是通过局部感受野的方式来融合空间和通道维度的特征的,针对空间维度的特征提取方法其实很早在 GoogLeNet 中 Inception 模块中多尺度特征提取再融合这个过程就有所体现了,而针对通道维度的注意力机制才从 SENet 这里开始引入研究。ECCV(欧洲计算机视觉国际会议) 2018年又提出了卷积块的注意力模块,提出了通道维度和空间维度两种方式下进行注意力机制的获得。
注意力机制,我理解应该是一种通过提高关注度进而提高效率的方法,可理解为将最有意义的部分给予更多“关注”。
这篇论文提出的SE块其实就引入了注意力机制,着重于通过以计算有效的方式对各个通道之间的关系进行建模来增强网络的表示能力。
本文针对另一个角度——通道维度,进行了研究,引入了新的体系结构单元:Squeeze-and-Excitation Module(SE块),也可以理解为一种机制,其目的是通过显式地建模其卷积特征的通道之间的相互依赖性,从而提高网络特征表示的质量。那么怎么提高呢?就是令网络对传统CNN得到的特征图进行一个“重新校准”,也就是对原来特征图上的特征点进行权重的重新分配,有选择性的加强重要信息特征的权重,同时抑制重要程度不高的信息特征。
目前来看,提出并设计出一个新的CNN架构是很难的,尤其是前几年涌现出那么多性能还不错的网络模型,通常需要选择许多新的超参数和层配置。相比之下,SE块的结构很简单,并且可以直接在现有的最新技术体系结构中使用,从而可以有效地提高性能,同时在计算上也很轻巧,并且在模型复杂性和计算负担上仅增加了一点点。
对于一个 C × W × H C\times W\times H C×W×H的输入 X X X,在经过 F t r F_{tr} Ftr卷积操作之后,得到的输入 U c U_c Uc(也就是 C C C 个大小为 H × W H\times W H×W 的特征图)。
这个地方的操作就和传统卷积操作得不一样了,说到我们目前传统的卷积方式,是通过固定大小的卷积核在图像上进行滑动,那么每个学习过特征的卷积核都有一个局部感受野,因此每个卷积单元只能够关注到它所在区域内的空间信息,这样的话,这个感受野区域之外的上下文信息就无法利用,卷积核只是在一个局部空间内进行操作, 输出特征图就很难获得足够的信息来提取通道之间的关系,为缓解这个问题,这里的 F s q F_{sq} Fsq操作就是将包含全局信息的 W × H × C W\times H\times C W×H×C 的特征图直接压缩成一个 1 × 1 × C 1\times 1\times C 1×1×C的特征向量上,即一个具有全局感受野的实数,通过使用按通道的全局平均池化来实现,屏蔽掉空间上的分布信息,更好的利用通道间的相关性。
再接下来就是Excitation操作,为了获取通道之间的信息,加入Excitation部分,能够完全捕获通道之间的相关性。
为了达到这个目的,我们需要考虑两个条件:
我个人理解的话,感觉第二个条件应该是一种要求非独占的机制,这里很像one-hot向量转换到分布式特征向量的表示过程,这里不进行一次热激活,而允许强调多个通道的不同重要程度,因为我们不光要学习特征,还要学习通道之间信息的相关性。
为了满足这两个条件,这篇论文这里采用两个全连接层+两个激活函数组成的结构输出和输入特征同样数目的权重值,也就是每个特征通道的权重系数。
整个Excitation操作就是:由Squeeze操作得到的特征图 z z z进行一系列非线性映射,最后得到每一个通道对应的权重参数,为每个特征通道生成一个代表注意力程度的权重值,就如下图所示,由原本全为白色的 C C C个通道的特征,得到带有不同深浅程度的颜色的特征向量,也就是不同的重要程度。
上图红色框内即为Excitation操作,流程图下面是该步操作的公式:
直接看公式的最右边,其实就是输入 z z z 经过两个FC层加激活函数,最终得到权重参数 s s s。
【注】注意这里有一个参数 reduction ratio(缩减率) r r r ,为了限制模型复杂度和辅助泛化,需要在全连接层操作过程中对模型参数量进行控制,具体细节会在后面的图中继续解释。
这个得到的 s s s 其实才是本文的核心,才是注意力机制的体现,它是用来刻画输出 U U U 中 C 个feature map 的权重,而且这个权重是通过前面这些全连接层和非线性层学习得到的,因此可以进行端到端训练。这两个全连接层的作用就是融合前面Squeeze针对各通道操作得到的特征信息。
最后是Scale操作,将前面得到的注意力权重加权到每个通道的特征上。论文中采用乘法,逐通道乘以权重系数,在通道维度上引入attention机制,也就是把当前得到的带有注意力的权重参数渲染到原来的特征图 U U U上,得到 X ~ \tilde{X} X~,将原本全为白色的注意力权重变为不同颜色的状态,也就代表着不同程度的重要性,对于某些颜色较深的attention map,神经网络就会重点关注这些特征通道,也即提升对当前任务有用的特征通道,并且抑制对当前任务用处不大的特征通道,这样就对原始特征进行了重标定。
公式 F s c a l e ( u c , s c ) F_{scale}(u_c,s_c) Fscale(uc,sc) 即为特征映射 u c u_c uc和标量 s c s_c sc(这里由于是 1 × 1 1\times1 1×1可看做标量)之间的对应通道乘积操作。
上图展示了SE Block在Inception结构中和ResNet结构中分别进行嵌入后的结构与原始结构的不嵌入的结构。
可以看到 SE Block 是即插即用的,可以将SE块集成到很多网络结构中,比如VGG,甚至是一些更复杂的结构如Inception、ResNet等。
这里详细说一下其中SE块的过程:
首先由 Inception结构 或 ResNet结构处理后的 C × W × H C \times W \times H C×W×H特征图开始,通过Squeeze操作对特征图进行全局平均池化(GAP),得到 1 × 1 × C 1\times1\times C 1×1×C 的特征向量
紧接着两个 FC 层组成一个 Bottleneck(瓶颈) 结构去建模通道间的相关性:
最后通过一个 Scale 的操作来将归一化后的权重加权到每个通道的特征上。
以上就是整个详细的过程
这里注意,前面用ReLU激活,后面为什么要改用Sigmoid呢?而且,为什么要用两个FC层而不用一个FC层解决呢?还有,那个特征降维的参数 reduction ratio 的作用是怎样的,这样做有这样几个好处:
如果将SE模块嵌入到 Inception 或 ResNet 等模块中,模型的参数变化导致的计算量的变化我们是需要考虑的,要权衡精度与复杂度。
如上图是在一些主流模型和一些轻量化模型中加入SE块后与原始的一些对比实验结果。其中:
注意下面几个评价指标:
在Image-1K数据集上的实验结果与分析:
由于SE块中的操作主要的附加参数都来自于Excitation操作中门控机制的两个全连接层,具体来分析,这些FC层的权重参数引入的总数为:
2 r ∑ s = 1 S N s C s 2 \frac{2}{r}\sum_{s=1}^{S}N_sC_s^2 r2s=1∑SNsCs2
C × C r + C r × C = 2 C 2 r C\times \frac{C}{r}+\frac{C}{r}\times C=\frac{2C^2}{r} C×rC+rC×C=r2C2
下图是ResNet-50与SE-ResNet-50以及SE-ResNeXt-50之间结构的对比,我们以ResNet-50为例对额外增加的参数进行定量计算,这里 r = 16 r=16 r=16:
总的参数增加量为:
2 r ∑ s = 1 S N s C s 2 = 2 16 ( 3 ∗ 25 6 2 + 4 ∗ 51 2 2 + 6 ∗ 102 4 2 + 3 ∗ 204 8 2 ) \frac{2}{r}\sum_{s=1}^{S}N_sC_s^2=\frac{2}{16}(3*256^2+4*512^2+6*1024^2+3*2048^2) r2s=1∑SNsCs2=162(3∗2562+4∗5122+6∗10242+3∗20482)
= 2 16 ( 131072 + 1048576 + 6291456 + 12582912 ) =\frac{2}{16}(131072+1048576+6291456+12582912) =162(131072+1048576+6291456+12582912)
= 2 16 ( 20054016 ) = 2 , 506 , 752 ≈ 2.5 m i l l i o n =\frac{2}{16}(20054016)=2,506,752\approx2.5million =162(20054016)=2,506,752≈2.5million
发现和论文中所描述的是一致的。
整个训练过程中,加入SE块后的 top-1 error 随着epoch的不断增加下降的趋势都是基本一致的,保持一致的性能提升现象。
进一步验证SE块的有效性,本文在多个数据集上如CIFAR-10/100、Places 365 和 COCO进行实验,加入SE,性能均获得提升
Ablation Study(消融实验) 是在研究模型有效性中很重要的一种实验研究方法,比如我们提出了某种结构,我们想要知道这个新提出的结构是否有利于最终的性能提升,那就要将去掉该结构的网络与加上该结构的网络所得到的结果进行对比,其实就可以理解为控制变量法,这里又进行了一系列实验,对一些参数及结构的选择等问题进行了实验探究。
Reduction Ratio, r r r直接影响SE Block的参数量和计算量, r r r越大,参数越少,这里通过下图实验就发现了 r = 16 r=16 r=16时既能保证参数量少的情况下又能得到高精度的性能,得到很好的权衡:
传统的池化方法一般是 最大池化 和 平均池化,在本文中,经过分别采用Max Pooling 和 Average Pooling 的对照实验,得出 Avg 的效果要比 Max 要好,因而在Squeeze操作中最终采用了全局平均池化(GAP)。
实验分别采用ReLU、Tanh、Sigmoid函数进行实验对比,发现:
在设计尺度变换的时候,建议尝试Sigmoid激活函数,根据函数特点,0~1的区间可以更好的区分哪部分更重要,哪部分不重要,也就是更好的去界定注意力机制所说的重要程度。
因此,SE模块是普适性的模块,可以嵌入网络的任意阶段。
我们发现,针对Residual Block,有四种嵌入方式可以选择:
结论:SE嵌入不同位置,精度差别不是很大,表现出SE模块具有很强的鲁棒性。
对比实验:
我们知道,在论文中,Excitation这一操作是从前面得到的带有全局信息的特征图上进行两个FC层的非线性操作,最终得到带有注意力机制的权重参数。这里对这些权重参数进行一系列实验针对不同阶段探究来证明体现注意力机制的有效性。
结论1:在前三个Stage中( N 1 = 3 , N 2 = 4 , N 3 = 6 N_1=3,N_2=4,N_3=6 N1=3,N2=4,N3=6)表现出较大的方差,Excitation的输出的确具有特征的选择性。
结论2:在最后一个Stage( N 4 = 3 N_4=3 N4=3)中的后两个Block的方差较小,因此这里可以认为已经没有了注意力的功能,可以剔除掉SE Block,以节省参数量。
总的来说,我们会发现,在靠前一些的层,如 SE_2_3、SE_3_4看出,不同类别在靠前层的时候,分布基本是一样的、重合的,这表明在网络早期的阶段,通道的特征信息是比较低级的,在不同类别间是共享的;而越往后会发现:不同类别间的分布开始有些不一样了,越靠后的特征,越具有类别差异,即特征开始有针对性的偏向了某个类别,一直到SE_5_1这个阶段为止,到了后面 SE_5_2 和 SE_5_3 阶段,这个时候就与之前的分布不一样了,各通道之间的差异性越来越小,就不再具有了注意力。
所以总结成一句话就是:越靠前的层的特征越普遍,越靠后则越特殊。
另外,文章又从另一角度,对同一类别中的分布差异进行探究:
从上图中我们可以看出类间和类内中的分布都是随着网络深度的不断加深变得更有分化的趋势。随着网络变深,方差一直在变大。在最后的一个Stage,类内的方差较大,也表明了网络是有选择性的。
本文整体上其实没有提出一个新的网络模型,而是相当于提出了一个即插即用的高性能小插件,所提出的SE模块能够生成通道维度的权重向量,用于特征“重构”,实现强调重要特征,忽略不重要特征,增强模型表征能力,提高模型性能的目的。这里也大概总结几个要点: