Non-local Neural Networks个人阅读笔记

1 介绍

卷积和循环操作都是对局部邻域进行处理(时间/空间),因此必须经过重复的卷积循环,逐渐传播数据中的信号,最终才能获得长距离的信息依赖关系。
但是这种局部处理的重复存在一定局限性:
1)计算低效
2)优化困难
3)长距离信息需要来回传递时,很难对这种多次跳跃的联系进行建模

所以本文弄了一种一般化的non-local操作(基于cv领域的经典non-local均值)
这个操作基于整个特征图上的全部位置计算响应,好处有:
1)和重复处理相比,可以直接计算任意两个位置的长距离信息依赖
2)更有效,层数少效果也不错
3)输入尺寸可变,很容易结合其他操作

本文展示了视频分类的处理结果,non-local的一个单元就可以捕捉视频的长范围时空信息,整个结构优于简单的2D,3D卷积网络。结果更准确,计算更省资源。

为了阐述non-local的通用性,文章进一步在COCO数据集上做了目标检测/分割/位姿估计的实验。结论是non-local在这三个任务中都提高了准确率,且只有很小的额外计算量。non-local具有通用性,可作为基础结构在神经网络中使用。

2 和non-local有关的工作

2.1 non-local图像处理

我理解的话,这部分是在讲non-local思想的历史,包括:
1)全局滤波操作,基于图像块的相似性计算贡献
2)BM3D,块匹配的思想,该方法和神经网络比基础也很牢固。

这种non-local匹配的思想也是纹理分析,超分重建,修复图像算法的精髓之处。

2.2 图模型

长距离依赖可以用图模型进行建模,例如条件随机场CRF。在深度神经网络领域,CRF可以做语义分割后处理工作。
对CRF的平均场进行迭代推测的过程,可以转化成RN。相反,我们的non-local只需要简单的前馈计算(不用循环)并且主要用在分类和检测。总而言之,这些方法都和图神经网络相关。

  • 搞懂CRF,写篇笔记

2.3 前馈序列建模

最近语音和语言序列都在用前馈网络建模。在这些方法中,长距离依赖主要通过大感受野和很深的一维卷积来捕获。这些前馈网络可并行,也比递归模型效果好。

2.4 自注意力机制

本文工作引入了自注意力机制的思想。自注意力模块通过对嵌入空间的全部序列加权平均,得到序列中关注位置的响应。我们将这种方法从机器翻译领域迁移到了计算机视觉领域,变为了更通用的non-local方法。

2.5 交互网络

交互网络(Interaction Networks,IN)常用于物理问题建模-处理物体成对的相互影响;
它的变体Relation Networks也是计算输入图的成对位置特征间函数关系;
而本文non-local也是处理的成对数据(后文有解释),由此可看出有non-local的作用之关键。

2.6 视频分类

视频分类的一个自然方法是,结合优秀的RNN和CNN。与此相反,前馈网络是基于时空上的3D卷积思想完成的。除了这些端到端的方法,光流和轨迹法也很好用。而这两种就是non-local的思想。

3 Non-local Nerual Networks(关键部分)

3.1 表示

神经网络中的non-local操作被定义为:
y i = 1 C ( x ) ∑ ∀ j f ( x i , x j ) g ( x j ) (1) \mathbf y_i=\frac{1}{C(\mathbf x)}\sum_{\forall j}f(\mathbf x_i,\mathbf x_j)g(\mathbf x_j) \tag 1 yi=C(x)1jf(xi,xj)g(xj)(1)
式(1)中, y \mathbf y y是输出, x \mathbf x x是输入,两者尺寸相同。
i i i是当前遍历位置, j j j是所有可能的位置。
f f f计算位置 i i i和位置 j j j的联系(相似性等),并得到一个标量, g g g是一元函数,得到输入 x \mathbf x x在位置 j j j的表征。
最终结果响应用 C ( x ) C(\mathbf x) C(x)归一化。

应该能明显看出不是局部处理。
这个non-local处理和fc不同,fc中是训练好的权重,不是 x i , x j \mathbf x_i,\mathbf x_j xi,xj相关的函数。non-local尺寸可变,fc需要固定尺寸并且损失了输入输出对应位置的相关信息。

non-local的灵活性使它可以与很多结构结合,和局部操作结合后层信息将更丰富。

3.2 实例化

下面考虑 f f f g g g两个函数的形式:

为了简化, g g g只考虑线性的情况,即 g ( x j ) = W g x j g(\mathbf x_j)=W_g\mathbf x_j g(xj)=Wgxj,在这里,权重矩阵可以被理解为空间中的1×1卷积或者时空中的1×1×1卷积。
(我看了下论文和代码,个人的理解是:这里和下面做的都是整体操作)
假设最初 x \mathbf x x 224 ∗ 224 ∗ 32 224*224*32 22422432的,分别对应长,宽,通道数
那经过 g g g的结果 g ( x ) g(\mathbf x) g(x)就应该是 224 ∗ 224 ∗ 16 224*224*16 22422416的,也就是说 W g W_g Wg的参数量是 1 ∗ 1 ∗ 16 1*1*16 1116

f f f的话,文章里考虑了四种情况,注意下这里也都是整体操作就好。

1)高斯函数
f ( x i , x j ) = e x i T x j (2) f(\mathbf x_i,\mathbf x_j)=e^{\mathbf x_i^T \mathbf x_j} \tag 2 f(xi,xj)=exiTxj(2)
2)嵌入高斯函数(将离散变量转为连续变量)
f ( x i , x j ) = e θ ( x i ) T ϕ ( x j ) (3) f(\mathbf x_i,\mathbf x_j)=e^{\theta (\mathbf x_i)^T \phi (\mathbf x_j)} \tag 3 f(xi,xj)=eθ(xi)Tϕ(xj)(3)
在上述尺度下,这两个式子最终得到的 f f f都是 ( 224 ∗ 224 ) ∗ ( 224 ∗ 224 ) (224*224)*(224*224) (224224)(224224) f f f的第 i i i行,第 j j j列,就表示位置 i i i j j j的相似性,因此标量相乘就可以转化为向量内积的形式。以式(3)为例,算出来的结果可以看作:
f = e θ ( x ) T ϕ ( x ) (3’) f=e^{\theta (\mathbf x)^T \phi (\mathbf x)} \tag{3’} f=eθ(x)Tϕ(x)(3)
其中, x \mathbf x x的尺寸是 1 ∗ ( 224 ∗ 224 ) ∗ 32 1*(224*224)*32 1(224224)32 θ \theta θ ϕ \phi ϕ W g W_g Wg操作相同。
在归一化时,原文令 C ( x ) = ∑ ∀ j f ( x i , x j ) C(\mathbf x)=\sum_{\forall j}f(\mathbf x_i,\mathbf x_j) C(x)=jf(xi,xj)

这两个式子带入到(1)可以视为自注意力机制的形式,即:
y = s o f t m a x ( x T W θ T W ϕ x ) g ( x ) (4) \mathbf y=softmax(\mathbf x^T W_\theta^T W_\phi \mathbf x)g(\mathbf x) \tag 4 y=softmax(xTWθTWϕx)g(x)(4)
其中, s o f t m a x ( x ) = [ e x 1 ∑ i e x i , . . . , e x n ∑ i e x i ] (5) softmax(x)=[\frac{e^{x_1}}{\sum_{i}{e^{x_i}}},...,\frac{e^{x_n}}{\sum_{i}{e^{x_i}}}] \tag 5 softmax(x)=[iexiex1,...,iexiexn](5)
x是一维行向量。

式(4)是对 x T W θ T W ϕ x \mathbf x^T W_\theta^T W_\phi \mathbf x xTWθTWϕx这个 ( 224 ∗ 224 ) ∗ ( 224 ∗ 224 ) (224*224)*(224*224) (224224)(224224)矩阵的每一行做softmax,结果还是 ( 224 ∗ 224 ) ∗ ( 224 ∗ 224 ) (224*224)*(224*224) (224224)(224224)的,再和 ( 224 ∗ 224 ) ∗ 16 (224*224)*16 (224224)16 g ( x ) g(\mathbf x) g(x)做点乘,最后生成
224 ∗ 224 ∗ 16 224*224*16 22422416的输出y。

(这里我有个小疑问, g ( x j ) g(\mathbf x_j) g(xj)的结果一定在0-1之间吗?因为softmax的结果就是和为1了,如果要保证y在0-1就必须要 g ( x j ) g(\mathbf x_j) g(xj)全部在0-1之间吧)

3)点积
f ( x i , x j ) = θ ( x i ) T ϕ ( x j ) (6) f(\mathbf x_i,\mathbf x_j)=\theta (\mathbf x_i)^T \phi (\mathbf x_j) \tag{6} f(xi,xj)=θ(xi)Tϕ(xj)(6)

4)串联
f ( x i , x j ) = R E L U ( w f T [ θ ( x i ) , ϕ ( x j ) ] ) (7) f(\mathbf x_i,\mathbf x_j)=RELU(\mathbf w_f^T[\theta (\mathbf x_i), \phi (\mathbf x_j)]) \tag{7} f(xi,xj)=RELU(wfT[θ(xi),ϕ(xj)])(7)
这里[·,·]就代表了串联操作。

实在是没懂,我感觉应该是把两个行向量竖着拼一起啊,假设先不考虑向量,只考虑 θ ( x i ) \theta(\mathbf x_i) θ(xi)这两个都是数值的话,也应该是行向量和列向量内积才能转换成标量啊。
个人理解:
这步串联是把[]内部变成 2 ∗ ( 224 ∗ 224 ) 2*(224*224) 2(224224)的尺度, w f T \mathbf w_f^T wfT的尺度则是 ( 224 ∗ 224 ) ∗ 2 (224*224)*2 (224224)2。不知道原意是什么样的。

总之后两种方法归一化的时候就简单取C=N,在我的例子里就是224*224,这样就不涉及softmax公式,没有引入自注意力机制,同时在求反向梯度时难度降低。

作者用不同的表达形式阐明了non-local的灵活性。

3.3 Non-local Block

这一部分主要是把3.2的式(3)抽出来,搭了一个基本的结构,上一部分也基本都解释了,不同之处就是最后加了个残差。原文的图比较简单,其他博客有细节图如下:
在这里插入图片描述
实际上,图中有一些小技巧:
其他公式也可以变换出来。
先降采样再上采样的bottleneck是为了提高计算效率,相似地,也可以利用子采样空间进行计算来降低计算量,例如在 ϕ \phi ϕ g g g的后面加maxpool(空间尺度缩小)。
这里残差表示为:
z i = W z y i + x i \mathbf z_i=W_z \mathbf y_i+\mathbf x_i zi=Wzyi+xi
是为了在初始化权重矩阵 W z W_z Wz为0时不会对原始模型 x x x产生影响。

具体实现上感觉多了挺多优化计算的地方,用矩阵的速度也不慢,挺值得学习的。

原文Figure2下面有这样一句有点奇怪:
在这里插入图片描述

The softmax operation is performed on each row.

理解为图中每条线都进行了softmax可能比较合适?虽然能解释之前我对 g g g的疑问,但是在代码里好像并未看到这样操作。

4 视频分类模型

处理视频分类问题,作者对比了2D卷积(C2D),膨胀3D网络(I3D),还有在它们里面加non-local结构的结果。
C2D结构如下:
在这里插入图片描述

I3D的膨胀方式为:
把3×3的kernel膨胀为3×3×3,1×1的kernel膨胀为3×1×1,每两个block膨胀一个kernel,conv1的核膨胀为5×7×7.
I3D的精确度高于CNN+LSTM。

实现细节

对预训练模型设置了一堆参数。
对non-local这部分权重参数,用MSRA初始化,做残差前的 W z W_z Wz用卷积代替,在 W z W_z Wz后面又加了BN层,BN的权重初始化为0,保证初始是个恒等映射。然后就可以随便加在别的地方了。

5 视频分类实验

在Kinetics和Charades两个数据集上都做了实验。

5.1 Kinetics数据集上的实验

文章结论自然是加non-local效果更优异,结果显示出比较重要的几个现象是:
1)non-local block个数越多,结果越好,并且不是因为它加深了网络,而是non-local在发挥着作用
2)四种 f f f的设计方法对结果影响并不大,也就是说self-attention应用于softmax的过程并没有那么重要,重要的是non-local本身
3)non-local加入位置越接近底层,感受的空间信息越少,发挥的优势越少,但是计算量小,计算速度快
4)non-local应用在时空的效果比单独的效果都要好
5)non-local C2D比I3D精确,计算量更少
6)non-local I3D比I3D精确,说明non-local和3D卷积是互补操作,可以共同作用

5.2 Charades数据集上的实验

non-local I3D最好。

6 COCO数据集实验

这部分实验需要注意的是,只加入1个non-local block的时候精度有所提高,但是数量越多,精度越低。

这篇文章网上也有很多分析,也有大佬尝试和自己的工作结合,感觉这种便于使用的模块确实可以自己试着写一个,至少把接口写好,想要用的时候就拿出来试试,没准就能派上用场呢。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值