https://www.zhihu.com/search?q=Self-Attention&type=content
作者:Fisher Yu
链接:https://zhuanlan.zhihu.com/p/44031466
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
Attention注意力,起源于Human visual system(HVS),个人定义的话,应该类似于 外界给一个刺激Stimuli,然后HVS会第一时间产生对应的 saliency map,注意力对应的应该就是这个显著性区域。
这其中就涉及很多 bottom-up 及 top-down 的 physiological 原理~
-------------------------------
总的来说,就是 区域权值学习 问题:
- Hard-attention,就是0/1问题,哪些区域是被 attentioned,哪些区域不关注
2. Soft-attention,[0,1]间连续分布问题,每个区域被关注的程度高低,用0~1的score表示
Self-attention自注意力,就是 feature map 间的自主学习,分配权重(可以是 spatial,可以是 temporal,也可以是 channel间)
[1] Non-local NN, CVPR2018
FAIR的杰作,主要 inspired by 传统方法用non-local similarity来做图像 denoise
主要思想也很简单,CNN中的 convolution单元每次只关注邻域 kernel size 的区域,就算后期感受野越来越大,终究还是局部区域的运算,这样就忽略了全局其他片区(比如很远的像素)对当前区域的贡献。
所以 non-local blocks 要做的是,捕获这种 long-range 关系:对于2D图像,就是图像中任何像素对当前像素的关系权值;对于3D视频,就是所有帧中的所有像素,对当前帧的像素的关系权值。
网络框架图也是简单粗暴:
Non-local block
文中有谈及多种实现方式,在这里简单说说在DL框架中最好实现的 Matmul 方式:
- 首先对输入的 feature map X 进行线性映射(说白了就是 1*1*1 卷积,来压缩通道数),然后得到 特征
- 通过reshape操作,强行合并上述的三个特征除通道数外的维度,然后对 进行矩阵点乘操作,得到类似协方差矩阵的东西(这个过程很重要,计算出特征中的自相关性,即得到每帧中每个像素对其他所有帧所有像素的关系)
- 然后对自相关特征 以列or以行(具体看矩阵 的形式而定) 进行 Softmax 操作,得到0~1的weights,这里就是我们需要的 Self-attention 系数
- 最后将 attention系数,对应乘回特征矩阵 中,然后再上扩 channel 数,与原输入 feature map X 残差一下,完整的 bottleneck
嵌入在 action recognition 框架中的attention map 可视化效果:
attention visulization
图中的箭头表示,previous 若干帧中的某些像素 对最后图(当前帧)的脚关节像素的贡献关系。由于是soft-attention,其实每帧每个像素对对其有贡献关系,图中黄色箭头是把响应最大的关系描述出来。
总结
Pros:non-local blocks很通用的,容易嵌入在任何现有的 2D 和 3D 卷积网络里,来改善或者可视化理解相关的CV任务。比如前不久已有文章把 non-local 用在 Video ReID [2] 的任务里。
Cons:文中的结果建议把non-local 尽量放在靠前的层里,但是实际上做 3D 任务,靠前的层由于 temporal T 相对较大,构造 及点乘操作那步,超多的参数,需要耗费很大的GPU Memory~ 可后续改善