【论文解读】SENet网络(一种新的卷积结构)

目录

  • Squeeze-and-Excitation Networks
    • 1 Introduction
    • 2 SQUEEZE-AND-EXCITATION BLOCKS
      • Squeeze: Global Information Embedding
      • Excitation: Adaptive Recalibration
    • 3 SENet 在具体网络中应用
    • 4 SENet 计算量比较

Squeeze-and-Excitation Networks

1 Introduction

【论文解读】SENet网络(一种新的卷积结构)_第1张图片
最基本的卷积操作开始说起。近些年来,卷积神经网络在很多领域上都取得了巨大的突破。而卷积核作为卷积神经网络的核心,通常被看做是在局部感受野上,将空间上(spatial)的信息和特征维度上(channel-wise)的信息进行聚合的信息聚合体。卷积神经网络由一系列卷积层、非线性层和下采样层构成,这样它们能够从全局感受野上去捕获图像的特征来进行图像的描述。
【论文解读】SENet网络(一种新的卷积结构)_第2张图片
然而去学到一个性能非常强劲的网络是相当困难的,其难点来自于很多方面。最近很多工作被提出来从空间维度层面来提升网络的性能,如 Inception 结构中嵌入了多尺度信息,聚合多种不同感受野上的特征来获得性能增益;在 Inside-Outside 网络中考虑了空间中的上下文信息;还有将 Attention 机制引入到空间维度上。这些工作都获得了相当不错的成果。
【论文解读】SENet网络(一种新的卷积结构)_第3张图片
我们可以看到,已经有很多工作在空间维度上来提升网络的性能。那么很自然想到,网络是否可以从其他层面来考虑去提升性能,比如考虑特征通道之间的关系?我们的工作就是基于这一点并提出了 Squeeze-and-Excitation Networks(简称 SENet)。Squeeze 和 Excitation 是两个非常关键的操作,所以我们以此来命名。动机是希望显式地建模特征通道之间的相互依赖关系。另外,我们并不打算引入一个新的空间维度来进行特征通道间的融合,而是采用了一种全新的「特征重标定」策略。具体来说,就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

2 SQUEEZE-AND-EXCITATION BLOCKS

【论文解读】SENet网络(一种新的卷积结构)_第4张图片
上图是我们提出的 SE 模块的示意图。给定一个输入 x,其特征通道数为 c_1,通过一系列卷积等一般变换后得到一个特征通道数为 c_2 的特征。与传统的 CNN 不一样的是,接下来我们通过三个操作来重标定前面得到的特征。

首先是 Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

其次是 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。

最后是一个 Reweight 的操作,我们将 Excitation 的输出的权重看做是经过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

SE网络可以通过简单地堆叠SE构件块的集合来生成。SE块也可以用作体系结构中任何深度的原始块的直接替换。但是,虽然构建模块的模板是通用的,它在不同深度处的角色适应网络的需求。在早期层中,它学会以类不可知的方式激发信息特性,支持共享的底层表示的质量。在后面的层次中,SE块变得越来越专业化,并以 highly class-specific的方式响应不同的输入。因此,SE块进行特征重新校准的好处可以通过整个网络进行累加。SE块的设计很简单,可以直接与现有最先进的体系结构一起使用,这些体系结构的模块可以通过直接替换SE模块来加强。

首先 F t r {F_{tr}} Ftr这一步是转换操作,把input X映射到feature map U(严格讲并不属于SENet,而是属于原网络,可以看后面SENet和Inception及ResNet网络的结合),在文中就是一个标准的卷积操作而已,输入输出的定义如下表示:
F t r : X → U , X ∈ R H ′ × W ′ × C ′ , U ∈ R H × W × C {F_{tr}}:X \to U,X \in {{\rm{R}}^{H' \times W' \times C'}},U \in {{\rm{R}}^{H \times W \times C}} Ftr:XU,XRH×W×C,URH×W×C

那么这个 F t r {F_{tr}} Ftr的公式就是下面的公式(卷积操作, v c {v_c} vc表示第c个卷积核的参数, x s {x_s} xs表示第s个输入, V = [ v 1 , v 2 , . . . , v C ] V = [{v_1},{v_2},...,{v_C}] V=[v1,v2,...,vC]学习到的卷积核集合, U = [ u 1 , u 2 , . . . , u C ] U = [{u_1},{u_2},...,{u_C}] U=[u1,u2,...,uC]是输出)
u c = v c ∗ X = ∑ s = 1 C ′ v c s ∗ x s {u_c} = {v_c}*X = \sum\limits_{s = 1}^{C'} {{v_c}^s*{x^s}} uc=vcX=s=1Cvcsxs

*表示卷积, v c = [ v c 1 , v c 2 , . . . , v c C ′ ] {v_c} = [{v_c}^1,{v_c}^2,...,{v_c}^{C'}] vc=[vc1,vc2,...,vcC] X = [ x 1 , x 2 , . . . , x C ′ ] X = [{x^1},{x^2},...,{x^{C'}}] X=[x1,x2,...,xC] u c ∈ R H × W {u_c} \in {{\rm{R}}^{H \times W}} ucRH×W

v c s {{v_c}^s} vcs是一个2D spatial kernel,因此表示 v c {v_c} vc的单个通道,其作用于X的相应通道。

F t r {F_{tr}} Ftr得到的U就是Figure1中的左边第二个三维矩阵,也叫tensor,或者叫C个大小为H×W的feature map。而 u c {u_c} uc表示U中第c个二维矩阵,下标c表示channel。

Squeeze: Global Information Embedding

为了解决利用channel dependencies的问题,我们首先考虑输出特征中每个通道的信号。每个学习过的卷积核都有一个局部感受野,因此每个转换输出单元U都不能利用这个区域之外的上下文信息。

为了缓解这个问题,我们提出将全局空间信息压缩成一个channel descriptor,公式非常简单,就是一个global average pooling来生成channel-wise 统计数据:

z c = F s q ( u c ) = 1 H × W ∑ i = 1 H ∑ j = 1 W u c ( i , j ) {z_c} = {F_{sq}}({u_c}) = \frac{1}{{H \times W}}\sum\limits_{i = 1}^H {\sum\limits_{j = 1}^W {{u_c}(i,j)} } zc=Fsq(uc)=H×W1i=1Hj=1Wuc(i,j)

因此上式就将H×W×C的输入转换成1×1×C的输出,对应Figure1中的Fsq操作。为什么会有这一步呢?这一步的结果相当于表明该层C个feature map的数值分布情况,或者叫全局信息。

Excitation: Adaptive Recalibration

再接下来就是Excitation操作,该操作旨在完全捕获通道相关性。直接看最后一个等号,前面squeeze得到的结果是z,这里先用W1乘以z,就是一个全连接层操作,W1的维度是C/r ×C,这个r是一个缩放参数,在文中取的是16,这个参数的目的是为了减少channel个数从而降低计算量。又因为z的维度是1×1×C,所以W1z的结果就是1×1×C/r;然后再经过一个ReLU层,输出的维度不变;然后再和W2相乘,和W2相乘也是一个全连接层的过程,W2的维度是C×C/r,因此输出的维度就是1×1×C;最后再经过sigmoid函数,得到s。

s = F e x ( z , W ) = σ ( g ( z , W ) ) = σ ( W 2 δ ( W 1 z ) ) s = {F_{ex}}(z,W) = \sigma (g(z,W)) = \sigma ({W_2}\delta ({W_1}z)) s=Fex(z,W)=σ(g(z,W))=σ(W2δ(W1z))

也就是说最后得到的这个s的维度是1×1×C,C表示channel数目。这个s其实是本文的核心,它是用来刻画tensor U中C个feature map的权重。而且这个权重是通过前面这些全连接层和非线性层学习得到的,因此可以end-to-end训练。这两个全连接层的作用就是融合各通道的feature map信息,因为前面的squeeze都是在某个channel的feature map里面操作。

在得到s之后,就可以对原来的tensor U操作了,就是下面的公式。也很简单,就是channel-wise multiplication,什么意思呢?uc是一个二维矩阵,sc是一个数,也就是权重,因此相当于把uc矩阵中的每个值都乘以sc。对应Figure1中的Fscale。
x c ∼ = F s c a l e ( u c , s c ) = s c u c \mathop {{x_c}}\limits^ \sim = {F_{scale}}({u_c},{s_c}) = {s_c}{u_c} xc=Fscale(uc,sc)=scuc

3 SENet 在具体网络中应用

【论文解读】SENet网络(一种新的卷积结构)_第5张图片
上左图是将 SE 模块嵌入到 Inception 结构的一个示例。方框旁边的维度信息代表该层的输出。

这里我们使用 global average pooling 作为 Squeeze 操作。紧接着两个 Fully Connected 层组成一个 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 等等。

4 SENet 计算量比较

【论文解读】SENet网络(一种新的卷积结构)_第6张图片
看完结构,再来看添加了SE block后,模型的参数到底增加了多少。其实从前面的介绍可以看出增加的参数主要来自两个全连接层,两个全连接层的维度都是C/r ×C,那么这两个全连接层的参数量就是2×C^2/r。以ResNet为例,假设ResNet一共包含S个stage,每个Stage包含N个重复的residual block,那么整个添加了SE block的ResNet增加的参数量就是下面的公式:
2 r ∑ s = 1 S N s ⋅ C s 2 \frac{{\rm{2}}}{r}\sum\limits_{s = 1}^S {{N_s} \cdot {C_s}^2} r2s=1SNsCs2

从上面的介绍中可以发现,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%。此时模型的精度几乎无损失。

参考:https://baijiahao.baidu.com/s?id=1574593150997120&wfr=spider&for=pc
https://blog.csdn.net/weixin_41923961/article/details/88983505

你可能感兴趣的:(卷积神经网络,深度学习)