目录
概要为什么需要视觉注意力计算机视觉(computer vision)中的注意力机制(attention)的基本思想就是想让系统学会注意力——能够忽略无关信息而关注重点信息。为什么要忽略无关信息呢? 注意力分类与基本概念神经网络中的「注意力」是什么?怎么用?这里有一篇详解: 就注意力的可微性来分:
硬注意力可以用Python(或Tensorflow)实现为:
上述存在的唯一的问题是它是不可微分的;你如果想要学习模型参数的话,就必须使用分数评估器(score-function estimator)关于这一点,我的前一篇文章中有对其的简要介绍。
就注意力关注的域来分:
一个概念:Self-attention自注意力,就是 feature map 间的自主学习,分配权重(可以是 spatial,可以是 temporal,也可以是 channel间) 软注意力The application of two-level attention models in deep convolutional neural network for fine-grained image classification—CVPR20151. Spatial Transformer Networks(空间域注意力)—2015 nipsSpatial Transformer Networks(STN)模型[4]是15年NIPS上的文章,这篇文章通过注意力机制,将原始图片中的空间信息变换到另一个空间中并保留了关键信息。 这篇文章认为之前pooling的方法太过于暴力,直接将信息合并会导致关键信息无法识别出来,所以提出了一个叫空间转换器(spatial transformer)的模块,将图片中的的空间域信息做对应的空间变换,从而能将关键的信息提取出来。 spatial transformer其实就是注意力机制的实现,因为训练出的spatial transformer能够找出图片信息中需要被关注的区域,同时这个transformer又能够具有旋转、缩放变换的功能,这样图片局部的重要信息能够通过变换而被框盒提取出来。 (a)列是原始的图片信息,其中第一个手写数字7没有做任何变换,第二个手写数字5,做了一定的旋转变化,而第三个手写数字6,加上了一些噪声信号; 2. SENET (通道域)—2017CPVR
详见《论文阅读笔记—SENET》 3. Residual Attention Network(混合域)—2017文章中注意力的机制是软注意力基本的加掩码(mask)机制,但是不同的是,这种注意力机制的mask借鉴了残差网络的想法,不只根据当前网络层的信息加上mask,还把上一层的信息传递下来,这样就防止mask之后的信息量过少引起的网络层数不能堆叠很深的问题。 文提出的注意力mask,不仅仅只是对空间域或者通道域注意,这种mask可以看作是每一个特征元素(element)的权重。通过给每个特征元素都找到其对应的注意力权重,就可以同时形成了空间域和通道域的注意力机制。 很多人看到这里就会有疑问,这种做法应该是从空间域或者通道域非常自然的一个过渡,怎么做单一域注意力的人都没有想到呢?原因有:
该文章的注意力机制的创新点在于提出了残差注意力学习(residual attention learning),不仅只把mask之后的特征张量作为下一层的输入,同时也将mask之前的特征张量作为下一层的输入,这时候可以得到的特征更为丰富,从而能够更好的注意关键特征。 模型结构中比较创新的残差注意力机制是:
Non-local Neural Networks, CVPR2018FAIR的杰作,主要 inspired by 传统方法用non-local similarity来做图像 denoise 主要思想也很简单,CNN中的 convolution单元每次只关注邻域 kernel size 的区域,就算后期感受野越来越大,终究还是局部区域的运算,这样就忽略了全局其他片区(比如很远的像素)对当前区域的贡献。 所以 non-local blocks 要做的是,捕获这种 long-range 关系:对于2D图像,就是图像中任何像素对当前像素的关系权值;对于3D视频,就是所有帧中的所有像素,对当前帧的像素的关系权值。 网络框架图也是简单粗暴:
嵌入在 action recognition 框架中的attention map 可视化效果: 图中的箭头表示,previous 若干帧中的某些像素 对最后图(当前帧)的脚关节像素的贡献关系。由于是soft-attention,其实每帧每个像素对对其有贡献关系,图中黄色箭头是把响应最大的关系描述出来。 总结 Pros:non-local blocks很通用的,容易嵌入在任何现有的 2D 和 3D 卷积网络里,来改善或者可视化理解相关的CV任务。比如前不久已有文章把 non-local 用在 Video ReID [2] 的任务里。 Cons:文中的结果建议把non-local 尽量放在靠前的层里,但是实际上做 3D 任务,靠前的层由于 temporal T 相对较大,构造及点乘操作那步,超多的参数,需要耗费很大的GPU Memory Interaction-aware Attention, ECCV2018美图联合中科院的文章 这文章扯了很多 Multi-scale 特征融合,讲了一堆 story,然并卵;直接说重点贡献,就是在 non-local block 的协方差矩阵基础上,设计了基于 PCA 的新loss,更好地进行特征交互。作者认为,这个过程,特征会在channel维度进行更好的 non-local interact,故称为 Interaction-aware attention 那么问题来了,怎么实现 通过PCA来获得 Attention weights呢? 文中不直接使用 协方差矩阵的特征值分解 来实现,而是使用下述等价形式: CBAM: Convolutional Block Attention Module(通道域+空间域), ECCV2018这货就是基于 SE-Net [5]中的 Squeeze-and-Excitation module 来进行进一步拓展, 具体来说,文中把 channel-wise attention 看成是教网络 Look 'what’;而spatial attention 看成是教网络 Look ‘where’,所以它比 SE Module 的主要优势就多了后者 通道注意力公式: 空间注意力公式:(空间域注意力是通过对通道axis进行AvgPool和MaxPool得来的) DANet:Dual Attention Network for Scene Segmentation(空间域+通道域), CPVR2019code: https://github.com/junfu1115/DANet 主要思想也是上述文章 CBAM 和 non-local 的融合变形: 把deep feature map进行spatial-wise self-attention,同时也进行channel-wise self-attetnion,最后将两个结果进行 element-wise sum 融合。 在 CBAM 分别进行空间和通道 self-attention的思想上,直接使用了 non-local 的自相关矩阵 Matmul 的形式进行运算,避免了 CBAM 手工设计 pooling,多层感知器 等复杂操作。 CCNet本篇文章的亮点在于用了巧妙的方法减少了参数量。在上面的DANet中,attention map计算的是所有像素与所有像素之间的相似性,空间复杂度为(HxW)x(HxW),而本文采用了criss-cross思想,只计算每个像素与其同行同列即十字上的像素的相似性,通过进行循环(两次相同操作),间接计算到每个像素与每个像素的相似性,将空间复杂度降为(HxW)x(H+W-1),以图为例为下: 实验结果达到了SOTA水平,但没有计算全部像素的attention方法准确率高。 OCNetOCNet: Object Context Network for Scene Parsing (Microsoft Research)论文解析 摘要 不得不说,这篇论文和DANet撞车了,而且撞的死死的,用的同样的核心内容 GCNet:Non-local Networks Meet Squeeze-Excitation Networks and BeyondNon-local Networks Meet Squeeze-Excitation Networks and Beyond 论文解读 GCNet 网络结构结构了non-local network和Squeeze-excitation networks.我们知道non-local network(NLNet)可以捕获长距离依赖关系。可以发现NLnet的网络结构采用的是自注意力机制来建模像素对关系。**在这篇文章中non-local network的全局上下文在不同位置几乎是相同的,这表明学习到了无位置依赖的全局上下文,因此这样导致了大量的计算量的浪费。作者在这里提出了一种简化版的模型去获得全局上下文信息。**使用的是query-independent(可以理解为无query依赖)的建模方式。同时更可以共享这个简化的结构和SENet网络结构。因此作者在这里联合了这三种方法产生了一个global context(GC) block 注意增强型卷积用自注意力增强卷积:这是新老两代神经网络的对话(附实现) PyTorch 实现地址: PS:启示就是在卷积算子的基础上,加入了多个注意力head(每个自注意head就是no-local block。),然后将这些head concat到一起。 机制 卷积运算有一个显著缺陷,即仅在局部近邻上工作,也由此会错失全局信息。另一方面,自注意则是获取长程交互性方面的一项近期进展,但还主要应用于序列建模和生成建模任务上。在这篇论文中,我们研究了将自注意(作为卷积的替代)用于判别式视觉任务的问题。我们提出了一种全新的二维相对自注意机制,研究表明这足以在图像分类任务上替代卷积作为一种单独的原语。我们在对照实验中发现,当结合使用卷积与自注意时所得到的结果最好。因此我们提出使用这种自注意机制来增强卷积算子,具体做法是将卷积特征图与通过自注意产生的一组特征图连接起来。 单个注意力head 给定一个形状为 (H, W, F_in) 的输入张量,我们将其展开为一个矩阵,并如 Transformer 架构提出的那样执行多头注意。则单个头 h 的自注意机制输出为 其中,是可学习的线性变换,它们分别将输入 X 映射到查询 Q、键值 K(xys:当矩阵相乘进行自相关时,一个称为query,一个称为key) 和值 V。 我们使用不同规模不同类型的模型(其中包括 ResNet 和一种当前最佳的可移动式受限网络)进行了广泛的实验,结果表明注意增强能在 ImageNet 图像分类与 COCO 目标检测任务上实现稳定的提升,同时还能保证参数数量大体接近。尤其值得提及的是,我们的方法在 ImageNet 上实现的 top-1 准确度优于 ResNet50 基准 1.3%我们的方法还在 COCO 目标检测上超过 RetinaNet 基准 1.4 mAP。 PAN: Pyramid Attention Network for Semantic Segmentation(层域)—CVPR2018亮点1:论文是将Attention机制与金字塔结构结合作为本文的亮点,这样可以在高层语义指导的基础上来提取相对与较低层的精确的密集特征,取代了其他方法里面的复杂的空洞卷积dilated和多个编码解码器的操作,跳出了以往常常用到的U-Net结构;
Multi-Context Attention for Human Pose EstimationTell Me Where to Look: Guided Attention Inference Network硬注意力一种通过引入硬注意力机制来引导学习视觉回答任务的研究软注意力机制已在计算机视觉领域取得了广泛的应用和成功。但是我们发现硬注意力机制在计算机视觉任务中的研究还相对空白。**而硬注意力机制能够从输入信息中选择重要的特征,因此它被视为是一种比软注意力机制更高效、直接的方法。**本次,将为大家介绍一种通过引入硬注意力机制来引导学习视觉回答任务的研究。此外结合 L2 正则化筛选特征向量,可以高效地促进筛选的过程并取得更好的整体表现,而无需专门的学习过程。 1. Diversified visual attention networks for fine-grained object classification—20162. Deep networks with internal selective attention through feedback connections (通道域)—NIPS 2014提出了一种Deep Attention Selective Network (dasNet)。在训练完成后,通过强化学习(Separable Natural Evolution Strategies)来动态改变attention。具体来说,attention调整的是每个conv filter的权重(和SENet一样有木有,都是channel维度)。policy是一个neural network,RL部分的算法如下: 3.Fully Convolutional Attention Networks for Fine-Grained Recognition本文利用基于强化学习的视觉 attenation model 来模拟学习定位物体的part,并且在场景内进行物体分类。这个框架模拟人类视觉系统的识别过程,通过学习一个任务驱动的策略,经过一系列的 glimpse 来定位物体的part。那么,这里的 glimpse 是什么呢?每一个 glimpse 对应一个物体的part。将原始的图像以及之前glimpse 的位置作为输入,下一次 glimpse位置作为输出,作为下一次物体part。每一个 glimpse的位置作为一个 action,图像和之前glimpse的位置作为 state,奖励衡量分类的准确性。本文方法可以同时定位多个part,之前的方法只能一次定位一个part 4 . 时间域注意力(RNN)这个概念其实比较大,因为计算机视觉只是单一识别图片的话,并没有时间域这个概念,但是[7]这篇文章中,提出了一种基于递归神经网络(Recurrent Neural Network,RNN)的注意力机制识别模型。 RNN模型比较适合的场景是数据具有时序特征,比如使用RNN产生注意力机制做的比较好的是在自然语言处理的问题上。因为自然语言处理的是文本分析,而文本产生的背后其实是有一个时序上的关联性,比如一个词之后还会跟着另外一个词,这就是一个时序上的依赖关联性。 而图片数据本身,并不具有天然的时序特征,一张图片往往是一个时间点下的采样。但是在视频数据中,RNN就是一个比较好的数据模型,从而能够使用RNN来产生识别注意力。 特意将RNN的模型称之为时间域的注意力,是因为这种模型在前面介绍的空间域,通道域,以及混合域之上,又新增加了一个时间的维度。这个维度的产生,其实是基于采样点的时序特征。 Recurrent Attention Model [7]中将注意力机制看成对一张图片上的一个区域点的采样,这个采样点就是需要注意的点。而这个模型中的注意力因为不再是一个可以微分的注意力信息,因此这也是一个强注意力(hard attention)模型。这个模型的训练是需要使用增强学习(reinforcementlearning)来训练的,训练的时间更长。 这个模型更需要了解的并不是RNN注意力模型,因为这个模型其实在自然语言处理中介绍的更详细,更需要了解的是这个模型的如何将图片信息转换成时序上的采样信号的:
这三个采样的信息是在位置中产生的图片信息,而下一个时刻,随着t的增加,采样的位置又开始变化,至于l随着t该怎么变化,这就是需要使用增强学习来训练的东西了。 自注意力自注意力机制在计算机视觉中的应用 自注意力机制是注意力机制的改进,其减少了对外部信息的依赖,更擅长捕捉数据或特征的内部相关性。 在神经网络中,我们知道卷积层通过卷积核和原始特征的线性结合得到输出特征,由于卷积核通常是局部的,为了增加感受野,往往采取堆叠卷积层的方式,实际上这种处理方式并不高效。同时,计算机视觉的很多任务都是由于语义信息不足从而影响最终的性能。自注意力机制通过捕捉全局的信息来获得更大的感受野和上下文信息。 自注意力机制 (self-attention)[1] 在序列模型中取得了很大的进步;另外一方面,上下文信息(context information)对于很多视觉任务都很关键,如语义分割,目标检测。自注意力机制通过(key, query, value)的三元组提供了一种有效的捕捉全局上下文信息的建模方式。接下来首先介绍几篇相应的工作,然后分析相应的优缺点以及改进方向。 RelatedWorksAttention is all you need [1] 是第一篇提出在序列模型中利用自注意力机制取代循环神经网络的工作,取得了很大的成功。其中一个重要的模块是缩放点积注意力模块(scaled dot-product attention)。文中提出(key,query, value)三元组捕捉长距离依赖的建模方式,如下图所示,key和query通过点乘的方式获得相应的注意力权重,最后把得到的权重和value做点乘得到最终的输出。 Non-localneural network [2] 继承了(key, query, value) 三元组的建模方式, 提出了一个高效的non-local 模块, 如下图所示。在Resnet网络中加入non-local模块后无论是目标检测还是实例分割,性能都有一个点以上的提升(mAP),这说明了上下文信息建模的重要性。 Danet [3]是来自中科院自动化的工作,其核心思想就是通过上下文信息来监督语义分割任务。作者采用两种方式的注意力形式,如下图所示,分别是spatial和 channel上,之后进行特征融合,最后接语义分割的head 网络。思路上来说很简单,也取得了很好的效果。 DFF [5] 是来自微软亚洲研究所视觉计算组的工作。如下图所示,它通过光流来对视频不同帧之间的运动信息进行建模, 从而提出了一个十分优雅的视频检测框架DFF。其中一个很重要的操作是warp, 它实现了点到点之间的对齐。在此以后出现了很多关于视频检测的工作,如, FGFA[6],Towards High Performance [7]等,他们大部分都是基于warp这个特征对其操作。由于光流网络的不准确性以及需要和检测网络进行联合训练,这说明现在视频检测中的光流计算其实不准确的。如何进行更好的建模来代替warp操作,并且起到同样的特征对其的作用是很关键的。通常而言我们假设flow运动的信息不会太远,这容易启发我们想到通过每个点的邻域去找相应的运动后的特征点,具体做法先不介绍了,欢迎大家思考(相关操作和自注意力机制)。 自注意力的缺点和改进策略前面主要是简单的介绍了自注意力机制的用途,接下来分析它的缺点和相应的改进策略,由于每一个点都要捕捉全局的上下文信息,这就导致了自注意力机制模块会有很大的计算复杂度和显存容量。如果我们能知道一些先验信息,比如上述的特征对其通常是一定的邻域内,我们可以通过限制在一定的邻域内来做。另外还有如何进行高效的稀疏化,以及和图卷积的联系,这些都是很开放的问题,欢迎大家积极思考。 接下来介绍其他的一些改进策略,Senet[9] 启发我们channel上的信息很重要,如下图所示。 CBAW [10] 提出了结合spatial和channel的模块,如下图所示,在各项任务上也取得很好的效果。 最后介绍一篇来自百度IDL的结合channel as spatial的建模方式的工作 [11]。本质上是直接在(key, query, value)三元组进行reshape的时候把channel的信息加进去,但是这带来一个很重要的问题就是计算复杂度大大增加。我们知道分组卷积是一种有效的降低参数量的方案,这里也采用分组的方式。但是即使采用分组任然不能从根本上解决计算复杂度和参数量大的问题,作者很巧妙的利用泰勒级数展开后调整计算key, query, value的顺序,有效的降低了相应的计算复杂度。下表是优化后的计算量和复杂度分析,下图是CGNL模块的整体框架。 自注意力小结自注意力机制作为一个有效的对上下文进行建模的方式,在很多视觉任务上都取得了不错的效果。同时,这种建模方式的缺点也是显而易见的,一是没有考虑channel上信息,二是计算复杂度仍然很大。相应的改进策,一方面是如何进行spatial和channel上信息的有效结合,另外一方面是如何进行捕捉信息的稀疏化,关于稀疏的好处是可以更加鲁棒的同时保持着更小的计算量和显存。最后,图卷积作为最近几年很火热的研究方向,如何联系自注意力机制和图卷积,以及自注意力机制的更加深层的理解都是未来的很重要的方向。 |
计算机视觉中的注意力机制
最新推荐文章于 2024-03-25 00:29:17 发布
展开全文