注意力的理解心得
注意力机制
注意力,很明显就是一个与人的视觉及神经有关的东西。
我们看电脑的时候,总是全身心的投入其中,即是妹妹从旁边走过,你也不会注意,因为电脑屏幕里是更好看的jk妹妹。
而注意力机制,就是模仿我们的大脑对图片的重点进行加权处理。
注意力分为空间注意力与通道注意力
空间注意力是获得H,W维度上的权值(输出是B×1×W×H),然后与feature map相乘。
通道注意力则是获得C 维度上的权值(输出为B×C×1×1),再与feature map 相乘。常见的就是SE注意力。
一个网络中通常会同时使用空间注意力+通道注意力,因为通道与空间都很重要,两者要兼顾。即使是上图中的SE通道注意力也在其中兼顾了一点空间的成分(只下采样到 1 8 \frac{1}{8} 81)(基操,例如我们总把低特征图与高特征图相连扥扥)
空间与通道为何重要
空间信息
空间信息是反映地理实体空间分布特征的信息。空间分布特征包括实体的位置、形状及实体间的空间关系、区域空间结构等。
我想,说白了就是一张图片中各个物体的大小及其位置关系。对于分割来说,知道一张图片的物体大小位置等信息确实很有必要。
通道联合
我想,这个可以用RGB的图片进行解释。下面是我用PS分别缺少显示R,G,B得来的图片(注意:任何单通道都是灰色的0~255)。
我们可以很清楚的体会到,缺少某个通道,虽然不会影响画面的内容,但是会严重影响画面想要表达的东西。缺少红色通道,少了台阶上的落红,没了蓝色,花儿头顶瞬间变绿(花儿表示很淦)
可以很明显的看到,不同的通道都会对合成的图片产生影响。
虽然台阶上的落红会产生意境美,但是为了让计算机知道这张图片主体,我们就应该让R通道的权重变低,蓝色通道的权重变大,这样就容易突出前景。
安放注意力的位置
壹
空间注意力放在网络前面,通道注意力放在后面。
在STDEnet与BiSenet中,我发现都有一部分是专注于空间的路径。而在STDEnet改进BiSenet的对比中,我发现两者的空间路径都是都是紧连着Input,而就算改了BiSenet的空间路径,将BiSenet(双流网络)的双流合并了,专注于空间的那条路径变成了context path 的上面一部分。
(我认为可以把这一小部分看做一个空间的注意力机制)。说明啥,说明空间注意力要在网络的前端。由于低特征的图片具有更高的空间信息,所以应该把空间注意力放在前面进行指导。
而在这两个网络中都有ARM模块,这是一个通道注意力模块,并且我们发现ARM都被放置在网络的后半部分,输入的都是中后部分的特征图。后面的高维特征图需要通道注意力去维护图片的上下文关系。
贰
还可以把注意力放在残差里面
叁
还有的时候是放在block里面。
这个是我在使用CA注意力的时候,Paper的回答。
综上
似乎注意力哪里都能加,需要经验辅助实验去验证。
知识碎片
-
小图片(一般是指16或32倍的下采样,一般在U-net这类比较深的结构中)会损失空间信息;对于上采样,应该会增加空间的信息,但是会导致空间信息模糊。
-
注意力机制使用了multiple,是不是与add有点关系(想想add与concat现实意义上的区别,一个是描述特征的数据增加,另一个是描述的特征增加)
PS
以上是我们目前对注意力的粗浅见解,欢迎不同看法的大佬交流。
更新
根据知乎上大佬们的回答,进行整合。
来自问题:神经网络上加机制,精度反而下降,为什么会这样?
CNN模型,二分类问题,2层卷积层,加上CBAM之后,模型精度反而不如不加(已排除过拟合和欠拟合)。不知道为什么会出现这个问题?
机器学习的常态
- 等下一次你发现增加channel数或者增加层数,甚至换成大模型导致精度下降,你才会真正怀疑人生。极少有trick是能保证有效的,也没有哪个是solid的。(为什么增加层数或通道数反而精度下降?重新随机初始化后起点变差了,层数加太多过拟合,各种奇奇怪怪的原因哈)
- 谁说加了注意力就一定涨点?特别实在加了很多track的网络中 可能改变任何网络结构都会让精度下降
- 对于一个简单的二分类任务,如果一个线性模型就能将他分开,那么使用更复杂的模型不仅可能会使得模型难以训练,也可能会使得最终精度下降。
过拟合or欠拟合
加模块,就是提升网络的复杂度。
如果是过拟合,那么训练误差应该会非常低。简单的排除方法就是看看增加注意力之后是不是比不增加时训练误差更小。如果是,那就是过。反之,欠拟合。
怎么知道自己添加的注意力是否work?
可视化heat map
任务不合适
注意力机制的兴起,self-attention的推力功不可没,因此有不少在CV和NLP转来转去的方法,这也是未来的一大趋势,特别是自监督、注意力、transformer这些方法结构。如目标检测用的比较多的no-loal、DaNet这类self-attention变体。针对这些特定领域、特定任务下有突出效果的注意力机制,在应用与自己模型时,特别要注意任务适不适合,原始设计目的是否符合自身的需求?
比如说,你想用self-attention,就要知道self-attention的目的是建立大的全局感受野,那么对于只有局部信息或者引入全局信息会引起歧义的情况下,就不应使用它。再如noloca-attention默认是建立时间前后维度的联系,将其应用与图像时就需要单独的注意设计。
位置不合理
包括注意力提取的位置和注意力施加的位置
还是拿resnet来说,SE、CBAM这些注意力为什么不添加到网络的开头和结尾?
从结构上看,CBAM包括一个空间和一个通道注意力,两者主要都是利用全局平均池化将特征抽象到一系列点注意力权重,然后建立这些权重的联系并附加到原空间或通道特征上。然后,从提取位置看,在网络的开头(如图像级)提取,从rgb图像提取CBAM注意力,得到的是rgb3个权重的通道注意力和整幅图像大小的空间注意力,常识能很坚定推断这是没有意义的。那么稍往后一些层也是一样的,空间特征图太大,通道数太少。提取的通道权重概括性太大没有落到一些具体特征上,提取的空间注意力由于通道数较少,概括性不足,且空间注意力敏感且难学,更容易造成负面影响。
那么网络靠后的层呢?为什么也不添加注意力?
将通道和空间反过来原因其实跟上面是一样的,太靠后的层,通道数过多,容易引起过拟合;特征图太小,使用卷积,操作不当反而会引入大比例非像素信息,特别地,如果特征图小到1*1,那注意力就变成了一层奇怪的全连接层。更重要的是,靠近分类层,注意力的效果对分类结果更敏感,容易影响分类层决策。
因此,像CBAM这种注意力机制一般适用于通道与空间都比较适中的网络中间层。在这里,很多空间特征图可以代表原图的一个特征(纹理,结构,颜色等),因此可以概括为一个权重,若某些特征比较重要,那么简单地加大对应的注意力权重即可达到目的。正常情况下,注意力还会随着通道的增多而增强,这是效果的叠加的结果。
说白了,就是图片太大,算空间注意力容易信息冗余,图片太小,空间代表性又不足。通道注意力同理。。。
感受野不足?
我们知道CNN是一个局部性很强的模型,通常使用的是3x3卷积进行扫描整张图片,一层层抽取信息。而感受野叠加也是通过多层叠加的方式构建,比如两个3x3卷积的理论感受野就是5x5, 但是其实际感受野并没有那么大,可以看以下文章的分析。
https://zhuanlan.zhihu.com/p/108493730
各种注意力模块的作用是什么呢?他们能够弥补cnn局部性过强,全局性不足的问题,从而获取全局的上下文信息,为什么上下文信息重要呢?可以看一张图来自CoConv。
单纯看图a可能完全不知道该目标是什么,但是有了图b的时候,指导这是厨房以后,就可以指导该目标是厨房用手套。
因此注意力模块具有让模型看的更广的能力,近期vision transformer的出现和注意力也有一定关联,比如Non Local Block模块就与ViT中的self-attention非常类似。 vision transformer在小数据集上性能不好的也可以从这个角度解释,因为太关注于全局性(并且参数量比较大),非常容易过拟合,其记忆数据集的能力也非常强,所以只有大规模数据集预训练下才能取得更好的成绩。(感谢李沐老师出的系列视频!)
跑原来,再回到这个问题,注意力模块对感受野的影响,直观上来讲是会增加模型的感受野大小。理论上最好的情况应该是模型的实际感受野(不是理论感受野)和目标的尺寸大小相符。
- 如果添加注意力模块之前,模型的感受野已经足够拟合数据集中目标,那么如果再添加注意力模块有些画蛇添足。但是由于实际感受野是会变化的,所以可能即便加了注意力模块也可以自调节实际感受野在目标大小附近,这样模型可能保持性能不变。
- 如果添加注意力模块之前,模型的感受野是不足的,甚至理论感受野都达不到目标的大小(实际感受野大小<理论感受野大小),那么这个时候添加注意力模块就可以起到非常好的作用,性能可能会有一定幅度提升。
从这个角度来分析,题主只用了两个卷积层,然后就开始使用CBAM模块,很有可能是感受野不足的情况。但是为什么性能会下降呢,可能有其他方面因素影响,可以考虑先构建一个差不多的baseline,比如带残差的ResNet20,或者更小的网络,然后再在其基础上进行添加注意力模块。
2022年1月26日16:21:45
更多推荐
所有评论(0)