一、摘要
注意力机制可以被用来编码序列数据基于每个元素的重要性分数,已经被广泛用于NLP中的各种任务。本篇论文,作者介绍了各种attention,探索他们之间的联系并且评估其性能。
二、介绍
作者通过举了机器翻译的例子介绍为什么要用attention机制。传统的机器翻译方法是encoder-decoder架构的,都是由RNN结构组成。但是RNN有两种严重的缺陷:RNN是健忘的,意味着旧信息在经过多个时间步传播后会被冲刷掉;在解码期间没有明确的词对齐,对原句的没个词的重要性都是一样的。为了解决以上问题,attention机制被推出用于NMT任务。对解码期间的每个时间步
j
j
j,它会根据每个输入的隐藏层表示
h
i
i
n
h^{in}_i
hiin计算注意力分数
α
j
i
\alpha_{ji}
αji,然后得到上下文向量
c
j
c_j
cj。
c
j
c_j
cj是输入序列的加权平均值,
c
j
c_j
cj与当前的隐藏层状态
h
j
h_j
hj和最后一个目标词的输出
y
j
−
1
y_{j-1}
yj−1相结合来生成
y
j
y_j
yj
因此注意力机制就解决了之前提到的问题,RNN的记忆健忘性就不再是问题,attention机制对输入序列的每个词计算其分数,
c
j
c_j
cj的计算不受序列长度的影响。另一方面,通过attention机制,可以知道输入序列的那些词的权重更大,哪些词权重更小,关注重要的部分,忽略不相关的部分。因此,注意力机制在NMT任务上表现很好,同时也被应用到其它任务。下面将会按照下面的顺序介绍attention机制:
- 详细地解释attention的基本形式。
- 讨论基于不同任务的各种attention变体
- 探索attention如何与机器学习的概念相结合,比如预训练、融合。
- 评估attention的性能。
三、公式
之前讨论了attention机制在NMT的应用,为了公式化attention的基本形式,定义
V
=
{
v
i
}
∈
R
n
×
d
v
V=\{v_i\}\in R^{n\times d_v}
V={vi}∈Rn×dv作为输入序列向量,重写之前的步骤为:
其中,
u
∈
R
d
u
u \in R^{d_u}
u∈Rdu是任务特定的向量匹配序列
{
v
i
}
\{v_i\}
{vi}的每一个元素,其中
a
(
u
,
v
)
a(u,v)
a(u,v)计算两者的匹配度。这个匹配函数可以有三种形式:加法、点积、MLP。三种形式都衡量了不同表示的相似度。
α
i
\alpha_i
αi 是最终的attention weight,与序列加权求和得到上下文向量
c
c
c。在机器翻译中,注意力权重可以自然地解释为目标端的词对每个源端的词的对齐度量。当生成一个目标词时,期望与源端匹配程度最高的词的权重更大,而上下文向量为解码阶段提供了相关的信息。
四、变种
上面提到的attention比较简单,很难适用于复杂的任务。比如:
困难在于Q和(3)并没有直接的联系,因此我们需要设计一个更复杂的attention根据上下文的潜在信息关注到正确的位置。接下来将会介绍各种attention的变种:多维的attention、层次化的attention、self-attention、memory-based attention、task-specific attention。
4.1 multi-dimensional attention
之前提到的attention是1D attention,为每个词都计算一个权重分数,将每个分数拼接起来
α
=
{
α
i
}
\alpha=\{\alpha_i\}
α={αi}就是一个1D向量。多维注意力的动机是捕获不同表示空间的单词之间的多个交互信息,这可以通过之间堆叠多个一维的表示来构建。
举个方面词抽取的2D attention例子,给定字符串的隐藏层表示
V
=
{
v
i
}
V=\{v_i\}
V={vi},方面词原型向量u,3D向量
W
=
{
W
k
}
∈
R
K
×
d
×
d
W=\{W_k\}\in R^{K\times d\times d}
W={Wk}∈RK×d×d,其中
W
k
∈
R
×
d
×
d
W_k\in R^{\times d\times d}
Wk∈R×d×d是一个矩阵,捕获每一个字符串和原型之间的组合信息,每个元素
v
i
v_i
vi的权重向量
e
i
e_i
ei可以如下得到:
e
i
=
t
a
n
h
(
u
T
W
v
i
)
=
c
o
n
c
a
t
(
t
a
n
h
(
u
T
W
k
v
i
)
)
e_i=tanh(u^TWv_i)=concat(tanh(u^TW_kv_i))
ei=tanh(uTWvi)=concat(tanh(uTWkvi))
整个序列的2D attention通过拼接得到
E
=
{
e
i
}
E=\{e_i\}
E={ei}。多维attention有个缺陷就是可以同时捕获多种类型的注意力,因此降低其表示能力。(这里有点搞不懂?)为了解决这个问题,可以加个正则惩罚项来约束每个attention列关注序列的不同部分。
4.2 Hierarchical attention
文本分类任务就是把一篇文档分为预定义的类别。很明显,我们需要分辨对分类有帮助的关键词,同时,典型的句子对文本分类也是有影响。如果我们考虑到嵌套结构:
c
h
a
r
a
c
t
e
r
∈
w
o
r
d
∈
d
o
c
u
m
e
n
t
character\in word \in document
character∈word∈document,层次化的attention就可以构造出来,或从底向上(word-level to sentence-level),或从顶到下(word-level to character-level)提取局部和全局的重要信息。
目前从底向上的方法已经用于文档分类任务中,两个GRU分别编码词级别和句级别的上下文信息,然后经过层次化的attention进行编码:
s
o
f
t
m
a
x
softmax
softmax是之前讨论的归一化步骤,
h
i
(
t
)
和
h
i
h_i^{(t)}和h_i
hi(t)和hi分别表示词和句的隐藏层表示。KaTeX parse error: Double subscript at position 4: u_w_̲T和u_s_T分别是词级别和句级别的模式向量,随模型一起训练。最终的句子表示c输入到分类层进行分类。
4.2 self-attention
之前最基本的attention可以称作外部的attention,因为attention权重是由外部的模式向量
u
u
u和每一个元素
v
i
v_i
vi计算得到。相反,在self-attention中,外部的模型向量由句子本身的一部分替代,因此称作内部的attention。我们可以将self-attention解释为匹配每个元素与内部的模式向量。
e
i
=
a
(
v
‘
,
v
i
)
。
v
‘
e_i=a(v^`,v_i)。v^`
ei=a(v‘,vi)。v‘的典型选择可以是另外一个元素
v
j
v_j
vj,但为了捕获序列中单词的更复杂的交互信息,可以扩展为计算序列中每对词的权重:
e
i
j
=
a
(
v
i
,
v
j
)
e_{ij}=a(v_i,v_j)
eij=a(vi,vj)
α
i
j
=
s
o
f
t
m
a
x
(
e
i
j
)
\alpha_{ij}=softmax(e_{ij})
αij=softmax(eij)
旨在捕获序列中更复杂的交互依赖信息。因此,每个单词都会与其它单词计算得到分布式关系表示,并且复杂的配对关系可以根据权重很好地解释。
self-attention的另一个动机与词向量相关。具体来说,我们想利用self-attention模型学习到复杂的上下文表示,举个例子来说,
I
a
r
r
i
v
e
d
a
t
t
h
e
b
a
n
k
a
f
t
e
r
c
r
o
s
s
i
n
g
t
h
e
s
t
r
e
e
t
.
I\ arrived\ at\ the\ bank\ after\ crossing\ the\ street.
I arrived at the bank after crossing the street.
I
a
r
r
i
v
e
d
a
t
t
h
e
b
a
n
k
a
f
t
e
r
c
r
o
s
s
i
n
g
t
h
e
r
i
v
e
r
.
I\ arrived\ at\ the\ bank\ after\ crossing\ the\ river.
I arrived at the bank after crossing the river.
单词‘bank’在不同的上下文中有不同的意义,我们想要模型可以学到可以捕捉周围上下文的语义信息的上下文向量。Transformer是基于attention的新型架构,与之前的self-attention类似,新颖的self-attention可以表示为:
其中
V
=
{
v
i
}
∈
R
n
×
d
i
n
V=\{v_i\}\in R^{n\times d_{in}}
V={vi}∈Rn×din表示输入序列,
W
1
,
W
2
,
W
3
∈
R
d
i
n
×
d
o
u
t
W_1,W_2,W_3\in R^{d_{in}\times d_{out}}
W1,W2,W3∈Rdin×dout是可更新的参数,
C
=
c
i
∈
R
n
×
d
o
u
t
C={c_i}\in R^{n\times d_{out}}
C=ci∈Rn×dout就是自注意的编码序列,我们期望每个输入通过在端到端训练期间调整其与周围环境的关系来学习deep context-aware configuration。我们知道这个架构不包括任何RNN、CNN结构,所以self-attention层的计算是可以并行的,与CNN相比参数更高效。越来越到的技术被提出用于加强它的表示能力。比如位置编码作为每个单词的额外信息,作为附加特征纳入句子编码中。
为了避免受到不期望方向的注意力信息, 一个双向掩码在归一化之前加入权重的表示中。还有其它的改进方法,这里不再介绍。
4.3 memory-based attention
为了介绍新的attention,重构一下基础attention的步骤。给定一系列键值对
{
(
k
i
,
v
i
)
}
\{(k_i,v_i)\}
{(ki,vi)}和查询向量q,attention的三部曲:
1.
e
i
=
a
(
q
,
k
i
)
(
a
d
d
r
e
s
s
m
e
m
o
r
y
)
e_i=a(q,k_i)(address\ memory)
ei=a(q,ki)(address memory)
2.
α
i
=
e
x
p
(
e
i
)
∑
i
e
x
p
(
e
i
)
(
n
o
r
m
a
l
i
z
e
)
\alpha_i=\frac{exp(e_i)}{\sum_iexp(e_i)}(normalize)
αi=∑iexp(ei)exp(ei)(normalize)
3.
c
=
∑
i
α
i
v
i
(
r
e
a
d
c
o
n
t
e
n
t
s
)
c=\sum_i\alpha_iv_i(read\ contents)
c=∑iαivi(read contents)
这里我们重新解释计算权重分数为soft memory addressing using query q,然后根据权重从内存中编码为reading contents。这就是基于记忆的注意力的一般形式。事实上,在很多文献中记忆是输入序列的同义词。如果每对key-value是相等的,那么就是之前介绍的最基本的attention(???)。然而,基于记忆的attention更加强大,因为我们结合了额外的功能来实现可重用性和增加灵活性。
- 可重用性: 在一些问答任务中的一个基本困难是答案与问题间接相关,因此不能通过简单的attention解决。如果我们可以通过迭代记忆更新(也称为多跳)模拟时间推理过程来逐步将注意力引导到答案的正确位置,就可以实现这一点。在每一次迭代过程中,查询被新的内容所更新,然后更新后的查询用于检索相关的内容。迭代过程的伪代码如下:
- - **灵活性:**由于key和value已经明确地表示出来了,我们可以自由地将先前知识结合到设计单独的key和value embedding中,以允许它们分别更好地捕获相关信息。key embeddings可以更好地匹配问题,value embeddings匹配回复。在key-value记忆网络中,提出了一种窗口级别的表示,key是围绕中窗口中心实体的词,value是实体,旨在更高效和更准确。
五、应用
这里列举attention的三个应用:ensemble、gating、pre-training。
5.1 attention for ensemble
如果我们将序列中的每个元素看作单个模型,attention权重看作是这些模型的加权融合,那么attention机制就类似于模型融合的方式。
5.2 attention for gating
传统的GRU隐藏层更新如下:
其中
u
i
和
r
i
u_i和r_i
ui和ri是更新门和重置门,一种基于attention的GRU是通过将
u
i
u_i
ui替换为attention权重
α
i
\alpha_i
αi
5.3 attention for pre-training
预训练的词向量在很多NLP任务上至关重要。传统的方法有skipgram、cbow、glove等等,利用大规模语料基于上下文训练一个无监督模型,学习到每个词的高位分布式表示。与此相反,最近有提出预训练方法,集成了基于attention的深度网络架构,旨在学习到更高质量的单词表示,包含了周围上下文的句法语义信息,然后对模型微调以适应下层监督任务。比如最近很火的BERT。
六、结论
在本文中,我们通过近期关于注意机制的研究进行了调查,并在其公式,变种,应用和评价的基础上进行了介绍性总结。 与其在各种NLP任务中的广泛使用相比,探索其数学证明的尝试仍然很少。 最近的研究探索其在嵌入式预训练中的应用取得了巨大成功,可能成为未来研究的一个前瞻性领域。