[深度概念]·Attention Model(注意力模型)学习笔记

此文源自一个博客,笔者用黑体作了注释与解读,方便本身和你们深刻理解Attention model,写的不对地方欢迎批评指正。。html

一、Attention Model 概述

深度学习里的Attention model其实模拟的是人脑的注意力模型,举个例子来讲,当咱们观赏一幅画时,虽然咱们能够看到整幅画的全貌,可是在咱们深刻仔细地观察时,其实眼睛聚焦的就只有很小的一块,这个时候人的大脑主要关注在这一小块图案上,也就是说这个时候人脑对整幅图的关注并非均衡的,是有必定的权重区分的。这就是深度学习里的Attention Model的核心思想。算法

这个思路很符合直觉,认为重要的部分咱们就更加注意,不重要的就忽略。网络

 

二、Encoder-Decoder框架

所谓encoder-decoder模型,又叫作编码-解码模型。这是一种应用于seq2seq问题的模型。seq2seq问题简单的说,就是根据一个输入序列x,来生成另外一个输出序列y。常见的应用有机器翻译,文档提取,问答系统等。Encoder-Decoder模型中的编码,就是将输入序列转化成一个固定长度的向量;解码,就是将以前生成的固定向量再转化成输出序列。架构

Encoder-Decoder(编码-解码)是深度学习中很是常见的一个模型框架,好比无监督算法的auto-encoding就是用编码-解码的结构设计并训练的;好比这两年比较热的image caption的应用,就是CNN-RNN的编码-解码框架;再好比神经网络机器翻译NMT模型,每每就是LSTM-LSTM的编码-解码框架。所以,准确的说,Encoder-Decoder并非一个具体的模型,而是一类框架。Encoder和Decoder部分能够是任意的文字,语音,图像,视频数据,模型能够采用CNN,RNN,BiRNN、LSTM、GRU等等。因此基于Encoder-Decoder,咱们能够设计出各类各样的应用算法。app

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

    

对于句子对<X,Y>,咱们的目标是给定输入句子X,期待经过Encoder-Decoder框架来生成目标句子Y。X和Y能够是同一种语言,也能够是两种不一样的语言。而X和Y分别由各自的单词序列构成:函数

    

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

    

对于解码器Decoder来讲,其任务是根据句子X的中间语义表示C和以前已经生成的历史信息y1, y2….yi-1来生成i时刻要生成的单词yi 优化

    

可是Encoder-Decoder框架会有一个明显的缺点,Encoder会把输入句子X编码为一个固定长度的隐向量(语义编码c),会致使隐向量没法彻底表示输入句子X的信息。能够从两个方面理解,1.隐向量的大小有限,没法表示语义丰富的句子,2.因为RNN类网络特色,网络会更加看中句子后面的信息,没法总揽全局。编码

最简单的解决思路就是把全部RNNcell的输出组合起来使用,而不仅使用最后一个RNNcell的输出,这个能够作到充分利用句子信息,能够必定程度解决问题。可是通常越明确的网络学习目标能够得到越好的效果,若是能够得到每一个RNNcell的输出的权重来加权编码,就能够更加明确学习目标提高学习效果。Attention Model的思路就是如此。

如何设计网络,进行加权操做,而且使用合理的loss就是Attention Model的重难点,也是咱们要学习理解的内容了。请继续往下看。。  

 

三、Attention Model

在Encoder-Decoder框架中,在预测每个encode时对应的语义编码c都是同样的,也就意味着不管句子X中的每一个单词对输出Y中的每个单词的影响都是相同的。这样就会产生两个弊端:一是语义向量没法彻底表示整个序列的信息,再者就是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了。输入序列越长,这个现象就越严重。这就使得在解码的时候一开始就没有得到输入序列足够的信息, 那么解码的准确度天然也就要打个折扣了。

为了解决上面的弊端,就须要用到咱们的Attention Model(注意力模型)来解决该问题。在机器翻译的时候,让生成词不是只能关注全局的语义编码向量c,而是增长了一个“注意力范围”,表示接下来输出词时候要重点关注输入序列中的哪些部分,而后根据关注的区域来产生下一个输出。模型结构以下:

    

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

    

好比输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。在没加入Attention Model以前,生成的语义编码C是一致的,而加入以后,对应的语义编码可能以下:

    

    

    

其中,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的造成过程相似下图:

    

这里还有一个问题:生成目标句子某个单词,好比“汤姆”的时候,你怎么知道AM模型所须要的输入句子单词注意力分配几率分布值呢?就是说“汤姆”对应的几率分布:

    

此时的Encoder和Decoder都采用RNN模型,咱们来看看如今的Encoder-Decoder模型结构:

    

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

    

对于采用RNN的Decoder来讲,若是要生成yi单词,在时刻t = i,咱们是能够知道在生成Yi以前的隐层节点t = i时刻的输出值Hi的,而咱们的目的是要计算生成Yi时的输入句子单词“Tom”、“Chase”、“Jerry”对Yi来讲的注意力分配几率分布,那么能够用t = i时刻的隐层节点状态Hi去一一和输入句子中每一个单词对应的RNN隐层节点状态hj进行对比,即经过函数F(hj, Hi)来得到目标单词Yi和每一个输入单词对应的对齐可能性,这个F函数在不一样论文里可能会采起不一样的方法,而后函数F的输出通过Softmax进行归一化就获得了符合几率分布取值区间的注意力分配几率分布数值。绝大多数AM模型都是采起上述的计算框架来计算注意力分配几率分布信息,区别只是在F的定义上可能有所不一样。

上述中提出的解决方法是对于每个Decoder输出都加权Encoder的信息,以Tom chase Jerry,Encoder-Decoder “汤姆”,“追逐”,“杰瑞”为例子,不计算起止符号,输出为3个单元,输入为3个单元。有时输入单元与输出数目会不一致,这里咱们假设输入为X,m个,输出为Y,n个。对于每一个yj都会综合全部x的信息共m个,同时m个X的信息权重之和为1(由于每一个yj由X决定)。一共有n个y,因此有n组,n*m个权重要计算。

就会有这些问题:

1.每组权重如何合理化表示?利用softMax能够帮助咱们权重之和为1

2.汇总权重信息时使用add仍是concat(私觉得add更加合适)?

3.如何表示权重?

4.如何优化权重?

咱们继续往下看就会找到答案。。

 

四、论文中模型简述

论文中的模型结构图以下:

    

Encoder层:采用了双向的RNN网络,最后隐层的输出是两个向量的拼接  ht=[←ht,→ht]。

Attention层:

    

其中

    

在上面公式中 hj 是Encoder层的隐层第 j 时刻的输出,si−1 是Decoder层第 i−1 时刻隐层的输出。能够发如今计算 ci 的模型其实是一个线性模型,并且 ci 事实上是Encoder层中各时刻隐层的输出的加权平均值。

Decoder层:采用了单向的RNN模型,第 ii 时刻的隐层的输出是 si 。第 i 时刻的输出和 si,yi−1,ci 有关    

    

所以引入Attention 机制,在机器翻译中,模型会本身去学得在不一样时刻不一样的权重系数 aij 。

 

如今咱们对3中提出的问题作些总结:

1.每组权重如何合理化表示?利用softMax能够帮助咱们权重之和为1

2.汇总权重信息时使用add仍是concat(私觉得add更加合适)?

3.如何表示权重?

4.如何优化权重?

 

解答:

1.经过使用softMax来归一化权重

2.由此公式能够得出是经过add方法,更准确的说是sum

3.权重表示是使用​此公式,eij是重点,hj 是Encoder层的隐层第 j 时刻的输出,si−1 是Decoder层第 i−1 时刻隐层的输出,a是一种变换方式能够把hj与si-1数据组合利用并得到一个标量这个标量表示了hj与si-1的关联度,从而进行softmax操做。a是如何变换的还须要继续往下看。

4..权重如何优化,只要把权重表示好,使得网络能够经过前向传播,使用Encoder-Decoder框架的loss就能够把权重与其余网络参数优化好。

 

5.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数值,目前绝大多数具体的注意力机制计算方法都符合上述的三阶段抽象计算过程。

 

由上述内容咱们能够对3中的问题如何表示权重,作进一步解答了:

如上图,经常使用的有三种表达方式,点积,预选类似度(归一化卷积),MLP网络(神经网络)。

 

 

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实例

 

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

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

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

Self Attention其实就是把让Value充当Query,用来表示某个单词自身与此句子其余单词的关联权重。做用能够加强句子中长距离的依赖关系(这就解决了RNN的通病,长时间依赖问题)。

 

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架构因为其卓越的实际效果,目前在深度学习领域里获得了普遍的使用,了解并熟练使用这一架构对于解决实际问题会有极大帮助。

 

在上述文章中,基本上把Attention机制概念和实现细节都介绍了一下,可能还有一些细节之处尚未考虑到,在下一个教程里,笔者将经过一个实战的方式来实现Attention机制,完成一个应用,感兴趣的朋友能够持续关注一下。

 

 

 

6.Reference

1.https://blog.csdn.net/malefactor/article/details/78767781

2.http://www.javashuo.com/article/p-oixbbsbj-ga.html