最近一直在研究深度语义匹配算法,搭建了个模型,跑起来效果并非很理想,在分析缘由的过程当中,发现注意力模型在解决这个问题上仍是颇有帮助的,因此花了两天研究了一下。html
此文大部分参考深度学习中的注意力机制(2017版) 张俊林的博客,不过添加了一些我的的思考与理解过程。在github上找到一份基于keras框架实现的可运行的注意模型代码:Attention_Network_With_Keras。若有不足之处,欢迎交流指教。git
注意力模型:对目标数据进行加权变化。人脑的注意力模型,说究竟是一种资源分配模型,在某个特定时刻,你的注意力老是集中在画面中的某个焦点部分,而对其它部分视而不见。 ------(思考:为何要集中在那个部分,是由于那个部分能解决问题吗?)github
最近两年,注意力模型(Attention Model)被普遍使用在天然语言处理、图像识别及语音识别等各类不一样类型的深度学习任务中,是深度学习技术中最值得关注与深刻了解的核心技术之一。web
当咱们人在看同样东西的时候,咱们当前时刻关注的必定是咱们当前正在看的这样东西的某一地方,换句话说,当咱们目光移到别处时,注意力随着目光的移动也在转移,这意味着,当人们注意到某个目标或某个场景时,该目标内部以及该场景内每一处空间位置上的注意力分布是不同的。---------(思考:对于图片,会有些特别显眼的场景会率先吸引住注意力,那是由于脑壳中对这类东西很敏感。对于文本,咱们大都是带目的性的去读,顺序查找,顺序读,可是在理解的过程当中,咱们是根据咱们自带的目的去理解,去关注的。 注意力模型应该与具体的目的(或者任务)相结合。)算法
从Attention的做用角度出发,咱们就能够从两个角度来分类Attention种类:Spatial Attention 空间注意力和Temporal Attention 时间注意力。更具实际的应用,也能够将Attention分为Soft Attention和Hard Attention。Soft Attention是全部的数据都会注意,都会计算出相应的注意力权值,不会设置筛选条件。Hard Attention会在生成注意力权重后筛选掉一部分不符合条件的注意力,让它的注意力权值为0,便可以理解为再也不注意这些不符合条件的部分。网络
目前绝大多数文献中出现的AM模型是附着在Encoder-Decoder框架下的,固然,其实AM模型能够看做一种通用的思想,自己并不依赖于Encoder-Decoder模型,这点须要注意。Encoder-Decoder框架能够看做是一种文本处理领域的研究模式,应用场景异常普遍,自己就值得细谈。架构
图1 抽象的Encoder-Decoder框架框架
Encoder-Decoder框架能够这么直观地去理解:能够把它看做适合处理由一个句子(或篇章)生成另一个句子(或篇章)的通用处理模型。对于句子对<X,Y>。 --------(思考:<X,Y>对很通用,X是一个问句,Y是答案;X是一个句子,Y是抽取的关系三元组;X是汉语句子,Y是汉语句子的英文翻译。等等),咱们的目标是给定输入句子X,期待经过Encoder-Decoder框架来生成目标句子Y。X和Y能够是同一种语言,也能够是两种不一样的语言。而X和Y分别由各自的单词序列构成:函数
Encoder顾名思义就是对输入句子X进行编码,将输入句子经过非线性变换转化为中间语义表示C:学习
对于解码器Decoder来讲,其任务是根据句子X的中间语义表示C和以前已经生成的历史信息y1,y2….yi-1来生成i时刻要生成的单词yi :
每一个yi都依次这么产生,那么看起来就是整个系统根据输入句子X生成了目标句子Y。 ------(思考:其实这里的Encoder-Decoder是一个序列到序列的模型seq2seq,这个模型是对顺序有依赖的。)
Encoder-Decoder是个很是通用的计算框架,至于Encoder和Decoder具体使用什么模型都是由研究者本身定的,常见的好比 CNN / RNN / BiRNN / GRU / LSTM / Deep LSTM 等,这里的变化组合很是多。 ------(思考:人的学习过程包括输入、输出、外界评价。Encoder模型相似于人的输入学习过程,Decoder模型相似于人的输出学习过程,对输出的内容进行评价就相似于损失函数。英语老师给我上了几堂英语课,我在不断的输入Encoder;忽然有一个随堂测试,我得作题输出Decoder;最后英语老师改卷子,给我一个分数,不对的地方我得反思调整我对输入数据的加工方式。)-------(再思考:关于英语翻译。课本上的单词和课文是原始数据输入,至关于X;我在大脑里加工这些数据,至关于Encoder模型,个人脑子里有不少加工后的数据,至关于C;如今要让我翻译一个英语句子,这个任务至关于Y,我不能翻课本,因此我只能借助我脑壳里加工的数据C去翻译这个句子,即我得动脑子,至关于Decoder。 学习的过程是什么都要学,要分类整理,要增长线索,并不知道将来的某天能用到什么,因此Encoder-Decoder是一个泛泛学习的框架)
以上介绍的Encoder-Decoder模型是没有体现出“注意力模型”的,因此能够把它看做是注意力不集中的分心模型。为何说它注意力不集中呢?请观察下目标句子Y中每一个单词的生成过程以下:
其中f是decoder的非线性变换函数。从这里能够看出,在生成目标句子的单词时,不论生成哪一个单词,是y1,y2也好,仍是y3也好,他们使用的句子X的语义编码C都是同样的,没有任何区别。而语义编码C是由句子X的每一个单词通过Encoder 编码产生的,这意味着不管是生成哪一个单词,y1,y2仍是y3,其实句子X中任意单词对生成某个目标单词yi来讲影响力都是相同的,没有任何区别(其实若是Encoder是RNN的话,理论上越是后输入的单词影响越大,并不是等权的,估计这也是为什么Google提出Sequence to Sequence模型时发现把输入句子逆序输入作翻译效果会更好的小Trick的缘由)。这就是为什么说这个模型没有体现出注意力的原因。
引入AM模型,以翻译一个英语句子举例:输入X:Tom chase Jerry。 理想输出:汤姆追逐杰瑞。
应该在翻译“杰瑞”的时候,体现出英文单词对于翻译当前中文单词不一样的影响程度,好比给出相似下面一个几率分布值:
(Tom,0.3)(Chase,0.2)(Jerry,0.5)
每一个英文单词的几率表明了翻译当前单词“杰瑞”时,注意力分配模型分配给不一样英文单词的注意力大小。这对于正确翻译目标语单词确定是有帮助的,由于引入了新的信息。同理,目标句子中的每一个单词都应该学会其对应的源语句子中单词的注意力分配几率信息。这意味着在生成每一个单词Yi的时候,原先都是相同的中间语义表示C会替换成根据当前生成单词而不断变化的Ci。理解AM模型的关键就是这里,即由固定的中间语义表示C换成了根据当前输出单词来调整成加入注意力模型的变化的Ci。
图2 引入AM模型的Encoder-Decoder框架
即生成目标句子单词的过程成了下面的形式:
而每一个Ci可能对应着不一样的源语句子单词的注意力分配几率分布,好比对于上面的英汉翻译来讲,其对应的信息可能以下:
其中,f2函数表明Encoder对输入英文单词的某种变换函数,好比若是Encoder是用的RNN模型的话,这个f2函数的结果每每是某个时刻输入xi后隐层节点的状态值;g表明Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,通常的作法中,g函数就是对构成元素加权求和,也就是经常在论文里看到的下列公式:
假设Ci中那个i就是上面的“汤姆”,那么Tx就是3,表明输入句子的长度,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”),对应的注意力模型权值分别是0.6,0.2,0.2,因此g函数就是个加权求和函数。若是形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示Ci的造成过程相似下图:
图3 Ci的造成过程
这里还有一个问题:生成目标句子某个单词,好比“汤姆”的时候,你怎么知道AM模型所须要的输入句子单词注意力分配几率分布值呢?就是说“汤姆”对应的几率分布:
为了便于说明,咱们假设对图1的非AM模型的Encoder-Decoder框架进行细化,Encoder采用RNN模型,Decoder也采用RNN模型,这是比较常见的一种模型配置,则图1的图转换为下图:
图4 RNN做为具体模型的Encoder-Decoder框架
注意力分配几率分布值的通用计算过程:
图5 AM注意力分配几率计算
对于采用RNN的Decoder来讲,若是要生成 yi 单词,在时刻 i ,咱们是能够知道在生成 Yi 以前的隐层节点i时刻的输出值 Hi 的,而咱们的目的是要计算生成 Yi 时的输入句子单词“Tom”、“Chase”、“Jerry”对 Yi 来讲的注意力分配几率分布,那么能够用i时刻的隐层节点状态 Hi 去一一和输入句子中每一个单词对应的RNN隐层节点状态 hj 进行对比,即经过函数 F(hj,Hi) 来得到目标单词 Yi 和每一个输入单词对应的对齐可能性,这个F函数在不一样论文里可能会采起不一样的方法,而后函数F的输出通过Softmax进行归一化就获得了符合几率分布取值区间的注意力分配几率分布数值(这就获得了注意力权重)。图5显示的是当输出单词为“汤姆”时刻对应的输入句子单词的对齐几率。绝大多数AM模型都是采起上述的计算框架来计算注意力分配几率分布信息,区别只是在F的定义上可能有所不一样。
上述内容就是论文里面经常提到的Soft Attention Model(任何数据都会给一个权值,没有筛选条件)的基本思想,你能在文献里面看到的大多数AM模型基本就是这个模型,区别极可能只是把这个模型用来解决不一样的应用问题。那么怎么理解AM模型的物理含义呢?通常文献里会把AM模型看做是单词对齐模型,这是很是有道理的。目标句子生成的每一个单词对应输入句子单词的几率分布能够理解为输入句子单词和这个目标生成单词的对齐几率,这在机器翻译语境下是很是直观的:传统的统计机器翻译通常在作的过程当中会专门有一个短语对齐的步骤,而注意力模型其实起的是相同的做用。在其余应用里面把AM模型理解成输入句子和目标句子单词之间的对齐几率也是很顺畅的想法。
图6 Google 神经网络机器翻译系统结构图
图6所示即为Google于2016年部署到线上的基于神经网络的机器翻译系统,相对传统模型翻译效果有大幅提高,翻译错误率下降了60%,其架构就是上文所述的加上Attention机制的Encoder-Decoder框架,主要区别无非是其Encoder和Decoder使用了8层叠加的LSTM模型。
固然,从概念上理解的话,把AM模型理解成影响力模型也是合理的,就是说生成目标单词的时候,输入句子每一个单词对于生成这个单词有多大的影响程度。这种想法也是比较好理解AM模型物理意义的一种思惟方式。
图7是论文“A Neural Attention Model for Sentence Summarization”中,Rush用AM模型来作生成式摘要给出的一个AM的一个很是直观的例子。
图7 句子生成式摘要例子
这个例子中,Encoder-Decoder框架的输入句子X是:“russian defense minister ivanov called sunday for the creation of a joint front for combating global terrorism”。对应图中纵坐标的句子。系统生成的摘要句子Y是:“russia calls for joint front against terrorism”,对应图中横坐标的句子。能够看出模型已经把句子主体部分正确地抽出来了。矩阵中每一列表明生成的目标单词对应输入句子每一个单词的AM分配几率,颜色越深表明分配到的几率越大。这个例子对于直观理解AM是颇有帮助做用。
《A Neural Attention Model for Sentence Summarization》论文提供的实验数据集连接(开放可用):DUC 2004,感兴趣的朋友能够下载看看。
图8 摘要生成 开放数据集
若是把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的权重系数。便可以将其本质思想改写为以下公式:
其中,Lx=||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和某个 Keyi ,计算二者的类似性或者相关性,最多见的方法包括:求二者的向量点积、求二者的向量Cosine类似性或者经过再引入额外的神经网络来求值,即以下方式:
第一阶段产生的分值根据具体产生的方法不一样其数值取值范围也不同,第二阶段引入相似SoftMax的计算方式对第一阶段的得分进行数值转换,一方面能够进行归一化,将原始计算分值整理成全部元素权重之和为1的几率分布;另外一方面也能够经过SoftMax的内在机制更加突出重要元素的权重。即通常采用以下公式计算:
第二阶段的计算结果 ai 即为 Valuei 对应的权重系数,而后进行加权求和便可获得Attention数值:
经过如上三个阶段的计算,便可求出针对Query的Attention数值,目前绝大多数具体的注意力机制计算方法都符合上述的三阶段抽象计算过程。
经过上述对Attention本质思想的梳理,咱们能够更容易理解本节介绍的Self Attention模型。Self Attention也常常被称为intra Attention(内部Attention),最近一年也得到了比较普遍的使用,好比Google最新的机器翻译模型内部大量采用了Self Attention模型。
在通常任务的Encoder-Decoder框架中,输入Source和输出Target内容是不同的,好比对于英-中机器翻译来讲,Source是英文句子,Target是对应的翻译出的中文句子,Attention机制发生在Target的元素和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实例
从两张图(图十一、图12)能够看出,Self Attention能够捕获同一个句子中单词之间的一些句法特征(好比图11展现的有必定距离的短语结构)或者语义特征(好比图12展现的its的指代对象Law)。
很明显,引入Self Attention后会更容易捕获句子中长距离的相互依赖的特征,由于若是是RNN或者LSTM,须要依次序序列计算,对于远距离的相互依赖的特征,要通过若干时间步步骤的信息累积才能将二者联系起来,而距离越远,有效捕获的可能性越小。
可是Self Attention在计算过程当中会直接将句子中任意两个单词的联系经过一个计算步骤直接联系起来,因此远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。除此外,Self Attention对于增长计算的并行性也有直接帮助做用。这是为什么Self 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架构因为其卓越的实际效果,目前在深度学习领域里获得了普遍的使用,了解并熟练使用这一架构对于解决实际问题会有极大帮助。
参考文章:
【1】天然语言处理中的Attention Model:是什么及为何