从seq2seq到谷歌BERT,浅谈对Attention Mechanism的理解

将深度学习应用到NLP时,许多任务被转换为一个Sequence to Sequence的模型来解决,例如对话系统,机器翻译,文本自动摘要等。在seq2seq中,流行过基于RNN、LSTM及Transformer等的模型,而本文主要介绍Attention Mechanism(注意力机制)在一些模型中所起的作用。

一、RNN Encoder-Decoder

RNN Encoder-Decoder模型中,Encoder将变长源序列映射为定长语义向量,Decoder将该向量映射回变长目标序列。例如在翻译任务中,编码器把要翻译的中文编码为一个向量表示,再用解码器将向量解码成其他语言的对应内容,完成翻译过程。

先观察一个不含注意力机制的RNN编码解码器框架是如何工作的。

首先给定输入x =(x1,x2,...,xTx1,x2,...,xT),编码器会利用RNN将其转换成一个向量 c: 

其中,ht 是t时刻的隐层状态,c 是由整个序列的隐层向量得到的向量表示,由最后一个编码器输出,是解码器从编码器接收的唯一信息。

接下来,解码器通过语言模型,最大化输出序列的似然函数 p(y),得到一个新的序列:

其中,yt 表示第t时刻预测的结果。

在一个简单而不含注意力机制的seq2seq模型中,有三个问题存在:1、语义向量c作为编码器与解码器间的唯一信息,被“寄予厚望”,在序列递归编码过程中被加入整个序列的结构信息,但序列中较早被编码的输入在传播中信息损失严重,语义向量包含的信息可能在解码时不足以还原源序列的信息;2、解码过程中只是无差别地使用语义向量,源序列与目标序列的依赖关系难以建模;3、RNN本身递归的方式决定了无法并行,速度较慢。

加入注意力机制改进RNN Encoder-Decoder:

为了帮助解决第1和第2两个问题,希望在解码每个输出时用到的信息是跟当前输出有关系的源序列部分,而不是其他无关的部分,例如将序列"machine learning"翻译为"机器学习","机"与"器"都应该更关注"machine"一词而不是"learning",那么在解码时,应当让c提示当前输出该对应的源序列隐层状态是哪个,那么不应在每步解码中都用同一个语义向量c,于是用 Ct 表示每步使用的语义向量后如下:

其中,St 为某一步解码时的隐层状态,引入了相应Ct 的信息,f为激活函数。

Ct代表对源序列信息的注意力,自然对不同输入的隐层状态分配不同的权重 αij,而由于输入输出序列往往长度不相同,此步还起到了对齐作用,整个构成了一个alignment model,定义Ci (Ct)

其中i为解码阶段的第i步,j为源序列的第j个输入。

记得改进前RNN模型的第1个问题吗? 引入注意力机制后,输入的隐层状态不再经过整个源序列编码过程的传递,而直接作用于语义向量 c,减少了信息损失。这是作用1。

然后是 αij 的定义:

这里一个softmax层将 eij 进行归一化为 αij,真正重要的是 eij,这是一个注意力得分,也就是量化输入j的隐层状态应该被第i个输出分配多少注意力,eij 定义为图中(1)式:

其中,tanh为激活函数,这是一种将输入输出隐层状态进行线性组合的注意力得分计算方式,另外还有dot product等不同的设计,但最终都为了让相关输入的隐层状态h与当前输出的隐层状态s有更高的得分。

记得改进前RNN模型的第2个问题吗? 拥有更高注意力得分的输入,在语义向量c的计算中有更高权重,从而为当前输出的s引入了主要的信息,解码过程的语义向量不再是无差别,而是基于源序列与目标序列的依赖关系建模得到。

模型训练时,通过反向传播让输出更接近结果,更新隐层状态与注意力函数的参数。

总结下来,通过训练,注意力机制可以对关系较大的输入输出的赋以较大权重(两者在转换中对齐的概率更大),对位置信息进行了建模,而因此减少了信息损失,能专注于更重要的信息进行序列预测。

这是Attention Mechanism第一次找到很合适的用武之地。

二、BERT

在解决不等长序列的seq2seq任务中,Attention Mechanism展示了对于序列长距离对应关系的捕获能力,而在其他任务中又可以起什么作用呢?

让计算机处理自然语言时,一个重要任务是如何有效地将语言转换为数学表示,从而让机器学习算法能用于语言数据。word2vec等模型通过做LM(language model)任务,把语言中的词语投影到了一个向量空间中,获得每个词对应的Word Embedding。但是词语具有多义性,将词嵌入到一个固定向量空间并不能完整描述词的意义和用法。要更准确地理解一个词,需要结合词所在的context,也就是词的语言表征需要能根据上下文变化。

ELMO模型较早在这方便取得成果,没引入Attention Mechanism,也有不错的效果。而在论文《Attention is All You Need》出现后,Attention + RNN的组合(本文的第一部分RNN Encoder-Decoder)被抛弃,Transformer被OpenAI实验室的GPT1.0模型首次证明作为特征抽取器比RNN效果更好。接着到最近大热的谷歌BERT模型,也使用了基于self-Attention的Transformer,刷爆了各项NLP任务,也刷爆了AI新闻。虽然微软和GPT2.0模型很快又再刷新了NLP任务的成绩,但在使用Transformer作为特征抽取器这点上没有改变,只是工程技术上的改进,Attention Mechanism受到广泛肯定。

需要注意的是,在预训练模型中使用的注意力,与第一部分提到的注意力不一样。在第一部分中,注意力匹配两个不等长序列的对应部分,对于单个序列来说(源序列或者目标序列),这属于与另一个与自身不同的序列做匹配,可以称之为“外部注意力”(inter-attention)。而在文本表征的预训练模型中,通常使用的是“内部注意力”,也就是说序列会与自身匹配,找到序列内部具有较强相互关系的位置,如图所示:

图中句子就是一个序列,红色为当前位置,蓝色为具有较强相关性的位置,也就是说蓝色的位置可作为当前位置的表征的参考。我们可以先看一个实际应用的模型,再回头讨论注意力机制学习到了什么规律。

因为谷歌的BERT模型比较有代表性且开源后在业界大量使用,所以就以BERT模型为例继续介绍注意力机制的作用。

就注意力机制来说,Transform是相关的结构,同时对BERT模型也是最重要的部分,这里重点说Transformer。

Transformer (以BERT中结构为例)

首先看编码器、解码器的结构,BERT使用6层编码器解码器,但不一定要6层也可以是其他层数,这并非注意力机制的关键所在。

接下来,是单个编码器和解码器的结构。

训练语料库中,句子转化为了张量,重点关注数据张量的处理过程:

1、首先将每个输入单词通过词嵌入算法转换为词向量,每个单词都被嵌入为512维的向量,然后每个词的词向量组成向量列表,列表长度等于训练集中最长句子长度。

输入形式:[ V1,V2,V3,...,Vt ]

2、为每个输入的词嵌入添加了一个位置编码向量,这是因为transformer捕获关系时本身只关注序列中的对象本身而不关注位置,交换序列的顺序也不影响结果,而语言中的语法句法都与位置有关,所以位置的信息也是需要引入,这样有助于确定每个词的位置,或序列中不同词之间的距离,为模型捕捉词之间的相对位置关系提供便利,而相对位置关系很可能就是句法结构。

位置编码向量的每个值都介于1和-1之间,左半部分的值由一个正弦函数生成,而右半部分由另一个余弦函数生成。然后将它们拼在一起而得到每一个位置编码向量,这样可扩展至未知序列的长度。

3、向量列表输入到第一个编码层后,会先经过自注意力层,列表中的每个词向量(即句子不同位置)在这一层会有不同的流入路径,路径的执行需要串行(按照词序),而路径间存在依赖关系。

4、词向量分别与三个权重矩阵相乘,得到三个新的向量,分别为查询向量Q、键向量K,和值向量V(维度为64)。

VBcD02jFhgk3urAHpLP3ibjyjzhmDC9br9ianqLd3go5Dm7cbk2VlCMROMnpFuKbKdoGIR8P2w6aF4SEhn1BMiczg

5、为所有单词计算两两之间的自注意力得分

然后通过softmax层,归一化得分,得分决定该词对需要编码的词的贡献程度。

6、根据自注意力得分对所有词的值向量V进行加权求和,得到的向量即为单个词在第一层编码器的的第一步编码。

整个计算过程如下

自注意力的矩阵运算形式

其中,除以根号n是防止点积过大,n在这里为64,经softmax层归一化后加权求和。在这一步里QK两个矩阵的点乘计算出了序列中所有位置的相互关系,自注意力得分高的相互关系会在表征时有更大影响。

7、传递至前馈层,该层没有依赖关系,可并行执行路径。

 

“多头”注意力机制(“multi-headed” attention)

Transformer有8个“注意力头”(一个头即为Q、K、V三个权值矩阵)做处理,每一个注意力头都处理句子所有词,为每一个词产生一组QKV向量。

作用:

1、扩展模型专注于不同位置的能力,模型有8个“注意力头”,只看某组注意力头,随机初始化可以让计算出的QKV矩阵在不同位置获得不同的初始权重,可以随机弱化某些词的影响,专注于剩余词间的是否有某种模式,这样对比单个注意力头可能会发现更多基于不同相对位置关系的表征,也就是“表征子空间”。

结构:

至此得到8个注意力头,然后先拼接起来,每一个词的向量表示都由8个不同的注意力头的向量表示拼接,然后与训练过参数的权重矩阵WO相乘,保留与原来单个注意力头维度相等的但包含所有注意力信息的句子表示矩阵Z。

在表示矩阵中,就包含了上文那幅图的词语关系:

结合Transformer抽取特征的过程,回到刚才的问题:在解决不等长序列的seq2seq任务中,Attention Mechanism展示了对于序列长距离对应关系的捕获能力,而在其他任务中又可以起什么作用呢?

很明显,在把Attention换成Self Attention模式后,原来Attention捕获不同序列相互关系的能力,被用到了在大量语料数据中捕获单个句子中词间的相互依赖上,这有助于发现句法结构及语义信息,同时对于单个词的表征,能更基于句子结构去利用邻近的词,做到依赖context得到合理的数学表示。

正如在图中,可见红色的"criminal",为了了解"criminal"是上下文语境下的,利用前三个相对位置的"is chasing a"会有着较有效的提示作用,这是transformer中训练出的QKV各自的参数矩阵W产生的作用。

同时,因为Self Attention在计算过程中会直接将句子中任意两个单词的联系通过一个计算步骤直接联系起来,所以远距离依赖特征之间的距离被极大缩短,有利于有效地利用这些特征。如果是RNN或者LSTM,需要依次序序列计算,对于远距离的相互依赖的特征,要经过若干时间步步骤的信息累积才能将两者联系起来,而距离越远,有效捕获的可能性越小,并且结果实际上无后效,具有马尔科夫性,未必能有效保留重要信息。另外,Transformer由于可并行,速度也比RNN更快。

最后总结,注意力机制就是能在编码任务中有选择地注意序列某些特定位置的机制,这对于发现自然语言中的句法结构,语义都有帮助,对自然语言的表征效果达到了新的高度,还可应用于CV领域。个人体会认为值得思考的地方有两个:

1、Attention Mechanism目前基于大规模数据集来进行学习,数据集越大,越可以合理地选择注意的位置,这种方式的上限可以到哪里?

2、基于QKV矩阵的查询方式,是否可加入知识图谱,让“合理地选择注意位置”这件事变得有理有据,同时变得更可解释?

这都值得探索,而当前,Attention is all you need.

 

 

去年,谷歌发布了 Google Neural Machine Translation (GNMT),即谷歌神经机器翻译,一个 sequence-to-sequence (“seq2seq”) 的模型。现在,它已经用于谷歌翻译的产品系统。   虽然消费者感受到的提升并不十分明显,谷歌宣称,GNMT 对翻译质量带来了巨大飞跃。   但谷歌想做的显然不止于此。其在官方博客表示:“由于外部研究人员无法获取训练这些模型的框架,GNMT 的影响力受到了束缚。”   如何把该技术的影响力最大化?答案只有一个——开源。   因而,谷歌于昨晚发布了 tf-seq2seq —— 基于 TensorFlow 的 seq2seq 框架。谷歌表示,它使开发者试验 seq2seq 模型变得更方便,更容易达到一流的效果。另外,tf-seq2seq 的代码库很干净并且模块化,保留了全部的测试覆盖,并把所有功能写入文件。   该框架支持标准 seq2seq 模型的多种配置,比如编码器/解码器的深度、注意力机制attention mechanism)、RNN 单元类型以及 beam size。这样的多功能性,能帮助研究人员找到最优的超参数,也使它超过了其他框架。详情请参考谷歌论文《Massive Exploration of Neural Machine Translation Architectures》。   上图所示,是一个从中文到英文的 seq2seq 翻译模型。每一个时间步骤,编码器接收一个汉字以及它的上一个状态(黑色箭头),然后生成输出矢量(蓝色箭头)。下一步,解码器一个词一个词地生成英语翻译。在每一个时间步骤,解码器接收上一个字词、上一个状态、所有编码器的加权输出和,以生成下一个英语词汇。雷锋网(公众号:雷锋网)提醒,在谷歌的执行中,他们使用 wordpieces 来处理生僻字词。   据雷锋网了解,除了机器翻译,tf-seq2seq 还能被应用到其他 sequence-to-sequence 任务上;即任何给定输入顺序、需要学习输出顺序的任务。这包括 machine summarization、图像抓取、语音识别、对话建模。谷歌自承,在设计该框架时可以说是十分地仔细,才能维持这个层次的广适性,并提供人性化的教程、预处理数据以及其他的机器翻译功能。   谷歌在博客表示: “我们希望,你会用 tf-seq2seq 来加速(或起步)你的深度学习研究。我们欢迎你对 GitHub 资源库的贡献。有一系列公开的问题需要你的帮助!”   GitHub 地址:https://github.com/google/seq2seq   GitHub 资源库:https://google.github.io/seq2seq/nmt/ 标签:tensorflow  seq2seq  谷歌  机器学习
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值