卷积神经网络的核心组成是卷积操作,卷积操作使得网络能够通过在每层的局部感知域内融合空间和通道的方式来构建相应的特征。并且大量的研究已经研究了这种关系的空间组成部分,并尝试通过试图提高整个特征层中空间编码的质量来增强 CNN 的表征能力。收到这种思想的启发,本文主要工作是提出了一个新的架构单元,即 Squeeze-and-Excitation—— (SE) block 。通过明确地建模通道之间的相互依赖性来自适应地重新校准通道方面的特征响应。最后通过实验证明,该结构能够堆叠在一起形成 SENet 体系结构,且可以跨域不同数据集并非常有效的进行泛化。并进一步证明了 SE 模块以最小的额外计算成本为现有的最先进的 CNN 带来了显著的性能上的改进。
下面的思维导图给出了整篇论文的结构与内容,图片形式来自于博客论文阅读:《Squeeze-and-Excitation Networks》),我对这个图重新进行了整理并绘画,思维导图源文件可以点击链接进行下载。
SENet 中最主要的 3 个操作分别是 Squeeze 操作,Excitation 操作以及 Scale 操作,通过作者三个操作来重标定前面得到的特征。下面分别对这三个操作进行介绍:
Squeeze 操作的主要思想是让网络顺着空间维度来进行特征压缩,加每个二维的特征通道变成一个标量,即一个实数。在某方面上,这种操作可以具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野。这一点在很多任务重都是非常有用的。
在具体操作上,本文使用的是全局平均池化(Global Average Pooling)操作,具体公式如下所示:
z c = F s q ( u c ) = 1 H × W ∑ i = 1 H ∑ j = 1 W u c ( i , j ) z_c=\bold F_{sq}(\bold u_c)=\frac{1}{H\times W}\sum_{i=1}^H\sum_{j=1}^Wu_c(i,j) zc=Fsq(uc)=H×W1i=1∑Hj=1∑Wuc(i,j)
论文中说明,除了全局池化操作外,同样可以使用其余的操作达到 Squeeze 的目的,这里为了计算简单,仅使用全局平均池化来进行。
Excitation 操作是一个类似于循环神经网络中门的机制。通过参数 w w w 来为每个特征通道生成权重,其中参数 w w w 被学习用来显示地建模特征通道间的相关性。
在具体实现上,这部分是由两个全连接来实现的,其中第一个全连接把 C C C 个通道压缩为 C r \frac C r rC个通道来降低计算量,同时激活函数采用 ReLU。第二个全连接再回复回到 C C C 个通道,后面采用 Sigmoid 激活函数,上面的 r r r 指的是通道压缩比例。作者在尝试了 r r r 在各种取值下的性能后,最后得出结论, r = 16 r=16 r=16 时整体性能与计算量能够达到比较好的平衡。
这里添加全连接层的作用是为了利用通道间的相关性来训练出不同通道所对应的真正的 s c a l e scale scale 值。一次的 mini-batch 个样本的 squeeze 输出并不代表通道真实要调整的 s c a l e scale scale 值,真实的 s c a l e scale scale 值是基于所有样本得到的,而不是单个 batch,所以后面添加了全连接层来进行训练。
将上述过程用公式来进行描述如下:
s = F e x ( z , W ) = σ ( g ( z , W ) ) = σ ( W 2 δ ( W 1 z ) ) \bold s=\bold F_{ex}(\bold z,\bold W)=\sigma(g(\bold z,\bold W))=\sigma(\bold W_2\delta(\bold W_1\bold z)) s=Fex(z,W)=σ(g(z,W))=σ(W2δ(W1z))
其中, δ \delta δ 指的是 ReLU 激活函数, σ \sigma σ 指的是 Sigmoid 激活函数。 W 1 ∈ R C r × C , W 2 ∈ R C × C r \bold W_1\in\mathbb{R}^{\frac C r\times C},\bold W_2\in \mathbb{R}^{C\times \frac C r} W1∈RrC×C,W2∈RC×rC,这两个权重矩阵也就是网络中的全连接层,最后得到的 s \bold s s 是一个维度为 1 × 1 × C 1\times 1\times C 1×1×C 的向量。
最后将从 Excitation 操作中输出的权重看作是经过特征选择后的每个特征通道的重要性,然后通过乘法运算逐通道的加权到先前的特征上,从而完成在通道维度上的对原始特征的重标定。公式表示如下所示:
x ~ c = F s c a l e ( u c , s c ) = s c ⋅ u c \widetilde {\bold x}_c=\bold F_{scale}(\bold u_c,s_c)=s_c\cdot\bold u_c x c=Fscale(uc,sc)=sc⋅uc
其中 X ~ = [ x ~ 1 , x ~ 2 , . . . , x ~ C ] \widetilde {\bold X}=[\widetilde {\bold x}_1,\widetilde {\bold x}_2,...,\widetilde {\bold x}_C] X =[x 1,x 2,...,x C],而 s c s_c sc 指的是标量, u c ∈ R H × W \bold u_c\in \mathbb R^{H\times W} uc∈RH×W。
在网络中应用 SE block 可以直接加在不同的卷积层后,具体的,论文中使用 global average pooling 作为 Squeeze 操作。紧接着两个 Fully Connected 层组成一个 Bottleneck 结构去建模通道间的相关性,并输出和输入特征同样数目的权重。我们首先将特征维度降低到输入的 1/16,然后经过 ReLu 激活后再通过一个全连接层升回到原来的维度。这样做比直接用一个全连接层的好处在于:
然后通过一个 Sigmoid 的门获得 0~1 之间归一化的权重,最后通过一个 Scale 的操作来将归一化后的权重加权到每个通道的特征上。
将其应用在 Inception 模块中的示意图如下所示:
除此之外,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 等等。
这部分内容通过实验说明了本文提出策略的有效性,这里不再赘述。