一、背景
在深度学习领域,已经有很多成果通过在空间维度上对网络的性能进行了提升。但是,SENet反其道而行之,通过对通道关系进行建模来提升网络的性能。Squeeze和Excitation是两个非常关键的操作,所以SENet以此来命名。SENet的动机是希望显式地建模特征通道之间的相互依赖关系,具体来说,就是通过学习的方式来自动获取每个通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。
二、结构
给定一个输入 ,其特征通道数为 ,通过一系列卷积等一般变换后得到一个特征通道数为 的特征。与传统的CNN不一样的是,接下来通过三个操作来重标定前面得到的特征。
1) Squeeze(压缩)。顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用。
2) Excitation(激发)。它是一个类似于循环神经网络中门的机制。通过参数来为每个特征通道生成权重,其中参数被学习用来显式地建模特征通道间的相关性。
3)Reweight(缩放)。将Excitation的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。
三、结构融合
如下是SE模块与Inception和ResNet融合的结构示意图。
上左图是将SE模块嵌入到Inception结构的示例。方框旁边的维度代表该层的输出。这里使用Alobal Average Pooling作为Squeeze操作。紧接着两个Fully Connected层组成一个Bottleneck结构去建模通道间的相关性,并输出和输入特征同样数目的权重。首先将特征维度降低到输入的1/16,然后经过ReLu激活后再通过一个Fully Connected层升回到原来的维度。这样做比直接用一个Fully Connected层的好处在于:
1)具有更多的非线性,可以更好地拟合通道间复杂的相关性;
2)减少了参数量和计算量。然后通过一个Sigmoid的门获得0~1之间归一化的权重,最后通过一个Scale的操作来将归一化后的权重加权到每个通道的特征上。
右图是SE模块嵌入到ResNet的示例。操作过程基本和SE-Inception一样,只不过是在Addition前对分支上Residual的特征进行了特征重标定。如果对Addition后主支上的特征进行重标定,由于在主干上存在0~1的scale操作,在网络较深BP优化时就会在靠近输入层容易出现梯度消散的情况,导致模型难以优化。
四、运算效率
实验表明,SE模块在参数量上的增加带来的计算量增长微乎其微,但是性能却有所提升,当然这也取决于实际应用,如果因为SE模块导致参数量增加的掠夺,可以针对性的在适当的位置削减SE模块的数量,而精度几乎不受影响。
以ResNet-50和SE-ResNet-50对比举例来说,SE-ResNet-50相对于ResNet-50有着10%模型参数的增长。额外的模型参数都存在于Bottleneck设计的两个Fully Connected中,由于ResNet结构中最后一个stage的特征通道数目为2048,导致模型参数有着较大的增长,实验发现移除掉最后一个stage中3个build block上的SE设定,可以将10%参数量的增长减少到2%。此时模型的精度几乎无损失。
五、消融实验
压缩率。这个要根据骨干网去调整,不要盲目在所有位置使用相同的压缩率 ,因为不同的层有着不同的抽象程度。
激发部分的激活函数。实验表明Sigmod最优,Relu最差。
SE在不同Stage中的作用。不同层的SE在功能上是互补的,处在不同层的多个SE模块的组合可进一步提升模型性能。