学习笔记之——计算机视觉中的Attention机制(Visual Attention)

最近看了系列论文,对于里面的attention机制理解不到位,为此写下这篇博文,作为对attention机制的学习笔记。本文的文字来源于网络的各种推文、博客加本人的总结。仅供本人学习记录用,不做商业用途

 

基于RNN(循环神经网络)的attention机制,直接百度搜的话,应该大多数都是机器翻译或自然语言处理方面的。本文主要介绍CV中的attention机制。

注意力(attention)其实是一个非常常见,但是又会被忽略的事实。比如天空一只鸟飞过去的时候,往往你的注意力会追随着鸟儿,天空在你的视觉系统中,自然成为了一个背景(background)信息。

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

一般的神经网络识别物体,是通过大量的数据来训练出一个神经网络。神经网络含有很多神经元,比如一个神经网络如果见过大量的手写数字,那么这个神经网络是能够识别出一个新的手写数字代表的数值的。但是这样训练出的神经网络,对图片的全部特征其实是等价处理的。虽然神经网络学习到了图片的特征来进行分类,但是这些特征在神经网络“眼里”没有差异,神经网络并不会过多关注某个“区域”。但是人类注意力是会集中在这张图片的一个区域内,而其他的信息受关注度会相应降低。

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

计算机视觉(computer vision)中的注意力机制(attention)的基本思想就是想让系统学会注意力——能够忽略无关信息而关注重点信息。为什么要忽略无关信息呢?举个例子,生活中我们坐在咖啡店玩手机,如果注意力放在自己的手机上,基本上完全不知道外界在说什么东西,但是如果你恰好想听一个人说话,你眼睛离开手机,开始将注意力集中在那个人的声音上,你就能听清楚谈话的内容了。视觉也是类似,你一扫而过,几乎很难注意到一些信息,但是如果你集中注意力看过去,事物的细节会在你的脑海里形成印象。神经网络也是如此,你不告诉它你想关注鸟儿,那么整张图片的信息其实还是天空占的比例更大,所以它会认为这是一张有关天空的照片,而不是鸟儿。

在深度学习发展的今天,搭建能够具备注意力机制的神经网络则开始显得更加重要,一方面是这种神经网络能够自主学习注意力机制,另一方面则是注意力机制能够反过来帮助我们去理解神经网络看到的世界。近几年来,深度学习与视觉注意力机制结合的研究工作,大多数是集中于使用掩码(mask)来形成注意力机制。掩码的原理在于通过另一层新的权重,将图片数据中关键的特征标识出来,通过学习训练,让深度神经网络学到每一张新图片中需要关注的区域,也就形成了注意力。这种思想,进而演化成两种不同类型的注意力,一种是软注意力(soft attention),另一种则是强注意力(hard attention)

软注意力的关键点在于,这种注意力更关注区域或者通道,而且软注意力是确定性的注意力,学习完成后直接可以通过网络生成,最关键的地方是软注意力是可微的,这是一个非常重要的地方。可以微分的注意力就可以通过神经网络算出梯度并且前向传播和后向反馈来学习得到注意力的权重。

强注意力与软注意力不同点在于,首先强注意力是更加关注点,也就是图像中的每个点都有可能延伸出注意力,同时强注意力是一个随机的预测过程,更强调动态变化。当然,最关键是强注意力是一个不可微的注意力,训练过程往往是通过增强学习(reinforcement learning)来完成的。

主要有三种注意力域,空间域(spatial domain)通道域(channel domain)混合域(mixed domain)。

Encoder-Decoder框架

要了解深度学习中的注意力模型,就不得不先谈Encoder-Decoder框架,因为目前大多数注意力模型附着在Encoder-Decoder框架下,当然,其实注意力模型可以看作一种通用的思想,本身并不依赖于特定框架,这点需要注意。

Encoder-Decoder框架可以看作是一种深度学习领域的研究模式,应用场景异常广泛。下图是文本处理领域里常用的Encoder-Decoder框架最抽象的一种表示。

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

文本处理领域的Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由一个句子(或篇章)生成另外一个句子(或篇章)的通用处理模型。对于句子对<Source,Target>,我们的目标是给定输入句子Source,期待通过Encoder-Decoder框架来生成目标句子Target。Source和Target可以是同一种语言,也可以是两种不同的语言。而Source和Target分别由各自的单词序列构成:

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

Encoder顾名思义就是对输入句子Source进行编码,将输入句子通过非线性变换转化为中间语义表示C:

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

对于解码器Decoder来说,其任务是根据句子Source的中间语义表示C和之前已经生成的历史信息

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

来生成i时刻要生成的单词

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

有:

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

每个yi都依次这么产生,那么看起来就是整个系统根据输入句子Source生成了目标句子Target。如果Source是中文句子,Target是英文句子,那么这就是解决机器翻译问题的Encoder-Decoder框架;如果Source是一篇文章,Target是概括性的几句描述语句,那么这是文本摘要的Encoder-Decoder框架;如果Source是一句问句,Target是一句回答,那么这是问答系统或者对话机器人的Encoder-Decoder框架。由此可见,在文本处理领域,Encoder-Decoder的应用领域相当广泛。

Soft Attention模型

ncoder-Decoder框架是没有体现出“注意力模型”的,所以可以把它看作是注意力不集中的分心模型。为什么说它注意力不集中呢?请观察下目标句子Target中每个单词的生成过程如下:

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

其中f是Decoder的非线性变换函数。从这里可以看出,在生成目标句子的单词时,不论生成哪个单词,它们使用的输入句子Source的语义编码C都是一样的,没有任何区别。

而语义编码C是由句子Source的每个单词经过Encoder

编码产生的,这意味着不论是生成哪个单词,y1,y2还是y3,其实句子Source中任意单词对生成某个目标单词yi来说影响力都是相同的,这是为何说这个模型没有体现出注意力的缘由。这类似于人类看到眼前的画面,但是眼中却没有注意焦点一样。

没有引入注意力的模型在输入句子比较短的时候问题不大,但是如果输入句子比较长,此时所有语义完全通过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失很多细节信息,这也是为何要引入注意力模型的重要原因。

上面的例子中,如果引入Attention模型的话,应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不同的影响程度,比如给出类似下面一个概率分布值:

(Tom,0.3)(Chase,0.2) (Jerry,0.5)

每个英文单词的概率代表了翻译当前单词“杰瑞”时,注意力分配模型分配给不同英文单词的注意力大小。这对于正确翻译目标语单词肯定是有帮助的,因为引入了新的信息。

同理,目标句子中的每个单词都应该学会其对应的源语句子中单词的注意力分配概率信息。这意味着在生成每个单词yi的时候,原先都是相同的中间语义表示C会被替换成根据当前生成单词而不断变化的Ci。理解Attention模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci。增加了注意力模型的Encoder-Decoder框架理解起来下图所示。

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

这里还有一个问题:生成目标句子某个单词,比如“汤姆”的时候,如何知道Attention模型所需要的输入句子单词注意力分配概率分布值呢?就是说“汤姆”对应的输入句子Source中各个单词的概率分布:(Tom,0.6)(Chase,0.2) (Jerry,0.2) 是如何得到的呢?

为了便于说明,我们假设对图2的非Attention模型的Encoder-Decoder框架进行细化,Encoder采用RNN模型,Decoder也采用RNN模型,这是比较常见的一种模型配置,则图2的框架转换为图5。

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

那么用图6可以较为便捷地说明注意力分配概率分布值的通用计算过程。

学习笔记之——计算机视觉中的Attention机制(Visual Attention)

对于采用RNN的Decoder来说,在时刻i,如果要生成yi单词,我们是可以知道Target在生成Yi之前的时刻i-1时,隐层节点i-1时刻的输出值Hi-1的,而我们的目的是要计算生成Yi时输入句子中的单词“Tom”、“Chase”、“Jerry”对Yi来说的注意力分配概率分布,那么可以用Target输出句子i-1时刻的隐层节点状态Hi-1去一一和输入句子Source中每个单词对应的RNN隐层节点状态hj进行对比,即通过函数F(hj,Hi-1)来获得目标单词yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。

绝大多数Attention模型都是采取上述的计算框架来计算注意力分配概率分布信息,区别只是在F的定义上可能有所不同。

 

作用:

1、学习权重分布:输入数据或特征图上的不同部分对应的专注度不同。这个加权可以是保留所有分量均做加权、可以是分布中以某种采样测量选区部分分量做加权。可以作用在原图上,也可以作用在特征图上。可以作用在空间尺度上,给不同空间区域加权。也可以作用在channel尺度上,给不不同channel特征加权,也可以对于feature map上每个元素加权。还可以i做哟也能够在不同时刻历史特征上(如machine translation)

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

参考资料

https://zhuanlan.zhihu.com/p/56501461

https://blog.csdn.net/yideqianfenzhiyi/article/details/79422857

https://mp.weixin.qq.com/s/KKlmYOduXWqR74W03Kl-9A

https://zhuanlan.zhihu.com/p/37601161