First published on indexfziq.github.io at 2019-03-08 14:00:00
Introduction
本文出自Baidu NLP Research ,在MS MARCO的V1版本上是第二;V2版本上QA任务是第三,well-formed任务是第二。代码没公开,基本的思想就是提出两个辅助任务,辅助抽取更好的答案片段。
Motivation
这篇文章的动机很直接,文章对数据进行分析,提出一种假设:正确的答案往往在10个摘要中出现频率高,且具有很大的相似性;然后错误的答案通常和其他答案不一样。
Contribution
实现了一个端到端的模型,每篇文章抽取的片段之间相互监督,再算一个相似度作为验证模块,对片段的内容再做一个分析,应用多任务学习使得抽取的片段更好。
Model
下面对模型详细介绍,最主要的是Answer Content Modeling和Cross-Passage Answer Verification,其他的地方和其他模型大同小异。
Overview
整个模型是End-to-End的,输入是Question和Passages,输出是Answer,也就是抽取的span,所以说,这应该是抽取式模型里效果最好的了。
Question and Passage Modeling
把每一个token的Glove word embedding和character embedding串起来,然后过BiLSTM得到每一个sequence的表示,公式如下:
U
t
Q
=
B
i
L
S
T
M
Q
(
u
t
−
1
Q
,
[
e
t
Q
,
c
t
Q
]
)
U_t^Q = BiLSTM_Q(u_{t-1}^Q,[e^Q_t,c^Q_t])
U t Q = B i L S T M Q ( u t − 1 Q , [ e t Q , c t Q ] )
U
t
P
i
=
B
i
L
S
T
M
P
(
u
t
−
1
P
i
,
[
e
t
P
i
,
c
t
P
i
]
)
U_t^{P_i} = BiLSTM_P(u_{t-1}^{P_i},[e^{P_i}_t,c^{P_i}_t])
U t P i = B i L S T M P ( u t − 1 P i , [ e t P i , c t P i ] ) 得到表示之后,采用BiDAF计算相似度的方式:
S
t
P
i
=
u
t
Q
⊺
⋅
u
t
P
i
S_{t}^{P_i}={u^Q_t}\intercal \cdot u^{P_i}_t
S t P i = u t Q ⊺ ⋅ u t P i ,然后再喂给BiLSTM得到Matching之后的Passages表示
V
t
P
V_t^P
V t P :
V
t
P
i
=
B
i
L
S
T
M
Q
(
v
t
−
1
P
i
,
S
t
P
i
)
V_t^{P_i} = BiLSTM_Q(v_{t-1}^{P_i},S_{t}^{P_i})
V t P i = B i L S T M Q ( v t − 1 P i , S t P i )
Answer Boundary Prediction
该模块对每个Passage都抽取答案片段,具体的就是指针网络,输入是
V
t
P
V_t^P
V t P ,输出是span两端的概率,公式如下:
g
k
t
=
w
1
a
⊺
t
a
n
h
(
W
2
a
[
V
t
P
,
h
t
−
1
a
]
)
g_k^t = {w^a_1}\intercal tanh(W_2^a[V_t^P,h^a_{t-1}])
g k t = w 1 a ⊺ t a n h ( W 2 a [ V t P , h t − 1 a ] )
a
k
t
=
e
x
p
(
g
k
t
)
/
∑
j
=
1
∣
p
∣
e
x
p
(
g
k
j
)
a_k^t=exp(g_k^t)/\sum\nolimits_{j=1}^{|p|}exp(g_k^j)
a k t = e x p ( g k t ) / ∑ j = 1 ∣ p ∣ e x p ( g k j )
c
t
=
∑
j
=
1
∣
p
∣
a
k
t
V
t
P
c_t=\sum\nolimits_{j=1}^{|p|}a_k^t V_t^P
c t = ∑ j = 1 ∣ p ∣ a k t V t P
h
a
t
=
L
S
T
M
(
h
a
t
−
1
,
c
t
)
h_a^t=LSTM(h_a^{t-1},c_t)
h a t = L S T M ( h a t − 1 , c t ) 这部分的输出是片段起始位置和终止位置的
a
k
t
a_k^t
a k t ,对于指针网络的详细计算参见Match-LSTM。
Answer Content Modeling
该模块尝试对Passage的内容进行建模,也就是本文的动机:越正确的答案,出现频率越高,且具有很大的相似性;错误的答案通常和其他答案不一样。因此,输入是
V
t
P
V_t^P
V t P ,过ReLU和sigmoid函数,对每个passage的内容加一个门控,算出来的权重
p
k
c
p^c_k
p k c :
p
k
c
=
s
i
g
m
o
i
d
(
W
1
c
⊺
R
e
L
U
(
W
2
c
V
t
P
)
)
p^c_k = sigmoid({W_1^c}\intercal ReLU(W_2^cV_t^P))
p k c = s i g m o i d ( W 1 c ⊺ R e L U ( W 2 c V t P ) ) 最后该模块会算一个综合考虑所有token的Passage表示(加权求和),增强了内容相似度分数更高的Passage表示,文中称之为Answer Content:
r
A
i
=
1
P
i
∑
k
=
1
∣
p
i
∣
p
k
c
[
e
k
P
i
,
c
k
P
i
]
r^{A_i}=\frac{1}{P_i}\sum\nolimits_{k=1}^{|p_i|}p_k^c[e_k^{P_i},c_k^{P_i}]
r A i = P i 1 ∑ k = 1 ∣ p i ∣ p k c [ e k P i , c k P i ] 然后将此用于计算下一部分的答案验证。
Cross-Passage Answer Verification
该模块输入每个passage的Answer Content,过Attention Pooling,综合考虑所有的passage,相互比较一下,最后用类似于Dual Attention的方式叠加,算出最终的得分:
s
i
,
j
=
{
0
if i=j
r
A
i
⊺
⋅
r
A
j
otherwise
s_{i,j}= \begin{cases} 0& \text{if i=j}\\ {r^{A_i}}\intercal \cdot r^{A_j}& \text{otherwise} \end{cases}
s i , j = { 0 r A i ⊺ ⋅ r A j if i=j otherwise
a
i
,
j
=
e
x
p
(
s
i
,
j
)
/
∑
k
=
1
n
e
x
p
(
s
i
,
k
)
a_{i,j}=exp(s_{i,j})/\sum\nolimits_{k=1}^{n}exp(s_{i,k})
a i , j = e x p ( s i , j ) / ∑ k = 1 n e x p ( s i , k )
r
~
A
i
=
∑
j
=
1
n
a
i
,
j
r
A
j
\tilde{r}^{A_i}=\sum\nolimits_{j=1}^{n}a_{i,j}{r}^{A_j}
r ~ A i = ∑ j = 1 n a i , j r A j 得到attention权重化的答案内容的表示,和每一个篇章各自的答案内容做点积和串联操作,得到打分,归一化后就得到对每一个抽取的答案的概率分布
p
y
i
v
p^v_{y_i}
p y i v 并输出,运算关系如下:
g
i
v
=
w
v
⊺
[
r
A
j
,
r
~
A
i
,
r
A
j
⊙
r
~
A
i
]
g_i^v={w^v}\intercal [r^{A_j},\tilde{r}^{A_i},r^{A_j}\odot\tilde{r}^{A_i}]
g i v = w v ⊺ [ r A j , r ~ A i , r A j ⊙ r ~ A i ]
p
i
v
=
e
x
p
(
g
v
,
i
)
/
∑
j
=
1
n
e
x
p
(
g
v
,
j
)
p^v_i=exp(g_{v,i})/\sum\nolimits_{j=1}^{n}exp(g_{v,j})
p i v = e x p ( g v , i ) / ∑ j = 1 n e x p ( g v , j )
Training
模型的Loss由三部分组成,Model部分也介绍了每部分的输出,Multi-Loss如下:
L
b
o
u
n
d
a
r
y
=
−
1
N
∑
i
=
1
N
(
l
o
g
α
y
i
1
1
+
l
o
g
α
y
i
1
2
2
)
L_{boundary}=-\frac{1}{N}\sum_{i=1}^{N}(log{\alpha}^1_{y_i^1}+log{\alpha}^2_{y_i^12})
L b o u n d a r y = − N 1 i = 1 ∑ N ( l o g α y i 1 1 + l o g α y i 1 2 2 )
L
c
o
n
t
e
n
t
=
−
1
N
1
∣
P
∣
∑
i
=
1
N
∑
j
=
1
∣
P
∣
(
y
k
c
l
o
g
p
k
c
+
(
1
−
y
k
c
)
l
o
g
(
1
−
p
k
c
)
)
L_{content}=-\frac{1}{N}\frac{1}{|P|}\sum_{i=1}^{N}\sum_{j=1}^{|P|}(y_k^clog{p}^c_k+(1-y_k^c)log(1-{p}^c_k))
L c o n t e n t = − N 1 ∣ P ∣ 1 i = 1 ∑ N j = 1 ∑ ∣ P ∣ ( y k c l o g p k c + ( 1 − y k c ) l o g ( 1 − p k c ) )
L
v
e
r
i
t
y
=
−
1
N
∑
i
=
1
N
l
o
g
p
y
i
v
v
L_{verity}=-\frac{1}{N}\sum_{i=1}^{N}log{p}^v_{y_i^v}
L v e r i t y = − N 1 i = 1 ∑ N l o g p y i v v 综上:
L
=
L
b
o
u
n
d
a
r
y
+
β
1
L
c
o
n
t
e
n
t
+
β
2
L
v
e
r
i
t
y
L=L_{boundary}+\beta_1{L_{content}}+\beta_2{L_{verity}}
L = L b o u n d a r y + β 1 L c o n t e n t + β 2 L v e r i t y 最后两项损失的系数在实验部分设置的是
0.5
0.5
0 . 5 ,优化器使用的是Adam。
Experiment
在MAMARCO第一版上很接近人类水平,也就是说抽取式模型对数据集的处理就可以了,也从另一个方面说明有点违背了MARCO的本意,与其他模型的对比,评测指标是BLEU-1和ROUGE-L: 下图是在DuReader上的结果,中文的生成式阅读理解数据集,评测指标是BLEU-4和ROUGE-L:
Analysis
本文对自己提出的Answer Content和Verify部分进行了分析,发现综合打分的作用对一些case是有效果的,比如: 并且从下图也可以看出,span部分的Answer Content概率分布与起止位置的点很吻合: 去除实验部分,感觉都同等重要,就没有放上来。
Conclusion
通过分析,可以发现对抽出来的答案进行进一步的内容计算和验证,然后用Multi-Loss进行联合训练,是有助于抽取的片段更加准确,但是这仍不是MARCO的初衷,还是extrative MRC。因此,多任务学习还是适用性比较强的,未来MARCO的工作应该更多地向生成式发展。
References
Multi-Passage Machine Reading Comprehension with Cross-Passage Answer Verification. Yizhong Wang, Kai Liu, Jing Liu, Wei He, Yajuan Lyu, Hua Wu, Sujian Li and Haifeng Wang. ACL 2018.
MAMARCO leaderboard: http://www.msmarco.org/leaders.aspx
https://github.com/IndexFziQ/MSMARCO-MRC-Analysis .