Non-local Neural Networks

论文链接:论文
一位大佬的博客:博客
一般深度学习的各种操作都是local的,比如CNN,conv都是局部感受野,但其实全局的信息对于图像的任务更有价值,比如短视频分类任务等等,目前全局信息的使用就是FC,但是这会带来大量的参数。这篇文章提出了一个nonlocal的操作,他把position当成了一个权重,这里的position可以指空间,时间,或者时空关系,计算全局的关联性。eg视频中第一帧的A1区域和第十帧中A3区域有关联性,或者静态图像中,有些区域有关系,如果找到这些关系,就可以更好的分析目标整体的动作。
Non-local Neural Networks
这个nonlocal可以被封装成一个block,用于任何网络。
贴出它的公式:
Non-local Neural Networks
它是一个类似attention的机制,根据各像素之间的相关性,对所有像素进行加权。权重越大,说明这个区域越重要。
xix_{i}代表输入图像的各像素点,ff计算xix_{i}和所有xjx_{j}之间的相关性。gg可以理解为对xjx_{j}的一种增强操作。(注意,xx为向量。故ff的结果为一个数值,g(xj)g(x_{j})仍为一个向量,C(x)C(x)是用于归一化的数值。相当于给输入图像每个像素点处的向量xjx_{j},都乘以xix_{i}xjx_{j}之间相关性的权重值,越相关,对结果的贡献便越大。计算所有的xjx_{j}都加权后的结果,得到当前yiy_{i}。此时,yiy_{i}便包含了xix_{i}与周围所有像素点之间相关性的信息
nonlocal不同于FC。nonlocal计算了不同location之间的关系,但是FC没有这种操作,他只是学习到了权重。同时nonlocal可以用于任意尺寸,但是FC只能固定尺寸。

介绍一下它的结构:
首先说一下关系函数ff,它有四种形式,但是经由实验发现它们都没差别。

  1. Gaussian:
    Non-local Neural Networks
    其中xiTxjx^T_ix_j是点乘相似度(dot-product similarity)。也可以用欧式距离,但是点乘在深度学习平台上更好实现。此时归一化参数C(x)=jf(xi,xj)C(x)=∑_{∀j}f(x_i,x_j)

  2. Embedded Gaussian:
    Non-local Neural Networks
    其中θ(xi)=Wθxiθ(x_i)=W_θx_iϕ(xj)=Wϕxjϕ(x_j)=W_ϕx_j是两个embedding。归一化参数和之前一致,为C(x)=jf(xi,xj)C(x)=∑_{∀j}f(x_i,x_j)
    这里和self attention比较相似

  3. Dot product:
    Non-local Neural Networks
    这里我们使用embedded version。在这里,归一化参数设为C(x)=NC(x)=N,其中N是x的位置的数目,而不是f的和,这样可以简化梯度的计算。这种形式的归一化是有必要的,因为输入的size是变化的,所以用x的size作为归一化参数有一定道理。
    dot product和embeded gaussian的版本的主要区别在于是否做softmax,softmax在这里的作用相当于是一个**函数。

  4. Concatenation:
    Non-local Neural Networks
    这里[.,.]表示的是concat,wfw_f是能够将concat的向量转换成一个标量的权重向量。这里设置C(x)=NC(x)=N

nonlocal block的整体公式定义如下:
Non-local Neural Networks
这样就允许我们把这个block插入到任意网络中去。一个示例的non-local block如图所示,我们看到式(2),(3),(4)中的这些pairwise function可以通过矩阵乘法来进行,(5)则可以直接concat得到。
Non-local Neural Networks
当nonlocal用于高层的feature map时,THW都比较小,这样它的运算量就比较轻量了。
如何让nonlocal高效?
首先Wg,Wθ,WφW_g, W_θ, W_φ的channel变成xxchannel的一半,然后WzW_z再变回来。还有一个subsampling的trick可以进一步使用,就是将(1)式变为:yi=1/C(x^)jf(xi,x^j)g(x^j)y_i=1/C(x̂ )∑_{∀j}f(x_i,x̂_j)g(x̂_j),其中x^xx下采样得到的(比如通过pooling),我们将这个方式在空间域上使用,可以减小1/4的pairwise function的计算量。这个trick并不会改变non-local的行为,而是使计算更加稀疏了。这个可以通过在图2中的ϕϕgg后面增加一个max pooling层实现。

实验

Non-local Neural Networks
表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要好,但是没有同时做时空维度的效果好。