《Non-local Neural Networks》个人总结理解

时序动作检测SSAD《Single Shot Temporal Action Detection》_程大海的博客-CSDN博客_时序动作检测

时序动作检测《BSN: Boundary Sensitive Network for Temporal Action Proposal Generation》_程大海的博客-CSDN博客

时序动作检测《BMN: Boundary-Matching Network for Temporal Action Proposal Generation》_程大海的博客-CSDN博客

《Non-local Neural Networks》个人总结理解_程大海的博客-CSDN博客

时序动作检测《BSN++: Complementary Boundary Regressor with Scale-Balanced Relation Modeling for ……》_程大海的博客-CSDN博客


问题分析:

        神经网络中的long-range依赖问题,对于序列数据(如语音、文字),可以使用RNN循环神经网络来提取长距离依赖,对于图像数据,由于卷积操作具有的局部连接的特性,使得卷积的结果仅和周围的局部区域相关。为了使的卷积操作能够捕捉到更大的依赖关系,目前的做法是增大卷积的感受野,这也就是常见的卷积+下采样(池化)的网络结构。这种网络结构存在以下限制:

  1. 计算效率不高
  2. 优化困难
  3. 跨级的依赖关系比较困难

核心观点:

        论文提出的Non-Local操作,每个位置的特征都是通过加权计算所有位置的特征得到的,并且权重参数是通过学习得到的,所以可以解决长距离的依赖问题。并且,加权计算可以在space(2D)、time(1D)、spacetime(3D)多种维度上进行,也就是说这种操作可以适用于一维、二维和三维数据处理。

Non-Local操作的优势:

  1. 与卷积的渐进堆叠方式不同,Non-Local通过直接加权计算得到长距离依赖关系
  2. Non-Local操作的计算效率高
  3. Non-Local保持输入输出的维度不变,所以可以嵌入到网络的任意位置,可以作为一个即插即用的模块嵌入到网络中

Non-Local操作的基本公式:

y_{i}=\frac{1}{\mathcal{C(X)}} \sum_{\forall j}^{}f(x_{i},x_{j})g(x_{j})

        x是输入信号,y是输出信号,x和y的形状相同。x_i代表当前位置的特征,x_j代表其他位置的特征,二元函数f计算每个j位置与当前位置i的权重系数,一元函数g对每个位置j的特征做一次变换,通常使用1x1的卷积操作,然后进行加权求和得到当前位置i的特征。C(x)是起到归一化的作用。

        通过上述Non-Local的公式可以看到,Non-Local在计算过程中参考了所有位置的特征,相比之下,卷积操作只计算卷积核覆盖的局部区域,RNN操作只计算之前的特征,不会考虑之后的特征。

Non-Local操作不同于FC全连接层:

  1. Non-Local可以处理任意大小的输入,FC只能处理固定大小的输入
  2. Non-Local的权重是通过计算两个位置的相关系数得到的,而FC的权重是学习得到的
  3. FC一般用在网络在最后,用于输出,而Non-Local可以在网络的早期阶段使用
  4. Non-Local可以处理1D、2D、3D的输入数据,FC只能处理1D的输入数据

Self-Attention与CNN的关系

        普通的CNN操作具有局部连接的特性,感受野的大小受到卷积核以及网络深度的限制,卷积的计算结果是局部的weighted sum加权和。Self-Attention通过计算每个position与其他所有position的weight权重,加权求和来实现全局连接,所以self-Attention比CNN具有更多的参数,更大的function set,更高的灵活性,同时也更容易出现过拟合。可以简单理解为CNN是self-Attention的缩小版,self-Attention是CNN的放大版。

Non-Local操作具体实现:

        前面看了Non-Local操作的计算公式,在具体实现上可以使用不同的f、g和C(x)。论文中对于一元函数g使用的是一个简单的线性变换,也就是一个1x1卷积操作。对于二元函数f的具体实现,作者尝试了4中不同的方式:

高斯函数(Gaussian

f(x_{i},x_{j})=e^{x_{i}^Tx_{j}}

\mathcal{C}(X)= {\textstyle \sum_{\forall j}^{}} f(x_{i},x_{j})

嵌入式高斯函数(Embedded Gaussian

f(x_{i},x_{j})=e^{\theta (x_{i})^T\phi (x_{j})}

\mathcal{C}(X)= {\textstyle \sum_{\forall j}^{}} f(x_{i},x_{j})

        高斯函数实现的f和C(x)实际上就组成了一个softmax层,这个softmax作用于每一行,对应的每一列表示权重系数。

点积(Dot product

f(x_{i},x_{j})=\theta (x_{i}^T)\phi(x_{j})

\mathcal{C(X)}=N

连接(Concatenation

f(x_{i},x_{j})=ReLU(w_{f}^T[\theta (x_{i}), \phi(x_{j})])

\mathcal{C(X)}=N

        作者实验发现,这几种实现方式的性能几乎一样,都会带来性能的大幅提升,只是点积的性能稍微好一丢丢。

        有了上述实现方法,下面看一下Non-Local Block模块的结构:

z_{i}=W_{z}y_{i}+x_{i}

        这里的x和y和上面公式中的意思一样,x表示输入,y表示输出,x和y具有相同的维度,并且还是一个residual残差模块,残差模块有一个好处就是,对于现有的网络模型,加入Non-Local模块,设置W参数为0就可以还原成为原本的网络模型。具体的网络结构长这样:

        对于 和 g 部分,在卷积之后同时使用同样大小的下采样可以进一步降低Non-Local Block的计算量。


Non-Local与self-attention的关系:

如果同时看过non-local的论文《Non-local Neural Networks》,以及Transformer论文《Attention Is All You Need》的同学基本上都会产生一种感觉,Transformer论文里面用到了self-attention,通过Q,K,V来计算注意力,non-local里面没说自己用到了self-attention,但是说self-attention是non-local的一个特例,non-local里面也没有提到Q,K,V这一套的计算方法(用的是\theta,\phi,g​​​​​​​,哈哈哈哈哈)。总感觉这两个是一回事,但是论文里面偏偏说不是一回事,下面就列一下Transformer和non-local的一些细节对比(个人理解,不一定对),希望从中能找到一些信息:

Transformer:

使用场景:处理序列问题,比如语音识别,机器翻译等

输入:输入的数据形状是(B,T,C),其中,B是batch size的大小,T是序列长度,C是每个时间点的特征维度

计算方式:针对输入序列中每个时间步的特征x,分别乘以三个变换矩阵W_{q}W_{k}W_{v},其中W_{q}W_{k}的维度必须i相同,得到三个变换后的特征x_{q}x_{k}x_{v},然后将x_{q}和每个位置得到的x_{k}做向量内积(dot-product)得到一个实数值(注意力得分),然后将这T个注意力得分做softmax归一化,将归一化后的T个实数值分别乘以对应位置的x_{v},就得到了这个x_{q}经过注意力计算之后的特征。

Attention(Q,K,V)=softmax(\frac{QK^T}{\sqrt{d_{x} }} )V

输出:在计算Q,K,V的过程中W_{q}W_{k}的维度必须相同,W_{v}的维度一般都和输入的特征维度相同,假如输入的特征维度为d_{i}=512, W_{q}W_{k}的维度为d_{q}=d_{k}=512, W_{v}的维度为d_{v}=512,那么在一次self-attention的运算中,参数量大小如下:

d_{i}*d_{q}+d_{i}*d_{k}+d_{i}*d_{v}

Non-Local

使用场景:在论文的描述场景中,主要用于处理图像、视频问题,下面以常见的处理图像问题为例

输入:输入的数据形状是(B,C,H,W),其中,B是batch size的大小,C是feature map的通道维度,H是feature map的高,W是feature map的宽。

计算方式:针对输入的图像数据x,经过三次卷积变换W_{q}W_{k}W_{v}得到三个输出x_{\theta}x_{\phi}x_{g},其中卷积参数 W_{q}W_{k}的维度必须相同,假设batch size的大小B=1,将x_{\theta}x_{\phi}的形状变换为(HW, C),然后将变换后的两个(HW, C)矩阵做矩阵乘法得到(HW, HW)大小的权重矩阵,在non-local中权重矩阵的计算使用了多种方式(高斯、嵌入的高斯、dot-product、concat),同时对于权重矩阵的归一化也使用了多种不同的方式,并配合使用1x1卷积来减少计算量

y_{i}=\frac{1}{\mathcal{C(X)}} \sum_{\forall j}^{}f(x_{i},x_{j})g(x_{j})

个人观点:在transformer论文中的self-attention只用来处理以为的序列数据,在non-local的论文中将self-attention的思想扩展到了1D,2D,3D数据上,同时在non-local的论文中验证了多种计算attention score的方法,以及不同的归一化方法,而self-attention中的attention score和归一化分别用的是dot-product和softmax,所以个人理解non-local是把self-attention的思想更通用化了,同时在non-local中借助于1x1的卷积操作来降低self-attention的计算量,就像non-local论文中所说的,self-attention算是non-local的一个特例,实质上两者的计算思想并没有什么本质区别(纯属个人理解)。

Non-Local模块实现参考代码:Non-local_pytorch/non_local_dot_product.py at master · AlexHex7/Non-local_pytorch · GitHub

  • 8
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值