赞
踩
论文:
Non-local Neural Networks及自注意力机制思考
视频:
CVPR2018——Non-local Neural Networks 经典论文分享
不管是CV还是NLP任务,都需要捕获长范围依赖。在时序任务中,RNN操作是一种主要的捕获长范围依赖手段,而在CNN中是通过堆叠多个卷积模块来形成大感受野。目前的卷积和循环算子都是在空间和时间上的局部操作,长范围依赖捕获是通过重复堆叠,并且反向传播得到,存在3个不足:
故作者基于图片滤波领域的非局部均值滤波操作思想,提出了一个泛化、简单、可直接嵌入到当前网络的非局部操作算子,可以捕获时间(一维时序信号)、空间(图片)和时空(视频序列)的长范围依赖。
Local
这个词主要是针对感受野(receptive field)来说的,主要就是关注局部区域。以卷积操作为例,它的感受野大小就是卷积核大小,而我们一般都选用
3
×
3
,
5
×
5
3\times3,5\times5
3×3,5×5 之类的卷积核,它们只考虑局部区域,因此都是local的运算。同理,池化(Pooling)也是。
相反的,Non-Local
指的就是感受野可以很大,而不是一个局部领域。
全连接就是non-local的,而且是global的。但是全连接带来了大量的参数,给优化带来困难。这也是深度学习(主要指卷积神经网络)近年来流行的原因,考虑局部区域,参数大大减少了,能够训得动了。
为什么还需要Non-Local
?
我们知道,卷积层的堆叠可以增大感受野,但是如果看特定层的卷积核在原图上的感受野,它毕竟是有限的。这是local运算不能避免的。然而有些任务,它们可能需要原图上更多的信息,比如attention。如果在某些层能够引入全局的信息,就能很好地解决local操作无法看清全局的情况,为后面的层带去更丰富的信息。
Non-Local
网络表达了从集合
x
x
x 到集合
y
y
y 的映射,两个集合具有相同的元素个数(例如
x
x
x 为一幅图像,
y
y
y 可以视为一个与
x
x
x 具有相同尺寸的图像),其一般模型为:
下面解释一下上式中的各变量的含义:
从以上公式可以直观的看出,对于任意一个输出位置的计算,都需要输入序列中所有位置元素的参与,这便是其名称中“非局部”的含义,这一点与卷积的局部操作有着本质区别。
在Non-Local
中,全连接网络中权重系数是通过训练得到的。而 f ( x i , x j ) f(x_i,x_j) f(xi,xj) 作为权重系数是通过输入序列中元素“自己和自己”计算得到的,正是这种“自娱自乐”的方式才决定了Non-Local网络属于自注意力模型, f ( x i , x j ) f(x_i,x_j) f(xi,xj) 即为注意力权重系数。
在 Non-Local
网络的一般模型中,需要确定函数
g
g
g 、
f
f
f 和
C
C
C 的具体形式。
首先 g ( x j ) g(x_j) g(xj) 被确定为针对 x j x_j xj 的线性变换 g ( x j ) = W g x j g(x_j)=W_gx_j g(xj)=Wgxj ,其中 W g W_g Wg 为一个学习得到的权重矩阵。当 x x x 为一幅图像(或图像对应的特征图)时, g g g 即可以表示为一个 1 × 1 × d v 1×1×d_v 1×1×dv 卷积操作,其中 d v d_v dv 为 x x x 的维度,也即上述特征图的通道数。
不同的 f f f 也决定了不同的 C C C 。Non-Local网络原文中给出了四种对 f f f 的设定形式,分别为:
在对 f f f 不同的设定下,归一化函数 C C C 也具有不同的形式,下面就分别对其进行讨论。
(1)高斯设定:Non-local网络的注意力权重系数实现为“两向量点积的指数函数”,记作:
这里 x i T x j x_i^Tx_j xiTxj 为点积形式表示的向量间相似度,对应的归一化函数为:
在高斯设定下,将 g g g 、 f f f 和 C C C 的具体表达式代入Non-local网络的一般形式,有:
将上式用矩阵形式表示,有:
(2)嵌入高斯设定:Non-local网络的注意力权重系数函数实现为“两变换后向量点积的指数函数”,记作:
其中函数 θ ( ⋅ ) θ(⋅) θ(⋅) 和 ϕ ( ⋅ ) ϕ(⋅) ϕ(⋅) 分别为对 x i x_i xi 和 x j x_j xj 的变换(嵌入)函数,在Non-local网络中,这两个变换也构造为线性变换,即 θ ( x i ) = W θ x i θ(x_i)=W_θx_i θ(xi)=Wθxi 和 ϕ ( x j ) = W ϕ x j ϕ(x_j)=W_ϕx_j ϕ(xj)=Wϕxj ,其中 W θ W_θ Wθ 和 W ϕ W_ϕ Wϕ 分别为两个学习得到的线性变换系数矩阵。
与嵌入高斯匹配的归一化函数为:
在嵌入高斯设定下,将 g g g 、 f f f 和 C C C 的具体表达式代入Non-local网络的一般形式,并以矩阵形式表示:
(3)点积设定:Non-local网络的权重系数函数实现为“两变换后向量的点积”,记作:
为了简化梯度计算,直接以 C ( x ) = N C(x)=N C(x)=N 这一简化版本取代之,其中 N N N 为序列 x x x 的长度。与嵌入高斯的主要区别在于点积设定下,注意力权重系数没有通过softmax的概率化操作,即权重系数没有进行归一化。
(4)拼接设定:Non-local网络的权重系数函数实现为“拼接向量各维度加权和的激活值”,记作:
其中 w f ∈ R 2 d v w_f∈R^{2d_v} wf∈R2dv 为一个学习得到的权重向量,其以内积的形式将 x i x_i xi 和 x j x_j xj 的拼接结果变换为一个标量,该标量再经过 R e L U ReLU ReLU 函数进行激活得到最终的注意力权重系数。与点积设定类似,拼接设定也使用序列长度作为归一化函数,即 C ( x ) = N C(x)=N C(x)=N 。
前面是基本的非局部操作算子,利用这些算子,下面开始构造成模块。
z
i
=
W
z
y
i
+
x
i
z_i=W_zy_i+x_i
zi=Wzyi+xi 可以看出,上面构造成了残差形式。上面的做法的好处是可以随意嵌入到任何一个预训练好的网络中,因为只要设置W_z初始化为0,那么就没有任何影响,然后在迁移学习中学习新的权重。这样就不会因为引入了新的模块而导致预训练权重无法使用。
下面结合具体实例分析:
这里的输入以图片为例,输入是 X = ( b a t c h , h , w , 1024 ) X= (batch,h,w,1024) X=(batch,h,w,1024) :
在对视频这样的时空序列进行分类等操作时,Non-local网络的处理方式与针对静态图像空间序列的处理方式类似。只不过在静态图像中,自注意力机制考虑的仅仅是某像素与其他所有位置像素的关系,而在视频序列中,自注意力机制考虑的是某帧上的某像素与所有帧上的所有像素之间的关系。下图示意了Non-local网络在时空序列上的作用机制。
这篇文章的思路非常清晰,模块也非常简单。其背后的思想其实是自注意力机制的泛化表达,准确来说本文只提到了位置注意力机制(要计算位置和位置之间的相关性)。
本文设计的模块依然存在以下的不足:
(1) 只涉及到了位置注意力模块,而没有涉及常用的通道注意力机制;
(2) 可以看出如果特征图较大,那么两个(batch,hxw,512)矩阵乘是非常耗内存和计算量的,也就是说当输入特征图很大存在效率底下问题,虽然有其他办法解决例如缩放尺度,但是这样会损失信息,不是最佳处理办法。
参考代码:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。