当前位置:   article > 正文

【视频理解】十一、Non-Local☆_non-local网络

non-local网络


参考资料

论文

  Non-local Neural Networks
博客

  自注意力模型的视觉应用——Non-local网络

  Non-local Neural Networks及自注意力机制思考

  Non-local neural networks

视频

  CVPR2018——Non-local Neural Networks 经典论文分享


第1章 引言

 不管是CV还是NLP任务,都需要捕获长范围依赖。在时序任务中,RNN操作是一种主要的捕获长范围依赖手段,而在CNN中是通过堆叠多个卷积模块来形成大感受野。目前的卷积和循环算子都是在空间和时间上的局部操作,长范围依赖捕获是通过重复堆叠,并且反向传播得到,存在3个不足:

  • (1) 捕获长范围依赖的效率太低;
  • (2) 由于网络很深,需要精心设计模块和梯度;
  • (3) 当需要在比较远位置之间来回传递消息时,这是局部操作是困难的;

 故作者基于图片滤波领域的非局部均值滤波操作思想,提出了一个泛化、简单、可直接嵌入到当前网络的非局部操作算子,可以捕获时间(一维时序信号)、空间(图片)和时空(视频序列)的长范围依赖。


1.1 Local与Non-Local

Local 这个词主要是针对感受野(receptive field)来说的,主要就是关注局部区域。以卷积操作为例,它的感受野大小就是卷积核大小,而我们一般都选用 3 × 3 , 5 × 5 3\times3,5\times5 3×35×5 之类的卷积核,它们只考虑局部区域,因此都是local的运算。同理,池化(Pooling)也是。

 相反的,Non-Local 指的就是感受野可以很大,而不是一个局部领域

 全连接就是non-local的,而且是global的。但是全连接带来了大量的参数,给优化带来困难。这也是深度学习(主要指卷积神经网络)近年来流行的原因,考虑局部区域,参数大大减少了,能够训得动了。

 为什么还需要Non-Local

 我们知道,卷积层的堆叠可以增大感受野,但是如果看特定层的卷积核在原图上的感受野,它毕竟是有限的。这是local运算不能避免的。然而有些任务,它们可能需要原图上更多的信息,比如attention。如果在某些层能够引入全局的信息,就能很好地解决local操作无法看清全局的情况,为后面的层带去更丰富的信息


第2章 网络结构

2.1 模型的数学构建

Non-Local 网络表达了从集合 x x x 到集合 y y y 的映射,两个集合具有相同的元素个数(例如 x x x 为一幅图像, y y y 可以视为一个与 x x x 具有相同尺寸的图像),其一般模型为:

在这里插入图片描述

下面解释一下上式中的各变量的含义:

  • x x x 为输入序列,可以表示一幅图像、一段视频等,一般是序列的某种特征表示;
  • y y y 为对应的输出序列,尺度和 x x x 一样;
  • i 、 j i、j ij 均为两个集合的元素下标,这里的下标可以表达空间位置、时间位置(时刻)或是时空位置;
  • f f f 是配对计算函数,计算第 i i i 个位置和其他所有位置的相关性;
  • g g g 是一个映射函数,将一个点映射成一个向量,可以看成是计算一个点的特征。
  • C ( x ) C(x) C(x) 是归一化函数,保证变换前后整体信息不变。

 从以上公式可以直观的看出,对于任意一个输出位置的计算,都需要输入序列中所有位置元素的参与,这便是其名称中“非局部”的含义,这一点与卷积的局部操作有着本质区别
 
 在 Non-Local 中,全连接网络中权重系数是通过训练得到的。而 f ( x i , x j ) f(x_i,x_j) f(xi,xj) 作为权重系数是通过输入序列中元素“自己和自己”计算得到的,正是这种“自娱自乐”的方式才决定了Non-Local网络属于自注意力模型 f ( x i , x j ) f(x_i,x_j) f(xi,xj) 即为注意力权重系数。


 在 Non-Local 网络的一般模型中,需要确定函数 g g g f f f C C C 的具体形式。

 首先 g ( x j ) g(x_j) g(xj) 被确定为针对 x j x_j xj 的线性变换 g ( x j ) = W g x j g(x_j)=W_gx_j g(xj)=Wgxj ,其中 W g W_g Wg 为一个学习得到的权重矩阵。当 x x x 为一幅图像(或图像对应的特征图)时, g g g 即可以表示为一个 1 × 1 × d v 1×1×d_v 1×1×dv 卷积操作,其中 d v d_v dv x x x 的维度,也即上述特征图的通道数。

 不同的 f f f 也决定了不同的 C C C 。Non-Local网络原文中给出了四种对 f f f 的设定形式,分别为:

  • 高斯(Gaussian);
  • 嵌入高斯(Embedded Gaussian);
  • 点积(Dot product);
  • 拼接(Concatenation);

 在对 f f f 不同的设定下,归一化函数 C C C 也具有不同的形式,下面就分别对其进行讨论。

(1)高斯设定:Non-local网络的注意力权重系数实现为“两向量点积的指数函数”,记作:

在这里插入图片描述

 这里 x i T x j x_i^Tx_j xiTxj 为点积形式表示的向量间相似度,对应的归一化函数为:

在这里插入图片描述

 在高斯设定下,将 g g g f f f C C C 的具体表达式代入Non-local网络的一般形式,有:

在这里插入图片描述

 将上式用矩阵形式表示,有:

在这里插入图片描述


(2)嵌入高斯设定:Non-local网络的注意力权重系数函数实现为“两变换后向量点积的指数函数”,记作:

在这里插入图片描述

 其中函数 θ ( ⋅ ) θ(⋅) θ() ϕ ( ⋅ ) ϕ(⋅) ϕ() 分别为对 x i x_i xi x j x_j xj 的变换(嵌入)函数,在Non-local网络中,这两个变换也构造为线性变换,即 θ ( 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 ,其中 W θ W_θ Wθ W ϕ W_ϕ Wϕ 分别为两个学习得到的线性变换系数矩阵。

 与嵌入高斯匹配的归一化函数为:

在这里插入图片描述

 在嵌入高斯设定下,将 g g g f f f C C C 的具体表达式代入Non-local网络的一般形式,并以矩阵形式表示:

在这里插入图片描述


(3)点积设定:Non-local网络的权重系数函数实现为“两变换后向量的点积”,记作:

在这里插入图片描述

 为了简化梯度计算,直接以 C ( x ) = N C(x)=N C(x)=N 这一简化版本取代之,其中 N N N 为序列 x x x 的长度。与嵌入高斯的主要区别在于点积设定下,注意力权重系数没有通过softmax的概率化操作,即权重系数没有进行归一化。


(4)拼接设定:Non-local网络的权重系数函数实现为“拼接向量各维度加权和的激活值”,记作:

在这里插入图片描述

 其中 w f ∈ R 2 d v w_f∈R^{2d_v} wfR2dv 为一个学习得到的权重向量,其以内积的形式将 x i x_i xi x j x_j xj 的拼接结果变换为一个标量,该标量再经过 R e L U ReLU ReLU 函数进行激活得到最终的注意力权重系数。与点积设定类似,拼接设定也使用序列长度作为归一化函数,即 C ( x ) = N C(x)=N C(x)=N


2.2 Non-local Block

 前面是基本的非局部操作算子,利用这些算子,下面开始构造成模块。
z i = W z y i + x i z_i=W_zy_i+x_i zi=Wzyi+xi 可以看出,上面构造成了残差形式。上面的做法的好处是可以随意嵌入到任何一个预训练好的网络中,因为只要设置W_z初始化为0,那么就没有任何影响,然后在迁移学习中学习新的权重。这样就不会因为引入了新的模块而导致预训练权重无法使用

 下面结合具体实例分析:

在这里插入图片描述

Fig 1. Non-local Block

 这里的输入以图片为例,输入是 X = ( b a t c h , h , w , 1024 ) X= (batch,h,w,1024) X=(batch,h,w,1024)

  • (1)经过 E m b e d d e d   G a u s s i a n Embedded\ Gaussian Embedded Gaussian 中的两个嵌入权重变换 W θ , W ϕ W_θ,W_ϕ Wθ,Wϕ 得到 ( b a t c h , h , w , 512 ) (batch,h,w,512) (batch,h,w,512) ( b a t c h , h , w , 512 ) (batch,h,w,512) (batch,h,w,512) ,目的是降低通道数,减少计算量;
  • (2)分别对这两个输出进行reshape操作,变成 ( b a t c h , h × w , 512 ) (batch,h×w,512) (batch,h×w,512)
  • (3)对这两个输出进行矩阵乘(其中一个要转置),计算相似性,得到 ( b a t c h , h × w , h × w ) (batch,h×w,h×w) (batchh×wh×w)
  • (4)然后在第2个维度即最后一个维度上进行softmax操作,得到 ( b a t c h , h × w , h × w ) (batch,h×w,h×w) (batchh×wh×w)注意这样做就是位置注意力,相当于找到了当前图片或特征图中每个像素与其他所有位置像素的归一化相关性
  • (5)然后将 g g g 也采用一样的操作,先通道降维,然后reshape;
  • (6)然后和 ( b a t c h , h × w , h × w ) (batch,h×w,h×w) (batchh×wh×w) 进行矩阵乘,得到 ( b a t c h , h × w , 512 ) (batch,h×w,512) (batch,h×w,512) ,即将位置或者空间注意力机制应用到了所有通道的每张特征图对应位置上,本质就是输出的每个位置值都是其他所有位置的加权平均值,通过softmax操作可以进一步突出共性
  • (7)最后经过一个 1 × 1 1\times1 1×1卷积恢复输出通道,保证输入输出尺度完全相同。

 在对视频这样的时空序列进行分类等操作时,Non-local网络的处理方式与针对静态图像空间序列的处理方式类似。只不过在静态图像中,自注意力机制考虑的仅仅是某像素与其他所有位置像素的关系,而在视频序列中,自注意力机制考虑的是某帧上的某像素与所有帧上的所有像素之间的关系。下图示意了Non-local网络在时空序列上的作用机制。

在这里插入图片描述

Fig 2. Non-local网络在时空序列上的作用机制

第3章 总结

 这篇文章的思路非常清晰,模块也非常简单。其背后的思想其实是自注意力机制的泛化表达,准确来说本文只提到了位置注意力机制(要计算位置和位置之间的相关性)

本文设计的模块依然存在以下的不足:

 (1) 只涉及到了位置注意力模块,而没有涉及常用的通道注意力机制;

 (2) 可以看出如果特征图较大,那么两个(batch,hxw,512)矩阵乘是非常耗内存和计算量的,也就是说当输入特征图很大存在效率底下问题,虽然有其他办法解决例如缩放尺度,但是这样会损失信息,不是最佳处理办法。


第4章 Pytorch实现Non-Local

参考代码

  AlexHex7/Non-local_pytorch


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/855377
推荐阅读
相关标签
  

闽ICP备14008679号