版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014665013/article/details/87610047
又是一篇之前读的paper,最近把之前读的paper整理整理…
今天的主角又是在斯坦福的SQuAD的基础上,虽然是一篇比较早的文章,但是该文章是第一个在SQuAD上实现的端到端的神经网络(end-end),对于入门attention,QA的小伙伴来说还是很不错的~
前言
SQuAD 是由 Rajpurkar 等人提出的一个最新的阅读理解数据集。该数据集:
包含 10 万个(问题,原文,答案)三元组(500多篇文章,2万多个段落,10万个问题);
原文来自于 536 篇维基百科文章,而问题和答案的构建主要是通过众包的方式,让标注人员提出最多 5 个基于文章内容的问题并提供正确答案,且答案出现在原文中。每个问题3人标注,降低了人工标注误差
SQuAD 和之前的完形填空类阅读理解数据集如CNN/DM,CBT等最大的区别在于:SQuAD 中的答案不再是单个实体或单词,而可能是一段短语,这使得其答案更难预测。
SQuAD 包含公开的训练集和开发集,以及一个隐藏的测试集,其采用了与 ImageNet 类似的封闭评测的方式,研究人员需提交算法到一个开放平台,并由 SQuAD 官方人员进行测试并公布结果。
几乎所有做 SQuAD 的模型都可以概括为同一种框架:Embed 层,Encode 层,Interaction 层和 Answer 层 。
Embed 层负责将原文和问题中的 tokens 映射为向量表示;
Encode 层主要使用 RNN 来对原文和问题进行编码,这样编码后每个 token 的向量表示就蕴含了上下文的语义信息;、
Interaction 层是大多数研究工作聚焦的重点,该层主要负责捕捉问题和原文之间的交互关系,并输出编码了问题语义信息的原文表示,即 query-aware 的原文表示;
最后 Answer 层则基于 query-aware 的原文表示来预测答案范围。
QA 系统基本框架
1.模型概述
Match-LSTM模型的输入由两部分组成:段落(passage)和问题(question)。passage使用一个矩阵P[d * P]表示,其中d表示词向量维度大小,P表示passage中tokens的个数;question使用矩阵Q[d * Q]表示,其中Q表示question中tokens的个数。
Match-LSTM模型的输出即问题的答案有两种表示方法:
其一是使用一系列整数数组
a
=
(
a
1
,
a
2
,
…
)
a = (a1, a2,…)
a = ( a 1 , a 2 , … ) ,其中
a
i
a_i
a i 是
[
1
,
P
]
[1, P]
[ 1 , P ] 中的一个整数,表示在段落中某个token具体的位置,这里的整数数组不一定是连续的,对应Sequence Model ;
第二种表示方法是假设答案是段落中一段连续的token组合,即仅使用两个整数来表示答案
a
=
(
a
s
,
a
e
)
a = (a_s, a_e)
a = ( a s , a e ) ,
a
s
a_s
a s 表示答案在段落中开始的位置,
a
e
a_e
a e 则表示结束位置,
a
s
a_s
a s 和
a
e
a_e
a e 是
[
1
,
P
]
[1, P]
[ 1 , P ] 中的整数,对应Boundary Model 。
故对Match-LSTM模型的训练集样本来说,其可用下面的三维数组来表示:
(
P
n
,
Q
n
,
a
n
)
n
=
1
N
{(P_n,Q_n,a_n)}^N_{n=1}
( P n , Q n , a n ) n = 1 N
总结一下,在模型实现上,Match-LSTM 的主要步骤如下:
(1) LSTM预处理层 (LSTM preprocessing Layer):
Embed 层使用词向量表示原文和问题;
Encode 层使用单向 LSTM 编码原文和问题 embedding;
(2) match-LSTM层 (Match-LSTM Layer):匹配原文和问题
Interaction层对原文中每个词,计算其关于问题的注意力分布,并使用该注意力分布汇总问题表示,将原文该词表示和对应问题表示输入另一个 LSTM编码,得到该词的 query-aware 表示;
在反方向重复步骤 2,获得双向 query-aware 表示;
(3) Ans-Ptr层 (Answer Pointer(Ans-Ptr) Layer):从原文中选取答案
Answer 层基于双向 query-aware 表示使用Sequence Model 或 Boundary Model预测答案范围。其中:
序列模型(Sequence Model):使用Ptr-Net网络,不做连续性假设,预测答案存在与原文的每一个位置
边界模型(Boundary Mode):直接使用Ptr-Net网络预测答案在原文中起始和结束位置
模型结构图:
简单的说:带着问题去阅读原文,然后用得到的信息去回答问题:
先利用LSTM阅读一遍passage,得到输出的encoding 序列。
然后带着question的信息,重新将passage的每个词输入LSTM,再次得到passage的encoding信息。但是这次的输入不仅仅只有passage的信息,还包含这个词和question的关联信息,它和question的关联信息的计算方式就是我们在seq2seq模型里面最常用的attention机制。
最后将信息输入answer模块,生成答案。
2.LSTM preprocessing Layer
LSTM preprocessing Layer的目的是将token的上下文信息包含到passage和question中的每个token的向量表示中。分别将passage和question输入LSTM preprocessing Layer,直接使用单向LSTM,故而每一个时刻的隐含层向量输出只包含左侧上下文信息.
经过LSTM preprocessing Layer后,passage和question表示如下矩阵:
(2-1)
H
p
=
L
S
T
M
→
(
P
)
H
q
=
L
S
T
M
→
(
Q
)
H^{p}=\overrightarrow{LSTM}(P) \quad H^{q}=\overrightarrow{LSTM}(Q) \tag {2-1}
H p = L S T M
( P ) H q = L S T M
( Q ) ( 2 - 1 )
其中
H
p
H^p
H p 是passage的向量矩阵表示,其大小为
[
l
∗
P
]
[l * P]
[ l ∗ P ] ,
l
l
l 表示隐藏层的节点个数;
H
q
H^q
H q 是question的向量矩阵表示,其大小为
[
l
∗
Q
]
[l * Q]
[ l ∗ Q ] 。
3.match-LSTM
在文本蕴含任务中,输入一个文本对,假设句T和蕴含句H,这里将question当做T,passage当做H。下面是match-LSTM的构建,实质上就是一个attention机制。
(3-1)
G
i
→
=
tanh
(
W
q
H
q
+
(
W
p
h
i
p
+
W
r
h
i
−
1
r
→
+
b
p
)
⊗
e
Q
)
\overrightarrow{G_{i}}=\tanh(W^qH^q+(W^ph^p_i+W^r\overrightarrow{h_{i-1}^r} + b^p) \otimes e_{Q}) \tag{3-1}
G i
= tanh ( W q H q + ( W p h i p + W r h i − 1 r
+ b p ) ⊗ e Q ) ( 3 - 1 )
(3-2)
α
i
→
=
s
o
f
t
m
a
x
(
w
T
G
i
→
+
b
⊗
e
Q
)
\overrightarrow{\alpha_i}=softmax(w^T\overrightarrow{G_i} + b \otimes e_Q) \tag{3-2}
α i
= s o f t m a x ( w T G i
+ b ⊗ e Q ) ( 3 - 2 ) 其中:
W
q
,
W
p
,
W
r
ϵ
R
l
∗
l
,
b
p
,
w
ϵ
R
l
∗
1
a
n
d
b
ϵ
R
W^q,W^p,W^r \epsilon \mathbb{R} ^{\color {red}{l*l} },b^p,w \epsilon \mathbb{R} ^{\color {red}{l*1} } and b \epsilon \mathbb{R}
W q , W p , W r ϵ R l ∗ l , b p , w ϵ R l ∗ 1 a n d b ϵ R ,这都是需要训练的参数。
G
i
→
ϵ
R
l
∗
Q
\overrightarrow{G_{i}} \epsilon \mathbb{R}^{\color {red}{l*Q}}
G i
ϵ R l ∗ Q 是attention时的中间结果,表示passage中第i个词和query中每个词的交互信息(对应的每一列对应query中每一个词); 其维度变化过程为:[l Q] = [l l] [l Q] + ([l l] [l 1] + [l l] [l 1] + [l 1]) |Q|
α
i
→
\overrightarrow{\alpha_i}
α i
是attention计算出来的权重,表示在passage的第i个token对question中每个词的注意力权重向量。 其维度变化过程为:[1 Q] = ([1 l] [l Q] + 1 * |Q|)
h
i
−
1
r
→
ϵ
R
l
∗
1
\overrightarrow{h_{i-1}^r} \epsilon \mathbb{R}^{l*1}
h i − 1 r
ϵ R l ∗ 1 表示mathch-LSTM中,第
i
−
1
i-1
i − 1 个token的隐藏层输出,计算方式如下公式(3-4)
x
⊗
e
Q
x\otimes e_Q
x ⊗ e Q 表示将x复制
e
Q
e_Q
e Q 次,公式中同理
上式中公式3-1,3-2这种 attention 被称为 BahdanauAttention。 Passage 中第 t 个上下文向量会根据 所有 Question 的隐向量 & Passage 中 t-1 时刻的上下文向量 来确定对Question 每个 token 的权重。可以把下图的 Y 理解为 passage,把 X 理解为question。
这里可以针对passage每一个词语输出一个
α
i
→
\overrightarrow{\alpha_i}
α i
向量,这个向量维度是question词长度,故而这种方法也叫做question-aware attention passage representation。
下面将attention向量(
α
i
→
\overrightarrow{\alpha_i}
α i
)与原query编码向量(
H
Q
H^Q
H Q )点乘,得到passage中第i个token的question关联信息,再与passage中第i个token的编码向量做concat,粘贴为一个向量
z
i
→
\overrightarrow{z_i}
z i
,然后输出到LSTM网络中。
(3-3)
z
i
→
=
[
h
i
p
H
Q
α
i
T
→
]
\overrightarrow{z_i}=[\begin{matrix} h_i^p\\ H^Q\overrightarrow{\alpha_i^T} \end{matrix}] \tag{3-3}
z i
= [ h i p H Q α i T
] ( 3 - 3 )
(3-4)
h
i
r
→
=
L
S
T
M
→
(
z
i
→
,
h
i
−
1
r
→
)
\overrightarrow{h_i^r}=\overrightarrow{LSTM}(\overrightarrow{z_i}, \overrightarrow{h_{i-1}^r}) \tag{3-4}
h i r
= L S T M
( z i
, h i − 1 r
) ( 3 - 4 ) 其中
H
q
ϵ
R
l
∗
Q
a
n
d
α
i
→
ϵ
R
1
∗
Q
a
n
d
h
i
p
ϵ
R
l
∗
1
a
n
d
z
i
→
ϵ
R
2
l
∗
1
a
n
d
h
i
r
→
ϵ
R
2
l
∗
1
H^q \epsilon \mathbb{R}^{\color {red} {l*Q}} and \overrightarrow{\alpha_i} \epsilon \mathbb{R}^{\color {red}{1*Q}} and h^p_i \epsilon \mathbb{R}^{\color {red}{l*1}} and \overrightarrow{z_i} \epsilon \mathbb{R}^{\color {red}{2l*1}} and \overrightarrow{h_i^r} \epsilon \mathbb{R}^{\color {red}{2l*1}}
H q ϵ R l ∗ Q a n d α i
ϵ R 1 ∗ Q a n d h i p ϵ R l ∗ 1 a n d z i
ϵ R 2 l ∗ 1 a n d h i r
ϵ R 2 l ∗ 1 ,
H
Q
α
i
T
→
H^Q\overrightarrow{\alpha_i^T}
H Q α i T
是attention的结果。
这里所有的资料都写成了
L
S
T
M
→
(
z
i
→
,
h
i
−
1
r
→
)
\overrightarrow{LSTM}(\overrightarrow{z_i}, \overrightarrow{h_{i-1}^r})
L S T M
( z i
, h i − 1 r
) 的形式,但是熟悉lstm内部结构(可参考本博 )的应该知道,lstm需要的previous state是个tuple,也就是(
h
t
−
1
,
c
t
−
1
h_{t-1},c_{t-1}
h t − 1 , c t − 1 ),而这里只提到了
h
t
−
1
h_{t-1}
h t − 1 我觉得是因为attention只用到了
h
t
−
1
h_{t-1}
h t − 1 ,但是公式中只字未提
c
t
−
1
c_{t-1}
c t − 1 是不是有点缺乏严谨~~~(当然源码中用了state这个“tuple”而不只是
h
t
−
1
h_{t-1}
h t − 1 )
上述就是match-LSTM的标准结构,这里更进一步,为了捕捉到更丰富的上下文信息,再增加一个反向match-LSTM网络。基本结构同上。最终,只需要将正向match-LSTM输出的隐含层向量
H
r
→
\overrightarrow{H_r}
H r
和反向match-LSTM输出的隐含层向量
H
r
←
\overleftarrow{H_r}
H r
拼接起来即可。
(3-5)
H
r
=
[
H
r
→
H
r
←
]
H^r=[\begin{matrix} \overrightarrow{H_r}\\ \overleftarrow{H_r} \end{matrix}] \tag{3-5}
H r = [ H r
H r
] ( 3 - 5 ) 其中
H
r
→
,
H
r
←
ϵ
R
l
∗
P
a
n
d
H
r
ϵ
R
2
l
∗
P
\overrightarrow{H_r},\overleftarrow{H_r} \epsilon \mathbb{R}^{l*P} and H^r \epsilon \mathbb {R}^ {2l*P}
H r
, H r
ϵ R l ∗ P a n d H r ϵ R 2 l ∗ P
4.Answer Pointer Layer
将Match-LSTM Layer的输出
H
r
H^r
H r 作为这一层的输入。Match-LSTM 的 Answer Pointer Layer 层包含了两种预测答案的模式:
Sequence Model 将答案看做是一个整数组成的序列,每个整数表示选中的 token 在原文中的位置,因此模型按顺序产生一系列条件概率,每个条件概率表示基于上轮预测的 token 产生的下个 token 的位置概率,最后答案总概率等于所有条件概率的乘积。(其实有点怀疑这种方式产生的答案,人能读得懂吗?)
Boundary Model 简化了整个预测答案的过程,只预测答案开始和答案结束位置,相比于 Sequence Model 极大地缩小了搜索答案的空间,最后的实验也显示简化的 Boundary Model 相比于复杂的 Sequence Model 效果更好,因此 Boundary Model 也成为后来的模型用来预测答案范围的标配。
4.1.Sequence Model
序列模型不限定答案的范围,即可以连续出现,也可以不连续出现,因此需要输出答案每一个词语的位置。又因答案长度不确定,因此输出的向量长度也是不确定的,需要手动制定一个终结符。假设passage长度为P,则终结符为P+1。 pointer net网络,实质上仍然是一个attention机制的应用,只不过直接将attention向量作为匹配概率输出。
(4-1-1)
F
k
=
tanh
(
V
H
ˉ
r
+
(
W
a
h
k
−
1
a
+
b
a
)
⊗
e
p
+
1
)
F_k=\tanh(V \bar H^r+(W^a \mathbf h_{k-1}^a + b^a) \otimes e_{p+1}) \tag{4-1-1}
F k = tanh ( V H ˉ r + ( W a h k − 1 a + b a ) ⊗ e p + 1 ) ( 4 - 1 - 1 )
(4-1-2)
β
k
=
s
o
f
t
m
a
x
(
v
T
F
k
+
c
⊗
e
p
+
1
)
\beta_k=softmax (v^TF_k + c \otimes e_{p+1}) \tag{4-1-2}
β k = s o f t m a x ( v T F k + c ⊗ e p + 1 ) ( 4 - 1 - 2 ) 其中:
H
ˉ
r
ϵ
R
2
l
∗
(
P
+
1
)
\bar H^r \epsilon \mathbb{R}^{2l*(P+1)}
H ˉ r ϵ R 2 l ∗ ( P + 1 ) 是
H
r
H^r
H r 与0向量的concat,即
H
ˉ
r
=
H
r
:
0
]
\bar H^r=H^r:0]
H ˉ r = H r : 0 ]
F
k
ϵ
R
l
∗
(
p
+
1
)
,
h
k
−
1
a
ϵ
R
l
×
2
l
,
W
a
ϵ
R
l
×
l
,
v
ϵ
R
l
,
b
a
ϵ
R
l
,
c
ϵ
R
是
一
个
实
数
F_k \epsilon \mathbb{R}^{l*(p+1)},\mathbf h_{k-1}^a \epsilon \mathbb{R}^{l×2l} , W^a \epsilon \mathbb{R}^{l×l},v \epsilon \mathbb{R}^{l}, b^a \epsilon \mathbb{R}^{l}, c \epsilon \mathbb{R}是一个实数
F k ϵ R l ∗ ( p + 1 ) , h k − 1 a ϵ R l × 2 l , W a ϵ R l × l , v ϵ R l , b a ϵ R l , c ϵ R 是 一 个 实 数
这里的
h
k
−
1
a
h_{k-1}^a
h k − 1 a 来自:
h
k
a
=
L
S
T
M
→
(
H
ˉ
r
β
k
T
⎵
a
t
t
e
n
t
i
o
n
,
h
k
−
1
a
)
\mathbf h_k^a = \overrightarrow{\rm{LSTM}} ( \underbrace{\bar H^r \mathbf \beta_k^T}_{\color{blue}{\rm{attention}}}, \mathbf h_{k-1}^a)
h k a = L S T M
( a t t e n t i o n
H ˉ r β k T , h k − 1 a )
答案a第k个词对应passage位置为:
(4-1-3)
p
(
a
k
=
j
∣
a
1
,
a
2
,
.
.
.
,
a
k
−
1
,
H
r
)
=
β
k
,
j
p(a_k=j|a_1,a_2,...,a_{k-1},H^r)=\beta_{k,j} \tag{4-1-3}
p ( a k = j ∣ a 1 , a 2 , . . . , a k − 1 , H r ) = β k , j ( 4 - 1 - 3 )
也就是对于答案中的每个词
a
i
a_i
a i ,其产生过程是:
在P的末尾设置一个停止标记,如果选择它,则停止迭代。新的
H
ˉ
r
∈
R
(
m
+
1
)
×
2
h
\bar H^r \in \mathbb R^{(m+1) \times 2h}
H ˉ r ∈ R ( m + 1 ) × 2 h
先用上个状态中的隐状态输出
h
k
−
1
a
h^a_{k-1}
h k − 1 a 、match-lstm的输出结果
H
r
H^r
H r 做attention,产生
H
r
H^r
H r 的权重结果
β
k
\beta_k
β k ;并将
β
k
\beta_k
β k attention权重向量作为预测结果,用最大值的index作为k状态的答案输出
a
k
a_k
a k ,如果预测的index是P+1则停止,答案生成完毕;
将LSTM中的上一状态
h
k
−
1
a
h^a_{k-1}
h k − 1 a ,并用attention结果作为输入重新输入LSTM,得到当前状态隐状态
h
k
a
h^a_{k}
h k a
步骤二和步骤三循环,直到步骤二中预测的index是P+1,或者超出设置的超参数(答案最长长度)。
Sequence Model的模型评判计算公式如下:
(4-1-4)
p
(
a
∣
H
r
)
=
∏
k
p
(
a
k
∣
a
1
,
a
2
,
.
.
.
,
a
k
−
1
,
H
r
)
p(a|H^r)=\prod_k p(a_k|a_1,a_2,...,a_{k-1},H^r) \tag{4-1-4}
p ( a ∣ H r ) = k ∏ p ( a k ∣ a 1 , a 2 , . . . , a k − 1 , H r ) ( 4 - 1 - 4 ) 其中:
(4-1-5)
p
(
a
k
=
j
∣
a
1
,
a
2
,
.
.
.
,
a
k
−
1
,
H
r
)
=
β
k
,
j
p(a_k = j | a1,a2,...,a_{k−1},H_r) = β_{k,j} \tag{4-1-5}
p ( a k = j ∣ a 1 , a 2 , . . . , a k − 1 , H r ) = β k , j ( 4 - 1 - 5 ) 这里公式中的
p
(
a
k
∣
a
1
,
a
2
,
.
.
.
,
a
k
−
1
,
H
r
)
p(a_k|a_1,a_2,...,a_{k-1},H^r)
p ( a k ∣ a 1 , a 2 , . . . , a k − 1 , H r ) 表示的是最大的softmax值。
对上面公式4-1-4取对数函数,就得到了模型训练loss:
(4-1-6)
−
∑
n
−
1
N
log
p
(
a
n
∣
P
n
,
Q
n
)
-\sum_{n-1}^{N}\log p(a_n|P_n,Q_n) \tag{4-1-6}
− n − 1 ∑ N log p ( a n ∣ P n , Q n ) ( 4 - 1 - 6 )
4.2.Boundary Model
边界模型直接假设答案在passage中连续出现,因此只需要输出起始位置s和终止位置e即可。基本结构同Sequence Model,只需要将输出向量改为两个,并去掉终结符。那么同理loss定义为:
p
(
a
∣
H
r
)
=
p
(
a
s
∣
H
r
)
⋅
p
(
a
e
∣
a
s
,
H
r
)
p(\mathbf a \mid H^r) = p(a_s \mid H^r) \cdot p(a_e \mid a_s, H^r)
p ( a ∣ H r ) = p ( a s ∣ H r ) ⋅ p ( a e ∣ a s , H r ) Boundary Model的计算步骤可以根据上面修改为:
先用上个状态中的隐状态输出
h
k
−
1
a
h^a_{k-1}
h k − 1 a 、match-lstm的输出结果
H
r
H^r
H r 做attention,产生
H
r
H^r
H r 的权重结果
β
k
\beta_k
β k ;并将
β
k
\beta_k
β k attention权重向量作为预测结果,用最大值的index作为k状态的起始位置
a
s
a_s
a s 或者
a
k
a_k
a k ;
将LSTM中的上一状态
h
k
−
1
a
h^a_{k-1}
h k − 1 a ,并用attention结果作为输入重新输入LSTM,得到当前状态隐状态
h
k
a
h^a_{k}
h k a
步骤一和步骤二执行两次,得到
a
s
a_s
a s 和
a
k
a_k
a k 。
5.实验
模型参数设置:
隐藏层大小:150
优化方法:Adamax(β1 = 0.9,β2 = 0.999)
minibatch:30
没有用L2正则
最终结果:
6.源码解析
详见 QA系统Match-LSTM代码研读
参考网址