声明:本文是学习https://lena-voita.github.io/nlp_course/seq2seq_and_attention.html的笔记,小伙伴也可以自行跳转学习原文。
在之前的文章中我们介绍了什么是Seq2Seq,现在我们来介绍一下什么是Attention。
Atteintion
问题
固定的编码器表示问题
固定的源信息表示是不理想的:
(1)对于编码器,压缩句子是困难的。
(2)对于解码器,在不同的步中,不同的信息可能是不同相关性。
在目前我们所看的模型中,编码器将所有的源句子压缩为一个向量。这可能是很困难的----源句子的可以表达的意思是无穷的。当编码器强制的将所有信息都放入到一个向量中,看起来就像忘掉了一些信息。
不仅对于编码器来说将所有的信息放入到一个向量中是困难的,这对于解码器来说也是困难的。解码器只看到了源信息的一个表示。然而在每一步,源句子的不同的部分可能比其他部分更有用。但目前的设置中,解码器只能在相同的固定的表示中抽取相关信息----绝非易事。
High-Level View
Attention在论文 Neural Machine Translation by Jointly Learning to Align and Translate中被提出去解决固定表示问题。
Attention:在不同的步,让模型“注意”不同的输入部分
一个attention机器是神经网络的一部分呢。在解码器的每一步,它决定了源信息哪一部分是更重要的。在这中方式中,编码器不需要将全部的信息压缩到一个向量中----编码器给出所有源token的表示。
在每一步中,注意力机制:
(1)接收attention输入:一个解码器状态ht和所有的编码器状态s1,s2,…,sm
(2)计算attention得分:
对于每一个编码器状态sk,attention计算他针对解码器状态ht的 相关性。一般情况下,他使用一个attention函数,函数接收一个解码器状态一个编码器状态并且返回一个标量值score(ht,sk)。
(3)计算注意力权重:一个概率分布----在attention分数上应用softmax函数
(4)计算attention输出:带权重的编码器状态之和。
一般的计算模式如下图所示:
注意:每一个事情都是不同的----端到端的学习
主要观点是一个神经网络可以学到哪个输入部分更为重要。因为这里的每一个事情都是不同的(注意力函数,softmax,和其他的东西),带有注意力机制的模型可以端到端的进行训练。你不需要特地教模型怎样去挑选想要的词----模型自己就会学习怎样挑选重要信息。
跟着下图复习一下attention机制的作用,并注意权重的变化。
如何计算Attention score?
在上边的流程中,我们还没有明确如何计算attention scores。
你可以使用任何你想要的函数–甚至是比较复杂的一个。但是,通常,你不需要这样做,----这有几个流行的简单的计算方法变体效果很好。
最流行的计算attention score方法:
(1)dot-product 最简单的方法
(2)bilinear function(“Luong attention”)–在论文
Effective Approaches to Attention-based Neural Machine Translation中被使用
(3)multi-layer perceptron (aka “Bahdanau attention”)----在original paper
中被提出
模型变种:Bahdanau and Luong
在讨论早期的attention模型时,你可能也想了解一下这些变体:
Bahdanau attention:来自于论文Neural Machine Translation by Jointly Learning to Align and Translate由Dzmitry Bahdanau, KyungHyun Cho and Yoshua Bengio发布,也是attention第一次出现的论文。
Luong attention --来自论文Effective Approaches to Attention-based Neural Machine Translation 作者是Minh-Thang Luong, Hieu Pham, Christopher D. Manning.
Bahdanau Model
encoder:双向的
为了更好的编码每一个源序列词语,编码器有两个RNN,一个前向的一个后向的,后向的将输入反向读取。对于每一个token,是将两个RNN的状态相连接。
attention score:multi-layer perceptron
为了得到一个attention score,使用multi-layer perceptron 在一个encoder状态和一个decoder状态上。
attention applied: 在解码器每步之间
attention 被用于decoder的每步之间:状态ht-1被用于计算attention。他的输出是ct,之后ct和ht-1都被在时间t传递到解码器
Luong Model
encoder:单向的
attention score: blinear function
attention applied:在解码器RNN产生状态t和做预测之间
attention被用于在RNN编码器t之后产生预测之前。状态ht被用于计算attention他的输出是ct。然后ht与ct结合得到一个更新的表示ht*,ht*用于得到预测。
Attention Learns (Nearly) Alignment
我们引入attention的目的是在每一步中,我们可能需要关注不同的源token,因为这个token在当前步中是更相关的。现在让我们来看一下哪个源单词我们的decoder使用了?
图片来自论文:Neural Machine Translation by Jointly Learning to Align and Translate.
在这个例子中,我们可以看到attention学习的是源和目的词之间的对齐。解码器看的是当前翻译的那个词的源词。
声明:本文是学习https://lena-voita.github.io/nlp_course/seq2seq_and_attention.html的笔记,小伙伴也可以自行跳转学习原文。