Attention原理详解


说到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函数涉及点积运算(点积、余弦相似度等),其思想是度量两个向量之间的相似度。对于前馈神经网络评分函数,其思想是让模型在变换的同时学习对齐权值。
Summary of score functions
在这里插入图片描述
h代表encoder的隐藏状态,s代表decoder的隐藏状态。

Transformer

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

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

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

  • 42
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Transformer 模型是一种基于注意力机制(Attention Mechanism)的深度神经网络模型,主要用于自然语言处理任务,如语言建模、机器翻译、文本生成等。相较于传统的循环神经网络(RNN)和卷积神经网络(CNN),Transformer 模型能够更好地处理长序列数据,并且并行化计算效率更高。下面详细介绍 Transformer 模型的原理。 Transformer 模型主要由编码器(Encoder)和解码器(Decoder)两部分组成,其中编码器和解码器都是由多层的自注意力机制(Self-Attention)和前馈神经网络(Feed-Forward Neural Network)组成。 编码器的输入是一段文本序列,经过多层的自注意力机制和前馈神经网络,在每一层中都会生成一个新的表示向量。自注意力机制主要是通过计算文本序列中每个词与其他词之间的注意力得分,来确定每个词在当前上下文中的重要程度,进而计算加权和作为新的表示向量。这样的处理方式能够有效地捕捉序列中每个词的语义信息,并且能够处理长序列数据。 解码器的输入是目标语言的词汇序列,解码器的每一步都会生成一个新的词汇,并且在生成每个词汇时都会考虑前面已经生成的词汇。因此,解码器在每一步中都会通过注意力机制来计算上下文向量,将其与当前输入进行融合,从而生成新的输出词汇。解码器的最终输出是一个完整的目标语言句子。 在 Transformer 模型中,自注意力机制和注意力机制的计算都是通过“多头注意力(Multi-Head Attention)”实现的。多头注意力机制能够同时计算多个不同的注意力,从而更好地捕捉序列中的上下文信息。同时,前馈神经网络也是多层的,并且每一层都会使用残差连接(Residual Connection)和层归一化(Layer Normalization)技术,从而避免梯度消失和梯度爆炸问题。 总之,Transformer 模型通过自注意力机制和前馈神经网络实现了序列到序列的建模,能够有效地处理长序列数据,是目前自然语言处理领域的主流模型之一。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值