Squeeze-and-Excitation Networks论文翻译——中英文对照
SENet(Squeeze-and-Excitation Networks)算法笔记
SENet学习笔记
论文的动机是从特征通道之间的关系入手,希望显式地建模特征通道之间的相互依赖关系。另外,没有引入一个新的空间维度来进行特征通道间的融合,而是采用了一种全新的“特征重标定”策略。
SENet的核心思想在于通过网络根据loss去学习特征权重,使得有效的feature map权重大,无效或效果小的feature map权重小的方式训练模型达到更好的结果。具体来说,就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去增强有用的特征并抑制对当前任务用处不大的特征,通俗来讲,就是让网络利用全局信息有选择的增强有益feature通道并抑制无用feature通道,从而能实现feature通道自适应校准。
也许通过给某一层特征配备权重的想法很多人都有,那为什么只有SENet成功了?个人认为主要原因在于权重具体怎么训练得到。就像有些是直接根据feature map的数值分布来判断;有些可能也利用了loss来指导权重的训练,不过全局信息该怎么获取和利用也是因人而异。
当然,SE block嵌在原有的一些分类网络中不可避免地增加了一些参数和计算量,但是在效果面前还是可以接受的。
Sequeeze-and-Excitation(SE) block并不是一个完整的网络结构,而是一个子结构,可以嵌到其他分类或检测模型中。
作者在文中将SENet block插入到现有的多种分类网络中,都取得了不错的效果。作者采用SENet block和ResNeXt结合在ILSVRC 2017的分类项目中拿到第一,在ImageNet数据集上将top-5 error降低到2.251%,原先的最好成绩是2.991%。
我们提出了一种机制,使网络能够执行特征重新校准,通过这种机制可以学习使用全局信息来选择性地强调信息特征并抑制不太有用的特征。
通过引入新的架构单元(“Squeeze-and-Excitation” (SE)块),我们研究了通道关系,设计了SE block如图1所示。论文的核心就是Squeeze和Excitation(论文牛的地方)两个操作。下面先介绍一下这两个操作是怎么实现的并介绍其主要的作用,论文中给出了几个公式很清晰的表示出了其原理,我将结合这几个公式阐述Squeeze和Excitation的原理。
首先Ftr这一步是转换操作(严格讲并不属于SENet,而是属于原网络,可以看后面SENet和Inception及ResNet网络的结合),在文中就是一个标准的卷积操作而已,输入输出的定义如下表示。
F t r : X → U , X ∈ R W ′ × H ′ × C ′ , U ∈ R W × H × C \mathbf{F}_{t r} : \mathbf{X} \rightarrow \mathbf{U}, \mathbf{X} \in \mathbb{R}^{W^{\prime} \times H^{\prime} \times C^{\prime}}, \mathbf{U} \in \mathbb{R}^{W \times H \times C} Ftr:X→U,X∈RW′×H′×C′,U∈RW×H×C
那么这个Ftr的公式就是下面的公式1(卷积操作,vc表示第c个卷积核,xs表示第s个输入)
u c = v c ∗ X = ∑ s = 1 C v c s ∗ x s u_{c}=v_{c} * X=\sum_{s=1}^{C} v_{c}^{s *} x^{s} uc=vc∗X=∑s=1Cvcs∗xs
Ftr得到的U就是Figure1中的左边第二个三维矩阵,也叫tensor,或者叫C个大小为H*W的feature map。而Uc表示U中第c个二维矩阵,下标c表示channel。
接下来就是Squeeze操作(对应SE block结构图中的Fsq操作),公式非常简单,就是一个global average pooling:
z c = F s q ( u c ) = 1 W × H ∑ i = 1 W ∑ j = 1 H u c ( i , j ) z_{c}=F_{s q}\left(u_{c}\right)=\frac{1}{W \times H} \sum_{i=1}^{W} \sum_{j=1}^{H} u_{c}(i, j) zc=Fsq(uc)=W×H1∑i=1W∑j=1Huc(i,j)
为什么会有这一步呢?这一步的结果相当于表明该层C个feature map的数值分布情况,或者叫全局信息。
Squeeze操作就是在得到U(多个feature map)之后采用全局平均池化操作对其每个feature map进行压缩,使其C个feature map最后变成1x1xC的实数数列,下图中红色框标记的区域就是Squeeze操作。
一般CNN中的每个通道学习到的滤波器都对局部感受野进行操作,因此U中每个feature map都无法利用其它feature map的上下文信息,而且网络较低的层次上其感受野尺寸都是很小的,这样情况就会更严重。
U(多个feature map)可以被解释为局部描述子的集合,这些描述子的统计信息对于整个图像来说是有表现力的。论文选择最简单的全局平均池化操作,从而使其具有全局的感受野,使得网络低层也能利用全局信息。
论文通过Excitation操作(如图2紫色框标注)来全面捕获通道依赖性(相互之间的重要性),论文提出需要满足两个标准:
(1) 它必须是灵活的(特别是它必须能够学习通道之间的非线性交互);
(2) 它必须学习一个非互斥的关系,因为独热激活相反,这里允许强调多个通道。
为了满足这些要求,论文选择采用一个简单的gating mechanism,使用了sigmoid激活函数。
s = F e x ( z , W ) = σ ( g ( z , W ) ) = σ ( W 2 δ ( W 1 z ) ) s=F_{e x}(z, W)=\sigma(g(z, W))=\sigma\left(W_{2} \delta\left(W_{1} z\right)\right) s=Fex(z,W)=σ(g(z,W))=σ(W2δ(W1z)))
W 1 ∈ R C r × C ∓ l W 2 ∈ R C × C r W_{1} \in R^{\frac{C}{r} \times C} \mp \mathbb{l} W_{2} \in R^{C \times \frac{C}{r}} W1∈RrC×C∓lW2∈RC×rC
δ=ReLU(), σ \sigma σ=sigmoid()
1)前面squeeze得到的结果是z,
2)这里先用W1乘以z,就是一个全连接层操作,W1的维度是C/r * C,这个r是一个缩放参数,在文中取的是16,这个参数的目的是为了减少channel个数从而降低计算量。又因为z的维度是1x1xC,所以W1z的结果就是1x1xC/r;然后再经过一个δ函数(其中δ是指ReLU函数),输出的维度不变;
3)然后再和W2相乘,和W2相乘也是一个全连接层的过程,W2的维度是C*C/r,因此输出的维度就是1x1xC;
4)最后再经过sigmoid函数(门函数),得到s。
这个s其实是本文的核心,它是用来刻画tensor U中C个feature map的权重。前面的squeeze都只是在某个channel的feature map里面操作,这两个全连接层的作用就是融合各通道的feature map信息。
而且这个权重是通过前面这些全连接层和非线性层学习得到的,因此可以end-to-end训练。
下图的粉色框就是Excitation操作:
对应Figure1中的Fscale。在得到s之后,就可以对原来的tensor U操作了,就是下面的公式4。也很简单,就是channel-wise multiplication,什么意思呢?Uc表示U中第c个二维矩阵,下标c表示channel。Uc是一个二维矩阵,Sc是上一步的输出S(向量)中的一个数值,也就是权重,因此相当于把Uc矩阵中的每个值都乘以Sc。
x ~ c = F s c a l e ( u c , s c ) = s c ⋅ u c \tilde{x}_{c}=F_{s c a l e}\left(u_{c}, s_{c}\right)=s_{c} \cdot u_{c} x~c=Fscale(uc,sc)=sc⋅uc
F scale ( u c , s c ) F_{\text {scale}}\left(u_{c}, s_{c}\right) Fscale(uc,sc)指的是 u c ∈ R W × H u_{c} \in R^{W \times H} uc∈RW×H和标量 S c S_{c} Sc之间的对应通道乘积。
SE块的灵活性意味着它可以直接应用于标准卷积之外的变换。为了说明这一点,我们通过将SE块集成到两个流行的网络架构系列Inception和ResNet中来开发SENets。
通过将变换Ftr看作一个整体的Inception模块(参见图2),为Inception网络构建SE块。通过对架构中的每个模块进行更改,我们构建了一个SE-Inception网络。
Figure2是在Inception中加入SE block的情况,这里的Inception部分就对应Figure1中的Ftr操作。
图2 最初的Inception模块架构(左)和SE-Inception模块架构(右)。
残留网络及其变种已经证明在学习深度表示方面非常有效。我们开发了一系列的SE块,分别与ResNet[9],ResNeXt[43]和Inception-ResNet[38]集成。图3描述了SE-ResNet模块的架构。在这里,SE块变换Ftr被认为是残差模块的非恒等分支。压缩和激励都在恒等分支相加之前起作用。
图3 最初的Residual模块架构(左)和SE-ResNet模块架构(右)。
看完结构,再来看添加了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{2}{r} \sum_{s=1}^{S} N_{s} \cdot C_{s}^{2} r2∑s=1SNs⋅Cs2