GCNet论文解读

论文地址: https://arxiv.org/abs/1904.11492?context=cs.LG

Github: https://github.com/xvjiarui/GCNet

概述

这是一篇基于Non-Local NetworkSENet进行改进的工作,简化NL block和SE block,提出的普遍性框架包含三个阶段:

  • 一个上下文建模模块,它将所有位置的特征聚合在一起,形成一个全局上下文特征;
  • 特征变换模块,用于捕获通道维度之间的相互依赖性;
  • 融合模块,将全局上下文特征合并到所有位置的特征中

GC block相比较NL block更加轻量化,能够加入到ResNet所有的残差模块中,同时兼具NL block的全局上下文信息. 在正式介绍GCNet之间,先简要回顾一下NL和SENet.

Non-local Network

常规的convolution以及recurrent都是对局部区域进行操作,这里只利用到了局部的信息,而为了获取全局的特征信息,一般的做法就是加深网络的深度,逐步提高高层感受野.但是网络加深之后,带来的就是计算量的增加以及优化难度增大.而Non-local的操作机制就是在一层中就考虑全局上下文关系,具体公式如下:

non-local

其中x表示输入信号(图片,序列,视频等,也可能是它们的features),y表示输出信号,其size和x相同。$f(x_i, x_j)$用来计算i和所有可能关联的位置j之间pairwise的关系,这个关系可以是比如i和j的位置距离越远,f值越小,表示j位置对i影响越小。$g(x_j)$用于计算输入信号在j位置的特征值。C(x)是归一化参数.

从上式就可以出来,在提取某处特征时就利用了其周围的信息,从表现形式上来说,这个周围可以是空间, 时间,下面这个图就从时间维度上展示了Non-local的表达意思.

time

f函数在论文中采用了四种形式,1) Gaussian 2) Embedded Gaussian 3) Dot product 4) Concatenation.最后实验证明不同的表现形式对于non-local的结果影响并不大,表明non-local这个行为才是主要的提升因素。

non-local image

SENet

SENet主要从channel维度上提出改进工作,它显示地建模特征通道之间的相互依赖关系,通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。
SENet

Squeeze

$$z_c=F_{sq}(u_c)=\frac{1}{H * W}\sum_{i=1}^{H}\sum_{j=1}^{W}u_c(i, j)$$

  • 顺着空间维度进行特征压缩,将一个二维的特征通道变成一个实数,这个实数一定程度上具有全局的感受野
  • 输入和输出的维度一致,表征着在特征通道上响应的全局分布

    Excitation

    375e008d14d9c42332576dc18a35b911.png
    • 类似于循环神经网络中门的机制,通过参数W1和W2来获得权重
    • 为了限制模型复杂度和辅助泛化,论文通过引入两个全连接(FC)层(都是1* 1的conv层),即降维层参数为W1,降维比例为r(论文把它设置为16),然后经过一个ReLU,然后是一个参数为W2的升维层。
      4a835b1dbdec414452e595be31cb1b57.png

GCNet

attention maps

作者从coco数据集中随机选择6幅图,分别可视化3个不同位置和它们的attention maps。发现它们的attention maps几乎是相当的,继而作者通过分析不同位置的global context的距离证明了这一点,也就是说,虽然non-local block想要计算出每一个位置特定的全局上下文,但是经过训练之后,全局上下文是不受位置依赖的。

1560751058279

基本这一点,作者对non-local模块进行了简化,只需要计算一个全局的attention map,并且对所有位置都共享这个attention map。具体公式参考论文。

简化版的non-local block可以抽象为3个步骤:

  • 全局attention pooling:采用1x1卷积 $W_k$和softmax函数来获取attention权值,然后执行attention pooling来获得全局上下文特征。
  • 特征转换:采用1x1卷积  $W_V$。
  • 特征聚合:采用相加操作将全局上下文特征聚合到每个位置的特征上。

Global Context Block

融入了SE模块,既可以建议有效的长距离依赖,又可以节约很多计算量。原来的1x1卷积替换成了bottleneck transform模块,完整的GC block公式如下:

$z_i=x_i+W_{v2}ReLU(LN(W_{v1}\sum_{j=1}^{N_p}\frac{e^{W_kx_j}}{\sum_{m=1}^{N_p}e^{W_kx_m}}x_j))$