Non-Local Networks

Paper:https://arxiv.org/abs/1711.07971v1

convolution和recurrent都是对局部区域进行的操作,所以它们是典型的local operations。受计算机视觉中经典的非局部均值(non-local means)的启发,提出一种non-local operations用于捕获长距离依赖(long-range dependencies),即如何建立图像上两个有一定距离的像素之间的联系,如何建立视频里两帧的联系,如何建立一段话中不同词的联系等。

non-local operations在计算某个位置的响应时,是考虑所有位置features的加权——所有位置可以是空间的,时间的,时空的。这个结构可以被插入到很多计算机视觉结构中,在视频分类的任务上,non-local模型在Kinetics和Charades上都达到了最好的结果。在图像识别的任务上,non-local模型提高了COCO上物体检测/物体分割/姿态估计等任务的结果。

定义

按照非局部均值的定义,我们定义在深度神经网络中的non-local操作如下:

[图片上传失败...(image-e66d2b-1575469093981)]

其中表示输入信号(图片,序列,视频等,也可能是它们的features),表示输出信号,其size和相同。用来计算和所有可能关联的位置之间pairwise的关系,这个关系可以是比如和的位置距离越远,值越小,表示位置对影响越小。用于计算输入信号在位置的特征值。是归一化参数。作为对比,conv的操作是对一个局部邻域内的特征值进行加权求和,比如kernel size=3时,。 recurrent的操作则是i时刻的值仅基于当前时刻或前一时刻or。

另外作为对比,non-local的操作也和fc层不同。公式(1)计算的输出值受到输入值之间的关系的影响(因为要计算pairwise function),而fc则使用学习到的权重计算输入到输出的映射,在fc中x_j和x_i的关系是不会影响到输出的,这一定程度上损失了位置的相关性。另外,non-local能够接受任意size的输入,并且得到的输出保持和输入size一致。而fc层则只能有固定大小的输入输出

表示形式

讨论和的几种形式。有意思的是我们的实验显示不同的表现形式其实对non-local的结果并没有太大影响,表明non-local这个行为才是主要的提升因素。
为了简化,我们只考虑是线性的情况,即,其中是一个可学的权重矩阵,实际中是通过空间域的1*1 conv或时空域的1*1*1 conv实现的。


-Gaussian

其中是点乘相似度(dot-product similarity),也可以用欧式距离,但是点乘在深度学习平台上更好实现


-Embedded Gaussian

高斯函数的一个简单的变种就是在一个embedding space中去计算相似度,在本文中,我们考虑以下形式

其中,和,是两个embedding。归一化参数和之前一致,我们发现self-attention模块其实就是non-local的embedded Gaussian版本的一种特殊情况


-Dot product

也可以定义成点乘相似度,即

这里我们使用embedded version。在这里,归一化参数设为,其中N是的位置的数目,而不是f的和,这样可以简化梯度的计算。这种形式的归一化是有必要的,因为输入的size是变化的,所以用的size作为归一化参数有一定道理。dot product和embeded gaussian的版本的主要区别在于是否做softmax,softmax在这里的作用相当于是一个激活函数。


-Concatenation

Concat是在Relation Networks [38]中用到的pairwise function。我们也给出了一个concat形式的f,如下:

这里[.,.]表示的是concat,是能够将concat的向量转换成一个标量的权重向量。这里设置。


Non-local Block

将(1)式中的non-local操作变形成一个non-local block,以便其可以被插入到已有的结构中。我们定义一个non-local block为:

其中已经在(1)式中给出了,则表示的是一个residual connection。residual connection的结构使得我们可以在任意的pretrain模型中插入一个新的non-local block而不需要改变其原有的结构(如作为初始化则完全和原始结构一致)。
一个示例的non-local block如图所示,我们看到式(2),(3),(4)中的这些pairwise function可以通过矩阵乘法来进行,(5)则可以直接concat得到。

image

non-local block的pairwise的计算可以是非常lightweight的,如果它用在高层级,较小的feature map上的话。比如,图2上的典型值是T=4,H=W=14 or 7。通过矩阵运算来计算parwise function的值就和计算一个conv layer的计算量类似。另外我们还通过以下方式使其更高效。

我们设置的channel的数目为的channel数目的一半,这样就形成了一个bottleneck,能够减少一半的计算量。再重新放大到的channel数目,保证输入输出维度一致。
还有一个subsampling的trick可以进一步使用,就是将(1)式变为:,其中是下采样得到的(比如通过pooling),我们将这个方式在空间域上使用,可以减小1/4的pairwise function的计算量。这个trick并不会改变non-local的行为,而是使计算更加稀疏了。这个可以通过在图2中的和后面增加一个max pooling层实现。
我们在本文中的所有non-local模块中都使用了上述的高效策略。

[参考链接]
https://blog.csdn.net/elaine_bao/article/details/80821306
https://zhuanlan.zhihu.com/p/33345791

你可能感兴趣的:(Non-Local Networks)