目前采用编码器-解码器 (Encode-Decode) 结构的模型非常热门,是因为它在许多领域较其他的传统模型方法都取得了更好的结果。这种结构的模型通常将输入序列编码成一个固定长度的向量表示,对于长度较短的输入序列而言,该模型能够学习出对应合理的向量表示。然而,这种模型存在的问题在于:当输入序列非常长时,模型难以学到合理的向量表示。这个问题限制了模型的性能,尤其当输入序列比较长时,模型的性能会变得很差。解决方法是将encoder的历史状态视作随机读取内存,这样不仅增加了源语言的维度,而且增加了记忆的持续时间(LSTM只是短时记忆)。
1.Attention机制
Attention机制的基本思想是,打破了传统编码器-解码器结构在编解码时都依赖于内部一个固定长度向量的限制。
Attention机制的实现是通过保留LSTM编码器对输入序列的中间输出结果,然后训练一个模型来对这些输入进行选择性的学习并且在模型输出时将输出序列与之进行关联。
更为通俗的一种解释是,attention机制就是将encoder的每一个隐藏状态设定一个权重,根据权重的不同决定decoder输出更侧重于哪一个编码状态。
下面直接上图来看看attention机制的流程。
约定encoder hidden states:h1,h2,…,hn; 第t时刻decoder hidden state:St;
- 由encoder hidden states和decoder hidden state 计算每个encoder状态对应的attention score Et
2.将Et softmax化后得到attention分布
a t = ∑ i = 1 N α i t h i ∈ R h \boldsymbol{a}_t=\sum_{i=1}^N\alpha_i^t\boldsymbol{h}_i\in\mathbb{R}^h at=∑i=1Nαithi∈Rh
3.将attention分布与encoder hidden state 相乘后相加得到attention vector
a t = ∑ i = 1 N α i t h i ∈ R h \boldsymbol{a}_t=\sum_{i=1}^N\alpha_i^t\boldsymbol{h}_i\in\mathbb{R}^h at=∑i=1Nαithi∈Rh
4.将attention vector与decoder hidden state 作为输入计算得出输出
Attention机制的本质思想
上面是一个attention结合在seq2seq模型中的应用,如果把它从上述例子中剥离出来,并做进一步抽象,可以更容易看懂Attention机制的本质思想。如下图所示
将source中的构成元素想像成一系列的(key,value)数据对构成,对于某个给定的Query,我们去计算Query和各个Key之间的相关性,得到每个key对应value的权重系数,然后对value进行加权求和,即最终的attention score。所以从上面分析可以看出,attention机制本质上就是一个加权求和的过程:
A
t
t
e
n
t
i
o
n
(
Q
u
e
r
y
,
S
o
u
r
c
e
)
=
∑
i
=
1
L
x
S
i
m
i
l
a
r
i
t
y
(
Q
u
e
r
y
,
K
e
y
i
)
∗
V
a
l
u
e
i
Attention(Query,Source)=\sum\limits_{i=1}^{L_x}Similarity(Query,Key_i)*Value_i
Attention(Query,Source)=i=1∑LxSimilarity(Query,Keyi)∗Valuei
关于求Query和Key之间相关性的方法,文献中给出有几种:
点积: S i m i l a r i t y ( Q u e r y , K e y i ) = Q u e r y ⋅ K e y i Similarity(Query,Key_{i})=Query\cdot Key_{i} Similarity(Query,Keyi)=Query⋅Keyi
Cosine相似性: S i m i l a r i t y ( Q u e r y , K e y i ) = Q u e r y ⋅ K e y i ∣ ∣ Q u e r y ∣ ∣ ⋅ ∣ ∣ K e y i ∣ ∣ \mathbf{Similarity}(\mathbf{Query},Key_i)=\frac{\mathbf{Query}\cdot Key_i}{||Query||\cdot||\mathbf{Key}_i||} Similarity(Query,Keyi)=∣∣Query∣∣⋅∣∣Keyi∣∣Query⋅Keyi
MLP网络: S i m i l a r i t y ( Q u e r y , K e y i ) = M L P ( Q u e r y , K e y i ) \mathbf{Similarity}(\mathbf{Query},Key_i)=\mathbf{MLP}(\mathbf{Query},Key_i) Similarity(Query,Keyi)=MLP(Query,Keyi)
Attention的各种类型
Soft Attention VS Hard Attention
来自论文
Soft Attention就是我们平时常用的attention
Hard Attention是随机的,它会依概率S来采样输入端的隐状态一部分来计算,而不是整个encoder的隐状态。因此它不能直接求导反向传播
Global attention VS local attention
来自论文【Effective Approaches to Attention-based Neural Machine Translation】
global attention就是我们平时所说的attention
local attention提出是为了解决global attention需要attend所有输入导致的计算复杂问题,在attend时只选择encoder中的一部分来做attention。Local Attention可以认为是介于Soft Attention和Hard Attention之间的一种Attention方式,即把两种方式结合起来。首先定义一个位置对齐向量(aligned position)pt,然后根据pt从source中选定窗口为D的输入做attention
p
t
=
S
⋅
sigmoid
(
v
p
⊤
tanh
(
W
p
h
t
)
)
,
a
t
(
s
)
=
align
(
h
t
,
h
ˉ
s
)
exp
(
−
(
s
−
p
t
)
2
2
σ
2
)
\begin{aligned}p_t&=S\cdot\text{sigmoid}(v_p^\top\tanh(W_ph_t)),\\\\a_t(s)&=\text{align}(h_t,\bar{h}_s)\exp\left(-\frac{(s-p_t)^2}{2\sigma^2}\right)\end{aligned}
ptat(s)=S⋅sigmoid(vp⊤tanh(Wpht)),=align(ht,hˉs)exp(−2σ2(s−pt)2)
Multi-dimensional Attention
Hierarchical Attention
层次attention,顾名思义,就是模型框架中包含有多个attention机制。可以参考【论文复现】Hierarchical Attention Networks for Document Classification:https://blog.csdn.net/Kaiyuan_sjtu/article/details/85065962,文中就是采用了这种Hierarchical Attention机制。首先是一个word-level的attention获取句子表示,之后是一个sentence-level的attention获取文章表示,最后接一个softmax进行文章的分类。
Self-Attention
Self-Attention即在朴素Attention机制中满足条件Q=K=V,例如输入一个句子,那么Self-Attention就是句子中的每个词都要和其他词做attention,这样就可以学习句子内部词的依赖关系,捕获句子内部结构。具体可以参考attention is all you need一文。
个词都要和其他词做attention,这样就可以学习句子内部词的依赖关系,捕获句子内部结构。具体可以参考attention is all you need一文。
具体详细内容可见:https://mp.weixin.qq.com/s/CftkSOmAx0UTtCixdxj6_A