深度学习之Attention Model(注意力模型)

一、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,咱们能够设计出各类各样的应用算法。编码

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

    

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

    

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

    

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

    

  

三、Attention Model

  在Encoder-Decoder框架中,在预测每个yi时对应的语义编码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的定义上可能有所不一样。

 

四、论文中模型简述

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

    

  Encoder层:采用了双向的RNN网络,最后隐层的输出是两个向量的拼接 $h_t = [\leftarrow{h_t}, \rightarrow{h_t}]$ 。

  Attention层:

    

  其中

    

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

  Decoder层:采用了单向的RNN模型,第 $i$ 时刻的隐层的输出是 $s_i$ 。第 $i$ 时刻的输出和 $s_i,  y_{i-1},  c_i$ 有关

    

    

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

  Attention 模型在深度学习中的应用愈来愈重要,这种切合人的大脑活动的模型也能更真实的模拟人的大脑。在机器翻译中,在传统的Encoder-Decoder 框架中,随着翻译的句子的增加,翻译的质量会降低(以人脑为例,句子太长,人也是没法记住整个句子而后进行翻译的,而是会分红小段,逐个的翻译)。这是由于,将一个长的句子编码成一个定长的向量很容易丢失句子中的信息。Attention 模型就能很好的解决该问题,每一时刻的翻译都只关注与之相关较大的部分,所以Attention 能提升长句子的翻译质量。除了在机器翻译中的应用,在文本分类以及其余的领域都有着普遍的应用。

 

推荐文章:

  Neural Machine Translation by Jointly Learning to Align and Translate

致谢文章:

  天然语言处理中的Attention Model:是什么及为何

  深度学习方法(八):天然语言处理中的Encoder-Decoder模型,基本Sequence to Sequence模型