编解码器结构中注意力机制的,为文本摘要模型添加注意力机制,采用LSTM的编解码器模型实现

2021/05/19 18:50 · 提高注意力训练 ·  · 编解码器结构中注意力机制的,为文本摘要模型添加注意力机制,采用LSTM的编解码器模型实现已关闭评论
专注力注意力训练提升
摘要:

编解码器结构中注意力机制的,为文本摘要模型添加注意力机制,采用LSTM的编解码器模型实现摘要是自然语言处理领域中最具挑战性和最有趣的问题之一。它是一个从多种文本资源(如书籍、新闻文章、博客文章、研究论文、电子邮件和tweet)中生成简洁而有意义的文本摘要的过程。现在,随着大量的文本文档的可用性,摘要是一个更加重要的任务。萃取总结这些方法依赖于从一段文本中提取几个部分,比如短语和句子,然后将它们堆

编解码器结构中注意力机制的,为文本摘要模型添加注意力机制,采用LSTM的编解码器模型实现  第1张

编解码器结构中注意力机制的,为文本摘要模型添加注意力机制,采用LSTM的编解码器模型实现

摘要是自然语言处理领域中最具挑战性和最有趣的问题之一。它是一个从多种文本资源(如书籍、新闻文章、博客文章、研究论文、电子邮件和tweet)中生成简洁而有意义的文本摘要的过程。现在,随着大量的文本文档的可用性,摘要是一个更加重要的任务。
萃取总结
这些方法依赖于从一段文本中提取几个部分,比如短语和句子,然后将它们堆在一起创建摘要。因此,在提取方法中,识别出用于总结的正确句子是至关重要的。让我们通过一个例子来理解这一点。
Text: Messi and Ronaldo have better records than their counterparts. Performed exceptionally across all competitions. They are considered as the best in our generation.*
Abstractive summary: Messi and Ronaldo have better records than their counterparts. Best in our generation.
正如你在上面看到的,这些粗体的单词被提取出来并加入到一个摘要中——尽管有时这些摘要在语法上可能很奇怪。
摘要式的总结
这些方法使用先进的NLP技术产生一个全新的总结。本摘要的某些部分甚至可能不会出现在原文中。让我们通过一个例子来理解这一点。
Text: Messi and Ronaldo have better records than their counterparts. Performed exceptionally across all competitions. They are considered as the best in our generation.
Abstractive summary: Messi and Ronaldo have better records than their counterparts, so they are considered as the best in our generation.
摘要文本摘要算法创建新的短语和句子,从原始文本中传递最有用的信息——就像人类一样。
在本文中,我们将重点研究抽象摘要技术,并将利用编解码器架构来解决这一问题。
常用的序列-序列模型(编码器-解码器)的整体结构如下图所示
该模型由编码器、中间矢量和解码器三部分组成。
编码器
该编码器基本上由一系列LSTM/GRU单元组成(请查看LSTM/GRU文档以更好地理解架构)。编码器接受输入序列并将信息封装为内部状态向量。解码器使用编码器的输出和内部状态。在我们的文本摘要问题中,输入序列是文本中需要汇总的所有单词的集合。每个单词都表示为x_i,其中i是单词的顺序。
中间(编码器)向量
这是模型的编码器部分产生的最终隐藏状态。用上面的公式计算。这个向量旨在封装所有输入元素的信息,以帮助解码器做出准确的预测。它作为模型的解码器部分的初始隐藏状态。
译码器
一种由几个循环单元组成的堆栈,其中每个单元在一个时间步长t预测输出y_t。每个循环单元从前一个单元接受一个隐藏状态,并产生和输出它自己的隐藏状态。在摘要问题中,输出序列是来自摘要文本的所有单词的集合。每个单词都表示为y_i,其中i是单词的顺序。任意隐藏状态h_i的计算公式为:
正如你所看到的,我们只是用前一个隐藏状态来计算下一个。
t时刻的输出y_t用公式计算:
我们使用当前时间步长的隐藏状态和各自的权值W(S)来计算输出。Softmax用于创建一个概率向量,它将帮助我们确定最终的输出(例如回答问题中的单词)。
首先,我们需要了解什么是注意力。
为了在时间步长t生成一个单词,我们需要对输入序列中的每个单词给予多少关注?这就是注意力机制概念背后的关键直觉。
让我们用一个简单的例子来理解这一点:
Question: In the last decade, *who* is the best *Footballer*?
Answer: *Lionel Messi* is the best *player*.
在上面的例子中,问题中的第五个单词和梅西有关,第九个单词足球运动员和第六个单词球员有关。
因此,我们可以增加源序列中产生目标序列的特定部分的重要性,而不是查看源序列中的所有单词。这是注意力机制背后的基本思想。
根据被关注上下文向量的推导方式,有两种不同的注意机制:
Global Attention
在这里,注意力被放在所有的源位置上。换句话说,为了得到参与的上下文向量,我们考虑了编码器的所有隐藏状态。在这个总结任务中,我们将使用Global Attention。
Local Attention
在这里,注意力只放在几个源位置上。在推导参与上下文向量时,只考虑编码器的少数隐藏状态。
现在让我们了解这种注意力是如何真正起作用的:
编码器输出源序列中每个时间步长j的隐藏状态(hj)同样,解码器输出目标序列中每一个时间步长i的隐藏状态(si)我们计算一个称为对齐分数(eij)的分数,在这个分数的基础上,使用一个评分函数将源单词与目标单词对齐。利用score函数从源隐藏状态hj和目标隐藏状态si计算对齐得分。由:
其中eij为目标时间步长i和源时间步长j的对齐得分。
我们使用softmax函数对对齐分数进行归一化,以检索注意力权重(aij):
计算编码器hj的注意权值aij与隐藏状态的乘积的线性和,得到上下文向量Ci:
将所述解码器在时间步长i时的参与上下文向量与目标隐藏状态连接,生成参与隐藏向量Si,其中Si=concatenate([Si;Ci)然后将参与的隐藏向量Si送入稠密层产生yi, yi=dense(Si)。
让我们通过一个示例来理解上面的注意机制步骤。假设源文本序列为[x1, x2, x3, x4],目标摘要序列为[y1, y2]。
编码器读取整个源序列并输出每个时间步长的隐藏状态,例如h1, h2, h3, h4
解码器读取由一个时间步长偏移的整个目标序列,并输出每个时间步长(例如s1、s2、s3)的隐藏状态
目标timestep i=1
利用score函数从源隐藏状态hi和目标隐藏状态s1计算对齐得分e1j:
e11=score(s1, h1)
e12=score(s1, h2)
e13=score(s1, h3)
e14=score(s1, h4)
使用softmax对对齐分数e1j进行归一化,得到注意力权重a1j:
a11=exp(e11)/((exp(e11)+exp(e12)+exp(e13)+exp(e14))
a12=exp(e12)/(exp(e11)+exp(e12)+exp(e13)+exp(e14))
a13=exp(e13)/(exp(e11)+exp(e12)+exp(e13)+exp(e14))
a14=exp(e14)/(exp(e11)+exp(e12)+exp(e13)+exp(e14))
由编码器隐藏状态hj与对齐得分a1j的乘积的线性和得到上下文向量C1:
C1=h1 * a11 + h2 * a12 + h3 * a13 + h4 * a14
连接上下文向量C1和目标隐藏状态s1,生成隐藏向量s1
S1=concatenate([s1; C1])
然后将注意力隐藏向量S1输入到稠密层,产生y1
y1=dense(S1)
我们可以用同样的方法计算Y2。
在本文中,我们将使用亚马逊食品评论数据集。让我们来看看数据:
https://www.kaggle.com/snap/amazon-fine-food-reviews
数据清洗
我们首先需要清理我们的数据,所以我们需要遵循的步骤是:
将所有内容转换为小写字母删除HTML标记收缩映射删除(的)删除括号()内的任何文本消除标点和特殊字符删除stopwords。删除短词
数据分布
然后,我们将分析评语和总结的长度,从而对文章的长度分布有一个总体的认识。这将帮助我们确定序列的最大长度。
标记数据:
记号赋予器构建词汇表并将单词序列转换为整数序列。我们将使用Keras’ Tokenizer来标记句子。
模型建立
我们终于到了模型制作部分。但在此之前,我们需要熟悉一些术语,这些术语在构建模型之前是必需的。
Return Sequences=True:当参数设置为True时,LSTM为每个时间步长生成隐藏状态和单元格状态Return State=True:当Return State=True时,LSTM只生成最后一个时间步骤的隐藏状态和单元格状态Initial State:用于初始化第一个时间步骤的LSTM的内部状态Stacked LSTM:Stacked LSTM有多层的LSTM堆叠在彼此之上。这样可以更好地表示序列。我鼓励您试验堆叠在彼此之上的LSTM的多个层
训练和Early Stopping:
这就是在训练过程中验证损失减少的原因,我们可以推断在 epoch10之后验证损失略有增加。因此,在这个 epoch之后,我们将停止训练模型。
现在,我们将为编码器和解码器建立推断。在这里,编码器和解码器将一起工作,以产生摘要。所述解码器将堆叠在所述编码器之上,所述解码器的输出将再次馈入所述解码器以产生下一个字。
Review: right quantity japanese green tea able either drink one sitting save later tastes great sweet
Original summary: great japanese product
Predicted summary: great teaReview: love body wash smells nice works great feels great skin add fact subscribe save deal great value sold
Original summary: great product and value
Predicted summary: great productReview: look like picture include items pictured buy gift recipient disappointed
Original summary: very disappointed
Predicted summary: not what expected
在本文中,我们了解了如何使用序列到序列模型总结文本。我们可以通过增加数据集、使用双向LSTM、 Beam Search策略等方法进一步改进该模型。
本文代码:https://gist.github.com/sayakmisra/6133be0554ce916d8cae4cdb83d475d8
作者:Sayak Misra
编解码器结构中注意力机制的,为文本摘要模型添加注意力机制,采用LSTM的编解码器模型实现  第2张

编解码器结构中注意力机制的,为文本摘要模型添加注意力机制,采用LSTM的编解码器模型实现

摘要是自然语言处理领域中最具挑战性和最有趣的问题之一。它是一个从多种文本资源(如书籍、新闻文章、博客文章、研究论文、电子邮件和tweet)中生成简洁而有意义的文本摘要的过程。现在,随着大量的文本文档的可用性,摘要是一个更加重要的任务。
萃取总结
这些方法依赖于从一段文本中提取几个部分,比如短语和句子,然后将它们堆在一起创建摘要。因此,在提取方法中,识别出用于总结的正确句子是至关重要的。让我们通过一个例子来理解这一点。
Text: Messi and Ronaldo have better records than their counterparts. Performed exceptionally across all competitions. They are considered as the best in our generation.*
Abstractive summary: Messi and Ronaldo have better records than their counterparts. Best in our generation.
正如你在上面看到的,这些粗体的单词被提取出来并加入到一个摘要中——尽管有时这些摘要在语法上可能很奇怪。
摘要式的总结
这些方法使用先进的NLP技术产生一个全新的总结。本摘要的某些部分甚至可能不会出现在原文中。让我们通过一个例子来理解这一点。
Text: Messi and Ronaldo have better records than their counterparts. Performed exceptionally across all competitions. They are considered as the best in our generation.
Abstractive summary: Messi and Ronaldo have better records than their counterparts, so they are considered as the best in our generation.
摘要文本摘要算法创建新的短语和句子,从原始文本中传递最有用的信息——就像人类一样。
在本文中,我们将重点研究抽象摘要技术,并将利用编解码器架构来解决这一问题。
常用的序列-序列模型(编码器-解码器)的整体结构如下图所示
该模型由编码器、中间矢量和解码器三部分组成。
编码器
该编码器基本上由一系列LSTM/GRU单元组成(请查看LSTM/GRU文档以更好地理解架构)。
编码器接受输入序列并将信息封装为内部状态向量。
解码器使用编码器的输出和内部状态。
在我们的文本摘要问题中,输入序列是文本中需要汇总的所有单词的集合。每个单词都表示为x_i,其中i是单词的顺序。
中间(编码器)向量
这是模型的编码器部分产生的最终隐藏状态。用上面的公式计算。
这个向量旨在封装所有输入元素的信息,以帮助解码器做出准确的预测。
它作为模型的解码器部分的初始隐藏状态。
译码器
一种由几个循环单元组成的堆栈,其中每个单元在一个时间步长t预测输出y_t。
每个循环单元从前一个单元接受一个隐藏状态,并产生和输出它自己的隐藏状态。
在摘要问题中,输出序列是来自摘要文本的所有单词的集合。每个单词都表示为y_i,其中i是单词的顺序。
任意隐藏状态h_i的计算公式为:
正如你所看到的,我们只是用前一个隐藏状态来计算下一个。
t时刻的输出y_t用公式计算:
我们使用当前时间步长的隐藏状态和各自的权值W(S)来计算输出。Softmax用于创建一个概率向量,它将帮助我们确定最终的输出(例如回答问题中的单词)。
首先,我们需要了解什么是注意力。
为了在时间步长t生成一个单词,我们需要对输入序列中的每个单词给予多少关注?这就是注意力机制概念背后的关键直觉。
让我们用一个简单的例子来理解这一点:
Question: In the last decade, *who* is the best *Footballer*?
Answer: *Lionel Messi* is the best *player*.
在上面的例子中,问题中的第五个单词和梅西有关,第九个单词足球运动员和第六个单词球员有关。
因此,我们可以增加源序列中产生目标序列的特定部分的重要性,而不是查看源序列中的所有单词。这是注意力机制背后的基本思想。
根据被关注上下文向量的推导方式,有两种不同的注意机制:
Global Attention
在这里,注意力被放在所有的源位置上。换句话说,为了得到参与的上下文向量,我们考虑了编码器的所有隐藏状态。在这个总结任务中,我们将使用Global Attention。
Local Attention
在这里,注意力只放在几个源位置上。在推导参与上下文向量时,只考虑编码器的少数隐藏状态。
现在让我们了解这种注意力是如何真正起作用的:
编码器输出源序列中每个时间步长j的隐藏状态(hj)
同样,解码器输出目标序列中每一个时间步长i的隐藏状态(si)
我们计算一个称为对齐分数(eij)的分数,在这个分数的基础上,使用一个评分函数将源单词与目标单词对齐。利用score函数从源隐藏状态hj和目标隐藏状态si计算对齐得分。由:
其中eij为目标时间步长i和源时间步长j的对齐得分。
我们使用softmax函数对对齐分数进行归一化,以检索注意力权重(aij):
计算编码器hj的注意权值aij与隐藏状态的乘积的线性和,得到上下文向量Ci:
将所述解码器在时间步长i时的参与上下文向量与目标隐藏状态连接,生成参与隐藏向量Si,其中Si=concatenate([Si;Ci)
然后将参与的隐藏向量Si送入稠密层产生yi, yi=dense(Si)。
让我们通过一个示例来理解上面的注意机制步骤。假设源文本序列为[x1, x2, x3, x4],目标摘要序列为[y1, y2]。
编码器读取整个源序列并输出每个时间步长的隐藏状态,例如h1, h2, h3, h4
解码器读取由一个时间步长偏移的整个目标序列,并输出每个时间步长(例如s1、s2、s3)的隐藏状态
目标timestep i=1
利用score函数从源隐藏状态hi和目标隐藏状态s1计算对齐得分e1j:
使用softmax对对齐分数e1j进行归一化,得到注意力权重a1j:
由编码器隐藏状态hj与对齐得分a1j的乘积的线性和得到上下文向量C1:
连接上下文向量C1和目标隐藏状态s1,生成隐藏向量s1
然后将注意力隐藏向量S1输入到稠密层,产生y1
我们可以用同样的方法计算Y2。
在本文中,我们将使用亚马逊食品评论数据集。让我们来看看数据:
https://www.kaggle.com/snap/amazon-fine-food-reviews
数据清洗
我们首先需要清理我们的数据,所以我们需要遵循的步骤是:
将所有内容转换为小写字母
删除HTML标记
收缩映射
删除(的)
删除括号()内的任何文本
消除标点和特殊字符
删除stopwords。
删除短词
数据分布
然后,我们将分析评语和总结的长度,从而对文章的长度分布有一个总体的认识。这将帮助我们确定序列的最大长度。
标记数据:
记号赋予器构建词汇表并将单词序列转换为整数序列。我们将使用Keras’ Tokenizer来标记句子。
模型建立
我们终于到了模型制作部分。但在此之前,我们需要熟悉一些术语,这些术语在构建模型之前是必需的。
Return Sequences=True:当参数设置为True时,LSTM为每个时间步长生成隐藏状态和单元格状态
Return State=True:当Return State=True时,LSTM只生成最后一个时间步骤的隐藏状态和单元格状态
Initial State:用于初始化第一个时间步骤的LSTM的内部状态
Stacked LSTM:Stacked LSTM有多层的LSTM堆叠在彼此之上。这样可以更好地表示序列。我鼓励您试验堆叠在彼此之上的LSTM的多个层
训练和Early Stopping:
这就是在训练过程中验证损失减少的原因,我们可以推断在 epoch10之后验证损失略有增加。因此,在这个 epoch之后,我们将停止训练模型。
现在,我们将为编码器和解码器建立推断。在这里,编码器和解码器将一起工作,以产生摘要。所述解码器将堆叠在所述编码器之上,所述解码器的输出将再次馈入所述解码器以产生下一个字。
在本文中,我们了解了如何使用序列到序列模型总结文本。我们可以通过增加数据集、使用双向LSTM、 Beam Search策略等方法进一步改进该模型。
本文代码:https://gist.github.com/sayakmisra/6133be0554ce916d8cae4cdb83d475d8
作者:Sayak Misra

编解码器结构中注意力机制的,深度 | 从各种注意力机制窥探深度学习在NLP中的神威

原标题:深度 | 从各种注意力机制窥探深度学习在NLP中的神威

作者:Antoine J.-P. Tixier 来源:arXiv,机器之心

随着层级表征的兴起,自然语言处理在很多方面都应用了深度神经网络。它们可以实现语言建模、情感分析、机器翻译、语义解析等非常多的任务,这些序列建模任务可以使用循环神经网络、卷积神经网络甚至近来比较流行的 Transformer。由于很多基础知识读者可能已经比较熟悉了,因此本文只重点介绍该综述文章讨论的注意力机制。

综述文章地址:https://arxiv.org/abs/1808.

作者 Antoine Tixier 表示整篇综述笔记也是他学习过程的一部分,所以这一文章还会在 arXiv 上继续更新。为了完成整篇文章,作者主要借鉴了各种卷积神经网络的原论文、斯坦福 CS231n 课程笔记、 Zhang 和 Wallace 关于在 NLP 中运用 CNN 的实战指南、基于 CNN 的文本分类论文等,这些构建了该综述文章卷积神经网络部分的主体内容。

对于循环神经网络,作者参考了 Denny Britz 的 RNN 教程、Chris Colah 关于理解 LSTM 单元的技术博客、关于 GRU 单元的新颖论文、编码器-解码器架构和注意力机制方面的论文。最后,Yoav Golderg 的 NLP 神经网络入门和 Manning 关于神经机器翻译的教程也都非常有帮助。

作者在完成综述文章的同时,还根据 Keras 与 IMDB 数据集实现了很多模型算法,这些代码都能在作者的 GitHub 项目中找到。

项目地址:https://github.com/Tixierae/deep_learning_NLP

整个综述文章分为七章,我们仅会展示第七章的编码器解码器架构与注意力机制。其余关于卷积神经网络和循环神经网络的具体内容可查阅原文章,以下展示了整篇综述文章的目录:

7 注意力机制

注意力机制 [1] 是在编码器-解码器结构下用于神经机器翻译(NMT)[2, 24] 的一种结构,它已经非常快速地扩展到了其它相关任务,例如图像描述 [25] 和文本摘要 [21] 等。直观而言,注意力机制通过允许解码器在多个向量中关注它所需要的信息,从而使编码器避免了将输入嵌入为定长向量,因此能保留更多的信息 [1]。

如今,注意力机制在深度模型中已经非常普遍,它已经不再仅流行于编码器-解码器架构。尤其是一些注意力变体,它们仅作用于编码器而解决文本分类或表征学习等问题,这些变体适用于自注意力或内部注意力。

在本文中,我们会首先讨论编码器-解码器架构中的注意力机制,它们常用于神经机器翻译,随后本文会介绍自注意力与层级注意力等。

7.1 编码器-解码器注意力机制

7.1.1 编码器解码器架构

从概念上来说,如图 10 所示编码器希望将输入嵌入为一个向量,而解码器根据该向量生成一些输出。

图 10:编码器-解码器架构概览。

在神经机器翻译中,输入与输出都是由单词组成的序列,即 x=(x_1, ... , x_T) 和 y=(y_1, ... , y_T),其中 x 和 y 通常表示原语句子与目标语句子。因为输入与输出都是序列,编码器-解码器架构也称为序列到序列的模型(Seq2Seq)。因为编码器-解码器架构处处可微,所以它们的参数θ可以根据平行语料库和最大似然估计同时得到优化,这种训练类型也称为端到端的训练。

如上所示,我们希望最大化的函数即正确翻译的对数概率。

7.1.2 编码器

原语句子可以通过 CNN 或全连接网络等某个模型编码为一个向量,机器翻译通常会选择 RNN 作为编码器。Bahdanau[1] 等人最开始使用双向深度 RNN 网络,该模型使用两条深度单向 RNN 构建模型,且方向相反的两条 RNN 不会共享参数。第一个前向 RNN 从左到右处理原语句子,而第二条反向的 RNN 由右到左处理原语句子。两个 RNN 编码的隐向量在每一个时间步都会拼接在一起,从而作为双向 RNN 的内部表征:

双向 RNN 在考虑整个句子所有信息的情况下再编码原语句子,它不会仅考虑当前时间步之前的单词。因此 h_t 偏向于利用以 x_t 为中心的小区间信息,而在单向 RNN 中,h_t 偏向于利用 x_t 的信息。关注 x_t 周围小区间的信息可能会产生一些优势,但并不是绝对性的。Luong et al. [20] 使用一般的单向深度 RNN 编码器同样获得了当前最优的模型性能。在下文中,编码器的隐藏状态将写为 h_t bar。

7.1.3 解码器

编码器可以使用不同的模型,而在 NMT 中,解码器通常会使用深度的单向 RNN,这主要因为单向 RNN 会比较自然地适应于序列生成任务。解码器的目标是在每一个时间步生成目标语中的一个词,直到读到停止词而完成整句话的输出。

解码器的关键思想是仅使用原语句子最后时间步编码的隐藏向量来生成目标语句子,这会强迫编码器拟合尽可能多的原语句子信息,并整合到最后的隐藏向量 h_T 中。因为 h_T 是一个定长的向量,因此表征能力十分有限,很多信息也会损失掉。另一方面,注意力机制允许解码器在每一个时间步考虑整个编码器的隐藏状态序列 (h_1, ... , h_T),也就是说解码器在生成每一个目标语单词中能决定需要注意哪些编码向量。

更具体而言,目标语序列 y=(y_1, ... , y_T) 中每一个词 y_t 的生成都基于条件分布:

其中 h_t tilde 为注意的隐藏状态,它的计算表达式为:

h_t 为解码器的隐藏状态,当解码器是深度 RNN 时,h_t 就是编码器顶层的隐藏状态,它提供了前面所生成目标语词序列 {y_1, ... , y_(t-1)} 的信息。c_t 为原语的上下文向量,而「;」则表示了拼接操作。W_s 和 W_c 矩阵为可训练的参数,且该式子为了简化并没有展示偏置项。如下图 11 所示,上下文向量 c_t 能通过两种方式计算:全局和局部。本文在后面会讨论这两种方法。

图 11:全局注意力(左)和局部注意力(右)。

7.1.4 全局注意力

在全局注意力中,上下文向量 c_t 为整个原语序列隐藏状态 h_i bar 的加权和,即编码器所有时间步上隐藏状态的加权和。其中每一个隐藏状态向量的维度为编码器隐藏层的神经元数量,c_t 的维度与编码器的隐藏状态相等。校准向量α_t 的维度等于原语句子序列长度 T_x,所以它是一个变量。

校准向量(alignment vector)α_t 需要先对当前目标语隐藏状态 h_t 和所有原语隐藏状态 h_i bar 之间做校准运算(score()),然后再对运算结果应用 Softmax:

换而言之,α_t 为所有原语隐藏状态上的概率分布,即所有α_t 都在 0 和 1 之间,且加和为 1。α_t 表明原语句子中哪一个单词对预测目标语下一个单词最重要。score() 在理论上可以是任何对比函数,Luong et al. [20] 通过点乘试验该函数

,而更一般的公式是通过参数矩阵与全连接层确定

。他们发现点乘在全局注意力中有更好的效果,而全连接层在局部注意力中有更好的效果。全局注意力在图 12 中有所总结:

图 12:全局注意力机制总结。

7.1.5 局部注意力

每生成单个目标词都需要考虑原语句子的所有词在计算上是非常昂贵的,也不是必需的。为了减少这种问题,Luong et al. [20] 提出了一种仅关注固定窗口大小 2D+1 的局部注意力机制:

D 是开发者指定的超参数,位置 p_t 为窗口的中心,它可以设置为 t(单调性校准)或者由可微分机制确定(预测性校准),其中预测性校准基于前面生成的目标语单词信息 {y_1, ... , y_t-1},即储存在 h_t 中的信息:

其中 T_x 为原语句子的长度、σ为 Sigmoid 函数、v_p 和 w_p 为可训练参数。校准权重的计算方式与全局注意力相同(公式 19),只是加了一个均值为 p_t、标准差为 D/2 的正态分布项:

注意

。增加的高斯分布项会确保校准权重会随着 i 远离窗口中心 p_t 而衰减,即它会认为窗口中心附近的词更重要。同样不同于全局注意力,α_t 的维度固定等于 2D+1,只有在窗口内的隐藏向量才会得到考虑。局部注意力其实也可以视为全局注意力,只不过校准权重会乘上一个截断的正态分布。下图 13 总结了局部注意力机制:

图 13:局部注意力的总结,其带有预测性的校准机制。

7.2 自注意力

现在假定单个 RNN 编码器采用序列 (x_1, ..., x_T) 作为输入,其长度为 T,该 RNN 会将输入序列映射到隐藏向量序列 (h_1, ..., h_T)。该模型的目标与编码器-解码器架构中的注意力机制一样:它不希望仅考虑最后一个隐藏向量 h_T 作为对整个序列的总结,这会引起输入信息的损失,它希望考虑所有时间步下的隐藏状态,并计算一个新的上下文向量。为了这个目标,2016/2017 年提出了自注意力或内部注意力机制。

如下公式 23 所示,隐藏向量 h_t 首先会传递到全连接层。然后校准系数 α_t 会对比全连接层的输出 u_t 和可训练上下文向量 u(随机初始化),并通过 Softmax 归一化而得出。注意力向量 s 最后可以为所有隐藏向量的加权和。

score 函数理论上可以是任意校准函数,一个比较直接的方式是使用点乘 score(u_t , u)=u_t*u。上下文向量可以解释为在平均上表征的最优单词。但模型面临新的样本时,它会使用这一知识以决定哪一个词需要更加注意。在训练中,模型会通过反向传播更新上下文向量,即它会调整内部表征以确定最优词是什么。

7.2.1 与 Seq2Seq 注意力的不同

自注意力中定义的上下文向量与 Seq2Seq 注意力中定义的上下文向量是不同的。在 Seq2Seq 中,上下文向量 c_t 等于加权和

,它用来计算需要注意的隐藏状态 h_t tilde=tanh(W_c [c_t; h_t]。在自注意力中,上下文向量用来替代解码器的隐藏状态,因为模型没有解码器。所以在自注意力中,校准向量 α 表示每一个输入单词与平均最优单词的相似性,而在 Seq2Seq 注意力中,α 表示每一个原语单词对生成下一个目标语单词的相关性。

7.2.2 层级注意力

图 14 展示了一个很好的案例,它表示自注意力机制为什么在实践中非常有用。在该架构中,自注意力机制共使用了两次:在词层面与在句子层面。该方法因为两个原因而非常重要,首先是它匹配文档的自然层级结构(词——句子——文档)。其次在计算文档编码的过程中,它允许模型首先确定哪些单词在句子中是非常重要的,然后再确定哪个句子在文档中是非常重要的。

图 14:层级注意力架构。返回搜狐,查看更多

责任编辑:

编解码器结构中注意力机制的,深度学习中的“注意力机制”

赵清臣(译)

翻译
?
?

译者的话
注意力机制(Attention),从字面意思来看和人类的注意力机制类似。人类通过快速扫描全局文本,获得需要重点关注的区域,也就是一般所说的注意力焦点,而后对这一区域投入更多注意力资源,以获取更多所需要关注目标的细节信息,而抑制其他无用信息。这一机制的存在,极大提高了人类从大量的信息中筛选出高价值信息的手段,是人类在长期进化中形成的一种生存机制。深度学习中的注意力机制从本质上讲和人类的选择性机制类似,核心目标也是从众多信息中选择出对当前任务目标更关键的信息。目前注意力机制已经被广泛使用在自然语言处理、图像识别及语音识别等各种不同类型的深度学习任务中,是深度学习技术中最值得关注与深入了解的核心技术之一。
摘要
当今主流的序列变换模型都是基于编码器和解码器架构,编解器架构的背后又是依赖于复杂的递归神经网络(RNN)或者卷积神经网络(CNN)。为了获得更好的表现,我们还可以在编解码器架构的基础上,进一步添加注意力机制。不过在本篇论文中,我们摒弃之前的固有思维,不再依赖于递归神经网络和卷积神经网络,转而使用一种更为简单的网络架构来做序列变换,即注意力机制的序列变换器(Transformer)。为了验证模型的有效性,我们在两项机器翻译中做了实证分析,结果显示注意力机制翻译的质量更好,同时由于可以并行的执行而大幅度减少了模型的训练时间。在模型评估中,模型在WMT2014的英德翻译任务中,获得了BLEU 28.4的分,比现有最好的评价得分高出2分。在WMT 2014的英法翻译任务中,模型在8个GPU上仅训练了3.5天,就破了所有的单模型序列变换的最佳BLEU得分记录,达到了41.8分,所花费的硬件资源和时间成本为仅为先前最优序列变换模型的一小部分。不仅在上述翻译任务表现良好,模型在大规模数据集和小批量数据集条件下,都能成功地完成英语语义成分解析任务,模型表现出了很好的泛化性。
1、介绍
在序列建模和变换任务中,递归神经网络(RNN)、长短时记忆网络(LSTM)以及门递归神经网络(GRNN)都毫无疑问的是现在很多前沿最优深度学习方法的基石,包括语言建模和机器翻译等。由此,很多研究都在尝试拓展递归语言模型和编解码器架构的应用边界。
注意力机制在很多任务中,都已经成为序列建模和变换模型的不可或缺的一部分,也正是因为注意力机制,我们的序列依赖关系建模也就突破了输入和输出序列中距离的限制。然而,在大部分任务中,注意力机制通常和递归神经网络联合起来使用。
在我们的研究中,我们提出了转换器的概念,其本质上是一种模型的结构,该结构可以回避了使用递归的缺陷,而是完全依赖于注意力机制来刻画输入和输出之间的全局依赖性关系。转换器结构极大程度上实现了并行化,在8个P100的GPU上,经过12小时的训练,就能够达到当前最佳的数据处理性能。
2、背景
为了达到减少序列数据计算量的目标,人们提出了一系列的网络架构,包括扩展的神经GPU、ByteNet、ConvS2S。这些网络架构都采用了卷积神经网络作为基本的模块,对所有的输入和输出并行地计算隐藏层的特征表征。在这些模型中,为了关联输入和输出序列中任何两个位置的数据,所需要的运算量和这两个位置的距离正相关。具体来说,对ConvS2S模型来说,这种相关关系为线性关系,而对ByteNet模型来说,这种相关关系为对数关系。在这种情况下,远距离计算序列中的依赖性关系就会变得非常困难。在我们提出的转换器结构中,我们对序列中的位置进行注意力加权,然后取均值,因此运算量可以被缩减为固定数。不过这种操作的显著弊端在于加权求均值的操作,会在一定程度上牺牲运算的精度,需要级联多级注意力机制进行精度补偿。具体细节可以参考第三部分第二小节。
自注意力机制,有时也被称为局部注意力机制或内部注意力机制,该机制通过关联序列中不同的位置来计算序列语义表示。自注意力机制在一系列任务中都表现很好,包括阅读理解、摘要抽取、文本内含理解和任务无关的语句表示等。
端到端的记忆网络是一种基于递归注意力机制的神经网络,而不是基于序列对齐递归。这种网络在简单语言问答和语言建模任务中都表现良好。
据我们所知,转换器架构是第一个完全依赖于自注意力机制的变换模型,该模型可以用于计算输入和输出序列的序列表示,而且完全没有使用以往的基于序列对齐的递归神经网络(RNN)和卷积神经网络(CNN)。在本文接下来的部分,我们会先介绍转换器,然后引出自注意力机制,随后讨论该转换器架构相对于其他模型的优势。
3、模型架构

3.1、编码器和解码器堆叠
编码器:编码器是由6个完全相同的层堆叠而成,每一层有两个子层。第一个子层是多头自注意力机制(Multi-Head Attention)层,第二个子层是由一个简单的、按逐个位置进行全连接的前向神经网络。在两个子层之间通过残差网络结构进行连接,后接一个层正则化层。可以得出,每一个子层的输出通过公式可以表示为LayerNorm( x+ Sublayer(x)),其中Sublayer(x)函数由各个子层独立实现。为了方便各层之间的残差连接,模型中所有的子层包括嵌入层,都固定输出的维度为512。
解码器:解码器也是由6个完全相同的层堆叠而成。除了编码器中介绍过的两个子层之外,解码器还有第三个子层,用于对编码器对的输出实现多头注意力机制。与编码器类似,我们也使用残差架构连接每一个子层,后接一个层正则化层。对于解码器对的自注意力子层(Masked Multi-Head Attention),我们对结构做了改变来防止当前序列的位置信息和后续序列的位置信息混在一起。这样的一个位置掩码操作,再加上原有输出嵌入端对位置信息做偏置,就可以确保对位置i的预测仅依赖于已知的位置i之前的输出,而不会依赖于位置i之后的输出。
3.2 注意力机制
注意力机制本身是一个函数,整体的数据流程图可以参考下图2。该函数实现了从query和一系列键值对(key-value pair)到输出output的映射,其中query、key和value都是向量。输出结果output的计算通过对value进行加权求和来得到,而每一个value所对应的权值是由query和key通过一个相容性函数来计算获取。
3.2.1 伸缩点乘注意力机制
3.2.2 多头注意力机制
3.2.3 注意力机制在模型中的使用
我们提出的变换器结构对注意力机制的使用表现在三个方面:
1、在编码器-解码器层,Query来自于前一个解码器层,Keys和Values来源于编码器输出。这样使得解码器在解码序列的每一个位置都能够加入输入序列中所有位置的信息。这一做法借鉴了序列建模中经典的编码器-解码器注意力机制。
2、编码器包含了自注意力层。在自注意力层,所有的keys、values和queries值都是来自于同一层,在我们的例子中,它们均来自于编码器前一层的输出。编码器序列的每一个位置都能加入编码器前一层的所有位置信息。
3、和编码器的自注意力层类似,解码器的自注意力层,也能够实现在解码序列的每一个位置都能加入解码序列中的所有位置信息。为了获得模型的自回滚能力,我们需要阻止解码器序列流中的左向信息流。具体实现的方法就是通过伸缩点乘注意力层的位置掩码运算,来屏蔽softmax输入层的所有value。从另一个角度来说,也可以认为这些value的数据流连接是不合理的,因此需要被屏蔽。
3.3 逐位前向传播网络
3.4 数据嵌入和softmax操作
3.5 位置编码
由于我们的模型没有使用递归和卷积,因此为了模型能充分利用序列的位置信息,我们必须将序列的相对位置信息或绝对位置信息注入到模型中去。由于位置编码信息和嵌入层的数据维度相同,因此在位置信息注入的具体实现上,我们直接将位置编码信息和编解码器的嵌入层做加法操作。位置编码的方式有很多种,在本论文中,我们使用不同频率的正弦和余弦函数来实现位置编码,用公式表示为:

我们也尝试使用训练得到的位置嵌入信息,结果发现模型学习到的位置嵌入与上文提到的正余弦方式结果几乎相同(详见表3第E行)。我们选择正弦波形式的方法做位置嵌入,还因为这种方式能够让我们的模型支持比模型训练阶段所输入的序列长度更长的序列做编解码变换。
4、为什么要采用自注意力机制
第一方面的考虑是每一层的计算复杂度,第二方面的考虑是能够并行执行的计算量(该计算量以所需序列运算的最小数量来衡量),第三方面的考虑是网络中长距离依赖的路径长度。
长距离依赖是许多序列变换任务中最大的挑战。影响模型对长距离依赖学习能力的关键因素信号前向传播和反向传播的路径长度必须要在整个网络中广播。输入和输出序列中任意两个位置之间的路径越短,对长距离依赖的学习就越容易。因此我们分别用自注意力机制层、递归神经网络层和卷积神经网络层所构成的三种不同的网络,比较三种网络对任意两个输入和输出序列所支持的最大路径长度。
作为附带的好处,自注意力层能够生成更多的可解释模型。我们深入研究了模型中的注意力分布,并在附录中对一些案例做了演示和讨论分析。结果表明,在单点注意力机制下,模型就能够清晰的学会处理一些任务;在多点注意力前提下,模型甚至能够理解句子的句法和语义结构信息。
5、训练
这一部分主要讨论模型的训练过程。
5.1 训练数据及批量化
我们选择WMT2014英德数据集作为我们的训练数据集进行训练,该数据集包含450万条英德双语句子。句子采用双字节编码,源句和目标句共享大约个字符表。对于英法双语数据,我们使用了更加庞大的数据集——WMT 2014英法数据集,该数据集包含3600万条句子,分词之后大约有个词汇。长度大致相同的句子,组合在一起形成句子对。每一批训练的数据都是一个句子对集合,大约包含个源语言字符和个目标语言字符。
5.2 硬件和训练安排
我们的模型训练任务放在一台拥有8个NVIDIA P100 GPU的机器上进行。基准模型使用的超参数和本论文中提到的超参数完全相同,每一个训练步骤大约花费0.4秒的时间。我们的基准模型训练了100,000步,用时12小时。对于我们更大规模的模型(具体细节参见表3的最后一行),每一步耗时1.0秒。大模型一共训练了300,000步,耗时3.5天。
5.3 优化器
5.4 正则化
6、结果展示
6.1 机器翻译
在WMT 2014英德翻译任务中,大型的变换器模型(即表2中的Transformer(big))比之前最好的模型(包括一些组合模型)表现还要好,BLEU得分高出两分,并建立了该任务BLEU得分的新记录28.4分。该模型的详细参数配置信息可以参见表3的最后一行。训练在8个P100的GPU上,总共耗时约3.5天。即便是我们的基准模型,其表现也超出了之前公布的所有模型包括组合模型,其花费的算力成本仅为之前模型的一部分。
表2总结了我们的试验结果,并且把我们的模型和其他文献中的模型对比了翻译的质量和花费的训练成本。我们根据对训练时间、GPU使用的数量和每一个GPU所能支持的持续单精度浮点数运算能力的估算,把三者相乘得到的结果作为模型训练阶段浮点运算操作的总数。
6.2 模型的变体
为了评价模型不同部分的重要性程度,我们对基准模型做了多种形式的变换,然后在开发集上,评估英德翻译任务中的性能变化。和之前一样,我们这里也使用了束搜索的概念,但是这里不再对checkpoint文件做平均来获取模型。结果展现在表3中。
在表3的第A行,我们改变了注意力的个数,以及注意力函数中key和value的维度,而保持计算运算量和3.2.2部分一样为常数。从表中可以看出,使用单个注意力函数相比于基准模型,只造成了BLEU 0.9分的损失,但是以PPL衡量的翻译质量却下降了很多。
6.3 英语语义解析
为了评价转换器模型能否泛化到其他的一些自然语言处理任务中,我们在英语语义解析任务上继续做试验。这项任务的挑战在于:输出序列有较强的语法结构约束,而且比输入的序列更长。即便是基于RNN的序列到序列的变换模型,在较小的数据输入条件,也不能超越当前最优结果(具体可以参见文献37)。

结果如表4所示,尽管没有面向任务的调优,我们的模型仍然表现的非常好,除了递归神经网络语法模型(Recurrent Neural Network Grammar)之外,我们的模型表现超越了之前公布的所有模型。
和RNN序列变换模型相比,即便在WSJ只有4万条训练句子的前提下,我们的变换器模型仍然超越了BerkleyParser。
7、结论
在本篇论文中,我们提出了变换器模型,这也是迄今为止第一个仅仅依赖于注意力机制,而把大多数编码器-解码器结构中的递归层全部替换为多头注意力函数的序列变换器模型。
对于翻译任务,变换器模型相比于递归神经网络和卷积神经网络有着极快的训练速度。在WMT 2014的英德翻译任务中和WMT 2014的英法翻译任务中,我们都达到了前所未有的表现。在前面提高的任务中,我们最好的变换器模型甚至都超越了所有公布的组合模型。
基于这样的结果,我们对基于注意力机制的模型的前景非常看好,并打算将它应用于其他自然语言处理任务中。我们计划把变换器模型扩展到一些处理输入输出时态方面的问题中去,而不再仅局限于文本。此外,我们也计划探究局部受限的注意力机制来高效处理大规模的输入和输出,如图像、音频和视频。探索生成非序列化输出也是我们的目标之一。
训练和评估模型的代码参考:https://github.com/tensorflow/tensor2tensor。
致谢:我们感谢Nal Kalchbrenner 和Stephan Gouws,他们在实验中给出的一些富有成效的建议、指导和鼓励对我们无比重要。
参考文献
[1] Jimmy Lei Ba, Jamie Ryan Kiros, and Geoffrey E Hinton. Layer normalization. arXiv preprint arXiv:1607., 2016.
[2] Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. Neural machine translation by jointly learning to align and translate. CoRR, abs/1409.0473, 2014.
[3] Denny Britz, Anna Goldie, Minh-Thang Luong, and Quoc V. Le. Massive exploration of neural machine translation architectures. CoRR, abs/1703., 2017.
[4] Jianpeng Cheng, Li Dong, and Mirella Lapata. Long short-term memory-networks for machine reading. arXiv preprint arXiv:1601., 2016.
[5] Kyunghyun Cho, Bart van Merrienboer, Caglar Gulcehre, Fethi Bougares, Holger Schwenk, and Yoshua Bengio. Learning phrase representations using rnn encoder-decoder for statistical machine translation. CoRR, abs/1406.1078, 2014.
[6] Francois Chollet. Xception: Deep learning with depthwise separable convolutions. arXiv preprint arXiv:1610., 2016.
[7] Junyoung Chung, ?aglar Gül?ehre, Kyunghyun Cho, and Yoshua Bengio. Empirical evaluation of gated recurrent neural networks on sequence modeling. CoRR, abs/1412.3555, 2014.
[8] Chris Dyer, Adhiguna Kuncoro, Miguel Ballesteros, and Noah A. Smith. Recurrent neural network grammars. In Proc. of NAACL, 2016.
[9] Jonas Gehring, Michael Auli, David Grangier, Denis Yarats, and Yann N. Dauphin. Convolutional sequence to sequence learning. arXiv preprint arXiv:1705.v2, 2017.
[10] Alex Graves. Generating sequences with recurrent neural networks. arXiv preprint arXiv:1308.0850, 2013.
[11] Kaiming He, Xiangyu Zhang, Shaoqing Ren, and Jian Sun. Deep residual learning for image recognition. In Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition, pages 770–778, 2016.
[12] Sepp Hochreiter, Yoshua Bengio, Paolo Frasconi, and Jürgen Schmidhuber. Gradient flow in recurrent nets: the difficulty of learning long-term dependencies, 2001.
[13] Sepp Hochreiter and Jürgen Schmidhuber. Long short-term memory. Neural computation, 9(8):1735–1780, 1997.
[14] Zhongqiang Huang and Mary Harper. Self-training PCFG grammars with latent annotations across languages. In Proceedings of the 2009 Conference on Empirical Methods in Natural Language Processing, pages 832–841. ACL, August 2009.
[15] Rafal Jozefowicz, Oriol Vinyals, Mike Schuster, Noam Shazeer, and Yonghui Wu. Exploring the limits of language modeling. arXiv preprint arXiv:1602., 2016.
[16] ?ukasz Kaiser and Samy Bengio. Can active memory replace attention? In Advances in Neural Information Processing Systems, (NIPS), 2016.
[17] ?ukasz Kaiser and Ilya Sutskever. Neural GPUs learn algorithms. In International Conference on Learning Representations (ICLR), 2016.
[18] Nal Kalchbrenner, Lasse Espeholt, Karen Simonyan, Aaron van den Oord, Alex Graves, and Koray Kavukcuoglu. Neural machine translation in linear time. arXiv preprint arXiv:1610.v2, 2017.
[19] Yoon Kim, Carl Denton, Luong Hoang, and Alexander M. Rush. Structured attention networks. In International Conference on Learning Representations, 2017.
[20] Diederik Kingma and Jimmy Ba. Adam: A method for stochastic optimization. In ICLR, 2015.
[21] Oleksii Kuchaiev and Boris Ginsburg. Factorization tricks for LSTM networks. arXiv preprint arXiv:1703., 2017.
[22] Zhouhan Lin, Minwei Feng, Cicero Nogueira dos Santos, Mo Yu, Bing Xiang, Bowen Zhou, and Yoshua Bengio. A structured self-attentive sentence embedding. arXiv preprint arXiv:1703., 2017.
[23] Minh-Thang Luong, Quoc V. Le, Ilya Sutskever, Oriol Vinyals, and Lukasz Kaiser. Multi-task sequence to sequence learning. arXiv preprint arXiv:1511., 2015.
[24] Minh-Thang Luong, Hieu Pham, and Christopher D Manning. Effective approaches to attentionbased neural machine translation. arXiv preprint arXiv:1508., 2015.
[25] Mitchell P Marcus, Mary Ann Marcinkiewicz, and Beatrice Santorini. Building a large annotated corpus of english: The penn treebank. Computational linguistics, 19(2):313–330, 1993.
[26] David McClosky, Eugene Charniak, and Mark Johnson. Effective self-training for parsing. In Proceedings of the Human Language Technology Conference of the NAACL, Main Conference, pages 152–159. ACL, June 2006.
[27] Ankur Parikh, Oscar T?ckstr?m, Dipanjan Das, and Jakob Uszkoreit. A decomposable attention model. In Empirical Methods in Natural Language Processing, 2016.
[28] Romain Paulus, Caiming Xiong, and Richard Socher. A deep reinforced model for abstractive summarization. arXiv preprint arXiv:1705., 2017.
[29] Slav Petrov, Leon Barrett, Romain Thibaux, and Dan Klein. Learning accurate, compact, and interpretable tree annotation. In Proceedings of the 21st International Conference on Computational Linguistics and 44th Annual Meeting of the ACL, pages 433–440. ACL, July 2006.
[30] Ofir Press and Lior Wolf. Using the output embedding to improve language models. arXiv preprint arXiv:1608., 2016.
[31] Rico Sennrich, Barry Haddow, and Alexandra Birch. Neural machine translation of rare words with subword units. arXiv preprint arXiv:1508., 2015.
[32] Noam Shazeer, Azalia Mirhoseini, Krzysztof Maziarz, Andy Davis, Quoc Le, Geoffrey Hinton, and Jeff Dean. Outrageously large neural networks: The sparsely-gated mixture-of-experts layer. arXiv preprint arXiv:1701., 2017.
[33] Nitish Srivastava, Geoffrey E Hinton, Alex Krizhevsky, Ilya Sutskever, and Ruslan Salakhutdinov. Dropout: a simple way to prevent neural networks from overfitting. Journal of Machine Learning Research, 15(1):1929–1958, 2014.
[34] Sainbayar Sukhbaatar, Arthur Szlam, Jason Weston, and Rob Fergus. End-to-end memory networks. In C. Cortes, N. D. Lawrence, D. D. Lee, M. Sugiyama, and R. Garnett, editors, Advances in Neural Information Processing Systems 28, pages 2440–2448. Curran Associates, Inc., 2015.
[35] Ilya Sutskever, Oriol Vinyals, and Quoc VV Le. Sequence to sequence learning with neural networks. In Advances in Neural Information Processing Systems, pages 3104–3112, 2014.
[36] Christian Szegedy, Vincent Vanhoucke, Sergey Ioffe, Jonathon Shlens, and Zbigniew Wojna. Rethinking the inception architecture for computer vision. CoRR, abs/1512., 2015.
[37] Vinyals & Kaiser, Koo, Petrov, Sutskever, and Hinton. Grammar as a foreign language. In Advances in Neural Information Processing Systems, 2015.
[38] Yonghui Wu, Mike Schuster, Zhifeng Chen, Quoc V Le, Mohammad Norouzi, Wolfgang Macherey, Maxim Krikun, Yuan Cao, Qin Gao, Klaus Macherey, et al. Google’s neural machine translation system: Bridging the gap between human and machine translation. arXiv preprint arXiv:1609., 2016.
[39] Jie Zhou, Ying Cao, Xuguang Wang, Peng Li, and Wei Xu. Deep recurrent models with fast-forward connections for neural machine translation. CoRR, abs/1606., 2016.
[40] Muhua Zhu, Yue Zhang, Wenliang Chen, Min Zhang, and Jingbo Zhu. Fast and accurate shift-reduce constituent parsing. In Proceedings of the 51st Annual Meeting of the ACL (Volume 1: Long Papers), pages 434–443. ACL, August 2013.

未经授权禁止转载,详情见转载须知。

最后编辑:admin 于 2020-03-31 18:38:29

没有了
没有了

编解码器结构中注意力机制的,神经网络中注意力机制概述

总结来自这篇论文的第7章

注意力机制是一种在编码器-解码器结构中使用到的机制, 现在已经在多种任务中使用:

机器翻译(Neural Machine Translation, NMT)图像描述(Image Captioning (translating an image to a sentence))文本摘要(Summarization(translating to a more compact language))

而且也不再局限于编码器-解码器结构, 多种变体的注意力结构, 应用在各种任务中.

总的来说, 注意力机制应用在:

允许解码器在序列中的多个向量中, 关注它所需要的信息, 是传统的注意力机制的用法. 由于使用了编码器多步输出, 而不是使用对应步的单一定长向量, 因此保留了更多的信息.作用于编码器, 解决表征问题(例如Encoding Vector再作为其他模型的输入), 一般使用自注意力(self-attention)

1.1 编码器-解码器结构

如上图, 编码器将输入嵌入为一个向量, 解码器根据这个向量得到输出. 由于这种结构一般的应用场景(机器翻译等), 其输入输出都是序列, 因此也被称为序列到序列的模型Seq2Seq.

对于编码器-解码器结构的训练, 由于这种结构处处可微, 因此模型的参数\( heta\)可以通过训练数据和最大似然估计得到最优解, 最大化对数似然函数以获得最优模型的参数, 即:

\[\arg\max\limits_{ heta}\{\sum\limits_{(x,y)\in{corpus}}\log{p(y|x; heta)}\}\]

这是一种端到端的训练方法.

1.2 编码器

原输入通过一个网络模型(CNN, RNN, DNN), 编码为一个向量. 由于这里研究的是注意力, 就以双向RNN作为示例模型.

对于每个时间步\(t\), 双向RNN编码得到的向量\(h_t\)可以如下表示:

1.3 解码器

这里的解码器是单向RNN结构, 以便在每个时间点上产生输出, 行程序列. 由于解码器仅使用最后时间步\(T\)对应的编码器的隐藏向量\(h_{T_x}\), \(T_x\)指的是当前样本的时间步长度(对于NLP问题, 经常将所有样本处理成等长的). 这就迫使编码器将更多的信息整合到最后的隐藏向量\(h_{T_x}\)中.

但由于\(h_{T_x}\)是单个长度一定的向量, 这个单一向量的表征能力有限, 包含的信息量有限, 很多信息都会损失掉.

注意力机制允许解码器在每一个时间步\(t\)处考虑整个编码器输出的隐藏状态序列\((h_1, h_2, \cdots, h_{T_x})\), 从而编码器将更多的信息分散地保存在所有隐藏状态向量中, 而解码器在使用这些隐藏向量时, 就能决定对哪些向量更关心.

具体来说, 解码器生产的目标序列\((y_1, \cdots, y_{T_x})\)中的每一个输出(如单词)\(y_t\), 都是基于如下的条件分布:

\[P[y_t|\{y_1,\cdots,y_{t-1}\},c_t]=softmax(W_s ilde{h}_t)\]

其中\( ilde{h}_t\)是引入注意力的隐藏状态向量(attentional hidden state), 如下得到:

\[ ilde{h}_t= anh(W_c[c_t;h_t])\]

\(h_t\)为编码器顶层的隐藏状态, \(c_t\)是上下文向量, 是通过当前时间步上下文的隐藏向量计算得到的, 主要有全局和局部两种计算方法, 下午中提到. \(W_c\)和\(W_s\)参数矩阵训练得到. 为了式子的简化没有展示偏置项.

1.4 全局注意力

通过全局注意力计算上下文向量\(c_t\)时, 使用整个序列的隐藏向量\(h_t\), 通过加权和的方式获得. 假设对于样本\(x\)的序列长度为\(T_x\), \(c_t\)如下计算得到:

\[c_t=\sum\limits_{i=1}^{T_x}\alpha_{t,i}h_i\]

其中长度为\(T_x\)的校准向量alignment vector \(\alpha_t\)的作用是在\(t\)时间步, 隐藏状态序列中的所有向量的重要程度. 其中每个元素\(\alpha_{t,i}\)的使用softmax方法计算:

\[\alpha_{t,i}=\frac{\exp(score(h_t, h_i))}{\sum\limits_{j=1}^{T_x}\exp(score(h_t, h_j))}\]

值的大小指明了序列中哪个时间步对预测当前时间步\(t\)的作用大小.

score函数可以是任意的比对向量的函数, 一般常用:

点积: \(score(h_t, h_i)=h_t^Th_i\)

这在使用全局注意力时有更好的效果
使用参数矩阵:

\(score(h_t, h_i)=h_t^TW_{\alpha}h_i\)

这就相当于使用了一个全连接层, 这种方法在使用局部注意力时有更好的效果.

全局注意力的总结如下图:

1.5 局部注意力

全局注意力需要在序列中所有的时间步上进行计算, 计算的代价是比较高的, 可以使用固定窗口大小的局部注意力机制, 窗口的大小为\(2D+1\). \(D\)为超参数, 为窗口边缘距离中心的单方向距离. 上下文向量\(c_t\)的计算方法如下:

\[c_t=\sum\limits_{i=p_t-D}^{p_t+D}\alpha_{t,i}h_i\]

可以看到, 只是考虑的时间步范围的区别, 其他完全相同. \(p_t\)作为窗口的中心, 可以直接使其等于当前时间步\(t\), 也可以设置为一个变量, 通过训练获得, 即:

\[p_t=T_x\sigma(v_p^T anh(W_ph_t))\]

其中\(\sigma\)为sigmoid函数, \(v_p\)和\(W_p\)均为可训练参数. 因此这样计算得到的\(p_t\)是一个浮点数, 但这并没有影响, 因为计算校准权重向量\(\alpha_t\)时, 增加了一个均值为\(p_t\), 标准差为\(\frac{D}{2}\)的正态分布项:

\[\alpha_{t,i}=\frac{\exp(score(h_t, h_i))}{\sum\limits_{j=1}^{T_x}\exp(score(h_t, h_j))}\exp(-\frac{(i-p_t)^2}{2(D/2)^2})\]

当然, 这里有\(p_t\in\mathbb{R}\cap[0, T_x]\), \(i\in\mathbb{N}\cap[p_t-D, p_t+D]\). 由于正态项的存在, 此时的注意力机制认为窗口中心附近的时间步对应的向量更重要, 且与全局注意力相比, 除了正态项还增加了一个截断, 即一个截断的正态分布.

局部注意力机制总结如下图:

2.1 与编码器-解码器注意力机制的不同

最大的区别是自注意力模型没有解码器. 因此有两个最直接的区别:

上下文向量\(c_t\)在seq2seq模型中, \(c_t=\sum\limits_{i=1}^{T_x}\alpha_{t,i}h_i\), 用来组成解码器的输入\[ ilde{h}_t= anh(W_c[c_t;h_t])\], 但由于自注意力机制没有解码器, 所以这里就直接是模型的输出, 即为\(s_t\)在计算校准向量\(\alpha_t\)时, seq2seq模型使用的是各个位置的隐藏向量与当前隐藏向量的比较值. 在自注意力机制中, 校准向量中的每个元素由每个位置的隐藏向量与当前时间步\(t\)的平均最优向量计算得到的, 而这个平均最优向量是通过训练得到的
2.2 自注意力机制实现

首先将隐藏向量\(h_i\)输入至全连接层(权重矩阵为\(W\)), 得到\(u_i\):

\[u_i= anh(Wh_i)\]

使用这个向量计算校正向量\(\alpha_t\), 通过softmax归一化得到:

\[\alpha_{t,i}=\frac{\exp(score(u_i, u_t))}{\sum\limits_{j=1}^{T_x}\exp(score(u_j, u_t))}\]

这里的\(u_t\)是当前时间步\(t\)对应的平均最优向量, 每个时间步不同, 这个向量是通过训练得到的.

最后计算最后的输出:

\[s_t=\sum\limits_{i=1}^{T}a_{t, i}h_i\]

一般来说, 在序列问题中, 只关心最后时间步的输出, 前面时间步不进行输出, 即最后的输出为\(s=s_T\)

2.3 层级注意力

如下图, 对于一个NLP问题, 在整个架构中, 使用了两个自注意力机制: 词层面和句子层面. 符合文档的自然层级结构:

词->句子->文档. 在每个句子中, 确定每个单词的重要性, 在整片文档中, 确定不同句子的重要性.

编解码器结构中注意力机制的,为文本摘要模型添加注意力机制,采用LSTM的编解码器模型实现  第3张

编解码器结构中注意力机制的,编码器—解码器和注意力机制

? ? 在基于词语的语言模型中,我们使用了循环神经网络。它的输入是一段不定长的序列,输出却是定长的,例如一个词语。然而,很多问题的输出也是不定长的序列。以机器翻译为例,输入是可以是英语的一段话,输出可以是法语的一段话,输入和输出皆不定长,例如

英语:They are watching.

法语:Ils regardent.

当输入输出都是不定长序列时,我们可以使用编码器—解码器(encoder-decoder)或者seq2seq。它们分别基于2014年的两个工作:

Cho et al.,?Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine TranslationSutskever et al.,?Sequence to Sequence Learning with Neural Networks
以上两个工作本质上都用到了两个循环神经网络,分别叫做编码器和解码器。编码器对应输入序列,解码器对应输出序列。下面我们来介绍编码器—解码器的设计。

编码器和解码器是分别对应输入序列和输出序列的两个循环神经网络。我们通常会在输入序列和输出序列后面分别附上一个特殊字符''(end of sequence)表示序列的终止。在测试模型时,一旦输出''就终止当前的输出序列。

编码器的作用是把一个不定长的输入序列转化成一个定长的背景向量cc。该背景向量包含了输入序列的信息。常用的编码器是循环神经网络。

我们回顾一下循环神经网络知识。假设循环神经网络单元为ff,在tt时刻的输入为xt,t=1,…,Txt,t=1,…,T。 假设xtxt是单个输出xtxt在嵌入层的结果,例如xtxt对应的one-hot向量o∈?xo∈Rx与嵌入层参数矩阵E∈?x×hE∈Rx×h的乘积o?Eo?E。隐含层变量

?

ht=f(xt,ht?1)ht=f(xt,ht?1)

编码器的背景向量

?

c=q(h1,…,hT)c=q(h1,…,hT)

一个简单的背景向量是该网络最终时刻的隐含层变量hThT。 我们将这里的循环神经网络叫做编码器。

双向循环神经网络

编码器的输入既可以是正向传递,也可以是反向传递。如果输入序列是x1,x2,…,xTx1,x2,…,xT,在正向传递中,隐含层变量

?

h→t=f(xt,h→t?1)h→t=f(xt,h→t?1)

而反向传递中,隐含层变量的计算变为

?

h←t=f(xt,h←t+1)h←t=f(xt,h←t+1)

当我们希望编码器的输入既包含正向传递信息又包含反向传递信息时,我们可以使用双向循环神经网络。例如,给定输入序列x1,x2,…,xTx1,x2,…,xT,按正向传递,它们在循环神经网络的隐含层变量分别是h→1,h→2,…,h→Th→1,h→2,…,h→T;按反向传递,它们在循环神经网络的隐含层变量分别是h←1,h←2,…,h←Th←1,h←2,…,h←T。在双向循环神经网络中,时刻ii的隐含层变量可以把h→ih→i和h←ih←i连结起来。

?

编码器最终输出了一个背景向量cc,该背景向量编码了输入序列x1,x2,…,xTx1,x2,…,xT的信息。

假设训练数据中的输出序列是y1,y2,…,yT′y1,y2,…,yT′,我们希望表示每个tt时刻输出的既取决于之前的输出又取决于背景向量。之后,我们就可以最大化输出序列的联合概率

?

?(y1,…,yT′)=∏t′=1T′?(yt′∣y1,…,yt′?1,c)P(y1,…,yT′)=∏t′=1T′P(yt′∣y1,…,yt′?1,c)

并得到该输出序列的损失函数

?

?log?(y1,…,yT′)?log?P(y1,…,yT′)

为此,我们使用另一个循环神经网络作为解码器。解码器使用函数pp来表示单个输出yt′yt′的概率

?

?(yt′∣y1,…,yt′?1,c)=p(yt′?1,st′,c)P(yt′∣y1,…,yt′?1,c)=p(yt′?1,st′,c)

其中的stst为t′t′时刻的解码器的隐含层变量。该隐含层变量

?

st′=g(yt′?1,c,st′?1)st′=g(yt′?1,c,st′?1)

其中函数gg是循环神经网络单元。

需要注意的是,编码器和解码器通常会使用多层循环神经网络。

在以上的解码器设计中,各个时刻使用了相同的背景向量。如果解码器的不同时刻可以使用不同的背景向量呢?

以英语-法语翻译为例,给定一对输入序列“they are watching”和输出序列“Ils regardent”,解码器在时刻1可以使用更多编码了“they are”信息的背景向量来生成“Ils”,而在时刻2可以使用更多编码了“watching”信息的背景向量来生成“regardent”。这看上去就像是在解码器的每一时刻对输入序列中不同时刻分配不同的注意力。这也是注意力机制的由来。它最早由Bahanau等在2015年提出。

现在,对上面的解码器稍作修改。我们假设时刻t′t′的背景向量为ct′ct′。那么解码器在t′t′时刻的隐含层变量

?

st′=g(yt′?1,ct′,st′?1)st′=g(yt′?1,ct′,st′?1)

令编码器在tt时刻的隐含变量为htht,解码器在t′t′时刻的背景向量为

?

ct′=∑t=1Tαt′thtct′=∑t=1Tαt′tht

也就是说,给定解码器的当前时刻t′t′,我们需要对编码器中不同时刻tt的隐含层变量求加权平均。而权值也称注意力权重。它的计算公式是

?

αt′t=exp(et′t)∑Tk=1exp(et′k)αt′t=exp?(et′t)∑k=1Texp?(et′k)

而et′t∈?et′t∈R的计算为:

?

et′t=a(st′?1,ht)et′t=a(st′?1,ht)

其中函数aa有多种设计方法。在Bahanau的论文中,

?

et′t=v?tanh(Wsst′?1+Whht)et′t=v?tanh?(Wsst′?1+Whht)

其中的vv、WsWs、WhWh和编码器与解码器两个循环神经网络中的各个权重和偏移项以及嵌入层参数等都是需要同时学习的模型参数。在Bahanau的论文中,编码器和解码器分别使用了门控循环单元(GRU)。

在解码器中,我们需要对GRU的设计稍作修改。 假设ytyt是单个输出ytyt在嵌入层的结果,例如ytyt对应的one-hot向量o∈?yo∈Ry与嵌入层参数矩阵B∈?y×sB∈Ry×s的乘积o?Bo?B。 假设时刻t′t′的背景向量为ct′ct′。那么解码器在t′t′时刻的单个隐含层变量

?

st′=zt′⊙st′?1+(1?zt′)⊙st′st′=zt′⊙st′?1+(1?zt′)⊙s~t′

其中的重置门、更新门和候选隐含状态分别为

?

rt′=σ(Wyryt′?1+Wsrst′?1+Wcrct′+br)rt′=σ(Wyryt′?1+Wsrst′?1+Wcrct′+br)

?

zt′=σ(Wyzyt′?1+Wszst′?1+Wczct′+bz)zt′=σ(Wyzyt′?1+Wszst′?1+Wczct′+bz)

?

st′=tanh(Wysyt′?1+Wss(st′?1⊙rt′)+Wcsct′+bs)s~t′=tanh(Wysyt′?1+Wss(st′?1⊙rt′)+Wcsct′+bs)

编码器-解码器(seq2seq)的输入和输出可以都是不定长序列。在解码器上应用注意力机制可以在解码器的每个时刻使用不同的背景向量。每个背景向量相当于对输入序列的不同部分分配了不同的注意力
参考文章:

http://zh.d2l.ai/chapter_natural-language-processing/seq2seq.html

您可能感兴趣的文章

本文地址:https://www.wskee.cn/19694.html
文章标签:
版权声明:本文为原创文章,版权归 专注力训练与注意力训练网 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!