Skip to content

Instantly share code, notes, and snippets.

@YimianDai
Created July 30, 2019 22:35
Show Gist options
  • Save YimianDai/280686add13e621ab8de5f5183dd4c73 to your computer and use it in GitHub Desktop.
Save YimianDai/280686add13e621ab8de5f5183dd4c73 to your computer and use it in GitHub Desktop.
认识 Attention

认识 Attention

任何一篇做 Attention 的论文都应该回答一个问题,就是这个指导 Attention Module 该关注、抑制什么的信息来自于什么?为什么可以指导有效?

不需要啊,就是最后网络的全局损失函数,比如 SENet,就是希望建模通道之间的相互依赖关系,通过网络的全局损失函数自适应的重新矫正通道之间的特征相应强度

如果要学好 attention, 就必须要有一个比较好的初始化, 不然容易陷入到一个糟糕的点。

最近读过的 Attention 的文章:

  1. Single-Shot Object Detection with Enriched Semantics
  2. Non-local Neural Networks
  3. Attention to Scale: Scale-aware Semantic Image Segmentation
  4. Squeeze-and-Excitation Networks
  5. BAM: Bottleneck Attention Module
  6. CBAM: Convolutional Block Attention Module
  7. Gather-Excite: Exploiting Feature Context in Convolutional Neural Networks
  8. Attention Networks for Weakly Supervised Object Localization
  9. Decoupled Spatial Neural Attention for Weakly Supervised Semantic Segmentation

摘录

  1. 什么是 Attention 机制?

其实我没有找到 attention 的具体定义,但在计算机视觉的相关应用中大概可以分为两种:

1)学习权重分布:输入数据或特征图上的不同部分对应的专注度不同,对此 Jason Zhao 在知乎回答中概括得很好,大体如下:

  • 这个加权可以是保留所有分量均做加权(即 soft attention);也可以是在分布中以某种采样策略选取部分分量(即 hard attention),此时常用 RL 来做。
  • 这个加权可以作用在原图上,也就是《Recurrent Model of Visual Attention》(RAM)和《Multiple Object Recognition with Visual Attention》(DRAM);也可以作用在特征图上,如后续的好多文章(例如 image caption 中的《 Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》)。
  • 这个加权可以作用在空间尺度上,给不同空间区域加权;也可以作用在 channel 尺度上,给不同通道特征加权;甚至特征图上每个元素加权。
  • 这个加权还可以作用在不同时刻历史特征上,如 Machine Translation。

2) 任务聚焦:通过将任务分解,设计不同的网络结构(或分支)专注于不同的子任务,重新分配网络的学习能力,从而降低原始任务的难度,使网络更加容易训练。

不使用 RNN 结构。在特征图上生成空间分布的权重,然后再对特征图加权求和,试图让网络学出来对不同物体区域加以不同关注度。之后的在 CV 领域中应用 attention 绝大多数都是这么干的。例如,spatial transformer networks(STN) 是之后将 attention 用于物体识别比较有名的一篇文章,在一些现实应用中仍被使用。再如 residual attention network.

划重点:attention 机制听起来高达上,其实就是学出一个权重分布,再拿这个权重分布施加在原来的特征之上,就可以叫做 attention。简单来说:

  1. 这个加权可以是保留所有分量均做加权(即 soft attention);也可以是在分布中以某种采样策略选取部分分量(即 hard attention)。
  2. 这个加权可以作用在原图上,也就是 RAM 和 DRAM;也可以作用在特征图上,如后续的好多文章(例如 image caption)。
  3. 这个加权可以作用在空间尺度上,给不同空间区域加权;也可以作用在 channel 尺度上,给不同通道特征加权;甚至特征图上每个元素加权。
  4. 这个加权还可以作用在不同时刻历史特征上,如 Machine Translation,以及我前段时间做的视频相关的工作。

所以说,Attention 是啥啊?不就是一个权重分布嘛,搞得玄乎其玄~

本来 attention 就是区别对待的意思,用数学表示就是加权了

这个加权和 low-rank 里面的 weighted sum 有啥区别那?low-rank 的 weights 感觉也是给了一个权重那?也是学习一个权重分布呀(这一点可以把我之前的工作和之后的工作在博士论文里有机地联系起来了)

感觉强制让参数服从某种分布的话,好像和传统优化中的 regularzation 差不多??(其实是让特征服从某种分布)

attention 结构上就是一个新层

我理解的 attention 方法就是引入一层全连接层或者卷积层用非监督的方式(因为训练没有提供 attention 的 groundtruth)让模型自动学习不同 part 的权重

人眼的视觉 Attention

根据生物神经科学研究发现,人眼在看东西时潜意识中一般有三个过程:

  1. 眼睛接受像素信息,根据具体的像素信息成像。这个过程属于 bottom-up 过程,即人眼根据某一个像素极其周围的像素信息形成图像区域并进一步抽象为某一个物体形状;
  2. 眼睛扫描整个场景元素,并且寻找感兴趣的影像区域。这个过程属于 top-down 过程,即获得第一步物体形状之后,人眼会快速扫描整个视野场景,然后快速定位到感兴趣的地方;
  3. 眼睛聚焦感兴趣的区域,仔细观察获得外部信息。

也就是从这个过程中看,人眼视觉的目标检测应该是一个 Look and Think Twice 的过程,现在都只是一个简单的 Forward 肯定是不合理的

[Attention mechanism 目前有什么缺点和改进空间?][1]

机器学习中的 Attention 机制其实就是模仿人的注意力机制。其本质上都是从大量的信息中快速定位到少量高质量的目标区域信息,从而更有针对性的提取数据中的特征,学习相关知识。

Attention 的类别有很多,主要有 hard attention, soft attention, self attention 等。不过随着深度学习的发展,soft attention 可以嵌入到神经网络中收敛学习,所以应用更加广泛。self attention 是一种特殊的 soft attention,具体体现在学习的特征只针对输入或者输出一个特征空间学习。在视觉领域中,由于卷积是局部操作,需要很多层累堆之后其感受野才会变的较大,因此很多工作应用 self attention 解决了学习长距离特征之间的依赖关系,与卷积操作形成互补优势学习特征

Attention 的优势很明显,针对更有效的特征信息学习知识,其实是一个加速去噪的过程。但是,其应用也比较难,另外数据量如果很少很容易导致过拟合,结合小样本处理技术一起使用应该更能发挥它的特性。

大多数 Attention 机制都属于自我注意 self-attention,即 Attention 模块的参数都是通过 label 和预测值的 loss 反向传播进行更新,没有引入其他监督信息,因而其受到的监督有局限,容易对 label 过拟合。所以,可以考虑引入 label 之外的其他信息,引导 Attention 模块的学习。我们有一篇将属性信息引入帮助 Attention 学习的工作,详见:瑟木:Attribute-Aware Attention 开源啦!

Attention 作为一种思想,它的理想标签就是 “快准狠”:

  1. 快:尽量做到 light weight,否则就没意义了,毕竟 attention 的出发点就是来自人类视觉机制的 Biased Competition Theory,正因为资源有限才要有竞争嘛;
  2. 准:过滤掉任务无关的信息;
  3. 狠:enhance 任务相关的信息。

现在的 attention model 都能做到这几点,但代价是结果不够精确。所以这里有个很重要的问题,题主也说了,就是一旦一开始搞错了就尴尬了。这就像在大街上看到个妹子像是自己女朋友,不看清楚就冲过去又搂又抱,结果可想而知。。。

所以,第一个可能改进的方向就是 attention model 的 error feedback 机制。绝大多数的 architecture 都还是纯粹的 forward 结构,过去了就是过去了。而我们人类的 attention 更像是一个回溯搜索的过程,发现定位错了,是能够去关注其他地方的。这方面的工作,早期在 ICCV 2015 上有两篇,一个是 look and think twice(严格意义上这是一篇通过 task prior 将 general attention 修正为 task-specific attention 的工作,不是真正意义上的 error feedback),一个是 Human pose estimation with iterative error feedback。后续工作肯定也有,只是我的小领域不是这个,就不太关注了。但是我依然相信,这个方向仍然有很多问题没有解决。首先,error feedback 与现在大多数 recurrent attention 的一个不同,是在于如何估算当前 attention 的错误,从而回溯改变前一步预测的结果,而不是简单的 coarse-to-fine 或 sequential inference。从 learning 的角度,这里也有一些东西和 active/reinforcement learning 的某些 principle 是比较类似的。如何定义当前结果的期望 quality,采取什么样的 action 修正之前的 attention?这里有很多值得做的问题。

第二个改进的方向是 attention 的 collaborative 机制。如果做 error feedback 这种 iterative 的操作,时间开销会很大。但是,计算机比人的牛逼之处就在于我不一个一个来,我一起上。还是在大街上找女朋友,如果我们有三个分身,一个是颜控,只关注脸长的像女朋友的区域;一个是腿控,最后一个是脸盲,根本不知道漂不漂亮,只对女朋友那桀骜不驯的气质非常敏感。一个可能犯错,但一起来,大家互相竞争也互相合作,总能更快更准确的找到。所以,如何学习关注点都与 task 相关,但互相之间 diverse 并且 compete 的 multi-attention model,也是我认为非常有意思的问题。

最后,CV 领域很多 open 的方向对 attention 是有新的需求的。事实上越是复杂的 task 对 attention 的依赖程度就越高,因为这些问题的搜索空间往往都很庞大,例如因果推理。比如我们要识别一段长时间的足球赛事中,一段精彩的战术配合是在哪个时间段发生的,由哪些球员共同完成的?这个事件可能包含很长的、可变的时空范围,通过传统的 attention 机制是很难定义这个问题的。但是,如果我们结合局部区域的 attention(例如球员区域),做一些 attention-driven heuristic search 则可行性会大很多。我们可以简单想象成基于优先队列的深搜过程,优先级是由对不同子区域的 attention 给出的。这里,也会有 error feedback 的问题,以在形势不对的情况下及时回溯。DL 与传统 search 算法的结合已经成为可能,例如 Combinatorial Optimization with Graph Convolutional Networks and Guided Tree Search 这一篇。因此相信不久之后,类似的工作就会看到。再比如,Graph NN 中是否能把现在的 attention 机制都做一遍?最近这方面的工作突然挺多的,估计就几次会议的窗口。多关注一些 open 的问题,也会为 attention 的下一步提供新的思路。

在计算机视觉中,很多领域的相关工作 (例如,分类、检测、分割、生成模型、视频处理等) 都在使用 Soft Attention,这些工作也衍生了很多不同的 Soft Attention 使用方法。这些方法共同的部分都是利用相关特征学习权重分布,再用学出来的权重施加在特征之上进一步提取相关知识。 不过施加权重的方式略有差别,可以总结如下:

  1. 加权可以作用在原图上;
  2. 加权可以作用在空间尺度上,给不同空间区域加权;
  3. 加权可以作用在 Channel 尺度上,给不同通道特征加权;
  4. 加权可以作用在不同时刻历史特征上,结合循环结构添加权重,例如前面两章节介绍的机器翻译,或者后期会关注的视频相关的工作。

后来慢慢有人发现其实卷积神经网络自带 Attention 的功能,比方说在分类任务中,高层的 feature map 所激活的 pixel 也恰好集中在与分类任务相关的区域,也就是 salience map,常被用在解决图像检测和分割等弱监督问题上。

个人感觉 CV 中的 saliency 是通过比较低层的特征获得的图像区域,从某种程度上说,是表示了一些人眼移动的特质。但相比于 attention,attention 更为灵活,它可以根据场景和任务要求选取一些有意义的区域,而这些可能会被 saliency 忽略掉。

作者:阳阳 链接:https://www.zhihu.com/question/39576411/answer/102445570 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

划重点:attention 机制听起来高达上,其实就是学出一个权重分布,再拿这个权重分布施加在原来的特征之上,就可以叫做 attention。

Self-attention 自注意力,就是 feature map 间的自主学习,分配权重(可以是 spatial,可以是 temporal,也可以是 channel 间)

作者:zack.Zcy 链接:https://www.zhihu.com/question/68482809/answer/263764017 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

重点讲讲卷积网络上的 attention 吧,我本身也是做视觉的,和 CNN 打交道比较多。主要分为两种,一种是 spatial attention, 另外一种是 channel attention。什么意思呢,CNN 每一层都会输出一个 C x H x W 的特征图,C 就是通道,代表卷积核的数量,亦为特征的数量,H 和 W 就是原始图片经过压缩后的图,spatial attention 就是对于所有的通道,在二维平面上,对 H x W 尺寸的图学习到一个权重,对每个像素都会学习到一个权重。你可以想象成一个像素是 C 维的一个向量,深度是 C,在 C 个维度上,权重都是一样的,但是在平面上,权重不一样。这方面的论文已经很多了,重点关注一下 image/video caption。相反的,channel attention 就是对每个 C,在 channel 维度上,学习到不同的权重,平面维度上权重相同。spatial 和 channel attention 可以理解为关注图片的不同区域和关注图片的不同特征。channel attention 写的最好的一篇论文个人感觉是 SCA-CNN,读完有一种” 卧槽,原来这就是 channel attention!” 的感觉哈哈,我当时拿这篇论文给实验室导师看的时候,他说了句,卧槽,他把我想做的给做了 ,这就很气。网络架构上,Squeeze and Excitation Network 就是 channel attention 的典型代表,主要思想是卷积网络的卷积核所代表的特征之间存在冗余,他们起了个名字叫 feature recalibration,可以看作是在不影响性能的前提下减少卷积核数量是等效的。同样的,实验室一个同学也想到了这种方法,在 cifar10 数据集提了 20 个点,后来和我说过以后,我说这不就是 SeNet 吗……

请问 spatial attention 近些年有哪些推荐的论文啊 google 的 spatial transformer network

我理解的 attention 方法就是引入一层全连接层或者卷积层用非监督的方式(因为训练没有提供 attention 的 groundtruth)让模型自动学习不同 part 的权重

补充一点:attention 结构上就是一个新层。

Deformable Convolutional Networks 也是一种 Attention 机制

其实卷积网络本身就自带 Attention 效果,以分类网络为例,高层 feature map 所激活的 pixel 也恰好集中在分类任务相关的区域。

Soft attention 的典型例子是 stn[3],Residual Attention Network[5] 和 Two-level Attention[2],这种注意力机制是可微的,可以通过反向传播训练。而 Hard attention 需要预测关注的区域,通常使用强化学习来训练

[2] Xiao T, Xu Y, Yang K, et al. The application of two-level attention models in deep convolutional neural network for fine-grained image classification[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015: 842-850. [3] Jaderberg M, Simonyan K, Zisserman A. Spatial transformer networks[C]//Advances in Neural Information Processing Systems. 2015: 2017-2025. [5] Wang F, Jiang M, Qian C, et al. Residual Attention Network for Image Classification[J]. arXiv preprint arXiv:1704.06904, 2017.

[2] 中集成了三种类型的 attention: 提供候选 patch 的 bottom-up, 依据 object 筛选相关 patch 的 object-level top-down 和定位区分性部件的 part-level top-down。

[5] 这篇文章写得很不错,值得细读。提出了一种 Residual attention network,是 attention module 的堆叠。在每个 module 中均使用 bottom-up top-down 结构(参考 Stacked hourglass networks[7])。The bottom-up top-down structure mimics the fast feedforward and feedback attention process。利用残差机制使得网络深度可以进一步扩展。

[6] 提出了 SENet,这个模型获得了 ImageNet 2017 竞赛 Image Classification 任务的冠军。可以看做是 channel 维度的 attention (gating),


作者:Wayne2019 来源:CSDN 原文:https://blog.csdn.net/Wayne2019/article/details/78488142 版权声明:本文为博主原创文章,转载请附上博文链接!

待刷论文

几篇较新的计算机视觉 Self-Attention

素材

视觉注意力机制是人类视觉所特有的大脑信号处理机制。人类视觉通过快速扫描全局图像,获得需要重点关注的目标区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。

这是人类利用有限的注意力资源从大量信息中快速筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制,人类视觉注意力机制极大地提高了视觉信息处理的效率与准确性。

图 1 形象化展示了人类在看到一副图像时是如何高效分配有限的注意力资源的,其中红色区域表明视觉系统更关注的目标,很明显对于图 1 所示的场景,人们会把注意力更多投入到人的脸部,文本的标题以及文章首句等位置。

深度学习中的注意力机制从本质上讲和人类的选择性视觉注意力机制类似,核心目标也是从众多信息中选择出对当前任务目标更关键的信息。

自注意力机制

计算机视觉技术 self-attention 最新进展 这篇文章里介绍了一些相关的方法

比如介绍 non-local neural networks 的段落:

  1. 首先对输入的 feature map X 进行线性映射(说白了就是 111 卷积,来压缩通道数),然后得到θ,Φ,g 特征

  2. 通过 reshape 操作,强行合并上述的三个特征除通道数外的维度(其实就是对每个像素点都拉成向量,但是还保留 Channel 数,也就是变成 THW * C 这样的矩阵),然后对θ,Φ进行矩阵点乘操作,得到类似协方差矩阵的东西(这个过程很重要,计算出特征中的自相关性,即得到每帧中每个像素对其他所有帧所有像素的关系)(跟协方差的区别是协方差要求做中心化,而这个没有,也就是说这个就是一个自相关系数矩阵,最后这个自相关系数矩阵的大小会是 THW * THW)

  3. 然后对自相关特征 以列 or 以行(具体看矩阵 g 的形式而定) 进行 Softmax 操作,得到 0~1 的 weights,这里就是我们需要的 Self-attention 系数(每个像素都有一个 THW 的 weight 向量)

  4. 最后将 attention 系数,对应乘回特征矩阵 g 中,然后再上扩 channel 数,与原输入 feature map X 残差一下,完整的 bottleneck (怎么乘回去?g 是 THW * C,是的,就是 一个像素,有一个 THW 的 Attention 系数,分别跟 THW 像素相乘,得到后的加权平均值就是 这个像素位置最终的相应,就跟 NLM 一模一样,只不过这里的范围就是 THW 而不只是一个 search window,输入是 THW $\times $ C,mask 计算出来是 THW $\times $ THW,最后的输出是 THW $\times $ C 和输入一样大),这里的 Attention 就是与本像素特征相似度高的 特征 权重大,是这么体现出来的;在卷积里面本来计算一个输出的数值就会用到所有输入的channe,只不过因为 卷积是 sparse 的原因,Spatial 上很多都没有用到,而 non-local 计算 mask 则是 Spatial 和 channel 上都用到了

计算机视觉技术 self-attention 最新进展 这篇文章里面是把 non-local neural networks 认为是 self-attention 的,按照 Self-attention 自注意力,就是 feature map 间的自主学习,分配权重 这个定义,的确 non-local neural networks 是算 Self-attention 的,那么我的问题就是 不是 self-attention 的 Attention 是怎么做的?

目标检测演进路线 deep learning object detection

AttentionNet 的 Attention 体现在哪里?跟现在的 Attention 无关,AttentionNet 是 ICCV 2015 的工作,里面的 Attention 顶多是 Weak Direction,而不是现在 Attention 里面的 weight mask

神经网络的计算量非常大,特别随着分辨率提高,计算量至少成线性增长。而人类视觉的特性并不是一下子处理整个场景,而是提取关键的位置信息,然后联合起来构建出整个场景信息

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment