简介
这篇论文发表时间比较近,比较全面地总结了Match-LSTM、R-Net等众多前人模型的优缺点,并做了很好的改进,如:增加编码层能力,解决长距离上下文信息,提炼预测答案片段,直接优化评价函数等,在SQuAD数据库上取得了State-Of-Art的效果。
PyTorch实现:https://github.com/laddie132/Match-LSTM
前人的很多模型都具有一个共同的网络框架,即“encoder-interaction-pointer”。首先是将问题和段落的单词序列利用RNN网络编码为向量,接着利用Attention机制捕捉问题和段落之间的关系,最后利用指针网络预测答案的界限。
但是,这种框架具有很明显的缺点:
- 编码层,可能缺失部分词汇、句法信息,如词性、命名实体等都十分有用
- 交互层,使用LSTM或者GRU仍然无法全部捕捉长距离的上下文信息
- 指针层,a.多个候选答案无法处理,b.答案过长,过复杂无法清晰定义边界
该文提出以下解决方案:
- 编码层融入词汇、句法特征:是否完全匹配、词性POS、实体标签NER、问题类别
- 交互层增加passage的自对齐,即passage和passage做Attention,获得fully-aware context representation(这个有点类似R-NET的self-matching机制)
- 设计了一种基于记忆的答案抽取网络,可以持续增加阅读知识的同时,不断提取答案片段
- 训练时,结合极大似然估计的交叉熵损失函数和强化学习中的奖励机制
模型
富特征编码层
一个特征向量主要包括三部分:word-level、character-level和额外特征
混合编码
使用BiLSTM分别对段落和问题做word-level和character-level编码,得到向量 x w x_w xw和 x c x_c xc,拼接为 x = [ x w ; x c ] x=[x_w;x_c] x=[xw;xc]
额外特征
- 完全匹配(EM)特征:描述问题中的词语是否存在于段落中,或者段落中词语是否存在于问题中
- POS、NER:可以用查字典的方式得到每一个词语的标签,并追加到问题和段落向量中
- 问题类型:主要有“what, how, who, when, which, where, why, be, other”等,将类别标签表示为一个向量,只追加到问题向量中
处理完,获得了一个问题向量 { x ~ i q } i = 1 n \{\tilde{x}_i^q\}_{i=1}^n {x~iq}i=1n,和段落向量 { x ~ j c } j = 1 m \{\tilde{x}_j^c\}_{j=1}^m {x~jc}j=1m
编码
使用两个BiLSTM网络编码,如下:
这样一来,可以得到问题描述:
Q
′
=
{
q
i
}
i
=
1
n
Q^{'}=\{q_i\}_{i=1}^n
Q′={qi}i=1n,段落描述:
C
′
=
{
c
j
}
j
=
1
m
C^{'}=\{c_j\}_{j=1}^m
C′={cj}j=1m
迭代对齐层
之所以成为迭代,是因为采用了多跃点机制,相当于将一个aligner封装为一个unit,将该unit水平维度上依次连接,起到迭代的效果,迭代次数为T
对齐
在第t个hop中,问题和段落联合attention向量 B i j t = q i T ⋅ c ˇ j t − 1 B_{ij}^t=q_i^T \cdot \check{c}_j^{t-1} Bijt=qiT⋅cˇjt−1,其中, c ˇ j t − 1 \check{c}_j^{t-1} cˇjt−1表示上一个hop的输出中第j个段落单词表示,初始值 c ˇ j 0 = c j \check{c}_j^0=c_j cˇj0=cj。
从该公式中,也能看出若干个hop依次连接。变量 B i j t B_{ij}^t Bijt即表示了问题中第i个单词与段落中第j个单词的关联程度。
用
b
j
t
b_j^t
bjt表示段落中第j个单词在问题上attention分布的归一化向量,
{
q
~
j
t
}
j
=
1
m
\{\tilde{q}_j^t\}_{j=1}^m
{q~jt}j=1m,表示每一个段落单词的问题attention向量,如下所示:
一般情况下,论文计算到这块就已经完成了问题和段落的关联表示,即quare-aware context representation,但该文将上一个hop输出的段落表示
c
ˇ
j
t
−
1
\check{c}_j^{t-1}
cˇjt−1和这个attention向量结合起来,具体方法使用了一种语义融合单元(semantic fusion unit)。
语义融合单元(Semantic Fustion Unit)
这是该文的一个创新点,提出了一种新的向量融合方法,下面我们剖析公式可以发现,实质上还是一种门机制的引入。
单元接受一个输入向量
r
r
r和一个待融合向量集合
{
f
i
}
i
=
1
k
\{f_i\}_{i=1}^k
{fi}i=1k,输出一个向量
o
o
o,如下:
自对齐机制
前面是将段落与问题利用attention机制进行对齐关联,这里为了获取到段落中更长距离的依存信息,将段落与段落自身进行对齐关联,
该方法在MSRA论文R-NET中也有使用,读者可参考。
与上文相似,首先计算一个联合Attention向量
B
ˇ
i
j
t
\check{B}_{ij}^t
Bˇijt,如下:
这里,如果
i
=
=
j
i==j
i==j,即相同位置,则关联度设置为0;之后,仍然按照上述方法计算注意力段落向量
{
c
~
j
t
}
j
=
1
m
\{\tilde{c}_j^t\}_{j=1}^m
{c~jt}j=1m;然后,还会包括一个SFU单元与之前的quare-aware context representation
c
ˉ
j
t
\bar{c}_j^t
cˉjt进行向量融合,得到一个self-aware context representation
c
^
j
t
\hat{c}_j^t
c^jt
收集
每一个hop的最后,都会有一个收集单元,主要用于捕捉段落中的短距离信息。结构可以直接套用之前的编码层结构,即一个BiLSTM层。输入为之前自对齐产生的self-aware context representation向量,输出为fully-aware context representation c ˇ j t \check{c}_j^t cˇjt。
基于记忆的答案指针层
由于使用SQuAD数据库,答案只需要指定起始位置和终止位置即可。
这个层仍然使用multi-hop机制,包含L个hops。在第l个hop,输入fully-aware context representation
c
ˇ
i
t
\check{c}_i^t
cˇit和起始位置记忆向量
z
s
l
z_s^l
zsl,生成起始位置的概率分布
p
s
l
p_s^l
psl,如下:
其中,FN指前向神经网络。记忆向量
z
s
l
z_s^l
zsl初始化使用一个问题相关的向量,实验中发现,直接使用问题编码层最后一个隐含层状态向量效果最好,即
q
⃗
\vec{q}
q。之后会利用上一个hop进行更新。
有了起始位置的概率分布
p
s
l
p_s^l
psl,可以得到一个evidence向量
u
s
l
=
C
^
T
⊙
p
s
l
u_s^l=\hat{C}^T \odot p_s^l
usl=C^T⊙psl描述,包含了当前起始位置预测的信息,将它和之前的起始位置记忆向量
z
s
l
z_s^l
zsl做融合,得到终止位置记忆向量
z
e
l
=
S
F
U
(
z
s
l
,
u
s
l
)
z_e^l=SFU(z_s^l,u_s^l)
zel=SFU(zsl,usl)。之后,和得到起始位置概率分布的方法相同:
这里得到
p
e
l
p_e^l
pel即代表终止位置概率分布,仍然按照相同方法得到一个evidence向量
u
e
l
=
C
^
T
⊙
p
e
l
u_e^l=\hat{C}^T \odot p_e^l
uel=C^T⊙pel,这个向量最后会输入到下一个hop中,当做起始位置记忆向量
z
s
l
+
1
z_s^{l+1}
zsl+1。
如此一次迭代若干个hop。
训练步骤
极大似然估计
之前诸如match-LSTM等论文中都采用了对数损失函数,即极大似然估计的方法,公式如下:
局限性:
- 这种函数以优化完全匹配(EM)为目标,无法直接提升F1分数
- 另外,算法不稳定,在问题答案较长,边界模糊时候,无法正确划分。因此,很难解决“为什么”类型问题
强化学习
将原评价指标中的F1分数作为强化学习的奖励函数,设计损失函数如下:
为了保证训练稳定性以及防止早期过拟合,该文将之前的MLE方法和RL方法结合起来,即同时优化EM和F1值,有了如下的损失函数:
实验结果
在SQuAD中取得了State-Of-Art的效果,如下: