当前位置:   article > 正文

Attention机制原理总结和应用(一)_soft attention

soft attention

Attention机制原理总结和应用(一)

1、attention机制的概述和常用attention类型

注意力机制(attention)是借鉴于人类的视觉选择性的一种机制。这种机制通过对于全局的扫描,将人类的注意力着重分配在重点的区域。在计算机科学中,这种机制通过权重分配的方式进行实现。对于attention机制,常见的类型包括以下几种

1. soft-attention机制
3. global-attention机制
4.local-attention机制
2. hard-attention机制
5.self-attetion机制
6.multi-head attention机制

1、Soft-attention机制概述

1.1 传统的Encoder-Decoder的机器翻译模型

soft-attention是最早被提出和应用在NLP中的attention机制。最开始被应用于机器翻译的任务中。在机器翻译任务中,主要是把源语言翻译成目标语言。如下图所示:

图片来源:https://blog.csdn.net/qq_41058526/article/details/80783925
在这里插入图片描述
图上所展示的是一个传统的机器翻译模型,其中{x1,x2,x3,x4}表示输入源语言句子S中的各个单词。{y1,y2,y3}是目标语言句子的各个单词。源语言S的句子通过编码器(Encoder)的编码操作,将{x1,x2,x3,x4}编码成一个上下文的语义信息(context vector)。将这个语义信息输入到decoder中,decoder在对语义信息进行解码,获取要预测的句子。假设Encodeer和Decoder中采用的是RNN,GRU,LSTM等序列网络结构。其计算的流程为:

  1. 首先对输入每一个词汇,获取其隐状态的信息:
    h ( t ) = f ( x t , h t − 1 ) h(t) = f(x_t,h_{t-1}) h(t)=f(xt,ht1) x t x_t xt表示输入词汇, h t − 1 h_{t-1} ht1表示上一隐状态,f是一个非线性函数(激活)。
  2. 获取到所有隐状态向量之后,将所有的隐状态向量组装成上下文语义向量:
    C = q ( h 1 , h 2 , . . h n ) C = q(h_1,h_2,..h_n) C=q(h1,h2,..hn),其中q是非线性函数(激活)
  3. 将向量输入到Decoder之后,由于Decoder也是一个序列式的网络,所以对于Decoder的每一个输入而言,其和前一个状态相关,并且我们将前一个状态的输出作为当前状态的输入。用公式表达就是:
    s t = f ( s t − 1 , y t − 1 , C ) s_t = f(s_{t-1},y_{t-1},C) st=f(st1,yt1,C),其中 s t − 1 s_{t-1} st1表示Decoder中第t-1个隐藏状态。 y t − 1 y_{t-1} yt1表示前一个时间的输出,C表示输入的上下文向量。
    y t = q ( s t ) y_t = q(s_t) yt=q(st) 其中q和f都是非线性的激活函数。
1.2 Soft-attention引入

传统的机器翻译方式主要是通过编码器将输入序列编码成一个固定长度的向量,在通过解码器的解码过程对目标语言进行预测。在编码器中,每一个输入的词汇对于整个上下文向量(context vector)的贡献程度是相同的。类似于一种直接求和的思想。但是,对于目标语言来说,这种方式不一定是合理的。例如:假设我们要将"we are Chinese"翻译成中文"我们是中国人",如下图所示:
在这里插入图片描述
在这个翻译的过程中,当对“中国人”进行预测的时候,可以知道“我们”这个词汇是根据“we”,“是”是根据词汇“are”,“中国人”这个词汇是根据“Chinese”这个词汇来的,但是我们在预测的时候,使用的是相同的上下文向量C,没有任何区别。这样就没有显示出我们在翻译不同词汇时的不同侧重点。

2、Soft-attention的基本原理

根据上面的例子可以知道,常规的Encoder-Decoder结构没有体现出对于不同输入的侧重。下面我们就采用一种soft-attention机制来将这种侧重点机制体现出来。
继续我们上面的例子,由于我们需要体现出不同输出对于输入的不同侧重点,那么我们肯定是需要对C进行变换。比如对于上面的翻译结果,不同输出对应的侧重如下:
C 中 国 人 = 0.1 ∗ f ( w e ) + 0.1 ∗ f ( a r e ) + 0.8 ∗ ( C h i n e s e ) C_{中国人} = 0.1 * f(we)+0.1*f(are)+0.8*(Chinese) C=0.1f(we)+0.1f(are)+0.8(Chinese)
C 是 = 0.1 ∗ f ( w e ) + 0.8 ∗ f ( a r e ) + 0.1 ∗ f ( C h i n e s e ) C_{是} = 0.1*f(we)+0.8*f(are)+0.1*f(Chinese) C=0.1f(we)+0.8f(are)+0.1f(Chinese)
C 我 们 = 0.8 ∗ f ( w e ) + 0.1 ∗ f ( a r e ) + 0.1 ∗ f ( C h i n e s e ) C_{我们} = 0.8*f(we)+0.1*f(are)+0.1*f(Chinese) C=0.8f(we)+0.1f(are)+0.1f(Chinese)
则可以推导出:

C i = ∑ j = 1 o u t p u t s a i j h j C_i =∑_{j=1}^{outputs}a_{ij}h_j Ci=j=1outputsaijhj

其中 a i j a_{ij} aij表示当前输出对于不同输入分配的权重, h j h_j hj表示输入的隐藏层向量。outputs表示输出的个数。变换后的图示为:

在这里插入图片描述

2.1 soft-attention的形成

下面对于我们所推导出来的公式进行分析,首先我们可以知道 h j h_j hj是通过编码器来实现的,那么应该如何生成对应的 a i j a_{ij} aij呢?也就是 C 中 国 人 = 0.1 ∗ f ( w e ) + 0.1 ∗ f ( a r e ) + 0.8 ∗ ( C h i n e s e ) C_{中国人} = 0.1 * f(we)+0.1*f(are)+0.8*(Chinese) C=0.1f(we)+0.1f(are)+0.8(Chinese)中0.1,0.8,0.1是如何计算出来的呢?
在这里插入图片描述

上图说明了这种注意力权重的计算过程,在这个计算过程中,当我们要预测y3的时候。此时,我们使用的是s2(当前隐藏状态的前一个状态,PS:此时还没有S3状态)去和Encoder中的每一个输入隐藏层节点hj进行贡献度g的计算,在计算完所有的贡献度g之后,进行归一化吗,获取各个权重值,最终根据各个权重计算出新的上下文向量 c 3 c_3 c3即如下公式
S c o r e j = F ( h j , s 2 ) Score_j = F(h_j,s_2) Scorej=F(hj,s2)
a j = s o f t m a x ( S c o r e j ) a_j = softmax(Score_j) aj=softmax(Scorej)
c 3 = ∑ j = 1 n a j h j c_3 = ∑_{j=1}^n ajhj c3=j=1najhj
至此,attention计算完成,具有侧重点的上下文向量c3计算完成。之后计算过程就是上文所提到的解码的过程,最后计算出当前的隐藏状态s3,计算出预测字符y3。

2.2 attention的本质

在这里插入图片描述
attention的本质是一种查询机制,我们给定一个Query,计算出不同key所占的比例 a k e y a_{key} akey,在将 a k e y a_{key} akey分别和对应的value相乘,最后累加得到了对应的attention值。在我们上述和下面的例子中,key和value是相同的,也就是在计算 a k e y a_{key} akey的时候,直接用query和value计算出权重 a k e y a_{key} akey

2、Global Attention 和 Local Attention

本节,我们讲一讲Soft-Attention的变形Global Attention 和Local Attention。从字面意思就不难理解,这两种变形主要是在注意力机制的范围上进行了分类和改变。

2.1 、Global Attention

在这里插入图片描述
Global Attention:上图是global Attention的计算方式,由上图我们可以看出,Global Attention的计算方式和我们之前所描述的soft-attenton的计算方式相同,通过一个解码器中一个隐藏层节点作为Query,计算出该Query和所有Encoder中隐藏层节点之间的权重。最终进行汇总,得到对应的上下文向量C。其计算公式如下:

在这里插入图片描述

2.2、Local Attention

根据上面的计算方式,所有的Encoder的隐藏节点都需要和Query做相似度的运算。首先,当Encoder的隐层节点数量特别多的时候,计算量会很大。其次,某些情况下,语义的相关性也具有一定的局部性,也就是对于语义的判断可能仅仅依赖于输入的一部分就可以了。所以,我们采用一定的方式来减少attention的计算范围,重点关注于能够用来对当前输出有语义贡献的输入。
在这里插入图片描述
如上图所示,我们不在关注于全部的输入的隐层节点。其计算的过程主要包括以下几个步骤:

  1. 定义attention计算的范围:2D+1,也就是attention的计算仅仅在2D+1这个窗口内。其中D是由用户自己进行定义。
  2. 计算出窗口中心pt,也就是attention的计算窗口为[pt-D,pt+D]。pt的计算公式为:
    p t = S l e n g t h ⋅ σ ( v p T t a n h ( W p h t ) ) pt=S_{length}⋅σ(v _p^Ttanh(W_ph _t)) pt=Slengthσ(vpTtanh(Wpht))

    其中 S l e n g t h S_{length} Slength表示Encoder中隐层节点的数量,σ表示sigmoid函数, h t h_t ht表示的是Decoder当前的向量,Vp和Wp是可以学习的参数矩阵。这样计算出来之后, p t ∈ ( 0 , S l e n g t h ) p_t∈(0,S_{length}) pt(0,Slength)
    3.在计算完窗口和中心位置之后,就可以根据中心位置和窗口大小计算权重 a t , i a_{t,i} at,i,计算公式为:
    在这里插入图片描述
    计算分为两个部分,第一个部分是类似于之前介绍的计算attention权重的计算,第二部分是一个高斯分布的计算,这里D是我们之前设置窗口大小时候的D。高斯分布的作用是使得与靠近中心点pt,贡献度得分越高。

3.Hard-attention

在这里插入图片描述

参考文献和博客
  1. 详解注意力机制(Attention)——Global/Local/Self Attention
  2. NLP中的Attention机制介绍
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/525146
推荐阅读
相关标签
  

闽ICP备14008679号