注意力Attention之学习总结

1. Attention 介绍

目前绝大多数文献中出现的attention模型是附着在Encoder-Decoder框架下的,当然,其实attention模型可以看作一种通用的思想,本身并不依赖于Encoder-Decoder模型。

本文首先讲解了Encoder-Decoder模型,接着讲解了带有注意力的Encoder-Decoder模型,最后更一般的陈述了attention模型理念。
第二部分简单描述了几种不同的attention分类,包括soft attention、hard attention、global attention、local attention、self-attention。

自Attention机制提出后,加入attention的Seq2seq模型在各个任务上都有了提升,所以现在的seq2seq模型指的都是结合rnn和attention的模型。之后google又提出了解决sequence to sequence问题的transformer模型,用全attention的结构代替了lstm,在翻译任务上取得了更好的成绩。

我接触attention,也是因大名鼎鼎的transformer才开始的。

1.1Encoder-Decoder的架构

Encoder:它主要所做的事将输入序列数据的信息压缩到一个固定长度的上下文向量(context vector)[也可称为sentence embedding、thought vector]中,希望得到的表示向量可以较好的包含整个输入的信息

Decoder:它主要所做的是使用上下文向量初始化,然后输出转换后的向量。早期的工作仅使用Encoder的最后状态来初始化Decoder

Encoder和Decoder是一个循环神经网咯模型,通常可选择LSTM、GRU做为基本单元。例如在下面机器翻译的例子中,我们将She is eating a green apple输入到Encoder中,希望Decoder输出她在吃一个绿苹果。通常我们关注的并不是某一次具体的翻译任务,而是希望中间的Context vector可以学到关于输入的重要信息的表示。
在这里插入图片描述

1.2注意力模型的Encoder-Decoder框架

下面是另一个例子。比如输入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文单词:“汤姆”,“追逐”,“杰瑞”。

没有注意力模型时,函数如下,它们使用输入句子Source的语义编码C都是一样的,没有任何区别,对生成某个目标单词yi来说影响力都是相同的。
在这里插入图片描述
引入注意力后,固定的中间语义表示C换成了根据当前输出单词加入注意力模型的变化的Ci。即生成目标句子单词的过程成了下面的形式:
在这里插入图片描述
在这里插入图片描述
而每个Ci可能对应着不同的源语句子单词的注意力分配概率分布,比如对于上面的英汉翻译来说,其对应的信息可能如下:
在这里插入图片描述
其中,f2函数代表Encoder对输入英文单词的某种变换函数,比如如果Encoder是用的RNN模型的话,这个f2函数的结果往往是某个时刻输入xi后隐层节点的状态值;g代表Encoder根据单词的中间表示合成整个句子中间语义表示的变换函数,一般的做法中,g函数就是对构成元素加权求和,即下列公式:
在这里插入图片描述
其中,Lx代表输入句子Source的长度,aij代表在Target输出第i个单词时Source输入句子中第j个单词的注意力分配系数,而hj则是Source输入句子中第j个单词的语义编码。假设Ci下标i就是上面例子所说的“ 汤姆” ,那么Lx就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分别是输入句子每个单词的语义编码,对应的注意力模型权值则分别是0.6,0.2,0.2,所以g函数本质上就是个加权求和函数。如果形象表示的话,翻译中文单词“汤姆”的时候,数学公式对应的中间语义表示Ci的形成过程类似下图。

在这里插入图片描述
对于采用RNN的Decoder来说,在时刻i,如果要生成yi单词,我们是可以知道Target在生成yi之前的时刻i-1时,隐层节点i-1时刻的输出值Hi-1的,而我们的目的是要计算生成yi时输入句子中的单词“Tom”、“Chase”、“Jerry”对yi来说的注意力分配概率分布,那么可以用Target输出句子i-1时刻的隐层节点状态Hi-1去一一和输入句子Source中每个单词对应的RNN隐层节点状态hj进行对比,即通过函数F(hj,Hi-1)(等于下一节的score函数)来获得目标单词yi和每个输入单词对应的对齐可能性,这个F函数在不同论文里可能会采取不同的方法,然后函数F的输出经过Softmax进行归一化就得到了符合概率分布取值区间的注意力分配概率分布数值。绝大多数Attention模型都是采取上述的计算框架来计算注意力分配概率分布信息,区别只是在F的定义上可能有所不同。
在这里插入图片描述
图 attention模型示例1

1.3 Attention正式描述

下图“图 attention模型示例2”和上一章节的“图 attention模型示例1”可以说是一个图,只是上图的大写H等同于下图的S。
在这里插入图片描述
图 attention模型示例2

假设我们的输入为长度为n的序列数据x,目标是输出长度为m的序列数据y。
x=[x1,x2,…,xn]
y=[y1,y2,…,ym]

在这里插入图片描述

decoder在输入t位置的词时的隐状态为s_t=f(s_(t-1),y_(t-1),c_t),t=1,...,m,其中上下文向量c_t是输入序列对应隐状态的总和,按照对齐分数(alignment scores)加权,计算公式如下所示

其中a_(t,i)的值取决于输入序列中i位置的元素和输出t位置元素的配对数据。a_(t,i)中的权重值定义了输入中的每个元素对于源输入的每个隐状态的关注程度。在Bahdanau的论文中得分α由只有一个隐藏层的参数化的前馈网络得到,而且前馈网络与模型的其他部分一起训练。Score(等于上节所说的函数F(hj,Hi-1))的计算公式如下所示:
在这里插入图片描述
其中v_a和W_a是需要模型学习的权重矩阵。对齐分数矩阵可以显式地显示源词和目标词之间的相关性。

a_(t,i) 最后通过对socre函数进行softmax获得。

1.4 Attention本质

如果把Attention机制从上文讲述例子中的Encoder-Decoder框架中剥离,并进一步做抽象,可以更容易看懂Attention机制的本质思想。Attention函数的本质可以被描述为一个查询(query)到一系列(键key-值value)对的映射,如下图。
在这里插入图片描述

将Source中的构成元素想象成是由一系列的< Key,Value >数据对构成,此时给定Target中的某个元素Query,通过计算Query和各个Key的相似性或者相关性,得到每个Key对应Value的权重系数,然后对Value进行加权求和,即得到了最终的Attention数值。

在计算attention时主要分为三步:
第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;
第二步一般是使用一个softmax函数对这些权重进行归一化;
最后将权重和相应的键值value进行加权求和得到最后的attention。
目前在NLP研究中,key和value常常都是同一个,即key=value。
在这里插入图片描述

1.5 Attention不同score分类

根据score采用的函数不同,有下面类别。
在这里插入图片描述

2 Attention分类

在这里插入图片描述

2.1 soft attention

传统的Attention Mechanism就是Soft Attention,即通过确定性的得分计算来得到attended之后的编码隐状态。Soft Attention是参数化的(Parameterization),因此可导,可以被嵌入到模型中去,直接训练。梯度可以经过Attention Mechanism模块,反向传播到模型其他部分。
我们上面开始举得的“Tom chase Jerry”可以说就是soft attention。

2.2 hard attention

Hard Attention是一个随机的过程。Hard Attention不会选择整个encoder的隐层输出做为其输入,Hard Attention会依概率Si来采样输入端的隐状态一部分来进行计算,而不是整个encoder的隐状态。为了实现梯度的反向传播,需要采用蒙特卡洛采样的方法来估计模块的梯度。

2.3 global attention

global attention 在计算 context vector ct 的时候会考虑 encoder 所产生的全部hidden state。记 decoder 时刻 t 的 target hidden为 ht,encoder 的全部 hidden state 为hs ,对于其中任意hs ,其权重 αts 为:
在这里插入图片描述

2.4 local attention

global attention 可能的缺点在于每次都要扫描全部的 source hidden state,计算开销较大,对于长句翻译不利,为了提升效率,提出 local attention,每次只 focus 一小部分的 source position。

这里,context vector ct 的计算只 focus 窗口 [pt-D,pt+D] 内的 2D+1 个source hidden states(若发生越界,则忽略界外的 source hidden states)。

其中 pt 是一个 source position index,可以理解为 attention 的“焦点”,作为模型的参数, D 根据经验来选择。
在这里插入图片描述
可以看出,距离中心 pt 越远的位置,其位置上的 source hidden state 对应的权重就会被压缩地越厉害。

2.5 Transformer/self-attention

encoder 和 decoder 都是抛弃 RNN,而是用堆叠起来的 self-attention,和 fully-connected layer 来完成。
最核心的模块 multi-head attention(多头注意力)。
文章中attention的计算采用了scaled dot-product。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/zephyr_wang/article/details/106078446