一篇了解NLP中的注意力机制

 

 

 

文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。git

 

 

 

转自 | AI小白入门(公众号ID: StudyForAI)github

做者 | yuquanle,985在读硕士,目前研究方向为天然语言处理网络

 

 

 

 

00架构

目录app

 

1.写在前面框架

2.Seq2Seq 模型机器学习

3.NLP中注意力机制起源函数

4.NLP中的注意力机制  性能

5.Hierarchical Attention学习

6.Self-Attention

7.Memory-based Attention 

8.Soft/Hard Attention

9.Global/Local Attention

10.评价指标

11.写在后面

12.参考文献

 

01

写在前面

 

近些年来,注意力机制一直频繁的出如今目之所及的文献或者博文中,可见在NLP中算得上是个至关流行的概念,事实也证实其在NLP领域散发出不小得做用。这几年的顶会paper就能看出这一点。本文会从近些年天然语言中的注意力机制包括从起源、变体到评价指标方面进行介绍。

 

据Lilian Weng博主[1]总结以及一些资料显示,Attention机制最先应该是在视觉图像领域提出来的,这方面的工做应该不少,历史也比较悠久。人类的视觉注意力虽然存在不少不一样的模型,但它们都基本上归结为给予须要重点关注的目标区域(注意力焦点)更重要的注意力,同时给予周围的图像低的注意力,而后随着时间的推移调整焦点。

 

而直到Bahdanau等人[3]发表了论文《Neural Machine Translation by Jointly Learning to Align and Translate》,该论文使用相似attention的机制在机器翻译任务上将翻译和对齐同时进行,这个工做目前是最被承认为是第一个提出attention机制应用到NLP领域中的工做,值得一提的是,该论文2015年被ICLR录用,截至如今,谷歌引用量为5596,可见后续NLP在这一块的研究火爆程度。

 

注意力机制首先从人类直觉中获得,在NLP领域的机器翻译任务上首先取得不错的效果。简而言之,深度学习中的注意力能够广义地解释为重要性权重的向量:为了预测一个元素,例如句子中的单词,使用注意力向量来估计它与其余元素的相关程度有多强,并将其值的总和做为目标的近似值。既然注意力机制最先在NLP领域应用于机器翻译任务,那在这个以前又是怎么作的呢?

 

传统的基于短语的翻译系统经过将源句分红多个块而后逐个词地翻译它们来完成它们的任务,这致使了翻译输出的不流畅。不妨先来想一想咱们人类是如何翻译的?咱们首先会阅读整个待翻译的句子,而后结合上下文理解其含义,最后产生翻译。

 

从某种程度上来讲,神经机器翻译(NMT)的提出正是想去模仿这一过程。而在NMT的翻译模型中经典的作法是由编码器 - 解码器架构制定(encoder-decoder),用做encoder和decoder经常使用的是循环神经网络。这类模型大概过程是首先将源句子的输入序列送入到编码器中,提取最后隐藏状态的表示并用于解码器的输入,而后一个接一个地生成目标单词,这个过程广义上能够理解为不断地将前一个时刻 t-1 的输出做为后一个时刻 t 的输入,循环解码,直到输出中止符为止。

 

经过这种方式,NMT解决了传统的基于短语的方法中的局部翻译问题:它能够捕获语言中的长距离依赖性,并提供更流畅的翻译。

 

可是这样作也存在不少缺点,譬如,RNN是健忘的,这意味着前面的信息在通过多个时间步骤传播后会被逐渐消弱乃至消失。其次,在解码期间没有进行对齐操做,所以在解码每一个元素的过程当中,焦点分散在整个序列中。对于前面那个问题,LSTM、GRU在必定程度可以缓解。然后者正是Bahdanau等人重视的问题。

 

02

Seq2Seq模型

 

在介绍注意力模型以前,不得不先学习一波Encoder-Decoder框架,虽说注意力模型能够看做一种通用的思想,自己并不依赖于特定框架(好比文章[15]:Learning Sentence Representation with Guidance of Human Attention),可是目前大多数注意力模型都伴随在Encoder-Decoder框架下。

 

Seq2seq模型最先由bengio等人[17]论文《Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation》中初显。随后Sutskever等人[16]在文章《Sequence to Sequence Learning with Neural Networks》中提出改进模型即为目前常说的Seq2Seq模型。

 

从广义上讲,它的目的是将输入序列(源序列)转换为新的输出序列(目标序列),这种方式不会受限于两个序列的长度,换句话说,两个序列的长度能够任意。以NLP领域来讲,序列能够是句子、段落、篇章等,因此咱们也能够把它看做处理由一个句子(段落或篇章)生成另一个句子(段落或篇章)的通用处理模型。

 

对于句子对,咱们指望输入句子Source,期待经过Encoder-Decoder框架来生成目标句子Target。Source和Target能够是同一种语言,也能够是两种不一样的语言,如果不一样语言,就能够处理翻译问题了。如果相同语言,输入序列Source长度为篇章,而目标序列Target为小段落则能够处理文本摘要问题 (目标序列Target为句子则能够处理标题生成问题)等等等。

 

seq2seq模型一般具备编码器 - 解码器架构:

 

编码器encoder: 编码器处理输入序列并将序列信息压缩成固定长度的上下文向量(语义编码/语义向量context)。指望这个向量可以比较好的表示输入序列的信息。

 

解码器decoder: 利用上下文向量初始化解码器以获得变换后的目标序列输出。早期工做仅使用编码器的最后状态做为解码器的输入。

 

编码器和解码器都是循环神经网络,比较常见的是使用LSTM或GRU。

 

编码器 - 解码器模型

 

03

NLP中注意力机制的起源

 

前面谈到在Seq2Seq结构中,encoder把全部的输入序列都编码成一个统一的语义向量context,而后再由decoder解码。而context天然也就成了限制模型性能的瓶颈。

 

譬如机器翻译问题,当要翻译的句子较长时,一个context可能存不下那么多信息。除此以外,只用编码器的最后一个隐藏层状态,感受上都不是很合理。


实际上当咱们翻译一个句子的时候,譬如:Source: 机器学习-->Target: machine learning。当decoder要生成"machine"的时候,应该更关注"机器",而生成"learning"的时候,应该给予"学习"更大的权重。因此若是要改进Seq2Seq结构,一个不错的想法天然就是利用encoder全部隐藏层状态解决context限制问题。

 

Bahdanau等人[3]把attention机制用到了神经网络机器翻译(NMT)上。传统的encoder-decoder模型经过encoder将Source序列编码到一个固定维度的中间语义向量context,而后再使用decoder进行解码翻译到目标语言序列。

 

前面已经谈到了这种作法的局限性,并且,Bahdanau等人[3]在其文章的摘要中也说到这个context多是提升这种基本编码器 - 解码器架构性能的瓶颈,那Bahdanau等人又是如未尝试缓解这个问题的呢? 别急,让咱们来一探究竟。

 

做者为了缓解中间向量context很难将Source序列全部重要信息压缩进来的问题,特别是对于那些很长的句子。提出在机器翻译任务上在 encoder–decoder 作出了以下扩展:将翻译和对齐联合学习。这个操做在生成Target序列的每一个词时,用到的中间语义向量context是Source序列经过encoder的隐藏层的加权和,而传统的作法是只用encoder最后一个时刻输出做为context,这样就能保证在解码不一样词的时候,Source序列对如今解码词的贡献是不同的。

 

想一想前面那个例子:Source: 机器学习-->Target: machine learning (假如中文按照字切分)。decoder在解码"machine"时,"机"和"器"提供的权重要更大一些,一样,在解码"learning"时,"学"和"习"提供的权重相应的会更大一些,这在直觉也和人类翻译也是一致的。

 

经过这种attention的设计,做者将Source序列的每一个词(经过encoder的隐藏层输出)和Target序列 (当前要翻译的词) 的每一个词巧妙的创建了联系。想想,翻译每一个词的时候,都有一个语义向量,而这个语义向量是Source序列每一个词经过encoder以后的隐藏层的加权和。 由此能够获得一个Source序列和Target序列的对齐矩阵,经过可视化这个矩阵,能够看出在翻译一个词的时候,Source序列的每一个词对当前要翻译词的重要性分布,这在直觉上也能给人一种可解释性的感受。

论文中的图也能很好的看出这一点:

 

生成第t个目标词

 

更形象一点能够看这个图:

 

 

如今让咱们从公式层面来看看这个东东 (加粗变量表示它们是向量,这篇文章中的其余地方也同样)。 假设咱们有一个长度为n的源序列x,并尝试输出长度为m的目标序列y:

 

 

做者采样bidirectional RNN做为encoder(实际上这里能够有不少选择),具备前向隐藏状态和后向隐藏状态。为了得到词的上下文信息,做者采用简单串联方式将前向和后向表示拼接做为encoder的隐藏层状态,公式以下:

 

 

对于目标(输出)序列的每一个词(假设位置为t),decoder网络的隐藏层状态:

 

 

其中,语义向量 是源(输入)序列的隐藏状态的加权和,权重为对齐分数:

 

 

(注意:这里的score函数为原文的a函数,原文的描述为:is an alignment model)

 

对齐模型基于(在i时刻的输入)和(在t时刻的输出)的匹配程度分配分数是定义每一个目标(输出)单词应该考虑给每一个源(输入)隐藏状态的多大的权重(这偏偏反映了对此时解码的目标单词的贡献重要性)。

 

在Bahdanau[3]的论文中,做者采用的对齐模型为前馈神经网络,该网络与所提出的系统的全部其余组件共同训练。所以,score函数采用如下形式,tanh用做非线性激活函数,公式以下:

 

 

其中和都是在对齐模型中学习的权重矩阵。对齐分数矩阵是一个很好的可解释性的东东,能够明确显示源词和目标词之间的相关性。

 

 对齐矩阵例子

 

而decoder每一个词的条件几率为:

 

 

g为非线性的,多是多层的输出几率的函数,是RNN的隐藏状态, 为语义向量。

 

04

NLP中的注意力机制

 

随着注意力机制的普遍应用,在某种程度上缓解了源序列和目标序列因为距离限制而难以建模依赖关系的问题。如今已经涌现出了一大批基于基本形式的注意力的不一样变体来处理更复杂的任务。让咱们一块儿来看看其在不一样NLP问题中的注意力机制。

其实咱们可能已经意识到了,对齐模型的设计不是惟一的,确实,在某种意义上说,根据不一样的任务设计适应于特定任务的对齐模型能够看做设计出了新的attention变体,让咱们再回过头来看看这个对齐模型(函数):。再来看看几个表明性的work。

 

1. Citation[5]等人提出Content-base attention,其对齐函数模型设计为:

 

 

2. Bahdanau[3]等人的Additive(*),其设计为:  

 

 

3. Luong[4]等人文献包含了几种方式:

 

 

4. 以及Luong[4]等人还尝试过location-based function:  

 

 

这种方法的对齐分数仅从目标隐藏状态学习获得。

 

5. Vaswani[6]等人的Scaled Dot-Product(^):

 

 

细心的童鞋可能早就发现了这东东和点积注意力很像,只是加了个scale factor。当输入较大时,softmax函数可能具备极小的梯度,难以有效学习,因此做者加入比例因子

 

6. Cheng[7]等人的Self-Attention(&)能够关联相同输入序列的不一样位置。 从理论上讲,Self-Attention能够采用上面的任何 score functions。在一些文章中也称为“intra-attention” 。

 

Hu[7]对此分了个类:

 

 

前面谈到的一些Basic Attention给人的感受可以从序列中根据权重分布提取重要元素。而Multi-dimensional Attention可以捕获不一样表示空间中的term之间的多个交互,这一点简单的实现能够经过直接将多个单维表示堆叠在一块儿构建。Wang[8]等人提出了coupled multi-layer attentions,该模型属于多层注意力网络模型。做者称,经过这种多层方式,该模型能够进一步利用术语之间的间接关系,以得到更精确的信息。

 

05

Hierarchical Attention

 

再来看看Hierarchical Attention,Yang[9]等人提出了Hierarchical Attention Networks,看下面的图可能会更直观:

 

Hierarchical Attention Networks

 

这种结构可以反映文档的层次结构。模型在单词和句子级别分别设计了两个不一样级别的注意力机制,这样作可以在构建文档表示时区别地对待这些内容。Hierarchical attention能够相应地构建分层注意力,自下而上(即,词级到句子级)或自上而下(词级到字符级),以提取全局和本地的重要信息。自下而上的方法上面刚谈完。那么自上而下又是如何作的呢?让咱们看看Ji[10]等人的模型:

 

Nested Attention Hybrid Model

 

和机器翻译相似,做者依旧采用encoder-decoder架构,而后用word-level attention对全局语法和流畅性纠错,设计character-level attention对本地拼写错误纠正。

 

06

Self-Attention

 

那Self-Attention又是指什么呢?

Self-Attention(自注意力),也称为intra-attention(内部注意力),是关联单个序列的不一样位置的注意力机制,以便计算序列的交互表示。它已被证实在不少领域十分有效好比机器阅读,文本摘要或图像描述生成。

 

好比Cheng[11]等人在机器阅读里面利用了自注意力。当前单词为红色,蓝色阴影的大小表示激活程度,自注意力机制使得可以学习当前单词和句子前一部分词之间的相关性。

 

当前单词为红色,蓝色阴影的大小表示激活程度

 

好比Xu[12]等人利用自注意力在图像描述生成任务。注意力权重的可视化清楚地代表了模型关注的图像的哪些区域以便输出某个单词。

 

 

咱们假设序列元素为,其匹配向量为。让咱们再来回顾下前面说的基本注意力的对齐函数,attention score经过计算获得,因为是经过将外部u与每一个元素匹配来计算注意力,因此这种形式能够看做是外部注意力。当咱们把外部u替换成序列自己(或部分自己),这种形式就能够看做为内部注意力(internal attention)。

 

咱们根据文章[7]中的例子来看看这个过程,例如句子:"Volleyball match is in progress between ladies"。句子中其它单词都依赖着"match",理想状况下,咱们但愿使用自注意力来自动捕获这种内在依赖。换句话说,自注意力能够解释为,每一个单词去和V序列中的内部模式匹配,匹配函数很天然的选择为V中其它单词 ,这样即可以计算成对注意力得分。为了彻底捕捉序列中单词之间的复杂相互做用,咱们能够进一步扩展它以计算序列中每对单词之间的注意力。这种方式让每一个单词和序列中其它单词交互了关系。

 

 

另外一方面,自注意力还能够自适应方式学习复杂的上下文单词表示。譬如经典文章[14]:A structured self-attentive sentence embedding。这篇文章提出了一种经过引入自关注力机制来提取可解释句子嵌入的新模型。使用二维矩阵而不是向量来表明嵌入,矩阵的每一行都在句子的不一样部分,想深刻了解的能够去看看这篇文章,另外,文章的公式感受真的很漂亮。

 

值得一提还有2017年谷歌提出的Transformer[6],这是一种新颖的基于注意力的机器翻译架构,也是一个混合神经网络,具备前馈层和自注意层。论文的题目挺霸气:Attention is All you Need,毫无疑问,它是2017年最具影响力和最有趣的论文之一。

 

这篇文章提出许多改进,在彻底抛弃了RNN的状况下进行seq2seq建模。那这篇文章的Transformer的庐山真面目究竟是怎样的呢?接下来一块儿来详细看看吧。

 

01

Key, Value and Query

 

众所周知,在NLP任务中,一般的处理方法是先分词,而后每一个词转化为对应的词向量。接着通常最多见的有二类操做,第一类是接RNN(变体LSTM、GRU、SRU等),可是这一类方法没有摆脱时序这个局限,也就是说没法并行,也致使了在大数据集上的速度效率问题。第二类是接CNN,CNN方便并行,并且容易捕捉到一些全局的结构信息。很长一段时间都是以上二种的抉择以及改造,直到谷歌提供了第三类思路:纯靠注意力,也就是如今要讲的这个东东。

 

将输入序列编码表示视为一组键值对(K,V)以及查询 Q,由于文章[6]取K=V=Q,因此也天然称为Self Attention。

 

 

K, V像是key-value的关系从而是一一对应的,那么上式的意思就是经过Q中每一个元素query,与K中各个元素求内积而后softmax的方式,来获得Q中元素与V中元素的类似度,而后加权求和,获得一个新的向量。其中因子为了使得内积不至于太大。以上公式在文中也称为点积注意力(scaled dot-product attention):输出是值的加权和,其中分配给每一个值的权重由查询的点积与全部键肯定。

 

而Transformer主要由多头自注意力(Multi-Head Self-Attention)单元组成。那么Multi-Head Self-Attention又是什么呢?如下为论文中的图:

 

Multi-head scaled dot-product attention mechanism

 

Multi-Head Self-Attention不是仅仅计算一次注意力,而是屡次并行地经过缩放的点积注意力。 独立的注意力输出被简单地链接并线性地转换成预期的维度。论文[6]表示,多头注意力容许模型共同关注来自不一样位置的不一样表示子空间的信息。 只有一个注意力的头,平均值就会抑制这一点。

 

 

是须要学习的参数矩阵。既然为seq2seq模式,天然也包括encoder和decoder,那这篇文章又是如何构建这些的呢?莫急,请继续往下看。

 

02

Encoder

 

The transformer's encoder

 

编码器生成基于自注意力的表示,其可以从可能无限大的上下文中定位特定信息。值得一提的是,上面的结构文章堆了六个。

 

1. 每层都有一个多头自注意力层

2. 每层都有一个简单的全链接的前馈网络

3. 每一个子层采用残差链接和层规范化。 全部子层输出相同维度dmodel = 512。

 

03

Decoder

 

The transformer's decoder.

 

解码器可以从编码表示中检索。上面的结构也堆了六个。

 

1. 每层有两个多头注意机制子层。

2. 每层有一个彻底链接的前馈网络子层。

3. 与编码器相似,每一个子层采用残差链接和层规范化。

与encoder不一样的是,第一个多头注意子层被设计成防止关注后续位置,由于咱们不但愿在预测当前位置时查看目标序列的将来。最后来看一看总体架构:

 

The full model architecture of the transformer.

 

07

Memory-based Attention

 

那Memory-based Attention又是什么呢?咱们先换种方式来看前面的注意力,假设有一系列的键值对 存在内存中和查询向量q,这样便能重写为如下过程:

 

 

这种解释是把注意力做为使用查询q的寻址过程,这个过程基于注意力分数从memory中读取内容。聪明的童鞋确定已经发现了,若是咱们假设,这不就是前面谈到的基础注意力么?然而,因为结合了额外的函数,能够实现可重用性和增长灵活性,因此Memory-based attention mechanism能够设计得更增强大。

 

那为何又要这样作呢?在NLP的一些任务上好比问答匹配任务,答案每每与问题间接相关,所以基本的注意力技术就显得很无力了。那处理这一任务该如何作才好呢?这个时候就体现了Memory-based attention mechanism的强大了,譬如Sukhbaatar[19]等人经过迭代内存更新(也称为多跳)来模拟时间推理过程,以逐步引导注意到答案的正确位置:

 

 

在每次迭代中,使用新内容更新查询,而且使用更新的查询来检索相关内容。一种简单的更新方法为相加。那么还有其它更新方法么?

 

固然有,直觉敏感的童鞋确定想到了,光是这一点,就能够根据特定任务去设计,好比Kuma[13]等人的工做。这种方式的灵活度也体如今key和value能够自由的被设计,好比咱们能够自由地将先验知识结合到key和value嵌入中,以容许它们分别更好地捕获相关信息。看到这里是否是以为文章灌水其实也不是什么难事了。

 

08

Soft/Hard Attention

 

最后想再谈谈Soft/Hard Attention,是由于在不少地方都看到了这个名词。

 

据我所知,这个概念由《Show, Attend and Tell: Neural Image Caption Generation with Visual Attention》提出,这是对attention另外一种分类。SoftAttention本质上和Bahdanau等人[3]很类似,其权重取值在0到1之间,而Hard Attention取值为0或者1。

 

09

Global/Local Attention

 

Luong等人[4]提出了Global Attention和Local Attention。Global Attention本质上和Bahdanau等人[3]很类似。Global方法顾名思义就是会关注源句子序列的全部词,具体地说,在计算语义向量时,会考虑编码器全部的隐藏状态。而在Local Attention中,计算语义向量时只关注每一个目标词的一部分编码器隐藏状态。因为Global方法必须计算源句子序列全部隐藏状态,当句子长度过长会使得计算代价昂贵并使得翻译变得不太实际,好比在翻译段落和文档的时候。

 

 

10

评价指标

 

在看一些带有attention的paper时,经常会伴随着为了说明本身文章attention是work的实验,但实际上尝试提供严格数学证实的文章极少。

 

Hu[7]把Attention的评价方式分为两类:Quantitative(定量指标)和Qualitative(定性指标)。

 

定量指标顾名思义就是对attention的贡献就行量化,这一方面通常会结合下游任务,最多见的当属机器翻译,咱们都知道机器翻译的最流行评价指标之一是BLEU,咱们能够在翻译任务设计attention和不加attention进行对比,对比的指标就是BLEU,设置咱们能够设计多种不一样的attention进行对比。

 

定性指标评价是目前应用最普遍的评价技术,由于它简单易行,便于可视化。具体作法通常都是为整个句子构建一个热力图,其热力图强度与每一个单词接收到的标准化注意力得分红正比。也就是说,词的贡献越大,颜色越深。其实这在直觉上也是可以接收的,由于每每相关任务的关键词的attention权值确定要比其它词重要。好比Hu[7]文中的图:

 

 

11

写在后面

 

 

本文参考了众多文献,对近些年的天然语言中的注意力机制从起源、变体到评价方面都进行了简要介绍,可是要明白的是,实际上注意力机制在NLP上的研究特别多,为此,我仅仅对1八、19年的文献进行了简单的调研(AAAI、IJCAI、ACL、EMNLP、NAACL等顶会),就至少有一百篇之多,足见attention仍是很潮的,因此我也把连接放到了个人github上。方便查阅。之后慢慢补充~~

 

地址:

https://github.com/yuquanle/Attention-Mechanisms-paper/blob/master/Attention-mechanisms-paper.md

 

顺便贴个图:

 

 

参考文献

[1] Attention? Attention!.

[2] Neural Machine Translation (seq2seq) Tutorial.

[3] Neural Machine Translation by Jointly Learning to Align and Translate. Dzmitry Bahdanau, Kyunghyun Cho, and Yoshua Bengio. ICLR, 2015.

[4] Effective approaches to attention-based neural machine translation. Minh-Thang Luong, Hieu Pham, and Christopher D Manning. EMNLP, 2015.

[5] Neural Turing Machines. Alex Graves, Greg Wayne and Ivo Danihelka. 2014.

[6] Attention Is All You Need. Ashish Vaswani, et al. NIPS, 2017.

[7] An Introductory Survey on Attention Mechanisms in NLP Problems. Dichao Hu, 2018.

[8] Coupled Multi-Layer Attentions for Co-Extraction of Aspect and Opinion. Terms Wenya Wang,Sinno Jialin Pan, Daniel Dahlmeier and Xiaokui Xiao. AAAI, 2017.

[9] Hierarchical attention networks for document classification. Zichao Yang et al. ACL, 2016.

[10] A Nested Attention Neural Hybrid Model for Grammatical Error Correction. Jianshu Ji et al. 2017.

[11] Long Short-Term Memory-Networks for Machine Reading. Jianpeng Cheng, Li Dong and Mirella Lapata. EMNLP, 2016.

[12] Show, Attend and Tell: Neural Image Caption Generation with Visual Attention. Kelvin Xu et al. JMLR, 2015.

[13] Ask me anything: Dynamic memory networks for natural language processing. Zhouhan Lin al. JMLR, 2016.

[14] A structured self-attentive sentence embedding. Zhouhan Lin al. ICLR, 2017.

[15] Learning Sentence Representation with Guidance of Human Attention. Shaonan Wang , Jiajun Zhang, Chengqing Zong. IJCAI, 2017.

[16] Sequence to Sequence Learning with Neural Networks. Ilya Sutskever et al. 2014.

[17] Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation. Kyunghyun Cho, Yoshua Bengio et al. EMNLP, 2014.

[18] End-To-End Memory Networks Sainbayar Sukhbaatar et al. NIPS, 2015.

[19] 《Attention is All You Need》浅读(简介+代码)