Attention机制介绍

 

文章目录

    • attention机制介绍(基于encoder-decoder框架)
      • 直观对比
      • 改进的依据(为什么能够做到改进)
      • 具体解释(soft attention)
        • 如何获得每个语义编码C
        • 如何获得每个输入的权重
        • 如何计算相似度
    • attention机制本质(获得attention value过程的本质)
      • 大概过程抽象图
      • 具体计算步骤抽象图
    • attention的种类
      • 1. 计算区域
      • 2. 所用信息
      • 3. 结构层次
      • 4. 模型方面
    • self attention
      • 概念
      • 使用self attention的好处
        • 处理长距离序列
        • 处理变长序列
      • 具体计算流程
    • 最后
    • 参考文章

attention机制介绍(基于encoder-decoder框架)

直观对比

  1. 分心模型
    Attention机制介绍_第1张图片

此处公式不是很严谨,每个f进行的操作应该是各不相同的。或者可以理解为重载函数,因为输入的参数个数本就不同。例如当decoder为RNN时,若y1=f(C),则y2=f(g(C,y1)),其中g(C,y1)是当前时刻的隐藏层的值。
image

  1. 注意力模型
    Attention机制介绍_第2张图片
    在这里插入图片描述

关键点:每一个输出的语义编码C都是不同的,每个输入对不同C的影响不同(i.e. 每个输入对不同的C有不同的权重)。

改进的依据(为什么能够做到改进)

以机器翻译为例,翻译’Tom chase Jerry’时,如果是分心模型,decoder使用的是同一个C,那么同一个输入对所有输出产生的影响是相同的。但是,输入’Tom’对输出’汤姆’的影响应该远大于其他输入,输入’Jerry’对输出’杰瑞’的影响应该远大于其他输入。因此,对不同输出,C应当不同。

具体解释(soft attention)

如何获得每个语义编码C

在这里插入图片描述

C1、C2和C3的运算方式也有多种,一种可能的方式是根据源语句子单词的注意力分配概率分布(权重)进行计算。
Attention机制介绍_第3张图片
其中f2是encoder对输入单词进行的某种变换,例如使用RNN模型的得到的结果就是隐藏层的值。g就是为获得不同的向量C而对参数进行的某种计算,一般方式就是求和。
 

图形表示每个C的计算过程

Attention机制介绍_第4张图片

如何获得每个输入的权重

以encoder和decoder都为RNN的模型为例。
注意:要么在encoder的最后有个结束,要么在decoder的开头有个开始。一定有个过渡的过程。

  1. 分心模型
    Attention机制介绍_第5张图片

  2. 加入注意力机制
    (1)我自己的理解(前一个输出和前一个隐藏层共同决定当前隐藏层,当前隐藏层再和attention value产生中间向量,最后得到当前输出结果)
    下图方式是使用Ht和hi计算得ati,原始方式是使用Ht-1和hi计算得ati。
    F是进行的某种运算(某种函数),得到的是该输入在当前时刻对应的注意力分数。

第一步(输出Y1)
Attention机制介绍_第6张图片

后续是相同操作
Attention机制介绍_第7张图片

(2)另一种理解(前一个输出、前一个隐藏层和attention value共同决定当前隐藏层,并由隐藏层直接获得当前输出结果)
Attention机制介绍_第8张图片

如何计算相似度

1)点乘:最简单的方法,  s ( q , k ) = q T k s(q, k) = q^Tk s(q,k)=qTk

2)矩阵相乘:  s ( q , k ) = q T W k s(q, k) = q^TWk s(q,k)=qTWk

3)cos相似度:  s ( q , k ) = q T k ∣ ∣ q ∣ ∣ ⋅ ∣ ∣ k ∣ ∣ s(q, k) = \frac{q^Tk} {||q||·||k||} s(q,k)=qkqTk

4)串联方式:把q和k拼接起来,  s ( q , k ) = W [ q ; k ] s(q, k) = W[q; k] s(q,k)=W[q;k]

5)用多层感知机也可以:  s ( q , k ) = v a T t a n h ( W q + U k ) s(q, k) = v^T_atanh(Wq + Uk) s(q,k)=vaTtanh(Wq+Uk)

attention机制本质(获得attention value过程的本质)

将attention机制从encoder-decoder框架中剥离。

大概过程抽象图

Attention机制介绍_第9张图片
Query就是target里的某个元素(对应RNN的Hi),source的构成元素是对(对应RNN的,在上面提到的RNN中,key的值就是value的值)。

计算query和所有key的相似性(对应RNN的F(hi, Hj)),得到key对应value的权重(对应RNN的aij),再对value进行加权求和,得到attention value(对应RNN的Cj)。

image

具体计算步骤抽象图

Attention机制介绍_第10张图片

阶段1:计算query和每个key的相似性或者相关性(或者就是其他某种函数运算的结果)
阶段2:对上一步计算的结果进行归一化(为了变成概率分布的形式)
阶段3:计算每个key对应value的加权和(或者使用其他计算也可以),即attention value

attention的种类

从计算区域、所用信息、结构层次和模型等方面对Attention的形式进行归类。

1. 计算区域

根据Attention的计算区域,可以分成以下几种:

(1)Soft Attention(Global Attention),这是比较常见的Attention方式,对所有key求权重概率,每个key都有一个对应的权重,是一种全局的计算方式(也可以叫Global Attention)。这种方式比较理性,参考了所有key的内容,再进行加权。但是计算量可能会比较大一些。

(2)Hard Attention,这种方式是直接精准定位到某个key,其余key就都不管了,相当于这个key的概率是1,其余key的概率全部是0。因此这种对齐方式要求很高,要求一步到位,如果没有正确对齐,会带来很大的影响。另一方面,因为不可导,一般需要用强化学习的方法进行训练。(或者使用gumbel softmax之类的)

(3)Local Attention,这种方式其实是以上两种方式的一个折中,对一个窗口区域进行计算。先用Hard方式定位到某个地方,以这个点为中心可以得到一个窗口区域,在这个小区域内用Soft方式来算Attention。

2. 所用信息

假设我们要对一段原文计算Attention,这里原文指的是我们要做attention的文本,那么所用信息包括内部信息和外部信息,内部信息指的是原文本身的信息,而外部信息指的是除原文以外的额外信息。

(1)General Attention,这种方式利用到了外部信息,常用于需要构建两段文本关系的任务,query一般包含了额外信息,根据外部query对原文进行对齐。比如在阅读理解任务中,需要构建问题和文章的关联,假设现在baseline是,对问题计算出一个问题向量q,把这个q和所有的文章词向量拼接起来,输入到LSTM中进行建模。那么在这个模型中,文章所有词向量共享同一个问题向量,现在我们想让文章每一步的词向量都有一个不同的问题向量,也就是,在每一步使用文章在该步下的词向量对问题来算attention,这里问题属于原文,文章词向量就属于外部信息。

(2)Local Attention,这种方式只使用内部信息,key和value以及query只和输入原文有关,在self attention中,key、value、query来源相同。既然没有外部信息,那么在原文中的每个词可以跟该句子中的所有词进行Attention计算,相当于寻找原文内部的关系。还是举阅读理解任务的例子,上面的baseline中提到,对问题计算出一个向量q,那么这里也可以用上attention,只用问题自身的信息去做attention,而不引入文章信息。

3. 结构层次

结构方面根据是否划分层次关系,分为单层attention,多层attention和多头attention:

(1)单层Attention,这是比较普遍的做法,用一个query对一段原文进行一次attention。

(2)多层Attention,一般用于文本具有层次关系的模型,假设我们把一个document划分成多个句子,在第一层,我们分别对每个句子使用attention计算出一个句向量(也就是单层attention);在第二层,我们对所有句向量再做attention计算出一个文档向量(也是一个单层attention),最后再用这个文档向量去做任务。

(3)多头Attention,这是Attention is All You Need中提到的multi-head attention,用到了多个query对一段原文进行了多次attention,每个query都关注到原文的不同部分,相当于重复做多次单层attention:在这里插入图片描述

最后再把这些结果拼接起来:在这里插入图片描述

4. 模型方面

从模型上看,Attention一般用在CNN和LSTM上,也可以直接进行纯Attention计算。

(1)CNN+Attention
CNN的卷积操作可以提取重要特征,我觉得这也算是Attention的思想,但是CNN的卷积感受视野是局部的,需要通过叠加多层卷积区去扩大视野。另外,Max Pooling直接提取数值最大的特征,也像是hard attention的思想,直接选中某个特征。
CNN上加Attention可以加在这几方面:
a. 在卷积操作前做attention,比如Attention-Based BCNN-1,这个任务是文本蕴含任务需要处理两段文本,同时对两段输入的序列向量进行attention,计算出特征向量,再拼接到原始向量中,作为卷积层的输入。
b. 在卷积操作后做attention,比如Attention-Based BCNN-2,对两段文本的卷积层的输出做attention,作为pooling层的输入。
c. 在pooling层做attention,代替max pooling。比如Attention pooling,首先我们用LSTM学到一个比较好的句向量,作为query,然后用CNN先学习到一个特征矩阵作为key,再用query对key产生权重,进行attention,得到最后的句向量。

(2)LSTM+Attention
LSTM内部有Gate机制,其中input gate选择哪些当前信息进行输入,forget gate选择遗忘哪些过去信息,我觉得这算是一定程度的Attention了,而且号称可以解决长期依赖问题,实际上LSTM需要一步一步去捕捉序列信息,在长文本上的表现是会随着step增加而慢慢衰减,难以保留全部的有用信息。
LSTM通常需要得到一个向量,再去做任务,常用方式有:
a. 直接使用最后的hidden state(可能会损失一定的前文信息,难以表达全文)
b. 对所有step下的hidden state进行等权平均(对所有step一视同仁)。
c. Attention机制,对所有step的hidden state进行加权,把注意力集中到整段文本中比较重要的hidden state信息。性能比前面两种要好一点,而方便可视化观察哪些step是重要的,但是要小心过拟合,而且也增加了计算量。

(3)纯Attention
Attention is all you need,没有用到CNN/RNN,乍一听也是一股清流了,但是仔细一看,本质上还是一堆向量去计算attention。

self attention

概念

在一般任务的Encoder-Decoder框架中,输入Source和输出Target内容是不一样的。比如对于英-中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子,Attention机制发生在Target的元素Query和Source中的所有元素之间。

而Self Attention,指的不是Target和Source之间的Attention机制,而是Source内部元素之间或者Target内部元素之间发生的Attention机制,也可以理解为Target=Source这种特殊情况下的注意力计算机制。

使用self attention的好处

比卷积网络和循环网络更好地处理长距离序列,相比全连接模型,可以处理变长的信息序列。

处理长距离序列

卷积网络和循环网络虽然通过改进也能够处理长序列(例如LSTM),但是距离过长也不能很好处理(梯度消失等等),并没有self attention强大。
self attention可以通过计算query和整个序列中key的相关性确定权重,从而很好地体现上下文关系。
例如下图的句子中,its的指代对象law的权重很大。
Attention机制介绍_第11张图片

处理变长序列

如果要建立输入序列之间的长距离依赖关系,可以使用以下两种方法:一 种方法是增加网络的层数,通过一个深层网络来获取远距离的信息交互,另一种方法是使用全连接网络。 ——《神经网络与深度学习》

Attention机制介绍_第12张图片

以上为全连接模型和自注意力模型。实线表示可学习的权重,虚线表示动态生成的权重。

由上图可以看出,全连接网络虽然是一种非常直接的建模远距离依赖的模型, 但是无法处理变长的输入序列。不同的输入长度,其连接权重的大小也是不同的。这时我们就可以利用注意力机制来“动态”地生成不同连接的权重,这就是自注意力模型(self-attention model)。由于自注意力模型的权重是动态生成的,因此可以处理变长的信息序列。

总体来说,自注意力模型(self-Attention model)处理变长的关键:利用注意力机制来“动态”地生成不同连接的权重,从而处理变长的信息序列。

具体计算流程

第一步:计算每个元素的Q、K、V
其中 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCzqROS9-1615363527107)(en-resource://database/591:1)]是我们模型训练过程学习到的合适的参数。
image
Attention机制介绍_第13张图片

第二步:计算query和key的相似度
attention中的query来自source外部,source和target不同。
self attention的query、key和value是相同来源。
Attention机制介绍_第14张图片

第三步:为了防止结果过大,要除以一个尺度标准 d k \sqrt d_k d k,其中 d k d_k dk为一个query和key向量的维度。然后进行归一化。
Attention机制介绍_第15张图片

第四步:计算value的加权和
Attention机制介绍_第16张图片

二-四步公式总结
Attention机制介绍_第17张图片

最后的z就是结果(如果没有其他multi-head等后续步骤的话)。

最后

文章有问题欢迎提出。

参考文章

nlp中的Attention注意力机制+Transformer详解

Attention机制详解(二)——Self-Attention与Transformer

动画图解Attention机制,让你一看就明白

一文看懂 Attention(本质原理+3大优点+5大类型)

你可能感兴趣的:(神经网络,深度学习,自然语言处理)