Attention原理详解

  • Attention模型
    • 对齐
    • 模型介绍
    • Attention整体流程
      • Step1 计算Encoder的隐藏状态和Decoder的隐藏状态
      • Step2 获取每个编码器隐藏状态对应的分数
      • Step3 通过softmax归一化分数
      • Step4 用每个编码器的隐藏状态乘以其softmax得分
      • Step5 把所有对齐的向量加起来
      • Step6 将上下文向量输入到Decoder中
      • 完整过程
      • Attention到底是怎么工作的?
    • Attention实例
      • 1. Neural Machine Translation by Learning to Jointly Align and Translate
      • 2. Effective Approaches to Attention-based Neural Machine Translation
      • 3. Google的神经机器翻译(GNMT)
    • Score函数
    • Transformer

说到Attention可能大家想到的是最经典的Attention模型,实际上Attention有很多变种,Attention也有很多种计算方法,包括近来大火的self-attention也是Attention的一种。

下面我会由浅到深的介绍各种Attention机制,希望通过这篇博文能够让大家认识一个别样的Attention。

Attention是跟seq2seq模型一起用的,如果大家对seq2seq模型不了解的可以点击此链接了解其中的原理。

Attention模型

注意力机制可以分为两种:

一种叫做全局注意力,就是计算注意力的时候使用Encoder所有的隐藏状态。
还有一种叫局部注意力,使用Encoder一部分隐藏状态(目的是为了减少计算量,通常计算一个固定窗口内的部分)。

首先介绍一下什么是对齐,下面的内容会出现。

对齐

对齐的意思是把原始文本和对应的翻译进行匹配(就是哪个词对应着翻译成哪个词)。如下图所示:

模型介绍

看过上一篇博文的应该知道不加Attention的seq2seq模型是这样的:

Decoder中每一步输入的语义编码c都是相同的,也就意味着句子X中的每个单词对输出Y中的每一个单词的影响都是相同的,但实际上每个输出跟每个输入的关联度并不相同。

这样就会产生两个弊端:

一是语义向量无法完全表示整个序列的信息。
二是先输入的内容携带的信息会被后输入的信息稀释掉,或者说,被覆盖了,输入序列越长,这个现象就越严重。

这就使得在解码的时候一开始就没有获得输入序列足够的信息, 那么解码的准确度自然也就要打折扣。为了解决上面的弊端,就需要用到我们的Attention Model(注意力模型)来解决该问题。在机器翻译的时候,让生成词不是只能关注全局的语义编码向量c,而是增加了一个“注意力范围”。

通过这种方法,模型能够有选择地关注输入序列的有用部分,从而了解它们之间的对齐关系,有助于模型更好地处理输入较长的句子。

模型结构如下:

此模型中语义编码c1、c2、c3各不相同,y1、y2、y3的生成方法为:


比如输入的是英文句子:Tom chase Jerry,生成:“汤姆”,“追逐”,“杰瑞”。

注意力分配概率分布值的通用计算过程为:


当前输出词Yi针对某一个输入词j的注意力权重由当前的隐层Hi,以及输入词j的隐层状态(hj)共同决定;然后再接一个softmax得到0-1的概率值。即通过函数F(hj,Hi)来获得目标单词Yi和每个输入单词对应的对齐可能性。

那么整个翻译过程表示为:


每一个c会自动去选取与当前所要输出的y最合适的上下文信息。

具体来说,我们用 aij 衡量编码中第j阶段的hj和解码时第i阶段的相关性,最终Decoder中第i阶段的输入的上下文信息(语义编码) ci 就来自于所有 hj 对 aij 的加权和。

如下图所示,红色代表输入输出相关性很强,相应的权重会很大,比如“ I ”和“我”的相关性就很大,“China”和“中”、“国”两个输入的相关性很大。


输入的序列是“我爱中国”,因此,Encoder中的h1、h2、h3、h4就可以分别看做是“我”、“爱”、“中”、“国”所代表的信息。

在翻译成英语时,第一个上下文c1应该和“我”这个字最相关,因此对应的 a11就比较大,而相应的 a12 、a13 、 a14 就比较小。c2应该和“爱”最相关,因此对应的 a22 就比较大。最后的c3和h3、h4最相关,因此 a33 、 a34的值就比较大。

具体模型权重 aij 是如何计算出来的呢?

Attention整体流程

下面的内容会详细介绍Attention的整个流程:

通过为每个单词分配一个权重,注意力机制能够保证当前翻译的单词对原文各个单词的关注点不同(就是对照着原文翻译)。由于这个权重可能大于1,为了方便我们使用softmax进行归一化,得到归一化权重,然后计算Encoder隐藏状态和其对应归一化权重的加权和,得上下文向量c(语义编码)。

注意力层的实现可以分为6个步骤。

Step1 计算Encoder的隐藏状态和Decoder的隐藏状态

首先计算第一个解码器隐藏状态(红色)和所有可用的编码器隐藏状态(绿色)。下图中有4个编码器隐藏状态和当前解码器的隐藏状态。要想输出Decoder的第一个隐藏的状态,需要给Decoder一个初始状态和一个输入,例如采用Encoder的最后一个状态作为Decoder的初始状态,输入为0。

Step2 获取每个编码器隐藏状态对应的分数

计算Decoder的第一个隐藏状态和Encoder所有的隐藏状态的相关性,这里采用点积的方式(默认两个向量长度一样)。后面是一个计算示例。

 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

在上面的例子中,对于编码器的隐藏状态[5, 0, 1],我们获得了较高的注意分值60。这意味着下一个要翻译的单词与此编码器的隐藏状态相关性很大。

Step3 通过softmax归一化分数

我们把得到的分数输入到softmax层进行归一化,归一化之后的分数(标量)加起来等于1,归一化后的分数代表注意力分配的权重 。

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

注意,经过softmax之后的分数score^,注意力的分配仅按预期放在了[5, 0, 1]上。实际上,这些数字不是二进制的,而是0到1之间的一个浮点数。

Step4 用每个编码器的隐藏状态乘以其softmax得分

通过将每个编码器的隐藏状态与其softmax之后的分数(标量)相乘,我们得到对齐向量 或标注向量。这正是对齐产生的机制。

 encoder_hidden   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]

在这里,我们看到除了[5, 0, 1]外,所有编码器隐藏状态的对齐都被降低到0,这是因为注意力得分较低。这意味着我们可以期望第一个被翻译的单词应该与输入单词中使用[5, 0, 1]嵌入所表示的单词匹配。

Step5 把所有对齐的向量加起来

对齐向量进行求和,生成上下文向量(语义编码)。上下文向量是前一步对齐向量的聚合信息。

 encoder_hidden   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中

输入的方式和模型有关。我们会在后面的例子中看到不同的模型是如何利用Encoder的上下文向量的。

完整过程

Attention到底是怎么工作的?

反向传播,意不意外?

反向传播将尽一切努力确保输出接近基本事实。这是通过改变RNNs和score函数(如果有的话)中的权重来实现的。这些权重将影响编码器的隐藏状态和解码器的隐藏状态,从而影响注意力得分。

Attention实例

通过上面的内容我们已经了解了seq2seq和seq2seq +注意模型,接下来会介绍3个基于seq2seq的NMT架构,来看一下具体是怎么用的。为了比较效果,文章给出了每个模型的双语评估研究(BLEU)分数 --用于评估生成的句子到参考句子的标准度量。

1. Neural Machine Translation by Learning to Jointly Align and Translate

这是注意力机制用于机器翻译的开篇之作。作者在《Neural Machine Translation by Jointly Learning to Align and Translate》的标题中使用了align这个词,意思是在训练模型的同时直接调整负责得分的权重。以下是关于这个架构需要注意的几点:

  1. 编码器是一个双向(正向+反向)门控循环单元(BiGRU)。解码器是一个GRU,其初始隐藏状态是从反向编码器GRU的最后隐藏状态修改而来的向量(未在下图中示出)。
  2. 注意层中的score函数是additive/concat。
  3. 下一个解码器时间步的输入是前一个解码器时间步(粉红色)的输出与当前时间步(深绿色)的上下文向量之间的拼接。

    作者在WMT’14英语 - 法语数据集上获得了26.75的BLEU分数。

2. Effective Approaches to Attention-based Neural Machine Translation

论文链接:

Effective Approaches to Attention-based Neural Machine Translation

这篇论文的关键点如下:

  1. Encoder是两层的LSTM网络。 Decoder也一样,其初始隐藏状态是最后一个编码器的隐藏状态。
  2. 他们实验的score函数是(i) additive/concat, (ii) 点积,(iii) location-based,和(iv) “general”。
  3. 来自当前解码器时间步长的输出与来自当前时间步长的上下文向量之间的串联被输入到前馈神经网络,以给出当前解码器时间步长的最终输出(粉红色)。

    在WMT’15英德测试中,该模型的BLEU得分为25.9。

3. Google的神经机器翻译(GNMT)

论文链接:

Google’s Neural Machine Translation System: Bridging the Gap between Human and Machine Translation

GNMT是前面两个例子的组合(深受第一个例子的启发)。

这篇论文的关键点如下:

  1. 编码器由8个LSTM组成,其中第一个LSTM是双向的(其输出是拼接起来的),来自连续层的输出之间存在残差连接(从第3层开始)。解码器是8个单向LSTM的独立堆叠。
  2. 使用的score函数是additive/concat,类似于第一个例子。
  3. 同样,就像第一个例子中一样,下一个解码器时间步的输入是前一个解码器时间步(粉红色)的输出和当前时间步(深绿色)的上下文向量之间的连接。


残差连接用曲线箭头表示。注意,LSTM单元格只显示隐藏状态和输入,它不显示单元格状态输入。

该模型在WMT’14英法测试上达到38.95 BLEU,在WMT’14英德测试上达到24.17 BLEU。

Score函数

下面是一些由Lilian Weng编辑的评分函数。

在这篇文章中提到了Additive/concat和点积。

score函数涉及点积运算(点积、余弦相似度等),其思想是度量两个向量之间的相似度。对于前馈神经网络评分函数,其思想是让模型在变换的同时学习对齐权值。


h代表encoder的隐藏状态,s代表decoder的隐藏状态。

Transformer

transformer源于论文《Attention Is All You Need》

它是seq2seq模型,但全程没有用到rnn或者cnn,它的Encoder部分和Decoder部分都使用了self-attention,self-attention可以说是Attention模型中的一大进步,为NLP工作者带来了极大的方便。

有关transformer的介绍在我的另一篇博客里,感兴趣的可以点此链接阅读。

Attention原理详解相关推荐

  1. Transformer 初识:模型结构+attention原理详解

    Transformer 初识:模型结构+原理详解 参考资源 前言 1.整体结构 1.1 输入: 1.2 Encoder 和 Decoder的结构 1.3 Layer normalization Bat ...

  2. 注意力机制(Attention)原理详解

    文章结构 1. 为什么需要Attention 2. Attention的基本原理 3.自注意力机制(Self-Attention) 4.总结 1. 为什么需要Attention 在了解Attentio ...

  3. Transformer原理详解

    Transformer原理详解 一.前言 在学习Transformer之前,需要掌握Attention机制.Encoder-Decoder.Self-Attention机制的基础知识,可以参考本人的博 ...

  4. CRF(条件随机场)与Viterbi(维特比)算法原理详解

    摘自:https://mp.weixin.qq.com/s/GXbFxlExDtjtQe-OPwfokA https://www.cnblogs.com/zhibei/p/9391014.html C ...

  5. LVS原理详解(3种工作方式8种调度算法)--老男孩

    一.LVS原理详解(4种工作方式8种调度算法) 集群简介 集群就是一组独立的计算机,协同工作,对外提供服务.对客户端来说像是一台服务器提供服务. LVS在企业架构中的位置: 以上的架构只是众多企业里面 ...

  6. jQuery中getJSON跨域原理详解

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp28 jQuery中getJSON跨域原理详解 前几天我再开发一个叫 河蟹工 ...

  7. nginx配置文件及工作原理详解

    nginx配置文件及工作原理详解 1 nginx配置文件的结构 2 nginx工作原理 1 nginx配置文件的结构 1)以下是nginx配置文件默认的主要内容: #user nobody; #配置用 ...

  8. EMD算法之Hilbert-Huang Transform原理详解和案例分析

    目录 Hilbert-Huang Transform 希尔伯特-黄变换 Section I 人物简介 Section II Hilbert-Huang的应用领域 Section III Hilbert ...

  9. 图像质量损失函数SSIM Loss的原理详解和代码具体实现

    本文转自微信公众号SIGAI 文章PDF见: http://www.tensorinfinity.com/paper_164.html http://www.360doc.com/content/19 ...

最新文章

  1. MOS2010开发基础和集几种开发模型
  2. 展望下一代语言:Fortress, Chapel or X10(转)
  3. cnblog写博客还不错嘛
  4. 华为鸿蒙系统源码_鸿蒙系统 IO 栈分析 | 解读鸿蒙源码
  5. threshold函数
  6. boost::parallel::distributed_property_map用法的测试程序
  7. C语言求最大公约数3种方法
  8. Python之简单验证码实现
  9. 动态规划系列-连续的子数组和(leetcode523)
  10. 计算机网络基本知识汇总
  11. FreeCAD源码分析: PartDesign模块
  12. HDP直播个性化设置教程,简单几步提升电视盒子/投影仪观影体验
  13. 安卓变苹果12系统永久,安卓系统变苹果系统2020
  14. linux系统开机自动锁定键盘,设置linux开机启动小键盘的详细教程设置linux开机启动小键盘的图文教程...
  15. LeCo-33.搜索旋转数组
  16. C# 学习笔记04-15
  17. 在获取ADID时遇到疑似库版本不匹配的问题
  18. iVMS-4200 Vs区别_理科与工科有什么区别?如何判断自己适合学那个?
  19. 关于PC端浏览器打印
  20. 阿里云短视频SDK for iOS —— (二)静态与动态贴纸拍摄

热门文章

  1. 数据结构 - 队列 环形队列(循环队列)
  2. usb设备检测linux,Linux下USB设备检测全教程(转)
  3. QT中引用动态库(.so) 和 静态库 (.a)
  4. vue双向绑定原理及实现
  5. SSL单向、双向认证
  6. solidity基础学习
  7. IDEA中如何打包为jar包
  8. 【Yolo】Jetson Orin Nano下部署 YoloV5
  9. BP神经网络隐层节点的个数设置方法
  10. 区块链溯源系统开发:为何百度、阿里纷纷押注区块链溯源