Non-Local Neural Networks

一.摘要

卷积操作和循环神经元操作都是建立了一个处理一个局部范围信息的一个过程.本文呈现了一种非局部(non-local)操作,可以作为用于捕获长范围依赖的一类模块.本文提出的non-local操作在计算feature map上某点的响应值时就是通过对feature map上所有点与当前点的关系加权求和的一个结果.本文提出的non-local模块可以插入到许多计算机视觉网络结构中并取得不错的效果.

二.Non-Local Neural Networks

接下来首先给出non-local操作的定义,然后给出几个具体的non-local的实例.

2.1公式

定义通用的non-local操作如下公式所示:

y_i=\frac{1}{C(x)}\sum_{\forall j}f(x_i,x_j)g(x_j)

对于上式子non-local操作的通用定义有如下解释:

(1)y表示non-local操作的输出,与输入形状相同;

(2)x表示non-local操作的输入,与输出y形状相同;  

(3)i是输出y或输入x上的某个点的坐标(可以是空间坐标,时间坐标,或时空坐标);

(4)位置i的响应值(non-local操作的的输出)就是y_i

(5)j依次枚举(遍历)x上或y上的所有点的坐标位置,x_j表示输入数据上j位置的值; 

(6)函数f(x_i,x_j)计算输入数据的位置i和位置j的两个量之间的关系,例如相似度;

(7)函数g(x_j)计算输入数据的j位置的一个表示,在这里可以理解为f(x_i,x_j)的一个系数或权重; 

(8)non-local的位置i最终响应结果就是对每个位置j相对于当前位置i的关系f(x_i,x_j)进行加权f(x_i,x_j)g(x_j)求和,最后通过归一化因子C(x)进行归一化操作.

通过定义可以看出,非局部(non-local)操作在计算点i的响应值时得益于考虑了所有位置j关于当前位置i的关系,因而叫做非局部操作.而普通卷积操作之考虑了局部的一些相邻点,以及循环神经网络中某些点的计算也只考虑了当前时刻和上一时刻.

上式中的non-local操作与全连接操作是不同的,non-local操作是对所有位置j对于当前计算位置i的相关性f(x_i,x_j)进行加权求和,而全连接并没有考虑不同神经元之间的相关性,只是简单的对不同神经元的输出进行了加权求和.换言之就是说,全连接层并没有上式non-local操作中计算不同神经元输出之间关系的函数f.进一步地,上式的non-local操作支持多种尺寸的输入并输出相同的尺寸,并且保留了输入输出的位置对应关系(例如在位置i,输入x_i对应输出的y_i),但全连接层只能支持固定尺寸的输入,并且输出失去了与输入的位置对应关系.

non-local操作可以灵活并容易的应用于卷积/循环神经网络.并且non-local操作可以使用在网络的浅层,不像全连接层只能应用于网络末端.这就能够建立更加丰富的层级,从而结合局部和非局部信息.

2.2实例

尝试了多种不同的f函数和g函数的定义,通过实验发现对不同的fg的选择,non-local操作的结果并没有明显变化,表明了通用的non-local操作是模型提升的主要原因.  

为了简化,本文将g函数简单的构造为线性形式:g(x_j)=W_g*x_j,其中W_g为可学习参数,在实施过程中针对空间问题(2维图片)则通过1*1的卷积操作进行实现,针对时空问题(3维,例如视频)采用1*1*1卷积进行实现.

接下来具体讨论不同形式的f函数: 

高斯

f函数定义为高斯函数,形式如下式:

f(x_i,x_j) = e^{x_i^T,x_j}

这里x_i^Tx_j表示x_ix_j的点积相似度(近似余弦相似度).当然点积也可以用x_ix_j的欧式距离替代,但是在现在已有的深度学习平台中,点积在实施方面更加友好.归一化因子被定义为C(x)=\sum _{\forall j}f(x_i,x_j).

编码后高斯

对于上面的高斯函数进行进一步的扩展,将原始输入x_ix_j首先进行编码,的到编码后的结果\theta(x_i)\phi (x_j),之后对编码后的结果求取高斯函数结果,公式如下所示:

f(x_i,x_j) = e^{\theta(x_i)^T\phi(x_j)}

 x_ix_j 的编码函数就是简单的线性操作,其中\theta(x_i)=W_{\theta}x_i,\phi(x_j)=W_{\phi}x_j.归一化因子的定义与高斯函数形式相同为C(x)=\sum _{\forall j}f(x_i,x_j).

以上两种 f函数定义方式中归一化因子C(x)形式相同,带回到non-local操作通用定义公式中发现,本质上就是一个softmax操作,non-local操作的定义便成为了如下式所示:

y_i=\sum _{\forall j}\frac{f(x_i,x_j)}{\sum_{\forall j}f(x_i,x_j)}g(x_j)

其中\frac{f(x_i,x_j)}{\sum_{\forall j}f(x_i,x_j)}本质上就是softmax操作,可以记做softmax((W_{\theta}x_i)^T\cdot W_{\phi}x_j),其取值范围为0到1之间.则y_i=\sum_{\forall j}g(x_j)softmax(x_i^TW_{\theta}^TW_{\phi}x_j).所以也就能够发现,本质上就是通过对所有g(x_j)进行了一个注意力操作(加权求和)后得到了最终的输出y_i,这个注意力强度取决与当前被计算位置与所遍历到的位置的关系强度,也就是前面 f函数的计算结果大小.这种注意力的思想在之前的研究self-attention中已经提出了,因此自注意力可以形式为如下所示:

y=softmax(x^TW_{\theta}^TW_{\phi}x)g(x)

但需要注意,这并不是本文提出的non-local操作,只是自注意力操作,因为其缺少了求和那一步(在上式子中最左端加入求和符号便是本文的non-local操作).因此本文通过将自注意力和非局部均值方法想结合提出了本文的non-local操作.

随后本文发现由softmax操作进行attention操作并非是必须的,接下来给出2种non-local操作的可替换版本.

点积

f函数可定义为点积相似度.如下式所示:

f(x_i,x_j)=\theta (x_i^T)\phi(x_j)

这里采用对输入编码后的结果的点积相似度.与前两种方式不同的是,这里归一化因子C(x)=N,N表示non-local操作的输入x的位置数目,而非f(x_i,x_j)的求和结果,所以这也就取消了softmax操作,同时简化了梯度的计算.

拼接

f函数还可定义为输入的拼接形式,如下式所示:

 f(x_i,x_j)=ReLU(w_f^T[\theta (x_i),\phi (x_j)])

式中[\cdot ,\cdot ]表示拼接操作,w_f^T是一个权重向量,对拼接后的结果向量进行线性计算,然后的到一个标量.这里的归一化因子C(x)=N和上面点积的形式一样.最后将线性计算后的结果进行ReLU激活函数激活.

2.3Non-Local模块

Non-Local Neural Networks_第1张图片

上图为一个时空(3维数据,例如视频流)的non-local模块整体架构图,其中non-local操作选用的f函数是编码后高斯的形式,上图中\bigotimes表示矩阵相乘,\bigoplus表示对应元素相加,蓝色底色的框表示1*1*1的卷积操作,上图中绿色箭头表示reshape操作.\theta,\phi以及g表示对输入数据的编码操作(空间映射).上图中从输入x到两个\bigotimes计算结束则完成了前文定义的non-local操作.

这部分将介绍non-local模块的构造,non-local模块将前文提到的non-local操作包括在内,non-local模块能够应用于许多当前的网络结构中.本文定义non-local模块的数学表示如下所示:

z_i=W_zy_i+x_i

式子中y_i表示前文所说的non-local操作的输出结果,"+x_i"表示残差连接,残差连接的形式可以允许在不改变被插入网络的主体(初始网络计算流程)的基础上插入本文提出的non-local模块,例如上式中将W_z改为0就是未被插入non-local模块的原网络,模型会自主学习W_z去判断non-local操作的重要性,W_z就是2.3开始流程图中最顶端的1*1*1的卷积核.整个Non-Local模块结构如2.3开始的图. 

当输入特征是高级别(深层特征)并降采样的feature时,non-local模块中的f函数是轻量级的,通过以下两种方式来使得其计算更加高效.

Non-Local模块的实现

对输入x的编码操作后通道数均变为原来的一半,包括g函数,\theta\phi,目的是为了减小计算量.non-local模块公式中的W_z操作通过一个1*1*1的卷积(2.3图片中最顶层的1*1*1的卷积操作)来实现并将卷积结果通道书恢复为与non-local模块的输入x相同从而能够进行残差连接操作.

还有另一个降采样操作去减小non-local操作的计算量,首先将2.1中non-local操作的公式重新写为如下形式:

y_i=\frac{1}{C(\widehat{x})}\sum_{\forall j}f(x_i,\widehat{x_j})g(\widehat{x_j})

式子中\widehat{x}是输入x降采样后的结果(例如使用池化操作进行降采样).也就是说,在计算non-local操作在每一点的响应值时,不需要当前被计算点和所有点都进行f函数的计算,只需要和某些点进行计算即可,这样就可以大大减小计算量,文中表明这种做法并不会改变non-local行为.具体实现可以在2.3中non-local模块图中在\thetag操作后加入池化操作即可.

三.试验结果

下面为论文中一部分实验的结果数据:

Non-Local Neural Networks_第2张图片

上图中实例a表示在C2D模型中插入一个non-local模块,但是基于上文中提到的四种不同的f函数分别做了实验,并与C2D的baseline进行了对比,发现点积形式的f函数效果最好,并且所有使用了non-local模块效果都要由于baseline. 

表b展示了分别对基于ResNet50和ResNet101的C2D插入不同数量的non-local模块的实验结果,基于ResNet50的C2D插入10个non-local模块效果最好,基于ResNet101的插入5个和10个non-local模块效果最好.

表d展示了分别在ResNet50以及ResNet101中,分别在时间,空间以及时空维度插入5个non-local模块的结果,发现ResNet50与ResNet101中均在时空维度下插入效果最好.

你可能感兴趣的:(算法,神经网络,深度学习,1024程序员节)