赞
踩
视频链接:李宏毅 self-attention讲解上
参考文章:RNN详解
Attention详解
彻底搞懂Attention机制
知乎Transformer详解
一般最简单的编码器-解码器架构都是基于RNN模型的,编码器将输入的序列转换为语义编码C,语义编码C中包含了整个输入序列的信息。
解码器也是采用RNN模型,计算每一时刻的输出
y
t
y_t
yt时,除了上一时刻的输出
y
t
−
1
y_{t-1}
yt−1和上一时刻隐藏层的值
h
t
−
1
h_{t-1}
ht−1还需要语义编码C。
h
t
=
f
(
h
t
−
1
,
y
t
−
1
,
C
)
h_t = f(h_{t-1},y_{t-1},C)
ht=f(ht−1,yt−1,C)
y
t
=
f
(
h
t
,
y
t
−
1
,
C
)
y_t = f(h_t,y_{t-1},C)
yt=f(ht,yt−1,C)
h
t
h_t
ht表示当前t时刻的隐藏层的数值,
y
t
−
1
y_{t-1}
yt−1为上一时刻预测的输出,每个时刻语义编码C都是相同的。
这种编码方法,无法体现对一个句子序列中不同语素的关注程度。在自然语言中,一个句子中的不同部分是有不同含义和重要性的。比如:I hate this movie。如果是做情感分析的应用场景,训练的时候明显应该对hate这个词语做更多的关注。如果采用上述的方法则达不到这种效果。
人类在感知环境的时候(比如看一张图片或者一个句子),大脑让我们能够分清哪部分是重要的,哪部分是次要的,从而聚焦更重要的方面以获得对应的信息。我们在设计神经网络模型的时候,希望模型也具有这样的能力。这就引入了注意力机制。
在计算机算力资源有限的情况下,注意力机制可以将注意力集中在有用的信息上,从而减少了在噪声中花费的时间。
上图是引入了Attention机制的编码器-解码器架构。此时编码器的输出不再是只有有一个单一的语义编码C。而是具有多个C1,C2,C3这样的编码。在预测Y1的时候,使用C1作为语义编码,在预测Y2的时候,使用C2作为语义编码,这样就模拟了人类的注意力机制。其中
C
i
C_i
Ci就是对序列中的不同语素,赋予不同的权重吗,最后进行加权平均得到的结果,我们称为中间语义表示。Attention机制的关键是将固定的中间语义表示C换成了根据当前输出单词而变换的中间语义表示
C
i
C_i
Ci
下面我们来介绍一下中间语义表示是如何进行计算的。
注意力机制描述了(序列)元素的加权平均值,其权重是根据输入的query和元素的键值进行动态计算的。具体地,在注意力机制中,有4个概念需要明确。
a
i
=
exp
(
f
a
t
t
n
(
k
e
y
i
,
q
u
e
r
y
)
Σ
j
exp
(
f
a
t
t
n
k
e
y
j
,
q
u
e
r
y
)
)
out
=
∑
i
a
i
⋅
v
a
l
u
e
i
注意力机制的目的是解码器在进行解码的时候,对输入数据有着不同权重的参考。
如图所示,来自于Decoder模块中的查询首先和每个encoder中的键进行点集,得到一个评分函数,该评分函数通过softmax函数得到评分权重,将评分权重和encoder中的值进行相乘得到最终的输出,这个输出也就是我们所说的中间语义表示。
编码器中的隐层状态又可以看作是Attention机制的keys和values
优点
缺点
自注意力机制和传统的注意力机制不同,传统的注意力机制是根据源端和目标端的隐变量计算注意力的,结果是源端的每个词和目标端的每个词之间的依赖关系。
自注意力机制,首先分别在源端和目标端进行自身的注意力,捕捉到其自身的词与词之间的依赖关系,之后将源端得到的自注意力加到目标端中的attention机制中,称为Cross-Attention,以捕获源端和目标端词与词之间的依赖关系。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。