卷积模块设计整理(SENet,SKNet,Non-Local Net,GCNet,GIoRe,OcNet,Octave)

SENet

Squeeze-and-Excitation Networks (SENet) ,CVPR2017 [code]

很多工作被提出来从空间维度层面来提升网络的性能,如 Inception 结构中嵌入了多尺度信息,聚合多种不同感受野上的特征来获得性能增益;在 Inside-Outside 网络中考虑了空间中的上下文信息;还有将 Attention 机制引入到空间维度上。那么很自然想到,网络是否可以从其他层面来考虑去提升性能,比如考虑特征通道之间的关系?SENet就是基于这一点,Squeeze 和 Excitation 是两个非常关键的操作。动机是希望显式地建模特征通道之间的相互依赖关系。另外,并没有引入一个新的空间维度来进行特征通道间的融合,而是采用了一种全新的「特征重标定」策略。具体来说,就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

image

SE 模块的示意图如下。给定一个输入 x,其特征通道数为 ,通过一系列卷积等一般变换后得到一个特征通道数为的特征。与传统的 CNN 不一样的是,接下来我们通过三个操作来重标定前面得到的特征。

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

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

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


image

左图是将 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 优化时就会在靠近输入层容易出现梯度消散的情况,导致模型难以优化。

image

目前大多数的主流网络都是基于这两种类似的单元通过 repeat 方式叠加来构造的。由此可见,SE 模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构的 building block 单元中嵌入 SE 模块,我们可以获得不同种类的 SENet。如 SE-BN-Inception、SE-ResNet、SE-ReNeXt、SE-Inception-ResNet-v2 等等。


SKNet

Selective Kernel Networks (SKNet) ,CVPR2019 [code]

本文的motivation是发现过去的卷积网络在每层都share相同的感受野大小,而在神经科学中,视觉皮层单元中的感受野大小应该是受stimulus变化而自适应调整,故SK unit 就是实现这个功能。对多个不同感受野大小的branch进行融合,融合中使用的是类SENet结构,最后使用类似门机制的softmax attention来分配branch的重要性。

image
  • Split 即进行不同感受野卷积操作,上面的branch为3x3 kernel, dilate size=1的,而下面的为5x5 的dilate size=2的卷积(为了进一步提高效率,将常规的5x5卷积替换为5x5的空洞卷积)。
  • Fuse 即进行特征融合,对两个branch卷积后的特征进行叠加,然后标准SE过程(Global AVG, FC-BN-ReLU,FC),这里最后的FC是分别出来两个branch的channel weight vector
  • Select 即对Fuse最后的两个branch的channel weight vector进行每个位置各自的Softmax操作,类似门机制,可得到两个branch中每个channel各自的权值,乘回原始特征中,最后进行特征叠加。

通过在自然图像中放大目标对象和缩小背景来模拟刺激,以保持图像大小不变。结果发现,当目标物体越来越大时,大多数神经元会越来越多地从更大的核路径中收集信息。这些结果表明,所提出的sknet中的神经元具有自适应的感受野大小。


Non-Local Net

Non-local neural networks(NLNet), [code]

Local这个词主要是针对感受野(receptive field)来说的。以卷积操作为例,它的感受野大小就是卷积核大小,而我们一般都选用33,55之类的卷积核,它们只考虑局部区域,因此都是local的运算。同理,池化(Pooling)也是。相反的,non-local指的就是感受野可以很大,而不是一个局部领域。

那我们碰到过什么non-local的操作吗?有的,全连接就是non-local的,而且是global的。但是全连接带来了大量的参数,给优化带来困难。这也是深度学习(主要指卷积神经网络)近年来流行的原因,考虑局部区域,参数大大减少了,能够训得动了。

我们知道,卷积层的堆叠可以增大感受野,但是如果看特定层的卷积核在原图上的感受野,它毕竟是有限的。这是local运算不能避免的。然而有些任务,它们可能需要原图上更多的信息,比如attention。如果在某些层能够引入全局的信息,就能很好地解决local操作无法看清全局的情况,为后面的层带去更丰富的信息。

上面的公式中,输入是x,输出是y,i和j分别代表输入的某个空间位置,是一个向量,维数跟x的channel数一样,f是一个计算任意两点相似关系的函数,g是一个映射函数,将一个点映射成一个向量,可以看成是计算一个点的特征。也就是说,为了计算输出层的一个点,需要将输入的每个点都考虑一遍,而且考虑的方式很像attention:输出的某个点在原图上的attention,而mask则是相似性给出。

image

以图像为例,为了简化问题,作者简单地设置g函数为一个1*1的卷积。相似性度量函数f的选择有多种:

  • Gussian: f \left( x\mathop{{}}\nolimits_{{i}},x\mathop{{}}\nolimits_{{j}} \left) =e\mathop{{}}\nolimits^{{x\mathop{{}}\nolimits_{{T}}^{{i}}x\mathop{{}}\nolimits_{{j}}}},C \left( x \left) ={\mathop{ \sum }\limits_{{ \forall j}}{f \left( x\mathop{{}}\nolimits_{{i}},x\mathop{{}}\nolimits_{{j}} \right) }}\right. \right. \right. \right.
  • Embedded Gussian:f \left( x\mathop{{}}\nolimits_{{i}},x\mathop{{}}\nolimits_{{j}} \left) =e\mathop{{}}\nolimits^{{ \theta \left( x\mathop{{}}\nolimits_{{i}} \left) \mathop{{}}\nolimits^{{T}}∙ \varphi \left( x\mathop{{}}\nolimits_{{j}} \right) \right. \right. }},C \left( x \left) ={\mathop{ \sum }\limits_{{ \forall j}}{f \left( x\mathop{{}}\nolimits_{{i}},x\mathop{{}}\nolimits_{{j}} \right) }}\right. \right. \right. \right.
  • Concatenation: f \left( x\mathop{{}}\nolimits_{{i}},x\mathop{{}}\nolimits_{{j}} \left) =RELU \left( w\mathop{{}}\nolimits_{{T}}^{{f}}∙ \left[ \theta \left( x\mathop{{}}\nolimits_{{i}} \left) , \varphi \left( x\mathop{{}}\nolimits_{{j}} \left) \left] \left) ,\right. \right. \right. \right. \right. \right. \right. \right. \right. \right.
    最后一种的归一化系数C(x)选择为x的点数,只是为了简化计算,同时,还能保证对任意尺寸的输入,不会产生数值上的尺度伸缩。

为了能让non-local操作作为一个组件,可以直接插入任意的神经网络中,作者把non-local设计成residual block的形式,让non-local操作去学x的residual:

实际上是一个卷积操作,它的输出channel数跟x一致。这样以来,non-local操作就可以作为一个组件,组装到任意卷积神经网络中。

原文考虑的是T帧的视频为例,这里以一个batch的图像、f选为embedded Gaussian为例,对于其他形式的相似性度量,可以类似地化为矩阵操作。

GCNet

Non-local Networks Meet Squeeze-Excitation Networks and Beyond (GCNet) , [code]

为了捕获长距离依赖关系,产生了两类方法:

  • 第一种是采用自注意力机制来建模query对的关系。
  • 第二种是对query-independent(可以理解为无query依赖)的全局上下文建模。

NLNet就是采用自注意力机制来建模像素对关系。然而NLNet对于每一个位置学习不受位置依赖的attention map,造成了大量的计算浪费。

SENet用全局上下文对不同通道进行权值重标定,来调整通道依赖。然而,采用权值重标定的特征融合,不能充分利用全局上下文。

通过严格的实验分析,作者发现non-local network的全局上下文在不同位置几乎是相同的,这表明学习到了无位置依赖的全局上下文。基于上述观察,本文提出了GCNet,即能够像NLNet一样有效的对全局上下文建模,又能够像SENet一样轻量。

作者通过计算一个全局的attention map来简化non-local block,并且对所有位置共享这个全局attention map。忽略

image

和表示为线性转换矩阵。为了进一步减少简化版non-local block的计算量,将 移到attention pooling的外面,表示为:

image

不同于原始的non-local block,简化版non-local block的第二项是不受位置依赖的,所有位置共享这一项。因此,作者直接将全局上下文建模为所有位置特征的加权平均值,然后聚集全局上下文特征到每个位置的特征上。

Global Context Modeling Framework
(a)全局attention pooling:采用1x1卷积 和softmax函数来获取attention权值,然后执行attention pooling来获得全局上下文特征
(b)特征转换:采用1x1卷积
(c)特征聚合:采用相加操作将全局上下文特征聚合到每个位置的特征上。

image

GIoRe

Graph-Based Global Reasoning Network(GIoRe) , [code]

此文的目标其实跟Non-local一样,希望能得到全局的上下文信息,即reasoning globally。开头的图1比较炫酷.对特征从坐标空间映射到交互空间,使用图卷积网络GCN进一步推理来获取global context,最后反映射回坐标空间,可看成是 Non-local Block的优化版本

从上图可以看出文章的主要做的事情,就是希望推理不同区域间的上下文关系;而在Coordinate Space去做比较难处理且低效,就映射到Interaction space,然后通过图卷积网络来进行reasoning,刚好这也是图网络所擅长的。

如上图所示,GloRe Unit主要做了几件事情:

  1. 空间映射(中间黄色区域的 左边是从坐标空间映射到交互空间;而 右边是从交互空间映射回坐标空间):空间映射目的是找到子空间可以 more friendly for global reasoning over disjoint and distant regions,但又不想像 I3D-GCN[7] 一样用额外的 detector 或者 label 来框出区域, 故采取类似 non-local 中的做法,直接来 weighted global pooling:假定输入 X的维度为[C,H,W],则最后子空间上的 node states V 可表示为

这里的 N 是超参,即交互空间中节点的个数(好像后面可视化环节设 N=128 ),而C '为reduced channel number。

2.图卷积推理:这里假定Nodes间都有交互,就形成了fully connected graph,然后需要学习的是affine matrix Ag和图网络参数Wg,上图中间黄色区域典型的图卷积公式如下:

而文中把它巧妙地分解成两个步骤,则先进行节点间的message information propagation,然后再更新节点内部的states,如下图所示,分别使用两个1D卷积来实现。


OcNet

未完待续......


Octave

Octave Convolution [4], 将特征分解成低空间分辨率和原始空间分辨率的branch,并进行intra & inter branch间的信息交互;通过分解成低空间分辨率,可使卷积操作更加轻量级。

文中的初衷和story出发点是挺好的,就是借图像中高频(细节,非结构性)和低频(边缘形状,结构性)信息一说,来构造卷积来分解成低频和高频信息,其中低频用更低的空间分辨率来表示,达到去除空间冗余的目的,从而节省模型参数及计算量

上面橙色branch表示High frequency,下面蓝色branch表示Low frequency;绿色箭头表示 intra-branch information update,红色箭头表示 inter-branch information exchange。看到这里,恐怕有点 SKNet 的小感觉了。


1.Selective Kernel Unit, SKNet [1],对多个不同感受野大小的branch进行融合,融合中使用的是类SENet [5]结构,最后使用类似门机制的softmax attention来分配branch的重要性。

2.Global Context (GC) block, GCNet [2], 将 Non-local Block [6]进行简化(position间共享context feature,channel间不共享)来高效提取global context,并融合SENet来进行轻量地channel context计算。

3.Global Reasoning Unit, GloRe [3], 对特征从坐标空间映射到交互空间,使用图卷积网络GCN进一步推理来获取global context,最后反映射回坐标空间,可看成是 Non-local Block的优化版本。

  1. Octave Convolution [4], 将特征分解成低空间分辨率和原始空间分辨率的branch,并进行intra & inter branch间的信息交互;通过分解成低空间分辨率,可使卷积操作更加轻量级。

[参考链接]
https://mp.weixin.qq.com/
https://zhuanlan.zhihu.com/p/33345791
https://zhuanlan.zhihu.com/p/64988633
http://tongtianta.site/paper/10696

你可能感兴趣的:(卷积模块设计整理(SENet,SKNet,Non-Local Net,GCNet,GIoRe,OcNet,Octave))