图解Attention机制

图解Attention机制

原文来自Raimi Karim,地址:https://towardsdatascience.com/attn-illustrated-attention-5ec4ad276ee3
文章以一种GIF图解的方式,生动的解释了Attention机制。

目录

    • 1.Attention概览
    • 2.Attention应用示例
    • 3.总结
    • 附录:一些常见的评分函数

1.Attention概览

在介绍如何使用attention之前,先分享一个在翻译任务中seq2seq模型的应用例子。

seq2seq:
一个翻译人员面对一段德语文本,从头到尾阅读了一遍。然后他开始逐字逐句地将其翻译成英文。
很显然,当句子很长的时候,他可能早已忘记了之前阅读的德语文本。

这是一个简单的seq2seq模型,下面将attention机制应用到seq2seq中。

seq2seq+attention:
同样是一个翻译人员,他一边阅读德语文本一边写下德语中的关键词,从头到尾。
然后开始翻译成英文。当然在他翻译的过程,每次他都会参考之前写下的德语的关键词。

attention机制为每个单词分配一个权重分数,能够保证当前的翻译单词是对原文每个单词的关注点不同。这里一般使用softmax函数来计算权重分数,然后对encoder层的隐藏状态进行加权求和得到上下文向量。attention机制的实现可以分为4个步骤。

Step1:准备隐藏层

首先准备Encoder所有的隐藏状态(绿色)和Decoder第一个隐藏状态(红色)。在下图示例中,我们有4个encoder隐藏状态和当前decoder隐藏状态。
图解Attention机制_第1张图片
Step2:计算每个encoder的得分

通过函数(alignment score function或alignment model)计算Decoder第一个隐藏状态和Encoder所有的隐藏状态的分数。这里的示例采用的是点积的方式。
图解Attention机制_第2张图片

decoder_hidden = [10, 5, 10]

encoder_hidden  score
---------------------
     [0, 1, 1]     15 (= 10×0 + 5×1 + 10×1, the dot product)
     [5, 0, 1]     60
     [1, 1, 0]     15
     [0, 5, 1]     35

在上面的示例中,Encoder隐藏状态向量[5, 0, 1]获得了60分最高分,也就是说下一个词(decoder的输出)将会很大程度上受到该层encoder隐藏状态的影响。

Step3:使用softmax归一化得分

我们把上一步中计算得到的分数输入到softmax函数中,进行归一化,归一化的分数代表着attention的分配权重。
图解Attention机制_第3张图片

encoder_hidden  score  score^
-----------------------------
     [0, 1, 1]     15       0
     [5, 0, 1]     60       1
     [1, 1, 0]     15       0
     [0, 5, 1]     35       0

Tips:这里原文中将得分通过softmax函数后得到浮点数的概率值直接归一化为0 1形式,
其实就是将得分最高的Encoder的隐藏状态[5, 0, 1]与第一个隐藏状态进行匹配,下面的步骤将会看到如何使用的。

Step4:将每个Encoder隐藏状态和softmax得分相乘

这里将每个Encoder隐藏状态和其对应的softmax得分相乘,获得对其向量。
图解Attention机制_第4张图片

encoder  score  score^  alignment
---------------------------------
[0, 1, 1]   15      0   [0, 0, 0]
[5, 0, 1]   60      1   [5, 0, 1]
[1, 1, 0]   15      0   [0, 0, 0]
[0, 5, 1]   35      0   [0, 0, 0]

Tips:这一个过程稍微有点啰嗦,其实完全可以和上一步的过程进行合并

Step5:求和对其向量

将所有Encoder隐藏状态对其向量求和,得到上下文向量。
图解Attention机制_第5张图片

encoder  score  score^  alignment
---------------------------------
[0, 1, 1]   15     0  [0, 0, 0]
[5, 0, 1]   60     1  [5, 0, 1]
[1, 1, 0]   15     0  [0, 0, 0]
[0, 5, 1]   35     0  [0, 0, 0]
context = [0+5+0+0, 0+0+0+0, 0+1+0+0] = [5, 0, 1]

Step6:将上下文向量输入decoder

输入的方式和模型有关,下面的例子将会看到不同的模型是如何在Decoder中利用上下文向量的。
图解Attention机制_第6张图片
上述就是整个attention机制运行的过程,下面是完整的动态图过程。
图解Attention机制_第7张图片

训练和推理:
在训练阶段,每一个时间步t的decoder输入是上一个时间步t-1的真实输出
在推理阶段,每一个时间步t的decoder输入时上一个时间步t-1的预测输出

attention实际上如何运作?
反向传播,惊喜!反向传播会确保Decoder的输出和实际情况的误差逐渐变小。
这实际上式通过改变RNNs中的权重和得分函数来完成的。改变权重会影响Encoder隐藏状态和Decoder隐藏状态,进而影响attention得分。

2.Attention应用示例

上一节中我们了解了seq2seq和seq2seq+attention模型。接下来,会介绍3个应用于机器翻译领域中的seq2seq的attention模型。

示例1:Neural Machine Translation by Jointly Learning to Align and Translate

attention机制应用的开山鼻祖。作者使用Align一词来表示在训练模型时得到的attention权重。下面是该篇文章模型结构的一些关键点:

  • Encoder采用的是双向GRU(BiGRU)
  • Attention中的评分函数采用的是求和或者是拼接(additive、concat)
  • Decoder采用的是GRU
  • 下一个时间步的Decoder输入时来自前一个时间步的输入和当前时间步的上下文向量拼接而成
    图解Attention机制_第8张图片

示例2:Effective Approaches to Attention-based Neural Machine Translation

本篇文章在上一篇文章模型结构的基础上进行了一定的修改,其关键的点如下:

  • Encoder采用的是两层LSTM,Decoder也是采用的两层LSTM
  • 评分函数使用的是求和和拼接(additive、concat)、点积(dot)、location和general(这两点不知作何翻译,有兴趣的可以翻一下论文)
  • 将当前步的Decoder输出和当前步的上下文向量拼接输入一个前馈网络,前馈网络的输出当作当前Decoder的最终输出
    图解Attention机制_第9张图片

示例3:Google’s Neural Machine Translation (GNMT)

这篇文章没什么特别的贡献,主要的关键点如下:

  • Encoder使用的是8层LSTM,第一层是双向的,另外从第三层开始还添加了残差网络
  • 评分函数主要是求和和拼接(additive、concat)
  • Decoder采用的也是8层LSTM
  • Decoder的输入和第一篇文章一样,下一个时间步的Decoder输入时来自前一个时间步的输入和当前时间步的上下文向量拼接而成
    图解Attention机制_第10张图片

3.总结

本文内容回顾:

1.介绍了seq2seq
2.介绍了seq2seq+attention
3.介绍attention的机制
4.介绍了seq2seq + 双向encoder + attention
5.介绍了seq2seq + 2层encoder + attention
6.介绍了seq2seq + 8层encoder(双向+残差) + attention

附录:一些常见的评分函数

图解Attention机制_第11张图片


图解Attention机制_第12张图片

你可能感兴趣的:(NLP,nlp)