概述
CNN的核心构件是卷积算子,它使用网络在每一层的局部感受野内融合空间和信道信息来构建信息特征,研究试图通过提高空间编码的质量来增强CNN的代表性。卷积神经网络由一系列的卷积层,非线性层和下采样层构成,这样它们能够从全局感受野上去捕获图像特征来进行图像描述。SE模块通过明确地建模通道之间的依赖关系,自适应地重新校准通道方向的特征响应。在网络的每个卷积上,一组滤波器沿着输入信道表达邻近空间连接模式,在局部感受野融合空间和信道信息。最新研究表明,通过将学习机制集成到网络中,帮助捕获特征之间的空间相关性,可以增强CNN表示。一种方法由Inception系列流行起来,进一步的工作是设法更好地模拟空间依赖,并将attention纳入网络结构。在这篇网络中,我们研究了网络设计的另一个方面——通道之间的关系。
我们可以看到已经有很多工作在空间维度上提升网络的性能。那么很自然的想到,网络是否可以从其他方面来考虑提升性能,比如考虑特征通道之间的关系。我们通过这一点提出SENet。我们提出的网络中Squeeze和Excitation是两个关键的操作。SE目标是通过明确地建模卷积特性通道之间的相互依赖关系来提高网络的表示质量,所以,提出一种机制,允许网络执行特征重标定,通过这种机制,可以学习使用全局信息,有选择地强调重要特征,抑制不重要的特征。
Squeeze-and-Excitation Module
上图是SE模块示意图。给定一个输入x,其特征通道数为C‘,通过一系列卷积等变换后得到一个特征通道数c的特征。与传统CNN不一样的是,接下来通过三个操作来重标定前面得到的特征。
首先是Squeeze操作,顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表示着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。
其次时Excitation操作,它是一个类似于循环神经网络中门的机制。通过参数w来为每个特征通道生成权重,其中参数w被学习用来显示地建模特征通道间的相关性。
最后一个是Reweight操作,将Excitation的输出权重看做是经过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上对原始特征的重新标定。
首先Ftr这一步是转换操作(严格讲并不属于SENet,而是属于原网络),在文中就是一个标准的卷积操作而已,输入输出的定义如下表示:Ftr:X->U。
那么这个Ftr的公式就是下面的公式(卷积操作,Vc表示第c个卷积核,Xs表示第s个输入)。
Ftr得到的U就是图一中左边第二个三维矩阵,也叫tensor,或者叫C个大小为H * W的特征图。而Uc表示U中第c个二维矩阵,下标c为通道。
接下来就是Squeeze操作,是一个global average pooling:
因此上图公式就将H* W * C的输入转换成1 * 1* C的输出,对应图一的Fsq操作。这一步的结果相当于表明该层C个特征图的数值分布情况,或者叫全局信息。
再接下来就是Excitation操作,看下图。直接看最后一个等号,前面Squeeze得到的结果是Z,这里先用W1乘以Z,就是一个全连接操作,W1的维度是C/r * C,这个r是一个缩放参数,在文中取的是16,这个参数的目是为了减少通道个数从而降低计算量。有因为Z的维度是1 * 1 * C,所以W1 * Z的结果就是1 * 1 * C/r。然后再经过一个ReLU层,输出的维度不变。然后再和W2相乘,这也是一个全连接层的过程,W2的维度是C * C/r,因此输出的维度就是1 * 1 * C,最后再经过sigmoid函数,得到s。
也就是说最后得到这个s的维度是1 * 1 * C,C是通道数目,这个s其实是本文的核心,它是用来刻画tensor U中C个特征图的权重。而且这个权重是通过前面这些全连接层和非线性层学习得到的,因此可以end-to-end训练。这两个全连接层的作用就是融合各通道的特征图的信息,因为在前面的Squeeze都是在某个通道的特征图里面操作。
在得到s之后,就可以对原来的tensor U进行操作了,也就是下图的公式。Uc是一个二维矩阵,Sc是一个数,也就是权重,因此相当于把Uc矩阵中的每个值都乘以Sc,对应图一的Fscale。
SENet在具体网络中的应用
上图是将SE模块嵌入到Inception结构的一个示例,方框旁边的维度信息代表该层的输出。
我们使用global average pooling作为Squeeze操作,紧接着两个全连接层组成一个Bottleneck结构去建模通道间的相关性,并输出和输入同样数目的权重。我们首先将特征维度降低到输入的1/16,然后经过ReLU**后再通过一个全连接层升回到原来的维度。这样做比直接用一个全连接层的好处在于:1)具有更多的非线性,可以更好地拟合通道间复杂的相关性。2)极大的减少了参数量和计算量,然后通过一个sigmoid的门获得0-1之间的归一化权重,最后通过一个scale的操作来将归一化的权重加权到每个通道的特征上。
除此之外,SE模块还可以嵌入到含有跳跃连接的模块中。上图是将SE嵌入到ResNet模块中的一个例子,操作过程基本和SE-Inception一样,只不过是在Addition前对分支上Residual的特征进行了特征重新标定。如果在Addition后对主支上的特征进行重新标定,由于主干分支存在0-1的scale操作,在网络较深BP优化时就会在靠近输入层容易出现梯度消散的情况,导致模型难以优化。
目前大多数的主流网络都是基于这两种类似的单元通过repeat方式叠加来构造的。由此可见,SE模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构的building block单元中嵌入SE模块,我们可以获得不同种类的SENet。
Model and Computational Complexity
在添加了SE模块后,模型的参数到底增加了多少。其实从前面的介绍可以看出增加的参数重要来自两个全连接层,两个全连接层的维度都是C/r * C,那么这两个全连接层的参数量就是2*C^2/r。以ResNet为例,假设ResNet一共包括S个stage,每个Stage包含N个重复的residual block,那么整个添加SE block的ResNet增加的参数量就是下面的公式:
从上面的介绍可以看出,SENet构造非常简单,而且很容易被部署,不需要引入新的函数或者层,除此之外它还在模型和计算复杂度上具有良好的特性。实验发现移除掉最后一个stage中3个build block上的SE设定,可以将10%参数量增长减少到2%。此时模型的精度几乎无损失。
另外由于现有的GPU实现中,都没有对global pooling和较小计算量的全连接进行优化,导致在GPU上的运行时间SE-ResNet-50相对于ResNet-50有大约10%的增长.其理论增长的额外计算量仅仅不到1%.可以看出在现有网络架构中嵌入SE模块而导致额外的参数和计算量的增长微乎其微.