Non-local Neural Networks

    xiaoxiao2022-07-12  130

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

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

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

    Embedded Gaussian: 其中 θ ( 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是两个embedding。归一化参数和之前一致,为 C ( x ) = ∑ ∀ j f ( x i , x j ) C(x)=∑_{∀j}f(x_i,x_j) C(x)=jf(xi,xj) 这里和self attention比较相似

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

    Concatenation: 这里[.,.]表示的是concat, w f w_f wf是能够将concat的向量转换成一个标量的权重向量。这里设置 C ( x ) = N C(x)=N C(x)=N

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

    最新回复(0)