《Non-local Neural Networks》个人总结理解
问题分析:神经网络中的long-range依赖问题,对于序列数据(如语音、文字),可以使用RNN循环神经网络来提取长距离依赖,对于图像数据,由于卷积操作具有的局部连接的特性,使得卷积的结果仅和周围的局部区域相关。为了使的卷积操作能够捕捉到更大的依赖关系,目前的做法是增大卷积的感受野,这也就是常见的卷积+下采样(池化)的网络结构。这种网络结构存在以下限制:计算效率不高优化困难跨级的依赖关系比较困难核
时序动作检测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博客
问题分析:
神经网络中的long-range依赖问题,对于序列数据(如语音、文字),可以使用RNN循环神经网络来提取长距离依赖,对于图像数据,由于卷积操作具有的局部连接的特性,使得卷积的结果仅和周围的局部区域相关。为了使的卷积操作能够捕捉到更大的依赖关系,目前的做法是增大卷积的感受野,这也就是常见的卷积+下采样(池化)的网络结构。这种网络结构存在以下限制:
- 计算效率不高
- 优化困难
- 跨级的依赖关系比较困难
核心观点:
论文提出的Non-Local操作,每个位置的特征都是通过加权计算所有位置的特征得到的,并且权重参数是通过学习得到的,所以可以解决长距离的依赖问题。并且,加权计算可以在space(2D)、time(1D)、spacetime(3D)多种维度上进行,也就是说这种操作可以适用于一维、二维和三维数据处理。
Non-Local操作的优势:
- 与卷积的渐进堆叠方式不同,Non-Local通过直接加权计算得到长距离依赖关系
- Non-Local操作的计算效率高
- Non-Local保持输入输出的维度不变,所以可以嵌入到网络的任意位置,可以作为一个即插即用的模块嵌入到网络中
Non-Local操作的基本公式:
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全连接层:
- Non-Local可以处理任意大小的输入,FC只能处理固定大小的输入
- Non-Local的权重是通过计算两个位置的相关系数得到的,而FC的权重是学习得到的
- FC一般用在网络在最后,用于输出,而Non-Local可以在网络的早期阶段使用
- 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)
嵌入式高斯函数(Embedded Gaussian)
高斯函数实现的f和C(x)实际上就组成了一个softmax层,这个softmax作用于每一行,对应的每一列表示权重系数。
点积(Dot product)
连接(Concatenation)
作者实验发现,这几种实现方式的性能几乎一样,都会带来性能的大幅提升,只是点积的性能稍微好一丢丢。
有了上述实现方法,下面看一下Non-Local Block模块的结构:
这里的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这一套的计算方法(用的是,哈哈哈哈哈)。总感觉这两个是一回事,但是论文里面偏偏说不是一回事,下面就列一下Transformer和non-local的一些细节对比(个人理解,不一定对),希望从中能找到一些信息:
Transformer:
使用场景:处理序列问题,比如语音识别,机器翻译等
输入:输入的数据形状是(B,T,C),其中,B是batch size的大小,T是序列长度,C是每个时间点的特征维度
计算方式:针对输入序列中每个时间步的特征x,分别乘以三个变换矩阵,,,其中和的维度必须i相同,得到三个变换后的特征,,,然后将和每个位置得到的做向量内积(dot-product)得到一个实数值(注意力得分),然后将这T个注意力得分做softmax归一化,将归一化后的T个实数值分别乘以对应位置的,就得到了这个经过注意力计算之后的特征。
输出:在计算Q,K,V的过程中和的维度必须相同,的维度一般都和输入的特征维度相同,假如输入的特征维度为, 和的维度为, 的维度为,那么在一次self-attention的运算中,参数量大小如下:
Non-Local:
使用场景:在论文的描述场景中,主要用于处理图像、视频问题,下面以常见的处理图像问题为例
输入:输入的数据形状是(B,C,H,W),其中,B是batch size的大小,C是feature map的通道维度,H是feature map的高,W是feature map的宽。
计算方式:针对输入的图像数据x,经过三次卷积变换,和得到三个输出,和,其中卷积参数 和的维度必须相同,假设batch size的大小B=1,将,的形状变换为(HW, C),然后将变换后的两个(HW, C)矩阵做矩阵乘法得到(HW, HW)大小的权重矩阵,在non-local中权重矩阵的计算使用了多种方式(高斯、嵌入的高斯、dot-product、concat),同时对于权重矩阵的归一化也使用了多种不同的方式,并配合使用1x1卷积来减少计算量
个人观点:在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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)