Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)

   转眼间来到了二年级下学期,马上就要面临找工作的巨大压力。起风了,唯有努力生存~愿努力可以有所成效。

    这一篇想要讲一讲Attention机制。文章框架主要翻译自How Does Attention Work in Encoder-Decoder Recurrent Neural Networks,也参考了一些笔者觉得比较不错的博客。


    Attention(注意力机制)是为了提高Encoder-Decoder RNN在机器翻译中的性能而开发的一种机制。

    在本教程中,您将发现Encoder-Decoder模型的注意力机制。

    完成本教程后,您将知道:

  • 机器翻译的Encoder-Decoder模型和注意力机制。
  • 如何逐步实施注意里机制。
  • 注意力机制的应用程序和扩展。

让我们开始吧。

0 教程概述

    本教程分为四个部分;它们是:

  1. Encoder-Decoder模型
  2. 注意力模型(Attention)
  3. Attention工作实例
  4. Attention的扩展

 1 Encoder-Decoder模型

    两篇论文介绍了循环神经网络的Encoder-Decoder模型。两者都开发了一种技术来解决机器翻译中输入序列长度与输出序列不同的序列到序列的本质。

    Ilya Sutskever等人在使用LSTMs的论文“Sequence to Sequence Learning with Neural Networks” 中就是这样做的。

    Kyunghyun Cho等人在 “Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation“一文中就做到了这一点。这项工作,和一些相同的作者(Bahdanau, Cho和Bengio)后来开发了他们的特定模型来开发一个注意力模型。因此,我们将快速浏览一下本文所描述的Encoder-Decoder模型。

    从高层次上讲,该模型由两个子模型组成:Encoder和Decoder。

  • Encoder:负责单步执行输入时间步骤,并将整个序列编码为一个固定长度的向量,称为上下文向量。
  • Decoder:负责在读取上下文向量的同时逐步执行输出时间步长。

Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)_第1张图片

图1 Encoder-Decoder循环神经网络模型

    提出了一种新的神经网络结构,该结构能够将变长序列编码为定长向量表示,并将给定的定长向量表示解码为变长序列。

— Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation, 2014.

    该模型的关键是整个模型,包括Encoder和Decoder,是端到端的训练,而不是单独训练元素。该模型具有通用性,可以采用不同的RNN模型作为Encoder和Decoder。   

    作者没有使用流行的长短时记忆(LSTM)神经网络,而是开发并使用了他们自己的简单类型的神经网络,后来被称为门控递归单元(GRU)。

    此外,与Sutskever等人的模型不同,Decoder从上一个时间步长的输出被作为输入输入解码下一个输出时间步。您可以在上面的图像中看到这一点,其中输出y2使用上下文向量(C)、解码y1传递的隐藏状态以及输出y1。

    …y(t)和h(i)也取决于y(t - 1)和输入序列的总结c。

— Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation, 2014 

     为更加直观地解释,这里老鼠屎引用一下完全图解RNN、RNN变体、Seq2Seq、Attention机制里面的解释:

    RNN最重要的一个变种:N vs M。这种结构又叫Encoder-Decoder模型,也可以称之为Seq2Seq模型。

    原始的N vs N RNN要求序列等长,然而我们遇到的大部分问题序列都是不等长的,如机器翻译中,源语言和目标语言的句子往往并没有相同的长度。为此,Encoder-Decoder结构先将输入数据编码成一个上下文向量c,拿到c之后,就用另一个RNN网络对其进行解码,这部分RNN网络被称为Decoder。具体做法就是将c当做之前的初始状态h0输入到Decoder中:

Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)_第2张图片

图2 Encoder-Decoder循环神经网络模型其他表示方式

    所以,在老鼠屎的理解当中,Encoder-Decoder是解决输入和输出不等长的问题(这里不一定完全正确,欢迎大神勘误)。

2 注意力机制

2.1 注意力机制的引入

     老鼠屎认为,引入注意力机制有两个原因:   

  1. 这里插一点老鼠屎自己的理解。如图2所示,在Encoder-Decoder结构中,Encoder把所有的输入序列都编码成一个统一的语义特征c再解码,这使得不论是生成y1,y2还是y3,其输入对生成某个目标yi来说影响力都是相同的,这是为何说这个模型没有体现出注意力的缘由。这类似于人类看到眼前的画面,但是眼中却没有注意焦点一样。
  2. 引用完全图解RNN、RNN变体、Seq2Seq、Attention机制,c中必须包含原始序列中的所有信息,它的长度就成了限制模型性能的瓶颈。如机器翻译问题,当要翻译的句子较长时,一个c可能存不下那么多信息,就会造成翻译精度的下。Attention机制通过在每个时间输入不同的c来解决这个问题。

    为了更加直观地展示,这里引用一下Attention机制详解(一)——Seq2Seq中的Attention里面的介绍:  

    为了解决由长序列到定长向量转化而造成的信息损失的瓶颈,Attention注意力机制被引入了。Attention机制跟人类翻译文章时候的思路有些类似,即将注意力关注于我们翻译部分对应的上下文。同样的,Attention模型中,当我们翻译当前词语时,我们会寻找源语句中相对应的几个词语,并结合之前的已经翻译的部分作出相应的翻译,如下图所示,当我们翻译“knowledge”时,只需将注意力放在源句中“知识”的部分,当翻译“power”时,只需将注意力集中在"力量“。这样,当我们decoder预测目标翻译的时候就可以看到encoder的所有信息,而不仅局限于原来模型中定长的隐藏向量,并且不会丧失长程的信息。

Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)_第3张图片

图3 为什么引入注意力机制

2.2 什么是注意力机制

    Dzmitry Bahdanau等人在他们的论文 “Neural Machine Translation by Jointly Learning to Align and Translate”中提出了注意力机制,这是他们之前在Encoder-Decoder模型上工作的自然延伸。

    针对Encoder-Decoder模型将输入序列编码为一个固定长度向量的局限性,提出了一种解决方案。在解码长序列时,这个问题被认为是一个更大的问题。

    这种Encoder-Decoder方法的一个潜在问题是,神经网络需要能够将源语句的所有必要信息压缩成一个固定长度的向量。这可能会使神经网络难以处理长句,特别是那些比训练语料库中的长句。

— Neural Machine Translation by Jointly Learning to Align and Translate, 2015.

     注意力机制是一种对齐和翻译的方法。

    对齐是机器翻译中的问题,它识别输入序列的哪些部分与输出中的每个单词相关,而翻译是使用相关信息选择适当输出的过程。

    介绍了一种扩展的编码器-解码器模型,该模型学会了联合对齐和翻译。每次提出的模型在翻译中生成一个单词时,它(软)搜索源句中最相关信息集中的一组位置。然后,该模型根据与这些源位置相关的上下文向量和所有之前生成的目标单词预测目标单词。

— Neural Machine Translation by Jointly Learning to Align and Translate, 2015.

    与将输入序列编码为单个固定的上下文向量不同,注意力模型开发了一个上下文向量,该上下文向量针对每个输出时间步骤进行过滤。

Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)_第4张图片

图4 Attention Mechanism模块图解

    在该模型中,定义了一个条件概率:

    其中,si是decoder中RNN在在i时刻的隐状态,如图4中所示,其计算公式为:

    这里的背景向量ci的计算方式,与传统的Seq2Seq模型直接累加的计算方式不一样,这里的ci是一个权重化(Weighted)之后的值,其表达式如公式5所示:

    其中,i表示encoder端的第i个词,hj表示encoder端的第j和词的隐向量,aij表示encoder端的第j个词与decoder端的第i个词之间的权值,表示源端第j个词对目标端第i个词的影响程度,aij的计算公式如公式6所示:

Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)_第5张图片

    在公式6中,aij是一个softmax模型输出,概率值的和为1。eij表示一个对齐模型,用于衡量encoder端的位置j个词,对于decoder端的位置i个词的对齐程度(影响程度),换句话说:decoder端生成位置i的词时,有多少程度受encoder端的位置j的词影响。对齐模型eij的计算方式有很多种,不同的计算方式,代表不同的Attention模型,最简单且最常用的的对齐模型是dot product乘积矩阵,即把target端的输出隐状态ht与source端的输出隐状态进行矩阵乘。常见的对齐计算方式如下:

Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)_第6张图片

其中,Score(ht,hs) = aij表示源端与目标单单词对齐程度。可见,常见的对齐关系计算方式有,点乘(Dot product),权值网络映射(General)和concat映射几种方式。

2.3 注意力机制的本质思想    

    这里参考了知乎上的一个回答“目前主流的attention方法都有哪些?”

    如果把Attention机制从上文讲述例子中的Encoder-Decoder框架中剥离,并进一步做抽象,可以更容易看懂Attention机制的本质思想。

Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)_第7张图片

图5 Attention机制的本质思想

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

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

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

    从图5可以引出另外一种理解,也可以将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的计算过程抽象为如图6展示的三个阶段。

Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)_第8张图片

图6 三阶段计算Attention过程

    在第一个阶段,可以引入不同的函数和计算机制,根据Query和某个Key_i,计算两者的相似性或者相关性,最常见的方法包括:求两者的向量点积、求两者的向量Cosine相似性或者通过再引入额外的神经网络来求值,即如下方式:

Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)_第9张图片

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

    第二阶段的计算结果a_i即为value_i对应的权重系数,然后进行加权求和即可得到Attention数值:

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

 3 Attention工作实例

    在本节中,我们将通过一个小的工作示例使注意具体化。具体地说,我们将使用未向量化的项逐步完成计算。这将为您提供足够详细的理解,您可以将注意力添加到您自己的EncoderDecoder实现中。

    这个工作的例子分为以下6个部分:

  1. 问题
  2. Encoding
  3. 对齐
  4. 权重
  5. 上下文向量
  6. Decoder

3.1 问题

    该问题是一个简单的序列到序列预测问题。输入时间有三个步骤:

x1, x2, x3

    模型需要预测1个时间步长: 

y1

     在本例中,我们将忽略Encoder和Decoder中使用的RNN类型,并忽略双向输入层的使用。这些元素对于理解解码器中注意力的计算并不重要。

3.2 Encoding

    在EncoderDecoder模型中,输入将被编码为一个固定长度的向量。这是最后一个时间步的Encoder模型的输出。 

h1 = Encoder(x1, x2, x3)

     注意模型要求对每个输入时间步骤的编码器的输出进行访问。本文将这些步骤称为每个时间步骤的“注释”。在这种情况下:

h1, h2, h3 = Encoder(x1, x2, x3)

3.3 对齐

    Decoder每次输出一个值,在最终输出当前输出时间步长的预测(y)之前,该值可能会传递到更多的层。

    对齐模型(e)对每个编码输入(h)与解码器当前输出的匹配程度进行评分。分数的计算需要解码器输出前一个输出时间步骤的输出,例如s(t-1)。当对解码器的第一个输出进行评分时,该值为0。评分是使用函数a()执行的。我们可以对第一个输出时间步的每个批注(h)进行如下评分:

e11 = a(0, h1)
e12 = a(0, h2)
e13 = a(0, h3)

    我们对这些分数使用两个下标,例如e11,其中第一个“1”表示输出时间步长,第二个“1”表示输入时间步长。

    我们可以想象,如果我们有一个序列到序列的问题,有两个输出时间步长,那么稍后我们可以对第二个时间步长的注释进行如下的评分(假设我们已经计算了s1):

e21 = a(s1, h1)
e22 = a(s1, h2)
e23 = a(s1, h3)

    本文将函数a()称为对齐模型,并将其实现为一个前馈神经网络。这是一个传统的单层网络,其中每个输入(s(t-1)和h1、h2、h3)加权,使用双曲正切(tanh)传递函数,输出也加权。

3.4 权重

    接下来,使用softmax函数对对齐分数进行标准化。分数的标准化使它们可以像概率一样处理,表明每个编码的输入时间步(注释)与当前输出时间步相关的可能性。这些标准化的分数称为注释权重。例如,给定计算的对齐分数(e),我们可以计算softmax标注权(a),如下:

a11 = exp(e11) / (exp(e11) + exp(e12) + exp(e13))
a12 = exp(e12) / (exp(e11) + exp(e12) + exp(e13))
a13 = exp(e13) / (exp(e11) + exp(e12) + exp(e13))

     如果我们有两个输出时间步长,则第二个输出时间步长的标注权值计算如下:

a21 = exp(e21) / (exp(e21) + exp(e22) + exp(e23))
a22 = exp(e22) / (exp(e21) + exp(e22) + exp(e23))
a23 = exp(e23) / (exp(e21) + exp(e22) + exp(e23))

3.5 上下文向量

    接下来,每个注释(h)乘以注释权重(a),生成一个新的参与上下文向量,从中可以解码当前输出的时间步长。为了简单起见,我们只有一个输出时间步长,所以我们可以计算单个元素上下文向量如下(为了可读性,我们用括号括起来):

c1 = (a11 * h1) + (a12 * h2) + (a13 * h3)

    上下文向量是注释和标准化对齐分数的加权和。如果我们有两个输出时间步长,上下文向量将由两个元素[c1, c2]组成,计算如下:

c1 = a11 * h1 + a12 * h2 + a13 * h3
c2 = a21 * h1 + a22 * h2 + a23 * h3

 3.6 Decode

    然后根据Encoder-Decoder模型执行解码,尽管在本例中使用了当前时间步长的参与上下文向量。本文将Decoder的输出称为隐状态。

s1 = Decoder(c1)

     在最终退出模型作为时间步长的预测(y1)之前,这可能被输入到其他层中。

4 扩展关注

    本节将介绍Bahdanau等人的注意机制的其他一些应用。

4.1 Hard and Soft Attention

    在2015年发表的论文“Show, Attend and Tell: Neural Image Caption Generation with Visual Attention“中,Kelvin Xu等人将注意力应用于图像数据,使用卷积神经网络作为特征提取器对图像数据进行配图。

    他们开发了两种注意机制,一种称为“Soft Attention”,它类似于上面描述的带有加权上下文向量的注意,另一种称为“Hard Attention”,即对每个单词的上下文向量中的元素做出清晰的决策。

    他们还提出了双重注意力机制,即注意力集中在图像的特定部分。

4.2删除以前的隐藏状态

    该机制的一些应用程序对方法进行了简化,以便从注释的评分中去掉最后一个输出时间步骤(s(t-1))的隐藏状态(步骤3)。
两个例子是:

  • Hierarchical Attention Networks for Document Classification, 2016.
  • Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification, 2016

    这样做的结果是,没有为模型提供先前解码输出的概念,这是为了帮助对齐。

    这一点已在文件所列的方程式中指出,目前尚不清楚这项任务是有意改变模型,还是只是方程式中的一项遗漏。在这两篇论文中都没有看到关于删除这个术语的讨论。

4.3 研究之前的隐藏状态

    Minh-Thang Luong等人在2015年发表的论文“Effective Approaches to Attention-based Neural Machine Translation”中明确重组了在标注评分时使用先前解码器隐藏状态的方法。Also, see the presentation of the paper and associated Matlab code.

    他们开发了一个框架来对比不同的标注方法。它们的框架调用并显式地排除了注释评分中先前隐藏的状态。

    相反,它们接受前面的注意上下文向量并将其作为输入传递给解码器。其目的是让解码器了解过去的对齐决策。

    我们提出了一种输入-输入方法,其中注意向量ht在下次步骤中与输入连接起来[…]。拥有这样的连接的效果是双重的:(a)我们希望让模型充分意识到之前的对齐选择,(b)我们创建了一个非常深的网络,横向和纵向都覆盖.

— Effective Approaches to Attention-based Neural Machine Translation, 2015.

    下面是本文采用的这种方法的图片。请注意,虚线清楚地显示了参与隐藏状态输出(ht)的解码器的使用情况,该输出将在下一个时间步为解码器提供输入。

Attention如何在Encoder-Decoder循环神经网络中见效(原理篇)_第10张图片

    他们还开发了“全局”注意力与“局部”注意力的对比,局部注意力是学习固定大小窗口的方法的一种修正,该窗口对每个输出时间步骤的注意力向量进行强制。它被看作是徐等人提出的一种更简单的“集中注意力”的方法。

    Global attention的缺点是,它必须关注每个目标单词的源端上的所有单词,这是昂贵的,可能会使翻译较长的序列变得不切实际,例如段落或文档。为了解决这一不足,我们提出了一种局部注意机制,它选择只关注每个目标单词源位置的一小部分。

— Effective Approaches to Attention-based Neural Machine Translation, 2015.

    通过对不同标注评分功能的整体注意力和局部注意力的分析,发现局部力注意在翻译任务中具有更好的效果。

5 拓展阅读

如果您想深入了解这个主题,本节将提供更多的参考资料。

Encoder-Decoder Papers

  • Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation, 2014.
  • Sequence to Sequence Learning with Neural Networks, 2014.

Attention Papers

  • Neural Machine Translation by Jointly Learning to Align and Translate, 2015.
  • Show, Attend and Tell: Neural Image Caption Generation with Visual Attention, 2015.
  • Hierarchical Attention Networks for Document Classification, 2016.
  • Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification, 2016
  • Effective Approaches to Attention-based Neural Machine Translation, 2015.

More on Attention

  • Attention in Long Short-Term Memory Recurrent Neural Networks
  • Lecture 10: Neural Machine Translation and Models with Attention, Stanford, 2017
  • Lecture 8 – Generating Language with Attention, Oxford.

参考资料:

    文中已列出,然而再次感谢!

  1. How Does Attention Work in Encoder-Decoder Recurrent Neural Networks
  2. 完全图解RNN、RNN变体、Seq2Seq、Attention机制
  3. Attention机制详解(一)——Seq2Seq中的Attention
  4. 目前主流的attention方法都有哪些?
  5. 真正的完全图解Seq2Seq Attention模型
  6. 模型汇总24 - 深度学习中Attention Mechanism详细介绍:原理、分类及应用

你可能感兴趣的:(deep,learning,深度学习入门)