自我注意力机制(Self-Attention)
这节课我们学习自我注意力机制(Attention)。
Self-Attention(自我注意力机制)
Attention的第一篇论文发表于2015年,用于改进Seq2seq模型对长句子的遗忘问题。其实Attention并不局限于Seq2seq模型,而是可以用在所有的RNN上。接下来我们介绍Self-attention,文章发表在2016年EMNLP上。
Self-attention原始论文把Attention用在LSTM上,本节课我们把论文内容进行简化,把LSTM换成Simple RNN,这样更容易理解。
初始时,状态向量
h
h
h和Context vector
c
c
c都是全零向量。RNN读入第一个输入
x
1
x_1
x1?,需要更新状态
h
h
h,把
x
1
x_1
x1?的信息压缩到新的状态向量
h
h
h里面。标准的Simple RNN在计算
h
1
h_1
h1?时依赖输入
x
1
x_1
x1?和旧的状态
h
0
h_0
h0?,计算公式如下图所示:
而使用Self-attention后,计算公式变为这样:
即用
c
0
c_0
c0?代替
h
0
h_0
h0?。也可以用其他方法来更新,比如把
x
1
x_1
x1?、
c
0
c_0
c0?、
h
0
h_0
h0?做concatenation。算出新状态
h
1
h_1
h1?,下一步就是计算新的Context vector
c
1
c_1
c1?。新的Context vector
c
1
c_1
c1?是已有状态
h
h
h的加权平均。
由于初始状态
h
0
h_0
h0?是全零,我们忽略掉
h
0
h_0
h0?,那么已有状态的加权平均就等于
h
1
h_1
h1?,所以新的Context vector
c
1
c_1
c1?就是
h
1
h_1
h1?。
然后计算
h
2
h_2
h2?,公式如下: 接下来计算新的Context vector
c
2
c_2
c2?。想要计算
c
c
c,首先需要计算权重
α
\alpha
α。拿当前状态和已有的两个状态向量
h
h
h作对比(包括
h
2
h_2
h2?自己)。然后用权重进行加权平均计算
c
2
c_2
c2?。
以此类推,计算
c
3
c_3
c3?,……KaTeX parse error: Expected group after '_' at position 2: c_?。
Summary(总结)
RNN都有遗忘的问题,使用Self-attention后就可以解决遗忘的问题。每次在更新
c
c
c之前,都会再重新看一遍之前的各个状态信息。
Self-attention与Attention的道理是一样的,但Self-attention不局限于Seq2seq模型,可以用在所有的RNN上。除了避免遗忘,Self-attention还能帮助RNN关注相关的信息。
上图为论文中的插图,RNN从左往右读一句话,红色的是当前输入,高亮标出的权重
α
\alpha
α很大的位置,这些权重
α
\alpha
α说明前文中最相关的词是哪几个。
|