深度学习中的注意⼒机制
作者 | 张俊林
责编 | 何永灿
最近两年,注意⼒模型(Attention Model)被⼴泛使⽤在⾃然语⾔处理、图像识别及语⾳识别等各种不同类型的深度学习任务中,是深度学习技术中最值得关注与深⼊了解的核⼼技术之⼀。
本⽂以机器翻译为例,深⼊浅出地介绍了深度学习中注意⼒机制的原理及关键计算机制,同时也抽象出其本质思想,并介绍了注意⼒模型在图像及语⾳等领域的典型应⽤场景。
注意⼒模型最近⼏年在深度学习各个领域被⼴泛使⽤,⽆论是图像处理、语⾳识别还是⾃然语⾔处理的各种不同类型的任务中,都很容易遇到注意⼒模型的⾝影。所以,了解注意⼒机制的⼯作原理对于关注深度学习技术发展的技术⼈员来说有很⼤的必要。
⼈类的视觉注意⼒
从注意⼒模型的命名⽅式看,很明显其借鉴了⼈类的注意⼒机制,因此,我们⾸先简单介绍⼈类视觉的选择性注意⼒机制。
图1 ⼈类的视觉注意⼒
视觉注意⼒机制是⼈类视觉所特有的⼤脑信号处理机制。⼈类视觉通过快速扫描全局图像,获得需要重点关注的⽬标区域,也就是⼀般所说的注意⼒焦点,⽽后对这⼀区域投⼊更多注意⼒资源,以获取更多所需要关注⽬标的细节信息,⽽抑制其他⽆⽤信息。
这是⼈类利⽤有限的注意⼒资源从⼤量信息中快速筛选出⾼价值信息的⼿段,是⼈类在长期进化中形成的⼀种⽣存机制,⼈类视觉注意⼒机制极⼤地提⾼了视觉信息处理的效率与准确性。
图1形象化展⽰了⼈类在看到⼀副图像时是如何⾼效分配有限的注意⼒资源的,其中红⾊区域表明视觉系统更关注的⽬标,很明显对于图1所⽰的场景,⼈们会把注意⼒更多投⼊到⼈的脸部,⽂本的标题以及⽂章⾸句等位置。
深度学习中的注意⼒机制从本质上讲和⼈类的选择性视觉注意⼒机制类似,核⼼⽬标也是从众多信息中选择出对当前任务⽬标更关键的信息。
Encoder-Decoder框架
要了解深度学习中的注意⼒模型,就不得不先谈Encoder-Decoder框架,因为⽬前⼤多数注意⼒模型附着在Encoder-Decoder框架下,当然,其实注意⼒模型可以看作⼀种通⽤的思想,本⾝并不依赖于
特定框架,这点需要注意。
Encoder-Decoder框架可以看作是⼀种深度学习领域的研究模式,应⽤场景异常⼴泛。图2是⽂本处理领域⾥常⽤的Encoder-Decoder框架最抽象的⼀种表⽰。
图2 抽象的⽂本处理领域的Encoder-Decoder框架
⽂本处理领域的Encoder-Decoder框架可以这么直观地去理解:可以把它看作适合处理由⼀个句⼦(或篇章)⽣成另外⼀个句⼦(或篇章)的通⽤处理模型。对于句⼦对<Source,Target>,我们的⽬标是给定输⼊句⼦Source,期待通过Encoder-Decoder框架来⽣成⽬标句⼦Target。Source和Target可以是同⼀种语⾔,也可以是两种不同的语⾔。⽽Source和Target分别由各⾃的单词序列构成:
Encoder顾名思义就是对输⼊句⼦Source进⾏编码,将输⼊句⼦通过⾮线性变换转化为中间语义表⽰C:
对于解码器Decoder来说,其任务是根据句⼦Source的中间语义表⽰C和之前已经⽣成的历史信息来⽣成i时刻要⽣成的单词:
每个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中每个单词的⽣成过程如下:
其中f是Decoder的⾮线性变换函数。从这⾥可以看出,在⽣成⽬标句⼦的单词时,不论⽣成哪个单词,它们使⽤的输⼊句⼦Source的语义编码C都是⼀样的,没有任何区别。
⽽语义编码C是由句⼦Source的每个单词经过Encoder 编码产⽣的,这意味着不论是⽣成哪个单词,还是,其实句⼦Source中任意单词对⽣成某个⽬标单词yi来说影响⼒都是相同的,这是为何说这个模型没有体现出注意⼒的缘由。这类似于⼈类看到眼前的画⾯,但是眼中却没有注意焦点⼀样。
如果拿机器翻译来解释这个分⼼模型的Encoder-Decoder框架更好理解,⽐如输⼊的是英⽂句⼦:Tom chase Jerry,Encoder-Decoder框架逐步⽣成中⽂单词:“汤姆”,“追逐”,“杰瑞”。
在翻译“杰瑞”这个中⽂单词的时候,分⼼模型⾥⾯的每个英⽂单词对于翻译⽬标单词“杰瑞”贡献是相同的,很明显这⾥不太合理,显
然“Jerry”对于翻译成“杰瑞”更重要,但是分⼼模型是⽆法体现这⼀点的,这就是为何说它没有引⼊注意⼒的原因。
没有引⼊注意⼒的模型在输⼊句⼦⽐较短的时候问题不⼤,但是如果输⼊句⼦⽐较长,此时所有语义完全通过⼀个中间语义向量来表⽰,单词⾃⾝的信息已经消失,可想⽽知会丢失很多细节信息,这也
是为何要引⼊注意⼒模型的重要原因。
上⾯的例⼦中,如果引⼊Attention模型的话,应该在翻译“杰瑞”的时候,体现出英⽂单词对于翻译当前中⽂单词不同的影响程度,⽐如给出类似下⾯⼀个概率分布值:
(Tom,0.3)(Chase,0.2) (Jerry,0.5)
每个英⽂单词的概率代表了翻译当前单词“杰瑞”时,注意⼒分配模型分配给不同英⽂单词的注意⼒⼤⼩。这对于正确翻译⽬标语单词肯定是有帮助的,因为引⼊了新的信息。
同理,⽬标句⼦中的每个单词都应该学会其对应的源语句⼦中单词的注意⼒分配概率信息。这意味着在⽣成每个单词的时候,原先都是相同的中间语义表⽰C会被替换成根据当前⽣成单词⽽不断变化的。理解Attention模型的关键就是这⾥,即由固定的中间语义表⽰C换成了根据当前输出单词来调整成加⼊注意⼒模型的变化的。增加了注意⼒模型的Encoder-Decoder框架理解起来如图3所⽰。
图3 引⼊注意⼒模型的Encoder-Decoder框架
即⽣成⽬标句⼦单词的过程成了下⾯的形式:
⽽每个可能对应着不同的源语句⼦单词的注意⼒分配概率分布,⽐如对于上⾯的英汉翻译来说,其对应的信息可能如下:
其中,f2函数代表Encoder对输⼊英⽂单词的某种变换函数,⽐如如果Encoder是⽤的RNN模型的话,这个f2函数的结果往往是某个时刻输⼊后隐层节点的状态值;g代表Encoder根据单词的中间表⽰合成整个句⼦中间语义表⽰的变换函数,⼀般的做法中,g函数就是对构成元素加权求和,即下列公式:
其中,代表输⼊句⼦Source的长度,代表在Target输出第i个单词时Source输⼊句⼦中第j个单词的注意⼒分配系数,⽽则是Source输⼊句⼦中第j个单词的语义编码。假设下标i就是上⾯例⼦所说的“ 汤姆” ,那么就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分别是输⼊句⼦每个单词的语义编码,对应的注意⼒模型权值则分别是0.6,0.2,0.2,所以g函数本质上就是个加权求和函数。如果形象表⽰的话,翻译中⽂单词“汤姆”的时候,数学公式对应的中间语义表⽰的形成过程类似图4。
图4 Attention的形成过程
这⾥还有⼀个问题:⽣成⽬标句⼦某个单词,⽐如“汤姆”的时候,如何知道Attention模型所需要的输⼊句⼦单词注意⼒分配概率分布值呢?就是说“汤姆”对应的输⼊句⼦Source中各个单词的概率分布:(Tom,0.6)(Chase,0.2) (Jerry,0.2) 是如何得到的呢?
为了便于说明,我们假设对图2的⾮Attention模型的Encoder-Decoder框架进⾏细化,Encoder采⽤RNN模型,Decoder也采⽤RNN模型,这是⽐较常见的⼀种模型配置,则图2的框架转换为图5。
图5 RNN作为具体模型的Encoder-Decoder框架decoder
那么⽤图6可以较为便捷地说明注意⼒分配概率分布值的通⽤计算过程。
图6 注意⼒分配概率计算
对于采⽤RNN的Decoder来说,在时刻i,如果要⽣成yi单词,我们是可以知道Target在⽣成之前的时刻i-1时,隐层节点i-1时刻的输出值的,⽽我们的⽬的是要计算⽣成时输⼊句⼦中的单词“Tom”、“Chase”、“Jerry”对来说的注意⼒分配概率分布,那么可以⽤Target输出句⼦i-1时刻的隐层节点状态去⼀⼀和输⼊句⼦Source中每个单词对应的RNN隐层节点状态hj进⾏对⽐,即通过函数F(,)来获得⽬标单词和每个输⼊单词对应的对齐可能性,这个F函数在不同论⽂⾥可能会采取不同的⽅法,然后函数F的输出经过Softmax进⾏归⼀化就得到了符合概率分布取值区间的注意⼒分配概率分布数值。
绝⼤多数Attention模型都是采取上述的计算框架来计算注意⼒分配概率分布信息,区别只是在F的定义上可能有所不同。图7可视化地展⽰了在英语-德语翻译系统中加⼊Attention机制后,Source和Target两个句⼦每个单词对应的注意⼒分配概率分布。
图7 英语-德语翻译的注意⼒概率分布
上述内容就是经典的Soft Attention模型的基本思想,那么怎么理解Attention模型的物理含义呢?⼀般在⾃然语⾔处理应⽤⾥会把Attention模型看作是输出Target句⼦中某个单词和输⼊Source句⼦每个单词的对齐模型,这是⾮常有道理的。
⽬标句⼦⽣成的每个单词对应输⼊句⼦单词的概率分布可以理解为输⼊句⼦单词和这个⽬标⽣成单词的对齐概率,这在机器翻译语境下是⾮常直观的:传统的统计机器翻译⼀般在做的过程中会专门有⼀个短语对齐的步骤,⽽注意⼒模型其实起的是相同的作⽤。
图8 Google 神经⽹络机器翻译系统结构图
图8所⽰即为Google于2016年部署到线上的基于神经⽹络的机器翻译系统,相对传统模型翻译效果有⼤幅提升,翻译错误率降低了60%,其架构就是上⽂所述的加上Attention机制的Encoder-Decoder框架,主要区别⽆⾮是其Encoder和Decoder使⽤了8层叠加的LSTM模型。
Attention机制的本质思想
如果把Attention机制从上⽂讲述例⼦中的Encoder-Decoder框架中剥离,并进⼀步做抽象,可以更容易看懂Attention机制的本质思想。
图9 Attention机制的本质思想
我们可以这样来看待Attention机制(参考图9):将Source中的构成元素想象成是由⼀系列的<Key,Value>数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进⾏加权求和,即得到了最终的Attention
数值。所以本质上Attention机制是对Source中元素的Value值进⾏加权求和,⽽Query和Key⽤来计算对应Value的权重系数。即可以将其本质思想改写为如下公式:
其中,=||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展⽰的三个阶段。
图10 三阶段计算Attention过程
在第⼀个阶段,可以引⼊不同的函数和计算机制,根据Query和某个,计算两者的相似性或者相关性,最常见的⽅法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引⼊额外的神经⽹络来求值,即如下⽅式:
第⼀阶段产⽣的分值根据具体产⽣的⽅法不同其数值取值范围也不⼀样,第⼆阶段引⼊类似SoftMax的计算⽅式对第⼀阶段的得分进⾏数值转换,⼀⽅⾯可以进⾏归⼀化,将原始计算分值整理成所有元素权重之和为1的概率分布;另⼀⽅⾯也可以通过SoftMax的内在机制更加突出重要元素的权重。即⼀般采⽤如下公式计算:
第⼆阶段的计算结果即为对应的权重系数,然后进⾏加权求和即可得到Attention数值:
通过如上三个阶段的计算,即可求出针对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在同⼀个英语句⼦内单词间产⽣的联系。
图11 可视化Self Attention实例
图12 可视化Self Attention实例
从两张图(图11、图12)可以看出,Self Attention可以捕获同⼀个句⼦中单词之间的⼀些句法特征(⽐如图11展⽰的有⼀定距离的短语结构)或者语义特征(⽐如图12展⽰的its的指代对象Law)。
很明显,引⼊Self Attention后会更容易捕获句⼦中长距离的相互依赖的特征,因为如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若⼲时间步步骤的信息累积才能将两者联系起来,⽽距离越远,有效捕获的可能性越⼩。
但是Self Attention在计算过程中会直接将句⼦中任意两个单词的联系通过⼀个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极⼤缩短,有利于有效地利⽤这些特征。除此外,Self Attention对于增加计算的并⾏性也有直接帮助作⽤。这是为何Self Attention逐渐被⼴泛使⽤的主要原因。
Attention机制的应⽤
前⽂有述,Attention机制在深度学习的各种应⽤领域都有⼴泛的使⽤场景。上⽂在介绍过程中我们主要以⾃然语⾔处理中的机器翻译任务作为例⼦,下⾯分别再从图像处理领域和语⾳识别选择典型应⽤实例来对其应⽤做简单说明。
图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.”过程时每个单词对应图⽚中的注意⼒聚焦区域。
图14 图⽚⽣成句⼦中每个单词时的注意⼒聚焦区域
图15给出了另外四个例⼦形象地展⽰了这种过程,每个例⼦上⽅左侧是输⼊的原图,下⽅句⼦是⼈⼯智能系统⾃动产⽣的描述语句,上⽅右侧图展⽰了当AI系统产⽣语句中划横线单词的时候,对应图⽚中聚焦的位置区域。⽐如当输出单词dog的时候,AI系统会将注意⼒更多地分配给图⽚中⼩狗对应的位置。
图15 图像描述任务中Attention机制的聚焦作⽤
图16 语⾳识别中⾳频序列和输出字符之间的Attention
语⾳识别的任务⽬标是将语⾳流信号转换成⽂字,所以也是Encoder-Decoder的典型应⽤场景。Encoder部分的Source输⼊是语⾳流信
号,Decoder部分输出语⾳对应的字符串流。
图16可视化地展⽰了在Encoder-Decoder框架中加⼊Attention机制后,当⽤户⽤语⾳说句⼦ how much would a woodchuck chuck 时,输⼊部分的声⾳特征信号和输出字符之间的注意⼒分配概率分布情况,颜⾊越深代表分配到的注意⼒概率越⾼。从图中可以看出,在这个场景下,Attention机制起到了将输出字符和输⼊语⾳信号进⾏对齐的功能。
上述内容仅仅选取了不同AI领域的⼏个典型Attention机制应⽤实例,Encoder-Decoder加Attention架
构由于其卓越的实际效果,⽬前在深度学习领域⾥得到了⼴泛的使⽤,了解并熟练使⽤这⼀架构对于解决实际问题会有极⼤帮助。
作者简介:张俊林,中科院软件所博⼠,曾担任阿⾥巴巴、百度、⽤友等公司资深技术专家及技术总监职位,⽬前在新浪微博AI 实验室担任资深算法专家,关注深度学习在⾃然语⾔处理⽅⾯的应⽤。
本⽂为《程序员》原创⽂章,未经允许不得转载,更多精彩⽂章请点击「阅读原⽂」订阅《程序员》
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论