Non-local Neural Networks
论文链接:论文
一位大佬的博客:博客
一般深度学习的各种操作都是local的,比如CNN,conv都是局部感受野,但其实全局的信息对于图像的任务更有价值,比如短视频分类任务等等,目前全局信息的使用就是FC,但是这会带来大量的参数。这篇文章提出了一个nonlocal的操作,他把position当成了一个权重,这里的position可以指空间,时间,或者时空关系,计算全局的关联性。eg视频中第一帧的A1区域和第十帧中A3区域有关联性,或者静态图像中,有些区域有关系,如果找到这些关系,就可以更好的分析目标整体的动作。
这个nonlocal可以被封装成一个block,用于任何网络。
贴出它的公式:
它是一个类似attention的机制,根据各像素之间的相关性,对所有像素进行加权。权重越大,说明这个区域越重要。
代表输入图像的各像素点,计算和所有之间的相关性。可以理解为对的一种增强操作。(注意,为向量。故的结果为一个数值,仍为一个向量,是用于归一化的数值。相当于给输入图像每个像素点处的向量,都乘以与之间相关性的权重值,越相关,对结果的贡献便越大。计算所有的都加权后的结果,得到当前。此时,便包含了与周围所有像素点之间相关性的信息
nonlocal不同于FC。nonlocal计算了不同location之间的关系,但是FC没有这种操作,他只是学习到了权重。同时nonlocal可以用于任意尺寸,但是FC只能固定尺寸。
介绍一下它的结构:
首先说一下关系函数,它有四种形式,但是经由实验发现它们都没差别。
-
Gaussian:
其中是点乘相似度(dot-product similarity)。也可以用欧式距离,但是点乘在深度学习平台上更好实现。此时归一化参数。 -
Embedded Gaussian:
其中和是两个embedding。归一化参数和之前一致,为
这里和self attention比较相似 -
Dot product:
这里我们使用embedded version。在这里,归一化参数设为,其中N是x的位置的数目,而不是f的和,这样可以简化梯度的计算。这种形式的归一化是有必要的,因为输入的size是变化的,所以用x的size作为归一化参数有一定道理。
dot product和embeded gaussian的版本的主要区别在于是否做softmax,softmax在这里的作用相当于是一个**函数。 -
Concatenation:
这里[.,.]表示的是concat,是能够将concat的向量转换成一个标量的权重向量。这里设置。
nonlocal block的整体公式定义如下:
这样就允许我们把这个block插入到任意网络中去。一个示例的non-local block如图所示,我们看到式(2),(3),(4)中的这些pairwise function可以通过矩阵乘法来进行,(5)则可以直接concat得到。
当nonlocal用于高层的feature map时,THW都比较小,这样它的运算量就比较轻量了。
如何让nonlocal高效?
首先的channel变成channel的一半,然后再变回来。还有一个subsampling的trick可以进一步使用,就是将(1)式变为:,其中是下采样得到的(比如通过pooling),我们将这个方式在空间域上使用,可以减小1/4的pairwise function的计算量。这个trick并不会改变non-local的行为,而是使计算更加稀疏了。这个可以通过在图2中的和后面增加一个max pooling层实现。
实验
表2a比较了不同的non-local block的形式插入到C2D得到的结果(插入位置在res4的最后一个residual block之前)。发现即使只加一个non-local block都能得到~1%的提高。
有意思的是不同的non-local block的形式效果差不多,说明是non-local block的结构在起作用,而对具体的表达方式不敏感。本文后面都采用embedded Gaussian进行实验,因为这个版本有softmax,可以直接给出[0,1]之间的scores
表2b比较了一个non-local block加在resnet的不同stage的效果,具体加在不同stage的最后一个residual block之前。发现在res2,res3,res4层上加non-local block效果类似,加在res5上效果稍差。这个的可能原因是res5的spatial size比较小,只有7*7,可能无法提供精确的spatial信息了。
加入更多的non-local blocks。表2c给出了加入更多non-local block的结果,我们在resnet-50上加1 block(在res4),加5 block(3个在res4,2个在res3,每隔1个residual block加1个non-local block),加10 block(在res3和res4每个residual block都加non-local block)。在resnet101的相同位置加block。发现更多non-local block通常有更好的结果。我们认为这是因为更多的non-local block能够捕获长距离多次转接的依赖。信息可以在时空域上距离较远的位置上进行来回传递,这是通过local models无法实现的。
另外需要提到的是增加non-local block得到的性能提升并不只是因为它给base model增加了深度。为了说明这一点,表2c中resnet50 5blocks能够达到73.8的acc,而resnet101 baseline是73.1,同时resnet50 5block只有resnet101的约70%的参数量和80%的FLOPs。说明non-local block得到的性能提升并不只是因为它增加了深度。
表2d给出了在时间维度,空间维度和时空维度分别做non-local的结果。仅在空间维度上做就相当于non-local的依赖仅在单帧图像内部发生,也就是说在式(1)上仅对index i的相同帧的index j做累加。仅在时间维度上做也类似。表2d显示只做时间维度或者只做空间维度的non-local,都比C2D baseline要好,但是没有同时做时空维度的效果好。