Non-local Neural及Self-attention

@Non-local Neural及Self-attention

Non-local Neural及Self-attention

1 创新点

无论cv还是nlp,都需要捕获长范围依赖。在时间序列任务中RNN操作是一种主要的捕获长范围依赖手段,而在CNN任务中通过堆叠多个卷积模块来形成大的感受野。目前的卷积核循环算子都是在空间和时间上的局部操作,长范围依赖捕获是通过重复堆叠,并且反向传播得到,存在3个不足:
(1)捕获长范围依赖的效率太低;
(2)由于网络很深,需要小心的设计模块和梯度
(3)当需要在比较远位置之间来回传递消息的时,局部操作是是困难的
故作者基于图片滤波领域的非局部均值滤波操作思想,提出了一个泛化、简单、可直接嵌入到当前网络的非局部操作算子,可以捕获一段时间、空间和时空的长范围依赖。这样做的好处是:

  1. 相比于不断堆叠卷积核RNN的算子,非局部操作直接计算两个位置(可以是时间位置、空间位置和时空位置)之间的关系即可以快速捕获长范围依赖,但是会忽略欧式距离,这种计算方法其实就是求自相关矩阵,只不过是泛化的自相关矩阵。
  2. 非局部操作计算效率很高,要达到相同效果,只需要更少的对叠层
  3. 非局部操作可以保证尺度和输出尺度不变,这种设计可以很容易嵌入到目前的网络架构中。

2 核心思想

由于我关注的是二维图片的领域,故本文的大部分分析都是对图片而言,而不是时间序列或视频序列。
本文的非局部操作算子是基于非局部均值操作而提出来的,故很有必要解释一下非局部均值操作。我们在CNN或者传统图片滤波算子中涉及的都是局部操作,例如:
在这里插入图片描述
可以看出每个位置的输出值都是kernel和输入的局部卷积计算得到的,而非局部均值滤波操作是非常简单的。核心思想是在计算每个像素位置输出的时候,不在只和邻域计算,而是和图像中所有位置计算相关性,然后将相关性作为一个权重表征其他位置和点前待计算位置的相似度。可以简单认为采用了一个和原图一样大的kernel进行卷积计算。下图表示高斯滤波,双边滤波和非局部均值处理过程:
在这里插入图片描述
可以看出对待计算的中心红色点,前两种局部操作都是在邻域计算,而非局部均值是和整个图片进行计算。但是实际上如果采用逐点计算的方式,不仅计算速度非常慢,而且抗干扰能力不太强,故非局部均值操作是采用block的思想,计算block和block之间的相关性。
在这里插入图片描述
可以看出,待计算的像素位置是p,故先构造block,然后计算其他位置block和当前block的相关性,可以看出q1和q2区域非常相似,故计算时候给予一个大的权重,且q3给予一个较小的权重。这样做的好处是突出共性(关心的区域),消除差异(通常是噪声)。
在这里插入图片描述
上图可以看出非局部操作的优点,每一个例子中左图是待计算像素点的位置,右图是基于NL均值操作计算出来的权重分布图,通过(c)可以看出,由于待计算点位置是在边缘处,通过非局部操作后突出了全部边缘。
上面的所有分析都是基于非局部操作来讲的,但是实际上在深度学习时代,可以归为自注意力机制self-attention。在机器翻译中,自我注意力模块通过关注所有位置并嵌入空间中其加权平均值来计算序列中的位置相应。在CV中那就是通过关注图片中(可以是特征图)所有并在嵌入空间中取其加权平均值来表示图片中某位置处的响应。嵌入空间可以认为是一个更加抽象的图片空间表达,目的是汇聚更多的信息,提高计算效率。

3网络机构

非局部操作的具体计算公式。首先在深度学习中非局部操作可以表达为:
i是输出特征
i是输出特征图的其中一个位置,通用来说连这个位置可以是时间空间和时空。j是所有可能位置的索引,x是输入信号,可以是图像、序列和视频,通常是特征图。y是x的尺度一样的输出图,f是配对计算函数,计算第i个位置和其他所有位置的相关性,g是一元输入函数,目的是进行信息变换。C(x)是归一化函数,保证变换前后整体信息不变。以上是一个非常泛化的公式,具体细节见下面。在局部卷积算子中,一般的
在这里插入图片描述
由于f和g都是通式,故结合神经网络待定,需要考虑其具体形式。
首先g由于是一元输出,比较简单,我们可以采用1*1卷积,代表线性嵌入,其形式为:
在这里插入图片描述
对于f,前面我们说过其实就是计算两个位置的相关性,那么第一个非常自然的函数是Gaussian。
在这里插入图片描述
对两个位置进行点乘,然后通过指数映射,放大差异。
在这里插入图片描述
前面的gaussian形式是直接在当前空间计算,而(2)更加通用,在嵌入空间中计算高斯距离。这里:
在这里插入图片描述
在这里插入图片描述
前面两个:
在这里插入图片描述
仔细观察,如果把C(x)考虑进去,那么

在这里插入图片描述
其实就是softmax形式,完整考虑是:

在这里插入图片描述
这个就是目前常用的位置注意力机制的表达式,所以说语义分割中大部分通道注意力机制都是本文的特殊化。

(3) Dot product

考虑一种最简单的非局部操作形式:
image.png
其中C(x)=N,像素个数。可以看出(2) (3)的主要区别是是否含有**函数softmax。

(4) Concatenation
参考 Relation Networks可以提出:
在这里插入图片描述

前面是基本的非局部操作算子,利用这些算子,下面开始构造成模块。
在这里插入图片描述
可以看出,上面构造成了残差形式。上面的做法的好处是可以随意嵌入到任何一个预训练好的网络中,因为只要设置W_z初始化为0,那么就没有任何影响,然后在迁移学习中学习新的权重。这样就不会因为引入了新的模块而导致预训练权重无法使用。
在这里插入图片描述
由于我们考虑的是图片,故可以直接设置T=1, 或者说不存在。首先网络输入是X=(batch, h, w, 1024),经过Embeded gaussian 中的两个嵌入权重变换W得到 (batch, h, w, 512), 其实这里的目的是降低通道数,减少计算量;然后分别对这两个输出进行reshape操作,变成(batch, hw, hw), 然后在第2个维度即最后一个维度上进行softmax操作,得到(batch, hw, hw), 意这样做就是通道注意力,相当于找到了当前图片或特征图中每个像素与其他所有位置像素的归一化相关性;然后将g也采用一样的操作,先通道降维,然后reshape;然后和 (batch, hw, hw)进行矩阵乘,得到(batch, h, w, 512), 即将通道注意力机制应用到了所有通道的每张特征图对应位置上,本质就是输出的每个位置值都是其他所有位置的加权平均值,通过softmax操作可以进一步突出共性。最后经过一个1x1卷积恢复输出通道,保证输入输出尺度完全相同。

4 核心代码

在这里插入图片描述

5 扩展

nonlocl的背后思想其实是自注意力机制的泛化表达,准确来说本文只提到了位置注意力机制(位置与位置之间的相关性)。