deeplearning-cv-notes
deeplearning-cv-notes copied to clipboard
Attention 注意力机制
文章:【AI不惑境】计算机视觉中注意力机制原理及其模型发展和应用-有三AI
-
- 空间注意力模型(spatial attention);
-
- 通道注意力机制;
-
- 空间和通道注意力机制的融合。还有,残差注意力机制,多尺度注意力机制,递归注意力机制等。
视频:-----------------------
通道 Attention:
空间 Attention:
另
通道 + 空间结合 Attention:
残差级联 Attention:
Attention 应用在图像语义分割
视频:
-
【极市】李夏-语义分割中的自注意力机制和低秩重建_哔哩哔哩
- 文章:用Attention玩转CV,一文总览自注意力语义分割进展 作者:北京大学 立夏
- 注意力机制_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili
[MXNet/Gluon] 动手学深度学习番外篇:注意力机制概述_哔哩哔哩
page1:
page2:
page3:
注:在视频的 88 分钟多提了下在语义分割中的应用。
什么是滤波算子?
图像滤波可以更改或者增强图像。通过滤波,可以强调一些特征或者去除图像中一些不需要的部分。滤波是一个邻域操作算子,利用给定像素周围的像素的值决定此像素的最终的输出值。
- 均值滤波
- 中值滤波
- 高斯滤波
- 双边滤波
Non-local Neural Networks及自注意力机制思考 - 知乎
即将位置或者空间注意力机制应用到了所有通道的每张特征图对应位置上,本质就是输出的每个位置值都是其他所有位置的加权平均值,通过softmax操作可以进一步突出共性。最后经过一个1x1卷积恢复输出通道,保证输入输出尺度完全相同。
通读全文,你会发现思路非常清晰,模块也非常简单。其背后的思想其实是自注意力机制的泛化表达,准确来说本文只提到了位置注意力机制(要计算位置和位置之间的相关性,办法非常多)。
个人认为:如果这些自注意模块的计算开销优化的很小,那么应该会成为CNN的基础模块。既然位置和位置直接的相关性那么重要,那我是不是可以认为graph CNN才是未来?因为图卷积网络是基于像素点和像素点之间建模,两者之间的权重是学习到的,性能肯定比这种自监督方式更好,后面我会写文章分析。
本文设计的模块依然存在以下的不足:
(1) 只涉及到了位置注意力模块,而没有涉及常用的通道注意力机制
(2) 可以看出如果特征图较大,那么两个(batch,hxw,512)矩阵乘是非常耗内存和计算量的,也就是说当输入特征图很大存在效率底下问题,虽然有其他办法解决例如缩放尺度,但是这样会损失信息,不是最佳处理办法。
下一篇文章分析具有哪些扩展和新的改进策略。主要分析以下这些:
计算机视觉中的Non-local-Block以及其他注意力机制
因此,针对远距离信息传递问题,提高长距离依赖,本文从传统的非局部均值滤波方法中受到启发,提出了卷积网络中的non-local,即:某一像素点处的响应是其他所有点处的特征权重和,将每一个点与其他所有点相关联,实现non-local 思想。
Non-local 的思想和简单数学原理
Non-local的核心思想就是上面说的,某一像素点处的响应是其他所有点处的特征权重和。因此,假设对于一个2D的77特征图,总共是491(拉平操作)个位置,每个位置都与其他位置(包括本身位置)有关联性度量,就会得到49*49的关联性矩阵,而这个关联性矩阵经过归一化后其实可以理解为彼此之间的关联权重,因为不同像素点间的关联性都是不同的,因此这个权重本质上其实已经实现了注意力。当将这个4949的权重再与原特征图491做矩阵乘时,得到的49*1矩阵就是该2D特征图所有像素点的响应。因此在这里的2D特征图的空间位置的注意力操作就是这个non-local操作。 以上是举了一个例子,根据核心思想去理解这个东西。下面可以看一下具体的数学公式代入,抽象化。以下是我整理的公式图片,所有公式都在这上面。
将non-local的核心思想某一像素点处的响应是其他所有点处的特征权重和进行数学化,就是图片中的左公式(1),很好理解,其中yi代表第i像素点处的响应,f(xi,xj)表示两个像素点的关联性度量函数,g(xj)表示对xj特征的embedding线性映射,这里用Wgxj表示,C(x)表示一个归一化操作。如果左式理解不清,可以看右式,非常直观。 其他所有点xj,权重f(xi,xj),特征Wgxj, 和∑, 以及归一化C(x),一目了然。
。。。。。。
Non-local其实可以被认为是channel level和spatial level的泛化。这种方式通过注意力加强距离依赖,更是直接实现了全局的联系性。既有attention的思想也有context联系的思想。
基于这个non-local,后面相继又有几个网络结构提出来,本质还是做注意力机制,只不过操作不一样,或者是改进版的。像刚刚说的,CCNet, GCNet。可以看图。
另外,想说一点注意力的见解
形如resnet alexnet等通用网络结构中,我们可以理解为空间或者通道间的所有位置,其重要性均等,即权重都为1。而注意力机制的根本目的,就是对原本平均分配的权重通过手动或者自学习的方式进行非等份分配。所以,从这个角度看,挂在嘴边的先验知识或是上下文关系(local, global, context)都可以理解为对原本等价权重的非等分配。在诸如SENet,CBAM中,通过网络训练的方式得到权重;而人为先验,是不是就是手动的权重分配,针对我们觉得重要的部分进行高权重赋值然后操作?
一文读懂自注意力机制:8大步骤图解+代码
self-attention是什么?
如果你认为self-attention与attention有相似之处,那么答案是肯定的!它们基本上共享相同的概念和许多常见的数学运算。
一个self-attention模块接收n个输入,然后返回n个输出。这个模块中发生了什么呢?用外行人的话说,self-attention机制允许输入与输入之间彼此交互(“self”),并找出它们应该更多关注的对象(“attention”)。输出是这些交互和注意力得分的总和。
写一个self-attention模块包括以下步骤
- 准备输入
- 初始化权重
- 推导key, query 和 value
- 计算输入1的注意力得分
- 计算softmax
- 将分数与值相乘
- 将权重值相加,得到输出1
- 对输入2和输入3重复步骤4-7