nlp神经网络注意力机制,NLP中的Attention注意力机制+Transformer详解

2021/05/19 18:18 · 提高注意力训练 ·  · nlp神经网络注意力机制,NLP中的Attention注意力机制+Transformer详解已关闭评论
专注力注意力训练提升
摘要:

nlp神经网络注意力机制,NLP中的Attention注意力机制+Transformer详解关注上方“深度学习技术前沿”,选择“星标公众号”,资源干货,第一时间送达!作者:?JayLou娄杰知乎链接:本文仅作学术分享,如有侵权,请后台联系删除本文以QA形

nlp神经网络注意力机制,NLP中的Attention注意力机制+Transformer详解

关注上方“深度学习技术前沿”,选择“星标公众号”,

资源干货,第一时间送达!

作者:?JayLou娄杰

知乎链接:https://zhuanlan.zhihu.com/p/

本文仅作学术分享,如有侵权,请后台联系删除

本文以QA形式对自然语言处理中注意力机制(Attention)进行总结,并对Transformer进行深入解析。

一、Attention机制剖析

1、为什么要引入Attention机制?

2、Attention机制有哪些?(怎么分类?)

3、Attention机制的计算流程是怎样的?

4、Attention机制的变种有哪些?

5、一种强大的Attention机制:为什么自注意力模型(self-Attention model)在长距离序列中如此强大?

(1)卷积或循环神经网络难道不能处理长距离序列吗?

(2)要解决这种短距离依赖的“局部编码”问题,从而对输入序列建立长距离依赖关系,有哪些办法呢?

(3)自注意力模型(self-Attention model)具体的计算流程是怎样的呢?

二、Transformer(Attention Is All You Need)详解

1、Transformer的整体架构是怎样的?由哪些部分组成?

2、Transformer Encoder 与 Transformer Decoder 有哪些不同?

3、Encoder-Decoder attention 与self-attention mechanism有哪些不同?

4、multi-head self-attention mechanism具体的计算过程是怎样的?

5、Transformer在GPT和Bert等词向量预训练模型中具体是怎么应用的?有什么变化?

1、为什么要引入Attention机制?

根据通用近似定理,前馈网络和循环网络都有很强的能力。但为什么还要引入注意力机制呢?

计算能力的限制:当要记住很多“信息“,模型就要变得更复杂,然而目前计算能力依然是限制神经网络发展的瓶颈。
优化算法的限制:虽然局部连接、权重共享以及pooling等优化操作可以让神经网络变得简单一些,有效缓解模型复杂度和表达能力之间的矛盾;但是,如循环神经网络中的长距离以来问题,信息“记忆”能力并不高。

可以借助人脑处理信息过载的方式,例如Attention机制可以提高神经网络处理信息的能力。

2、Attention机制有哪些?(怎么分类?)

当用神经网络来处理大量的输入信息时,也可以借鉴人脑的注意力机制,只 选择一些关键的信息输入进行处理,来提高神经网络的效率。按照认知神经学中的注意力,可以总体上分为两类:

聚焦式(focus)注意力:自上而下的有意识的注意力,主动注意——是指有预定目的、依赖任务的、主动有意识地聚焦于某一对象的注意力;
显著性(saliency-based)注意力:自下而上的有意识的注意力,被动注意——基于显著性的注意力是由外界刺激驱动的注意,不需要主动干预,也和任务无关;可以将max-pooling和门控(gating)机制来近似地看作是自下而上的基于显著性的注意力机制。

在人工神经网络中,注意力机制一般就特指聚焦式注意力。

3、Attention机制的计算流程是怎样的?

Attention机制的实质:寻址(addressing)

Attention机制的实质其实就是一个寻址(addressing)的过程,如上图所示:给定一个和任务相关的查询Query向量?q,通过计算与Key的注意力分布并附加在Value上,从而计算Attention Value,这个过程实际上是Attention机制缓解神经网络模型复杂度的体现:不需要将所有的N个输入信息都输入到神经网络进行计算,只需要从X中选择一些和任务相关的信息输入给神经网络。

注意力机制可以分为三步:一是信息输入;二是计算注意力分布α;三是根据注意力分布α 来计算输入信息的加权平均。

step1-信息输入:用X?= [x1, · · · , xN ]表示N 个输入信息;

step2-注意力分布计算:令Key=Value=X,则可以给出注意力分布

我们将称之为注意力分布(概率分布),为注意力打分机制,有几种打分机制:

step3-信息加权平均:注意力分布可以解释为在上下文查询q时,第i个信息受关注的程度,采用一种“软性”的信息选择机制对输入信息X进行编码为:

这种编码方式为软性注意力机制(soft Attention),软性注意力机制有两种:普通模式(Key=Value=X)和键值对模式(Key!=Value)。

软性注意力机制(soft Attention)

4、Attention机制的变种有哪些?

与普通的Attention机制(上图左)相比,Attention机制有哪些变种呢?

变种1-硬性注意力:之前提到的注意力是软性注意力,其选择的信息是所有输入信息在注意力 分布下的期望。还有一种注意力是只关注到某一个位置上的信息,叫做硬性注意力(hard attention)。硬性注意力有两种实现方式:(1)一种是选取最高概率的输入信息;(2)另一种硬性注意力可以通过在注意力分布式上随机采样的方式实现。硬性注意力模型的缺点:

硬性注意力的一个缺点是基于最大采样或随机采样的方式来选择信息。因此最终的损失函数与注意力分布之间的函数关系不可导,因此无法使用在反向传播算法进行训练。为了使用反向传播算法,一般使用软性注意力来代替硬性注意力。硬性注意力需要通过强化学习来进行训练。——《神经网络与深度学习》

变种2-键值对注意力:即上图右边的键值对模式,此时Key!=Value,注意力函数变为:

变种3-多头注意力:多头注意力(multi-head attention)是利用多个查询Q = [q1, · · · , qM],来平行地计算从输入信息中选取多个信息。每个注意力关注输入信息的不同部分,然后再进行拼接:

5、一种强大的Attention机制:为什么自注意力模型(self-Attention model)在长距离序列中如此强大?

(1)卷积或循环神经网络难道不能处理长距离序列吗?

当使用神经网络来处理一个变长的向量序列时,我们通常可以使用卷积网络或循环网络进行编码来得到一个相同长度的输出向量序列,如图所示:

基于卷积网络和循环网络的变长序列编码

从上图可以看出,无论卷积还是循环神经网络其实都是对变长序列的一种“局部编码”:卷积神经网络显然是基于N-gram的局部编码;而对于循环神经网络,由于梯度消失等问题也只能建立短距离依赖。

(2)要解决这种短距离依赖的“局部编码”问题,从而对输入序列建立长距离依赖关系,有哪些办法呢?

如果要建立输入序列之间的长距离依赖关系,可以使用以下两种方法:一 种方法是增加网络的层数,通过一个深层网络来获取远距离的信息交互,另一种方法是使用全连接网络。——《神经网络与深度学习》

全连接模型和自注意力模型:实线表示为可学习的权重,虚线表示动态生成的权重。

由上图可以看出,全连接网络虽然是一种非常直接的建模远距离依赖的模型, 但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。

这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(self-attention model)。由于自注意力模型的权重是动态生成的,因此可以处理变长的信息序列。

总体来说,为什么自注意力模型(self-Attention model)如此强大:利用注意力机制来“动态”地生成不同连接的权重,从而处理变长的信息序列。

(3)自注意力模型(self-Attention model)具体的计算流程是怎样的呢?

同样,给出信息输入:用X = [x1, · · · , xN ]表示N 个输入信息;通过线性变换得到为查询向量序列,键向量序列和值向量序列:

上面的公式可以看出,self-Attention中的Q是对自身(self)输入的变换,而在传统的Attention中,Q来自于外部。

self-Attention计算过程剖解(来自《细讲 | Attention Is All You Need 》)

注意力计算公式为:

自注意力模型(self-Attention model)中,通常使用缩放点积来作为注意力打分函数,输出向量序列可以写为:

从Transformer这篇论文的题目可以看出,Transformer的核心就是Attention,这也就是为什么本文会在剖析玩Attention机制之后会引出Transformer,如果对上面的Attention机制特别是自注意力模型(self-Attention model)理解后,Transformer就很容易理解了。

1、Transformer的整体架构是怎样的?由哪些部分组成?

Transformer模型架构

Transformer其实这就是一个Seq2Seq模型,左边一个encoder把输入读进去,右边一个decoder得到输出:

Seq2Seq模型

Transformer=Transformer Encoder+Transformer Decoder

(1)Transformer Encoder(N=6层,每层包括2个sub-layers):

Transformer Encoder

sub-layer-1:multi-head self-attention mechanism,用来进行self-attention。
sub-layer-2:Position-wise Feed-forward Networks,简单的全连接网络,对每个position的向量分别进行相同的操作,包括两个线性变换和一个ReLU激活输出(输入输出层的维度都为512,中间层为2048):

每个sub-layer都使用了残差网络:?

(2)Transformer Decoder(N=6层,每层包括3个sub-layers):

Transformer Decoder

sub-layer-1:Masked multi-head self-attention mechanism,用来进行self-attention,与Encoder不同:由于是序列生成过程,所以在时刻 i 的时候,大于 i 的时刻都没有结果,只有小于 i 的时刻有结果,因此需要做Mask。
sub-layer-2:Position-wise Feed-forward Networks,同Encoder。
sub-layer-3:Encoder-Decoder attention计算。

2、Transformer Encoder 与 Transformer Decoder 有哪些不同?

(1)multi-head self-attention mechanism不同,Encoder中不需要使用Masked,而Decoder中需要使用Masked;

(2)Decoder中多了一层Encoder-Decoder attention,这与 self-attention mechanism不同。

3、Encoder-Decoder attention 与self-attention mechanism有哪些不同?

它们都是用了 multi-head计算,不过Encoder-Decoder attention采用传统的attention机制,其中的Query是self-attention mechanism已经计算出的上一时间i处的编码值,Key和Value都是Encoder的输出,这与self-attention mechanism不同。代码中具体体现:

4、multi-head self-attention mechanism具体的计算过程是怎样的?

multi-head self-attention mechanism计算过程

Transformer中的Attention机制由Scaled Dot-Product Attention和Multi-Head Attention组成,上图给出了整体流程。下面具体介绍各个环节:

Expand:实际上是经过线性变换,生成Q、K、V三个向量;
Split heads: 进行分头操作,在原文中将原来每个位置512维度分成8个head,每个head维度变为64;
Self Attention:对每个head进行Self Attention,具体过程和第一部分介绍的一致;
Concat heads:对进行完Self Attention每个head进行拼接;

上述过程公式为:

5、Transformer在GPT和Bert等词向量预训练模型中具体是怎么应用的?有什么变化?

GPT中训练的是单向语言模型,其实就是直接应用Transformer Decoder;
Bert中训练的是双向语言模型,应用了Transformer Encoder部分,不过在Encoder基础上还做了Masked操作;

BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能处理其左侧的上下文。双向 Transformer 通常被称为“Transformer encoder”,而左侧上下文被称为“Transformer decoder”,decoder是不能获要预测的信息的。

《神经网络与深度学习》

https://nndl.github.io/

Attention Is All You Need

https://arxiv.org/abs/1706.

谷歌BERT解析----2小时上手最强NLP训练模型

http://www.chinahadoop.cn/course/12

细讲 | Attention Is All You Need

https://mp.weixin.qq.com/s/RLxWevVWHXgX-UcoxDS70w

深度学习中的注意力模型(2017版)

https://zhuanlan.zhihu.com/p/

nlp神经网络注意力机制,NLP中的Attention注意力机制+Transformer详解  第1张

nlp神经网络注意力机制,一文解读NLP中的注意力机制

新智元推荐
来源:AI小白入门
作者:yuquanle 整理编辑:三石
【新智元导读】注意力机制越发频繁的出现在文献中,因此对注意力机制的学习、掌握与应用显得十分重要。本文便对注意力机制做了较为全面的综述。
近些年来,注意力机制一直频繁的出现在目之所及的文献或者博文中,可见在NLP中算得上是个相当流行的概念,事实也证明其在NLP领域散发出不小得作用。这几年的顶会paper就能看出这一点。本文深入浅出地介绍了近些年的自然语言中的注意力机制包括从起源、变体到评价指标方面。
本文便对NLP的注意力机制进行了综述。
目录
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.参考文献
写在前面
据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等人重视的问题。
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。
编码器 - 解码器模型
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的隐藏状态,
为语义向量。
NLP中注意力机制
随着注意力机制的广泛应用,在某种程度上缓解了源序列和目标序列由于距离限制而难以建模依赖关系的问题。现在已经涌现出了一大批基于基本形式的注意力的不同变体来处理更复杂的任务。让我们一起来看看其在不同NLP问题中的注意力机制。
其实我们可能已经意识到了,对齐模型的设计不是唯一的,确实,在某种意义上说,根据不同的任务设计适应于特定任务的对齐模型可以看作设计出了新的attention变体,让我们再回过头来看看这个对齐模型(函数):
。再来看看几个代表性的work。
Citation[5]等人提出Content-base attention,其对齐函数模型设计为:
Bahdanau[3]等人的Additive(*),其设计为:
Luong[4]等人文献包含了几种方式:
以及Luong[4]等人还尝试过location-based function:
这种方法的对齐分数仅从目标隐藏状态学习得到。 Vaswani[6]等人的Scaled Dot-Product(^):
细心的童鞋可能早就发现了这东东和点积注意力很像,只是加了个scale factor。当输入较大时,softmax函数可能具有极小的梯度,难以有效学习,所以作者加入比例因子
。Cheng[7]等人的Self-Attention(&)可以关联相同输入序列的不同位置。 从理论上讲,Self-Attention可以采用上面的任何 score functions。在一些文章中也称为“intra-attention” 。
Hu[7]对此分了个类:
前面谈到的一些Basic Attention给人的感觉能够从序列中根据权重分布提取重要元素。而Multi-dimensional Attention能够捕获不同表示空间中的term之间的多个交互,这一点简单的实现可以通过直接将多个单维表示堆叠在一起构建。Wang[8]等人提出了coupled multi-layer attentions,该模型属于多层注意力网络模型。作者称,通过这种多层方式,该模型可以进一步利用术语之间的间接关系,以获得更精确的信息。
再来看看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对本地拼写错误纠正。
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年最具影响力和最有趣的论文之一。那这篇文章的Transformer的庐山真面目到底是这样的呢?
这篇文章为提出许多改进,在完全抛弃了RNN的情况下进行seq2seq建模。接下来一起来详细看看吧。
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,那这篇文章又是如何构建这些的呢?莫急,请继续往下看。
Encoder
The transformer's encoder
编码器生成基于自注意力的表示,其能够从可能无限大的上下文中定位特定信息。值得一提的是,上面的结构文章堆了六个。
每层都有一个多头自注意力层每层都有一个简单的全连接的前馈网络每个子层采用残差连接和层规范化。 所有子层输出相同维度dmodel=512。
Decoder
The transformer's decoder.
解码器能够从编码表示中检索。上面的结构也堆了六个。
每层有两个多头注意机制子层。每层有一个完全连接的前馈网络子层。与编码器类似,每个子层采用残差连接和层规范化。
与encoder不同的是,第一个多头注意子层被设计成防止关注后续位置,因为我们不希望在预测当前位置时查看目标序列的未来。最后来看一看整体架构:
The full model architecture of the transformer.
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嵌入中,以允许它们分别更好地捕获相关信息。看到这里是不是觉得文章灌水其实也不是什么难事了。
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。
Global/Local Attention
Luong等人[4]提出了Global Attention和Local Attention。Global Attention本质上和Bahdanau等人[3]很相似。Global方法顾名思义就是会关注源句子序列的所有词,具体地说,在计算语义向量时,会考虑编码器所有的隐藏状态。而在Local Attention中,计算语义向量时只关注每个目标词的一部分编码器隐藏状态。由于Global方法必须计算源句子序列所有隐藏状态,当句子长度过长会使得计算代价昂贵并使得翻译变得不太实际,比如在翻译段落和文档的时候。
评价指标
在看一些带有attention的paper时,常常会伴随着为了说明自己文章attention是work的实验,但实际上尝试提供严格数学证明的文章极少。
Hu[7]把Attention的评价方式分为两类,Quantitative(定量指标)和Qualitative(定性指标)。定量指标顾名思义就是对attention的贡献就行量化,这一方面一般会结合下游任务,最常见的当属机器翻译,我们都知道机器翻译的最流行评价指标之一是BLEU,我们可以在翻译任务设计attention和不加attention进行对比,对比的指标就是BLEU,设置我们可以设计多种不同的attention进行对比。
定性指标评价是目前应用最广泛的评价技术,因为它简单易行,便于可视化。具体做法一般都是为整个句子构建一个热力图,其热力图强度与每个单词接收到的标准化注意力得分成正比。也就是说,词的贡献越大,颜色越深。其实这在直觉上也是能够接收的,因为往往相关任务的关键词的attention权值肯定要比其它词重要。比如Hu[7]文中的图:
写在后面
本文参考了众多文献,对近些年的自然语言中的注意力机制从起源、变体到评价方面都进行了简要介绍,但是要明白的是,实际上注意力机制在nlp上的研究特别多,为此,我仅仅对18、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》浅读(简介+代码)
更多阅读
看完这个文,你还会高喊快快造出“中国芯”?腾讯给出27亿美元估值,Reddit要成中国公司?四年三次上春晚,大型仿人服务机器人中国造!
举报/反馈

nlp神经网络注意力机制,干货!自然语言处理中的自注意力机制!

原标题:干货!自然语言处理中的自注意力机制!

近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中,之前我对早期注意力机制进行过一些学习总结(可见http://www.cnblogs.com/robert-dlut/p/.html)。随着注意力机制的深入研究,各式各样的attention被研究者们提出。在2017年6月google机器翻译团队在arXiv上放出的《Attention is all you need》论文受到了大家广泛关注,自注意力(self-attention)机制开始成为神经网络attention的研究热点,在各个任务上也取得了不错的效果。本人就这篇论文中的self-attention以及一些相关工作进行了学习总结(其中也参考借鉴了张俊林博士的博客"深度学习中的注意力机制(2017版)"和苏剑林的"《Attention is All You Need》浅读(简介+代码)"),和大家一起分享。

1 背景知识

Attention机制最早是在视觉图像领域提出来的,应该是在九几年思想就提出来了,但是真正火起来应该算是2014年google mind团队的这篇论文《Recurrent Models of Visual Attention》,他们在RNN模型上使用了attention机制来进行图像分类。随后,Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用类似attention的机制在机器翻译任务上将翻译和对齐同时进行,他们的工作算是第一个将attention机制应用到NLP领域中。接着attention机制被广泛应用在基于RNN/CNN等神经网络模型的各种NLP任务中。2017年,google机器翻译团队发表的《Attention is all you need》中大量使用了自注意力(self-attention)机制来学习文本表示。自注意力机制也成为了大家近期的研究热点,并在各种NLP任务上进行探索。下图维attention研究进展的大概趋势。

Attention机制的本质来自于人类视觉注意力机制。人们视觉在感知东西的时候一般不会是一个场景从到头看到尾每次全部都看,而往往是根据需求观察注意特定的一部分。而且当人们发现一个场景经常在某部分出现自己想观察的东西时,人们会进行学习在将来再出现类似场景时把注意力放到该部分上。

下面我先介绍一下在NLP中常用attention的计算方法(里面借鉴了张俊林博士"深度学习中的注意力机制(2017版)"里的一些图)。Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射,如下图。

在计算attention时主要分为三步,第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;然后第二步一般是使用一个softmax函数对这些权重进行归一化;最后将权重和相应的键值value进行加权求和得到最后的attention。目前在NLP研究中,key和value常常都是同一个,即key=value。

2 Attention is all you need[1]

接下来我将介绍《Attention is all you need》这篇论文。这篇论文是google机器翻译团队在2017年6月放在arXiv上,最后发表在2017年nips上,到目前为止google学术显示引用量为119,可见也是受到了大家广泛关注和应用。这篇论文主要亮点在于1)不同于以往主流机器翻译使用基于RNN的seq2seq模型框架,该论文用attention机制代替了RNN搭建了整个模型框架。2)提出了多头注意力(Multi-headed attention)机制方法,在编码器和解码器中大量的使用了多头自注意力机制(Multi-headed self-attention)。3)在WMT2014语料中的英德和英法任务上取得了先进结果,并且训练速度比主流模型更快。

该论文模型的整体结构如下图,还是由编码器和解码器组成,在编码器的一个网络块中,由一个多头attention子层和一个前馈神经网络子层组成,整个编码器栈式搭建了N个块。类似于编码器,只是解码器的一个网络块中多了一个多头attention层。为了更好的优化深度网络,整个网络使用了残差连接和对层进行了规范化(Add&Norm)。

下面我们重点关注一下这篇论文中的attention。在介绍多头attention之前,我们先看一下论文中提到的放缩点积attention(scaled dot-Product attention)。对比我在前面背景知识里提到的attention的一般形式,其实scaled dot-Product attention就是我们常用的使用点积进行相似度计算的attention,只是多除了一个(为K的维度)起到调节作用,使得内积不至于太大。

多头attention(Multi-head attention)结构如下图,Query,Key,Value首先进过一个线性变换,然后输入到放缩点积attention,注意这里要做h次,其实也就是所谓的多头,每一次算一个头。而且每次Q,K,V进行线性变换的参数W是不一样的。然后将h次的放缩点积attention结果进行拼接,再进行一次线性变换得到的值作为多头attention的结果。可以看到,google提出来的多头attention的不同之处在于进行了h次计算而不仅仅算一次,论文中说到这样的好处是可以允许模型在不同的表示子空间里学习到相关的信息,后面还会根据attention可视化来验证。

那么在整个模型中,是如何使用attention的呢?如下图,首先在编码器到解码器的地方使用了多头attention进行连接,K,V,Q分别是编码器的层输出(这里K=V)和解码器中都头attention的输入。其实就和主流的机器翻译模型中的attention一样,利用解码器和编码器attention来进行翻译对齐。然后在编码器和解码器中都使用了多头自注意力self-attention来学习文本的表示。Self-attention即K=V=Q,例如输入一个句子,那么里面的每个词都要和该句子中的所有词进行attention计算。目的是学习句子内部的词依赖关系,捕获句子的内部结构。

对于使用自注意力机制的原因,论文中提到主要从三个方面考虑(每一层的复杂度,是否可以并行,长距离依赖学习),并给出了和RNN,CNN计算复杂度的比较。可以看到,如果输入序列n小于表示维度d的话,每一层的时间复杂度self-attention是比较有优势的。当n比较大时,作者也给出了一种解决方案self-attention(restricted)即每个词不是和所有词计算attention,而是只与限制的r个词去计算attention。在并行方面,多头attention和CNN一样不依赖于前一时刻的计算,可以很好的并行,优于RNN。在长距离依赖上,由于self-attention是每个词和所有词都要计算attention,所以不管他们中间有多长距离,最大的路径长度也都只是1。可以捕获长距离依赖关系。

最后我们看一下实验结果,在WMT2014的英德和英法机器翻译任务上,都取得了先进的结果,且训练速度优于其他模型。

在模型的超参实验中可以看到,多头attention的超参h太小也不好,太大也会下降。整体更大的模型比小模型要好,使用dropout可以帮助过拟合。

作者还将这个模型应用到了句法分析任务上也取得了不错的结果。

最后我们看一下attention可视化的效果(这里不同颜色代表attention不同头的结果,颜色越深attention值越大)。可以看到self-attention在这里可以学习到句子内部长距离依赖"making…….more difficult"这个短语。在两个头和单头的比较中,可以看到单头"its"这个词只能学习到"law"的依赖关系,而两个头"its"不仅学习到了"law"还学习到了"application"依赖关系。多头能够从不同的表示子空间里学习相关信息。

3 Self-attention in NLP3.1 Deep Semantic Role Labeling with Self-Attention[8]

这篇论文来自AAAI2018,厦门大学Tan等人的工作。他们将self-attention应用到了语义角色标注任务(SRL)上,并取得了先进的结果。这篇论文中,作者将SRL作为一个序列标注问题,使用BIO标签进行标注。然后提出使用深度注意力网络(Deep Attentional Neural Network)进行标注,网络结构如下。在每一个网络块中,有一个RNN/CNN/FNN子层和一个self-attention子层组成。最后直接利用softmax当成标签分类进行序列标注。

该模型在CoNLL-2005和CoNll-2012的SRL数据集上都取得了先进结果。我们知道序列标注问题中,标签之间是有依赖关系的,比如标签I,应该是出现在标签B之后,而不应该出现在O之后。目前主流的序列标注模型是BiLSTM-CRF模型,利用CRF进行全局标签优化。在对比实验中,He et al和Zhou and Xu的模型分别使用了CRF和constrained decoding来处理这个问题。可以看到本论文仅使用self-attention,作者认为在模型的顶层的attention层能够学习到标签潜在的依赖信息。

3.2 Simultaneously Self-Attending to All Mentions for Full-Abstract Biological Relation Extraction[7]

这篇论文是Andrew McCallum团队应用self-attention在生物医学关系抽取任务上的一个工作,应该是已经被NAACL2018接收。这篇论文作者提出了一个文档级别的生物关系抽取模型,里面做了不少工作,感兴趣的读者可以更深入阅读原文。我们这里只简单提一下他们self-attention的应用部分。论文模型的整体结构如下图,他们也是使用google提出包含self-attention的transformer来对输入文本进行表示学习,和原始的transformer略有不同在于他们使用了窗口大小为5的CNN代替了原始FNN。

我们关注一下attention这部分的实验结果。他们在生物医学药物致病数据集上(Chemical Disease Relations,CDR)取得了先进结果。去掉self-attention这层以后可以看到结果大幅度下降,而且使用窗口大小为5的CNN比原始的FNN在这个数据集上有更突出的表现。

4 总结

最后进行一下总结,self-attention可以是一般attention的一种特殊情况,在self-attention中,Q=K=V每个序列中的单元和该序列中所有单元进行attention计算。Google提出的多头attention通过计算多次来捕获不同子空间上的相关信息。self-attention的特点在于无视词之间的距离直接计算依赖关系,能够学习一个句子的内部结构,实现也较为简单并行可以并行计算。从一些论文中看到,self-attention可以当成一个层和RNN,CNN,FNN等配合使用,成功应用于其他NLP任务。

除了Google提出的自注意力机制,目前也有不少其他相关工作,感兴趣的读者可以继续阅读。

原文:http://www.cnblogs.com/robert-dlut/p/.html

返回搜狐,查看更多

责任编辑:
nlp神经网络注意力机制,NLP中的Attention注意力机制+Transformer详解  第2张

nlp神经网络注意力机制,注意力机制(Attention Mechanism)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Solo95/article/details/
注意力机制起源于应用于NLP的RNN模型,但也在其他的领域有所应用。对注意力机制的理解也是算法面试经常提及的一道基础面试题,在这篇博文里我们汇总吴恩达深度学习视频序列模型3.7和3.8以及台大李宏毅教授对Attenion Mechanism以及相关参考文献对注意力机制给出详细的介绍的解释。

注意力机制是深度学习中一个非常重要的思想,在NLP领域尤为重要。
为什么要引入Attention Mechanism?
在一个Encoder和Decoder的翻译模型中,翻译一段法语到英文大致是整个序列输进Encoder然后Decoder再输出整个结果。也就是说模型是观测了整个要翻译的序列,然后再按序做的翻译(时间步模型)。
随着输入序列边长,对模型输出结果的Bleu score评估会呈现这样的变化:

绿线代表人类翻译的水平,蓝线代表机器翻译的水平,之间的Gap能衡量模型记忆长序列的能力。
而人工翻译则是看一部分,翻译一部分,再看下一部分,再翻译一部分,如此往复。因为对人来说,要记忆整个序列是非常困难的。
总结下来:
输入序列非常长时,原始的Encoder-Decoder翻译的质量会出现明显下降,因为整个模型要处理的feature过多,并且这些feature不一定对翻译特定的单词有所助益。一说模型难以学到足够合理的向量表示。原始的时间步方式翻译的模型在设计上有缺陷。具体来讲,整个序列无论长短都被Encoder编码到固定长度,这使得Decoder的能力受限。因为翻译前后,源语言和目标语言不一定长度一致。时间步编解码器的结构缺乏有效的理论支撑和经验指导,导致设计困难,模型效果不好。
如同前面讲过的人工翻译是一部分一部分看,一部分一部分翻译一样,注意力机制旨在实现在计算某个时间步的输出时,将注意力集中在一段序列上,段的大小可以由一个窗口来决定,并且为该段序列每一个时间步都赋以权值,以决定它们对最终输出的影响权重。这样使得前面所述问题得到一定程度的解决。
实例说明:

如图所示,在计算Encoder的输出上下文c0c^0c0时,维持窗口大小为4,即一个时间步输出由四个时间步输入决定。
c0=∑i=14α0^ihi c^0=\sum_{i=1}^4\hat{\alpha_0}^ih^i c0=i=1∑4?α0?^?ihi
那么每个时间步的权重α0i\alpha_0^iα0i?如何计算,通过一个match机制来实现,具体而言,可以使用一个小型的网络协同训练来得到一个具体match函数。

图中z是上一个时间步的输出,吴恩达notation里写作ss^{}s
可以使用softmax来实现:

使用softmax是为了窗口内部所有时间步权重相加等于1。
除此之外还有一些其他的实现方式:

余弦相似度小型网络(前述)使用只有一个权重的计算公式,权重可以交由原网络来训练
如上所述,重复以上过程指导所有时间步的输出都计算完成,这样就得到了最终结果的序列。
虽然使用attention机制会明显增加计算量,但是整个模型的输出结果质量得到有效提升。因为与单纯的Encoder-Decoder模型不同。面对大量的features我们只关注窗口内部那部分features,而且窗口内部每一个时间步如何影响最后的序列生成都由权重控制,这使得整个过程更加的科学合理。
虽然我们以NLP为例,但注意力机制在其他领域也有一些应用。
文本翻译(Text Translation)
吴恩达课程为例,Attention机制被应用在翻译一个单词时应该重点关注哪些原词。
语义蕴含(Entailment)
Attention机制被用来关联假设和前提两者中词与词之间的对应关系。
语音识别(Audio Recognition)
Attention机制被用来关联每个输入语音序列的某些部分和相应音素的对应关系。
文本摘要(Text Summary)
Attention机制被用来关联输入文本中的一些重要词汇和生成的摘要里的词汇之间的对应关系。
图像描述(Image Caption)
在计算机视觉领域,Attention机制可以帮助卷积神经网络决定在生成文本描述时应该重点关注图像的哪一部分。

吴恩达深度学习系列-注意力机制
台大李宏毅机器学习课程-Attention-based model
Neural Machine Translation by Jointly Learning to Align and Translate. Dzmitry Bahdanau, Kyunghyun Cho, Yoshua Bengio. 2014.
深度学习中 的 Attention机制
nlp神经网络注意力机制,NLP中的Attention注意力机制+Transformer详解  第3张

nlp神经网络注意力机制,注意力机制(Attention Mechanism)在自然语言处理中的应用

注意力机制(Attention Mechanism)在自然语言处理中的应用
近年来,深度学习的研究越来越深入,在各个领域也都获得了不少突破性的进展。基于注意力(attention)机制的神经网络成为了最近神经网络研究的一个热点,本人最近也学习了一些基于attention机制的神经网络在自然语言处理(NLP)领域的论文,现在来对attention在NLP中的应用进行一个总结,和大家一起分享。
Attention机制最早是在视觉图像领域提出来的,应该是在九几年思想就提出来了,但是真正火起来应该算是google mind团队的这篇论文《Recurrent Models of Visual Attention》[14],他们在RNN模型上使用了attention机制来进行图像分类。随后,Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》 [1]中,使用类似attention的机制在机器翻译任务上将翻译和对齐同时进行,他们的工作算是是第一个提出attention机制应用到NLP领域中。接着类似的基于attention机制的RNN模型扩展开始应用到各种NLP任务中。最近,如何在CNN中使用attention机制也成为了大家的研究热点。下图表示了attention研究进展的大概趋势。
在介绍NLP中的Attention之前,我想大致说一下图像中使用attention的思想。就具代表性的这篇论文《Recurrent Models of Visual Attention》 [14],他们研究的动机其实也是受到人类注意力机制的启发。人们在进行观察图像的时候,其实并不是一次就把整幅图像的每个位置像素都看过,大多是根据需求将注意力集中到图像的特定部分。而且人类会根据之前观察的图像学习到未来要观察图像注意力应该集中的位置。下图是这篇论文的核心模型示意图。
该模型是在传统的RNN上加入了attention机制(即红圈圈出来的部分),通过attention去学习一幅图像要处理的部分,每次当前状态,都会根据前一个状态学习得到的要关注的位置l和当前输入的图像,去处理注意力部分像素,而不是图像的全部像素。这样的好处就是更少的像素需要处理,减少了任务的复杂度。可以看到图像中应用attention和人类的注意力机制是很类似的,接下来我们看看在NLP中使用的attention。
这篇论文算是在NLP中第一个使用attention机制的工作。他们把attention机制用到了神经网络机器翻译(NMT)上,NMT其实就是一个典型的sequence to sequence模型,也就是一个encoder to decoder模型,传统的NMT使用两个RNN,一个RNN对源语言进行编码,将源语言编码到一个固定维度的中间向量,然后在使用一个RNN进行解码翻译到目标语言,传统的模型如下图:
这篇论文提出了基于attention机制的NMT,模型大致如下图:
图中我并没有把解码器中的所有连线画玩,只画了前两个词,后面的词其实都一样。可以看到基于attention的NMT在传统的基础上,它把源语言端的每个词学到的表达(传统的只有最后一个词后学到的表达)和当前要预测翻译的词联系了起来,这样的联系就是通过他们设计的attention进行的,在模型训练好后,根据attention矩阵,我们就可以得到源语言和目标语言的对齐矩阵了。具体论文的attention设计部分如下:
可以看到他们是使用一个感知机公式来将目标语言和源语言的每个词联系了起来,然后通过soft函数将其归一化得到一个概率分布,就是attention矩阵。
从结果来看相比传统的NMT(RNNsearch是attention NMT,RNNenc是传统NMT)效果提升了不少,最大的特点还在于它可以可视化对齐,并且在长句的处理上更有优势。
这篇论文是继上一篇论文后,一篇很具代表性的论文,他们的工作告诉了大家attention在RNN中可以如何进行扩展,这篇论文对后续各种基于attention的模型在NLP应用起到了很大的促进作用。在论文中他们提出了两种attention机制,一种是全局(global)机制,一种是局部(local)机制。
首先我们来看看global机制的attention,其实这和上一篇论文提出的attention的思路是一样的,它都是对源语言对所有词进行处理,不同的是在计算attention矩阵值的时候,他提出了几种简单的扩展版本。

在他们最后的实验中general的计算方法效果是最好的。
我们再来看一下他们提出的local版本。主要思路是为了减少attention计算时的耗费,作者在计算attention时并不是去考虑源语言端的所有词,而是根据一个预测函数,先预测当前解码时要对齐的源语言端的位置Pt,然后通过上下文窗口,仅考虑窗口内的词。
里面给出了两种预测方法,local-m和local-p,再计算最后的attention矩阵时,在原来的基础上去乘了一个pt位置相关的高斯分布。作者的实验结果是局部的比全局的attention效果好。
这篇论文最大的贡献我觉得是首先告诉了我们可以如何扩展attention的计算方式,还有就是局部的attention方法。
随后基于Attention的RNN模型开始在NLP中广泛应用,不仅仅是序列到序列模型,各种分类问题都可以使用这样的模型。那么在深度学习中与RNN同样流行的卷积神经网络CNN是否也可以使用attention机制呢?《ABCNN: Attention-Based Convolutional Neural Network for Modeling Sentence Pairs》 [13]这篇论文就提出了3中在CNN中使用attention的方法,是attention在CNN中较早的探索性工作。
传统的CNN在构建句对模型时如上图,通过每个单通道处理一个句子,然后学习句子表达,最后一起输入到分类器中。这样的模型在输入分类器前句对间是没有相互联系的,作者们就想通过设计attention机制将不同cnn通道的句对联系起来。
第一种方法ABCNN0-1是在卷积前进行attention,通过attention矩阵计算出相应句对的attention feature map,然后连同原来的feature map一起输入到卷积层。具体的计算方法如下。
第二种方法ABCNN-2是在池化时进行attention,通过attention对卷积后的表达重新加权,然后再进行池化,原理如下图。
第三种就是把前两种方法一起用到CNN中,如下图
这篇论文提供了我们在CNN中使用attention的思路。现在也有不少使用基于attention的CNN工作,并取得了不错的效果。
最后进行一下总结。Attention在NLP中其实我觉得可以看成是一种自动加权,它可以把两个你想要联系起来的不同模块,通过加权的形式进行联系。目前主流的计算公式有以下几种:
通过设计一个函数将目标模块mt和源模块ms联系起来,然后通过一个soft函数将其归一化得到概率分布。
目前Attention在NLP中已经有广泛的应用。它有一个很大的优点就是可以可视化attention矩阵来告诉大家神经网络在进行任务时关注了哪些部分。
不过在NLP中的attention机制和人类的attention机制还是有所区别,它基本还是需要计算所有要处理的对象,并额外用一个矩阵去存储其权重,其实增加了开销。而不是像人类一样可以忽略不想关注的部分,只去处理关注的部分。

参考文献
[1] Bahdanau, D., Cho, K. & Bengio, Y. Neural Machine Translation by Jointly Learning to Align and Translate. Iclr 2015 1–15 (2014).
[2] Luong, M. & Manning, C. D. Effective Approaches to Attention-based Neural Machine Translation. 1412–1421 (2015).
[3] Rush, A. M. & Weston, J. A Neural Attention Model for Abstractive Sentence Summarization. EMNLP (2015).
[4] Allamanis, M., Peng, H. & Sutton, C. A Convolutional Attention Network for Extreme Summarization of Source Code. Arxiv (2016).
[5] Hermann, K. M. et al. Teaching Machines to Read and Comprehend. arXiv 1–13 (2015).
[6] Yin, W., Ebert, S. & Schütze, H. Attention-Based Convolutional Neural Network for Machine Comprehension. 7 (2016).
[7] Kadlec, R., Schmid, M., Bajgar, O. & Kleindienst, J. Text Understanding with the Attention Sum Reader Network. arXiv:1603.v1 [cs.CL] (2016).
[8] Dhingra, B., Liu, H., Cohen, W. W. & Salakhutdinov, R. Gated-Attention Readers for Text Comprehension. (2016).
[9] Vinyals, O. et al. Grammar as a Foreign Language. arXiv 1–10 (2015).
[10] Wang, L., Cao, Z., De Melo, G. & Liu, Z. Relation Classification via Multi-Level Attention CNNs. Acl 1298–1307 (2016).
[11] Zhou, P. et al. Attention-Based Bidirectional Long Short-Term Memory Networks for Relation Classification. Proc. 54th Annu. Meet. Assoc. Comput. Linguist. (Volume 2 Short Pap. 207–212 (2016).
[12] Yang, Z. et al. Hierarchical Attention Networks for Document Classification. Naacl (2016).
[13] Yin W, Schütze H, Xiang B, et al. Abcnn: Attention-based convolutional neural network for modeling sentence pairs. arXiv preprint arXiv:1512., 2015.
[14] Mnih V, Heess N, Graves A. Recurrent models of visual attention[C]//Advances in Neural Information Processing Systems. 2014: 2204-2212.
nlp神经网络注意力机制,NLP中的Attention注意力机制+Transformer详解  第4张

nlp神经网络注意力机制,自然语言处理中的自注意力机制(Self-attention Mechanism)

自然语言处理中的自注意力机制(Self-attention Mechanism)
近年来,注意力(Attention)机制被广泛应用到基于深度学习的自然语言处理(NLP)各个任务中,之前我对早期注意力机制进行过一些学习总结(可见http://www.cnblogs.com/robert-dlut/p/.html)。随着注意力机制的深入研究,各式各样的attention被研究者们提出。在2017年6月google机器翻译团队在arXiv上放出的《Attention is all you need》论文受到了大家广泛关注,自注意力(self-attention)机制开始成为神经网络attention的研究热点,在各个任务上也取得了不错的效果。本人就这篇论文中的self-attention以及一些相关工作进行了学习总结(其中也参考借鉴了张俊林博士的博客"深度学习中的注意力机制(2017版)"和苏剑林的"《Attention is All You Need》浅读(简介+代码)"),和大家一起分享。
Attention机制最早是在视觉图像领域提出来的,应该是在九几年思想就提出来了,但是真正火起来应该算是2014年google mind团队的这篇论文《Recurrent Models of Visual Attention》,他们在RNN模型上使用了attention机制来进行图像分类。随后,Bahdanau等人在论文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用类似attention的机制在机器翻译任务上将翻译和对齐同时进行,他们的工作算是第一个将attention机制应用到NLP领域中。接着attention机制被广泛应用在基于RNN/CNN等神经网络模型的各种NLP任务中。2017年,google机器翻译团队发表的《Attention is all you need》中大量使用了自注意力(self-attention)机制来学习文本表示。自注意力机制也成为了大家近期的研究热点,并在各种NLP任务上进行探索。下图为attention研究进展的大概趋势。

Attention机制的本质来自于人类视觉注意力机制。人们视觉在感知东西的时候一般不会是一个场景从到头看到尾每次全部都看,而往往是根据需求观察注意特定的一部分。而且当人们发现一个场景经常在某部分出现自己想观察的东西时,人们会进行学习在将来再出现类似场景时把注意力放到该部分上。
下面我先介绍一下在NLP中常用attention的计算方法(里面借鉴了张俊林博士"深度学习中的注意力机制(2017版)"里的一些图)。Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射,如下图。
在计算attention时主要分为三步,第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;然后第二步一般是使用一个softmax函数对这些权重进行归一化;最后将权重和相应的键值value进行加权求和得到最后的attention。目前在NLP研究中,key和value常常都是同一个,即key=value。
接下来我将介绍《Attention is all you need》这篇论文。这篇论文是google机器翻译团队在2017年6月放在arXiv上,最后发表在2017年nips上,到目前为止google学术显示引用量为119,可见也是受到了大家广泛关注和应用。这篇论文主要亮点在于1)不同于以往主流机器翻译使用基于RNN的seq2seq模型框架,该论文用attention机制代替了RNN搭建了整个模型框架。2)提出了多头注意力(Multi-headed attention)机制方法,在编码器和解码器中大量的使用了多头自注意力机制(Multi-headed self-attention)。3)在WMT2014语料中的英德和英法任务上取得了先进结果,并且训练速度比主流模型更快。
该论文模型的整体结构如下图,还是由编码器和解码器组成,在编码器的一个网络块中,由一个多头attention子层和一个前馈神经网络子层组成,整个编码器栈式搭建了N个块。类似于编码器,只是解码器的一个网络块中多了一个多头attention层。为了更好的优化深度网络,整个网络使用了残差连接和对层进行了规范化(Add&Norm)。
下面我们重点关注一下这篇论文中的attention。在介绍多头attention之前,我们先看一下论文中提到的放缩点积attention(scaled dot-Product attention)。对比我在前面背景知识里提到的attention的一般形式,其实scaled dot-Product attention就是我们常用的使用点积进行相似度计算的attention,只是多除了一个(为K的维度)起到调节作用,使得内积不至于太大。
多头attention(Multi-head attention)结构如下图,Query,Key,Value首先进过一个线性变换,然后输入到放缩点积attention,注意这里要做h次,其实也就是所谓的多头,每一次算一个头。而且每次Q,K,V进行线性变换的参数W是不一样的。然后将h次的放缩点积attention结果进行拼接,再进行一次线性变换得到的值作为多头attention的结果。可以看到,google提出来的多头attention的不同之处在于进行了h次计算而不仅仅算一次,论文中说到这样的好处是可以允许模型在不同的表示子空间里学习到相关的信息,后面还会根据attention可视化来验证。
那么在整个模型中,是如何使用attention的呢?如下图,首先在编码器到解码器的地方使用了多头attention进行连接,K,V,Q分别是编码器的层输出(这里K=V)和解码器中多头attention的输入。其实就和主流的机器翻译模型中的attention一样,利用解码器和编码器attention来进行翻译对齐。然后在编码器和解码器中都使用了多头自注意力self-attention来学习文本的表示。Self-attention即K=V=Q,例如输入一个句子,那么里面的每个词都要和该句子中的所有词进行attention计算。目的是学习句子内部的词依赖关系,捕获句子的内部结构。

对于使用自注意力机制的原因,论文中提到主要从三个方面考虑(每一层的复杂度,是否可以并行,长距离依赖学习),并给出了和RNN,CNN计算复杂度的比较。可以看到,如果输入序列n小于表示维度d的话,每一层的时间复杂度self-attention是比较有优势的。当n比较大时,作者也给出了一种解决方案self-attention(restricted)即每个词不是和所有词计算attention,而是只与限制的r个词去计算attention。在并行方面,多头attention和CNN一样不依赖于前一时刻的计算,可以很好的并行,优于RNN。在长距离依赖上,由于self-attention是每个词和所有词都要计算attention,所以不管他们中间有多长距离,最大的路径长度也都只是1。可以捕获长距离依赖关系。
最后我们看一下实验结果,在WMT2014的英德和英法机器翻译任务上,都取得了先进的结果,且训练速度优于其他模型。
在模型的超参实验中可以看到,多头attention的超参h太小也不好,太大也会下降。整体更大的模型比小模型要好,使用dropout可以帮助过拟合。
作者还将这个模型应用到了句法分析任务上也取得了不错的结果。
最后我们看一下attention可视化的效果(这里不同颜色代表attention不同头的结果,颜色越深attention值越大)。可以看到self-attention在这里可以学习到句子内部长距离依赖"making…….more difficult"这个短语。在两个头和单头的比较中,可以看到单头"its"这个词只能学习到"law"的依赖关系,而两个头"its"不仅学习到了"law"还学习到了"application"依赖关系。多头能够从不同的表示子空间里学习相关信息。
这篇论文来自AAAI2018,厦门大学Tan等人的工作。他们将self-attention应用到了语义角色标注任务(SRL)上,并取得了先进的结果。这篇论文中,作者将SRL作为一个序列标注问题,使用BIO标签进行标注。然后提出使用深度注意力网络(Deep Attentional Neural Network)进行标注,网络结构如下。在每一个网络块中,有一个RNN/CNN/FNN子层和一个self-attention子层组成。最后直接利用softmax当成标签分类进行序列标注。
该模型在CoNLL-2005和CoNll-2012的SRL数据集上都取得了先进结果。我们知道序列标注问题中,标签之间是有依赖关系的,比如标签I,应该是出现在标签B之后,而不应该出现在O之后。目前主流的序列标注模型是BiLSTM-CRF模型,利用CRF进行全局标签优化。在对比实验中,He et al和Zhou and Xu的模型分别使用了CRF和constrained decoding来处理这个问题。可以看到本论文仅使用self-attention,作者认为在模型的顶层的attention层能够学习到标签潜在的依赖信息。
这篇论文是Andrew McCallum团队应用self-attention在生物医学关系抽取任务上的一个工作,应该是已经被NAACL2018接收。这篇论文作者提出了一个文档级别的生物关系抽取模型,里面做了不少工作,感兴趣的读者可以更深入阅读原文。我们这里只简单提一下他们self-attention的应用部分。论文模型的整体结构如下图,他们也是使用google提出包含self-attention的transformer来对输入文本进行表示学习,和原始的transformer略有不同在于他们使用了窗口大小为5的CNN代替了原始FNN。
我们关注一下attention这部分的实验结果。他们在生物医学药物致病数据集上(Chemical Disease Relations,CDR)取得了先进结果。去掉self-attention这层以后可以看到结果大幅度下降,而且使用窗口大小为5的CNN比原始的FNN在这个数据集上有更突出的表现。

最后进行一下总结,self-attention可以是一般attention的一种特殊情况,在self-attention中,Q=K=V每个序列中的单元和该序列中所有单元进行attention计算。Google提出的多头attention通过计算多次来捕获不同子空间上的相关信息。self-attention的特点在于无视词之间的距离直接计算依赖关系,能够学习一个句子的内部结构,实现也较为简单并且可以并行计算。从一些论文中看到,self-attention可以当成一个层和RNN,CNN,FNN等配合使用,成功应用于其他NLP任务。
除了Google提出的自注意力机制,目前也有不少其他相关工作,感兴趣的读者可以继续阅读。
参考文献
[1] Vaswani, Ashish, et al. Attention is all you need. Advances in Neural Information Processing Systems. 2017.
[2] Romain Paulus, Caiming Xiong, and Richard Socher. A deep reinforced model for abstractive summarization. arXiv preprint arXiv:1705., 2017.
[3] 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.
[4] Jianpeng Cheng, Li Dong, and Mirella Lapata. Long short-term memory-networks for machine reading. arXiv preprint arXiv:1601., 2016.
[5] Shen, T.; Zhou, T.; Long, G.; Jiang, J.; Pan, S.; and Zhang, C. Disan: Directional self-attention network for rnn/cnn-free language understanding. arXiv preprint arXiv:1709., 2017.
[6] Im, Jinbae, and Sungzoon Cho. Distance-based Self-Attention Network for Natural Language Inference. arXiv preprint arXiv:1712., 2017.
[7] Verga P, Strubell E, McCallum A. Simultaneously Self-Attending to All Mentions for Full-Abstract Biological Relation Extraction. arXiv preprint arXiv:1802., 2018.
[8] Tan Z, Wang M, Xie J, et al. Deep Semantic Role Labeling with Self-Attention. AAAI 2018.
[9] Shaw, Peter, Jakob Uszkoreit, and Ashish Vaswani. Self-Attention with Relative Position Representations. arXiv preprint arXiv:1803. ,2018.
参考博客
张俊林,深度学习中的注意力机制(2017版),https://blog.csdn.net/malefactor/article/details/
苏剑林,《Attention is All You Need》浅读(简介+代码),https://kexue.fm/archives/4765

您可能感兴趣的文章

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

文件下载

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

上一篇:
下一篇:

评论已关闭!