深度学习中的注意力机制

最近两年,注意力模型(Attention Model)被普遍使用在天然语言处理、图像识别及语音识别等各类不一样类型的深度学习任务中,是深度学习技术中最值得关注与深刻了解的核心技术之一。网络

本文以机器翻译为例,深刻浅出地介绍了深度学习中注意力机制的原理及关键计算机制,同时也抽象出其本质思想,并介绍了注意力模型在图像及语音等领域的典型应用场景。架构

注意力模型最近几年在深度学习各个领域被普遍使用,不管是图像处理、语音识别仍是天然语言处理的各类不一样类型的任务中,都很容易遇到注意力模型的身影。因此,了解注意力机制的工做原理对于关注深度学习技术发展的技术人员来讲有很大的必要。框架

 

 

 

人类的视觉注意力函数

 

从注意力模型的命名方式看,很明显其借鉴了人类的注意力机制,所以,咱们首先简单介绍人类视觉的选择性注意力机制。学习

0?wx_fmt=jpeg

图1 人类的视觉注意力ui

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

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

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

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

 

 

Encoder-Decoder框架

 

要了解深度学习中的注意力模型,就不得不先谈Encoder-Decoder框架,由于目前大多数注意力模型附着在Encoder-Decoder框架下,固然,其实注意力模型能够看做一种通用的思想,自己并不依赖于特定框架,这点须要注意。

Encoder-Decoder框架能够看做是一种深度学习领域的研究模式,应用场景异常普遍。图2是文本处理领域里经常使用的Encoder-Decoder框架最抽象的一种表示。

0?wx_fmt=png

图2 抽象的文本处理领域的Encoder-Decoder框架

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

0?wx_fmt=png

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

0?wx_fmt=png

对于Decoder来讲,其任务是根据句子Source的中间语义表示C和以前已经生成的历史信息0?wx_fmt=png来生成i时刻要生成的单词0?wx_fmt=png

0?wx_fmt=png

每一个yi都依次这么产生,那么看起来就是整个系统根据输入句子Source生成了目标句子Target。若是Source是中文句子,Target是英文句子,那么这就是解决机器翻译问题的Encoder-Decoder框架;若是Source是一篇文章,Target是归纳性的几句描述语句,那么这是文本摘要的Encoder-Decoder框架;若是Source是一句问句,Target是一句回答,那么这是问答系统或者对话机器人的Encoder-Decoder框架。因而可知,在文本处理领域,Encoder-Decoder的应用领域至关普遍。

Encoder-Decoder框架不只仅在文本领域普遍使用,在语音识别、图像处理等领域也常用。好比对于语音识别来讲,图2所示的框架彻底适用,区别无非是Encoder部分的输入是语音流,输出是对应的文本信息;而对于“图像描述”任务来讲,Encoder部分的输入是一副图片,Decoder的输出是可以描述图片语义内容的一句描述语。通常而言,文本处理和语音识别的Encoder部分一般采用RNN模型,图像处理的Encoder通常采用CNN模型。

 

 

Attention模型

 

本节先以机器翻译做为例子讲解最多见的Soft Attention模型的基本原理,以后抛离Encoder-Decoder框架抽象出了注意力机制的本质思想,而后简单介绍最近广为使用的Self Attention的基本思路。

Soft Attention模型

图2中展现的Encoder-Decoder框架是没有体现出“注意力模型”的,因此能够把它看做是注意力不集中的分心模型。为何说它注意力不集中呢?请观察下目标句子Target中每一个单词的生成过程以下:

0?wx_fmt=png

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

而语义编码C是由句子Source的每一个单词通过Encoder 编码产生的,这意味着不管是生成哪一个单词,0?wx_fmt=png仍是0?wx_fmt=png,其实句子Source中任意单词对生成某个目标单词yi来讲影响力都是相同的,这是为什么说这个模型没有体现出注意力的原因。这相似于人类看到眼前的画面,可是眼中却没有注意焦点同样。

若是拿机器翻译来解释这个分心模型的Encoder-Decoder框架更好理解,好比输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。

在翻译“杰瑞”这个中文单词的时候,分心模型里面的每一个英文单词对于翻译目标单词“杰瑞”贡献是相同的,很明显这里不太合理,显然“Jerry”对于翻译成“杰瑞”更重要,可是分心模型是没法体现这一点的,这就是为什么说它没有引入注意力的缘由。

没有引入注意力的模型在输入句子比较短的时候问题不大,可是若是输入句子比较长,此时全部语义彻底经过一个中间语义向量来表示,单词自身的信息已经消失,可想而知会丢失不少细节信息,这也是为什么要引入注意力模型的重要缘由。

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

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

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

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

0?wx_fmt=png

图3 引入注意力模型的Encoder-Decoder框架

 

即生成目标句子单词的过程成了下面的形式:

0?wx_fmt=png

而每一个0?wx_fmt=png可能对应着不一样的源语句子单词的注意力分配几率分布,好比对于上面的英汉翻译来讲,其对应的信息可能以下:

0?wx_fmt=png

其中,f2函数表明Encoder对输入英文单词的某种变换函数,好比若是Encoder是用的RNN模型的话,这个f2函数的结果每每是某个时刻输入0?wx_fmt=png后隐层节点的状态值;g表明Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,通常的作法中,g函数就是对构成元素加权求和,即下列公式:

0?wx_fmt=png

其中,0?wx_fmt=png表明输入句子Source的长度,0?wx_fmt=png表明在Target输出第i个单词时Source输入句子中第j个单词的注意力分配系数,而0?wx_fmt=png则是Source输入句子中第j个单词的语义编码。假设0?wx_fmt=png下标i就是上面例子所说的“ 汤姆” ,那么0?wx_fmt=png就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分别是输入句子每一个单词的语义编码,对应的注意力模型权值则分别是0.6,0.2,0.2,因此g函数本质上就是个加权求和函数。若是形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示0?wx_fmt=png的造成过程相似图4。

0?wx_fmt=png

图4 Attention的造成过程

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

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

0?wx_fmt=png

图5 RNN做为具体模型的Encoder-Decoder框架

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

0?wx_fmt=png

图6 注意力分配几率计算

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

绝大多数Attention模型都是采起上述的计算框架来计算注意力分配几率分布信息,区别只是在F的定义上可能有所不一样。图7可视化地展现了在英语-德语翻译系统中加入Attention机制后,Source和Target两个句子每一个单词对应的注意力分配几率分布。

0?wx_fmt=png

图7 英语-德语翻译的注意力几率分布

上述内容就是经典的Soft Attention模型的基本思想,那么怎么理解Attention模型的物理含义呢?通常在天然语言处理应用里会把Attention模型看做是输出Target句子中某个单词和输入Source句子每一个单词的对齐模型,这是很是有道理的。

目标句子生成的每一个单词对应输入句子单词的几率分布能够理解为输入句子单词和这个目标生成单词的对齐几率,这在机器翻译语境下是很是直观的:传统的统计机器翻译通常在作的过程当中会专门有一个短语对齐的步骤,而注意力模型其实起的是相同的做用。

0?wx_fmt=png

图8 Google 神经网络机器翻译系统结构图

图8所示即为Google于2016年部署到线上的基于神经网络的机器翻译系统,相对传统模型翻译效果有大幅提高,翻译错误率下降了60%,其架构就是上文所述的加上Attention机制的Encoder-Decoder框架,主要区别无非是其Encoder和Decoder使用了8层叠加的LSTM模型。

Attention机制的本质思想

若是把Attention机制从上文讲述例子中的Encoder-Decoder框架中剥离,并进一步作抽象,能够更容易看懂Attention机制的本质思想。

0?wx_fmt=png

图9 Attention机制的本质思想

咱们能够这样来看待Attention机制(参考图9):将Source中的构成元素想象成是由一系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,经过计算Query和各个Key的类似性或者相关性,获得每一个Key对应Value的权重系数,而后对Value进行加权求和,即获得了最终的Attention数值。因此本质上Attention机制是对Source中元素的Value值进行加权求和,而Query和Key用来计算对应Value的权重系数。便可以将其本质思想改写为以下公式:

0?wx_fmt=png

其中,0?wx_fmt=png=||Source||表明Source的长度,公式含义即如上所述。上文所举的机器翻译的例子里,由于在计算Attention的过程当中,Source中的Key和Value合二为一,指向的是同一个东西,也即输入句子中每一个单词对应的语义编码,因此可能不容易看出这种可以体现本质思想的结构。

固然,从概念上理解,把Attention仍然理解为从大量信息中有选择地筛选出少许重要信息并聚焦到这些重要信息上,忽略大多不重要的信息,这种思路仍然成立。聚焦的过程体如今权重系数的计算上,权重越大越聚焦于其对应的Value值上,即权重表明了信息的重要性,而Value是其对应的信息。

从图9能够引出另一种理解,也能够将Attention机制看做一种软寻址(Soft Addressing):Source能够看做存储器内存储的内容,元素由地址Key和值Value组成,当前有个Key=Query的查询,目的是取出存储器中对应的Value值,即Attention数值。经过Query和存储器内元素Key的地址进行类似性比较来寻址,之因此说是软寻址,指的不像通常寻址只从存储内容里面找出一条内容,而是可能从每一个Key地址都会取出内容,取出内容的重要性根据Query和Key的类似性来决定,以后对Value进行加权求和,这样就能够取出最终的Value值,也即Attention值。因此很多研究人员将Attention机制看做软寻址的一种特例,这也是很是有道理的。

至于Attention机制的具体计算过程,若是对目前大多数方法进行抽象的话,能够将其概括为两个过程:第一个过程是根据Query和Key计算权重系数,第二个过程根据权重系数对Value进行加权求和。而第一个过程又能够细分为两个阶段:第一个阶段根据Query和Key计算二者的类似性或者相关性;第二个阶段对第一阶段的原始分值进行归一化处理;这样,能够将Attention的计算过程抽象为如图10展现的三个阶段。

0?wx_fmt=png

图10 三阶段计算Attention过程

在第一个阶段,能够引入不一样的函数和计算机制,根据Query和某个0?wx_fmt=png,计算二者的类似性或者相关性,最多见的方法包括:求二者的向量点积、求二者的向量Cosine类似性或者经过再引入额外的神经网络来求值,即以下方式:

0?wx_fmt=png

第一阶段产生的分值根据具体产生的方法不一样其数值取值范围也不同,第二阶段引入相似SoftMax的计算方式对第一阶段的得分进行数值转换,一方面能够进行归一化,将原始计算分值整理成全部元素权重之和为1的几率分布;另外一方面也能够经过SoftMax的内在机制更加突出重要元素的权重。即通常采用以下公式计算:

0?wx_fmt=png

第二阶段的计算结果0?wx_fmt=png即为0?wx_fmt=png对应的权重系数,而后进行加权求和便可获得Attention数值:

0?wx_fmt=png

经过如上三个阶段的计算,便可求出针对Query的Attention数值,目前绝大多数具体的注意力机制计算方法都符合上述的三阶段抽象计算过程。

 

 

 

Self Attention模型

 

经过上述对Attention本质思想的梳理,咱们能够更容易理解本节介绍的Self Attention模型。Self Attention也常常被称为intra Attention(内部Attention),最近一年也得到了比较普遍的使用,好比Google最新的机器翻译模型内部大量采用了Self Attention模型。

在通常任务的Encoder-Decoder框架中,输入Source和输出Target内容是不同的,好比对于英-中机器翻译来讲,Source是英文句子,Target是对应的翻译出的中文句子,Attention机制发生在Target的元素Query和Source中的全部元素之间。而Self Attention顾名思义,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也能够理解为Target=Source这种特殊状况下的注意力计算机制。其具体计算过程是同样的,只是计算对象发生了变化而已,因此此处再也不赘述其计算过程细节。

若是是常规的Target不等于Source情形下的注意力计算,其物理含义正如上文所讲,好比对于机器翻译来讲,本质上是目标语单词和源语单词之间的一种单词对齐机制。那么若是是Self Attention机制,一个很天然的问题是:经过Self Attention到底学到了哪些规律或者抽取出了哪些特征呢?或者说引入Self Attention有什么增益或者好处呢?咱们仍然以机器翻译中的Self Attention来讲明,图11和图12是可视化地表示Self Attention在同一个英语句子内单词间产生的联系。

0?wx_fmt=png

图11 可视化Self Attention实例

0?wx_fmt=png

图12 可视化Self Attention实例

从两张图(图十一、图12)能够看出,Self Attention能够捕获同一个句子中单词之间的一些句法特征(好比图11展现的有必定距离的短语结构)或者语义特征(好比图12展现的its的指代对象Law)。

很明显,引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,由于若是是RNN或者LSTM,须要依次序序列计算,对于远距离的相互依赖的特征,要通过若干时间步步骤的信息累积才能将二者联系起来,而距离越远,有效捕获的可能性越小。

可是Self Attention在计算过程当中会直接将句子中任意两个单词的联系经过一个计算步骤直接联系起来,因此远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention对于增长计算的并行性也有直接帮助做用。这是为什么Self Attention逐渐被普遍使用的主要缘由。

 

 

Attention机制的应用

 

前文有述,Attention机制在深度学习的各类应用领域都有普遍的使用场景。上文在介绍过程当中咱们主要以天然语言处理中的机器翻译任务做为例子,下面分别再从图像处理领域和语音识别选择典型应用实例来对其应用作简单说明。

0?wx_fmt=png

图13 图片-描述任务的Encoder-Decoder框架

图片描述(Image-Caption)是一种典型的图文结合的深度学习应用,输入一张图片,人工智能系统输出一句描述句子,语义等价地描述图片所示内容。很明显这种应用场景也可使用Encoder-Decoder框架来解决任务目标,此时Encoder输入部分是一张图片,通常会用CNN来对图片进行特征抽取,Decoder部分使用RNN或者LSTM来输出天然语言句子(参考图13)。

此时若是加入Attention机制可以明显改善系统输出效果,Attention模型在这里起到了相似人类视觉选择性注意的机制,在输出某个实体单词的时候会将注意力焦点聚焦在图片中相应的区域上。图14给出了根据给定图片生成句子“A person is standing on a beach with a surfboard.”过程时每一个单词对应图片中的注意力聚焦区域。

0?wx_fmt=png

图14 图片生成句子中每一个单词时的注意力聚焦区域

图15给出了另外四个例子形象地展现了这种过程,每一个例子上方左侧是输入的原图,下方句子是人工智能系统自动产生的描述语句,上方右侧图展现了当AI系统产生语句中划横线单词的时候,对应图片中聚焦的位置区域。好比当输出单词dog的时候,AI系统会将注意力更多地分配给图片中小狗对应的位置。

0?wx_fmt=png

图15 图像描述任务中Attention机制的聚焦做用

0?wx_fmt=png

图16 语音识别中音频序列和输出字符之间的Attention

语音识别的任务目标是将语音流信号转换成文字,因此也是Encoder-Decoder的典型应用场景。Encoder部分的Source输入是语音流信号,Decoder部分输出语音对应的字符串流。

图16可视化地展现了在Encoder-Decoder框架中加入Attention机制后,当用户用语音说句子 how much would a woodchuck chuck 时,输入部分的声音特征信号和输出字符之间的注意力分配几率分布状况,颜色越深表明分配到的注意力几率越高。从图中能够看出,在这个场景下,Attention机制起到了将输出字符和输入语音信号进行对齐的功能。

上述内容仅仅选取了不一样AI领域的几个典型Attention机制应用实例,Encoder-Decoder加Attention架构因为其卓越的实际效果,目前在深度学习领域里获得了普遍的使用,了解并熟练使用这一架构对于解决实际问题会有极大帮助。

相关文章
相关标签/搜索