赞
踩
注意力机制(attention)是借鉴于人类的视觉选择性的一种机制。这种机制通过对于全局的扫描,将人类的注意力着重分配在重点的区域。在计算机科学中,这种机制通过权重分配的方式进行实现。对于attention机制,常见的类型包括以下几种
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等序列网络结构。其计算的流程为:
传统的机器翻译方式主要是通过编码器将输入序列编码成一个固定长度的向量,在通过解码器的解码过程对目标语言进行预测。在编码器中,每一个输入的词汇对于整个上下文向量(context vector)的贡献程度是相同的。类似于一种直接求和的思想。但是,对于目标语言来说,这种方式不一定是合理的。例如:假设我们要将"we are Chinese"翻译成中文"我们是中国人",如下图所示:
在这个翻译的过程中,当对“中国人”进行预测的时候,可以知道“我们”这个词汇是根据“we”,“是”是根据词汇“are”,“中国人”这个词汇是根据“Chinese”这个词汇来的,但是我们在预测的时候,使用的是相同的上下文向量C,没有任何区别。这样就没有显示出我们在翻译不同词汇时的不同侧重点。
根据上面的例子可以知道,常规的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.1∗f(we)+0.1∗f(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.1∗f(we)+0.8∗f(are)+0.1∗f(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.8∗f(we)+0.1∗f(are)+0.1∗f(Chinese)
则可以推导出:
下面对于我们所推导出来的公式进行分析,首先我们可以知道
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.1∗f(we)+0.1∗f(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。
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。
本节,我们讲一讲Soft-Attention的变形Global Attention 和Local Attention。从字面意思就不难理解,这两种变形主要是在注意力机制的范围上进行了分类和改变。
Global Attention:上图是global Attention的计算方式,由上图我们可以看出,Global Attention的计算方式和我们之前所描述的soft-attenton的计算方式相同,通过一个解码器中一个隐藏层节点作为Query,计算出该Query和所有Encoder中隐藏层节点之间的权重。最终进行汇总,得到对应的上下文向量C。其计算公式如下:
根据上面的计算方式,所有的Encoder的隐藏节点都需要和Query做相似度的运算。首先,当Encoder的隐层节点数量特别多的时候,计算量会很大。其次,某些情况下,语义的相关性也具有一定的局部性,也就是对于语义的判断可能仅仅依赖于输入的一部分就可以了。所以,我们采用一定的方式来减少attention的计算范围,重点关注于能够用来对当前输出有语义贡献的输入。
如上图所示,我们不在关注于全部的输入的隐层节点。其计算的过程主要包括以下几个步骤:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。