自注意力与 non local Neural Networks

参考文献:

https://blog.csdn.net/u010158659/article/details/78635219

用Attention玩转CV,一文总览自注意力语义分割进展
Non-local Neural Networks及自注意力机制思考
https://blog.csdn.net/i1020/article/details/85370667
https://blog.csdn.net/piaoxuezhong/article/details/78345929

https://blog.csdn.net/u010158659/article/details/78635219
https://mp.weixin.qq.com/s/Fh2ob_qCNHeTOWHjZ9DRyg?scene=25#wechat_redirect

non loca的应用

【CVPR19 超分辨率】(Oral)Second-order Attention Network for Single Image Super-Resolution
github code:https://github.com/daitao/SAN/blob/master/TrainCode/loss/gradient_loss.py

文章学习Non-Local Recurrent Network for Image Restoration

文章学习34“Non-locally Enhanced Encoder-Decoder Network for Single Image Deraining”

论文阅读笔记之——《Image Restoration via Residual Non-local Attention Networks》

paper的链接:https://arxiv.org/pdf/1903.10082v1.pdf

代码:https://github.com/yulunzhang/RNAN

Motivation

“Non-local”直译为“非局部”。个人的理解是指特征提取时,当前输入数据的特征计算要考虑其它输入数据的信息。举例来说,非局部操作的关注点就是在于如何建立起图像上两个有一定距离的像素之间的联系,如何建立视频里两帧的联系,如何建立一段话中不同词的联系。

一个典型的CNN网络是由一系列卷积操作累积起来的。对于使用在图像上的CNN,每个卷积操作只能捕捉到输入数据的局部信息。整个网络通过局部操作的逐步累积来获得范围较广的信息提取。而RNN则是通过循环的方式处理序列输入(如视频每一帧图像的时间序列或者图片上一列像素的空间序列),从而融合非局部的信息。

这篇文章提出三点CNN和RNN在融合非局部信息上的三个劣势:1.计算不高效;2.优化更难;3.非局部特征的信息传递不够灵活,功能不够强大。当然,这也是因为CNN和RNN的初衷并不是专门来融合非局部信息的。

在这篇文章中,作者提出了一种非局部模块(non-local block, 简称NL block)的网络结构,来帮助深度网络更好地融合非局部的信息。这对于一些问题是非常重要的。

Method

从使用在图像去噪问题中的non-local means[1]方法出发,作者对NL block的抽象描述为:

以图像为背景来说的话,i,j是像素坐标,x,y是输入和输出信息。j的取值范围是任意的坐标。C(x)是一个归一化常数。f(.)是用来构建i,j点处信息关联的二输入函数。g(.)是计算j点信息对i点影响的单输入函数。

这样的非局部操作其实很常见,从广义的角度来讲可以从多个已有的研究方向来理解这个操作。首先这是从图像去噪中借鉴来的模型。除此之外,如果f(.)函数输出的是一个概率值,即0~1之间的数值,那么这就是前段时间有所讨论的self-attention[2]。因为(i,j)二元坐标对取遍了所有情况,这个定义又很像dense CRF[3],或者可以认为这也是一种图模型。

回到这篇文章中。作者对f(.)有很多不同选择的定义方式。通过实验选定了名为Embedded Gaussain+Dot product的方案。对g(.)的定义是一个简单的线性函数。NL block的输出并没有替代输入,而是和原输入相加,形成一个残差结构(residual),得到zi。

其中W均为待学习的参数,可以将其视为1x1卷积的参数。若,那么就是二阶的softmax,即CRF。
f(.)中所做的点积不同于style transfer中的协方差或者bilinear操作。后两者是把不同通道的特征图两两内积,空间信息完全抛弃,得到的结果是通道数x通道数大小的协方差矩阵。f(.)的操作是每个点的特征向量(通道个数的维度)进行内积,空间信息保留了下来,输出还是HxW大小。

整个NL block也可以从结构图来理解:

图中T,H,W代表输入特征的维度。其中T是对于视频数据的帧数,对于分割或检测任务,T=1.

这里面作者还提到了一些小trick可以进一步压缩计算量。比如1x1的卷积压缩输出通道数,形成一个瓶颈结构(bottleneck)。或者在f(.)对应的1x1卷积之后使用pooling来减小H,W,即采样一部分的j而不是所有的j进行信息融合。

可以看到,NL block可以用作网络设计中的一个补充结构插入到CNN中任意的一层之后。因为使用的是1x1卷积,因此对输入特征没有尺寸限制。同时整个操作计算量相对较小,额外参数量也很少。

Experiment

作者在视频分类、物体检测、物体实例分割这些很需要非局部信息关联的任务上进行了实验。其中在Kinetics数据集上进行了ablation study,来仔细研究NL block各个细节的有效性。结果表格不再赘述,得到的结论总结如下:

  1. NL block中f(.)不同的定义方式各有千秋,但是为了更好化可视化使用embedded Gaussian+dot

  2. product,即上文提到的公式所示的方法。 NL block的放入网络主干的位置:放在浅层好,高层提升作用下降。

  3. NL block变深的作用:对于主干网络较浅的网络,加深NL block能够提升性能。对于较大较深的网络无论是增加NL

  4. block还是继续加深主干网络的深度都很难再提升性能。 (对视频任务)NL block同时作用于时空比单独作用于时间域或空间域要好。

  5. (对视频任务)比三维CNN要好:比C3D又快又好。值得注意的是,在视频变长以后,non-local的trick的提升变小了。Reasonable。因为在时间维度上,这些短视频帧数太短,时间维度上的小卷积得到的信息不足,劣势明显。时间变长了,non-local也不能handle这么大的信息量了,损失一些信息的小卷积反而不那么差劲了。

这是有人会问,non-local这么吊怎么不把卷积层全都替换掉?肯定不行的!你要依赖小卷积核去捕捉主体信息,同时用他的block捕捉全局信息,两者相辅相成才有好的效果。

nolocal计算量

在这里插入图片描述
例如,将nolocal模块放在VGG19的conv2的池化之后,则图像尺寸为56x56x128(HWC),那么计算量为1,258,815,488Flops(1.2GFlops)。
如果放在VGG19的conv1之后,则图像尺寸为112x112x64(HWC),那么计算量为10,070,523,904Flops(10GFlops)。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值