多跳阅读理解的认知图
Abstract
提出大规模
文档的多跳QA框架—CogQA。该框架基于认知科学(cognitive science)中的双重过程理论,通过协调隐式提取模块
(系统1)和显式推理模块
(系统2),在迭代过程中逐步构建认知图
。在给出准确答案的同时,我们的框架进一步提供了可解释的推理路径.提供了基于BERT和GNN的高效处理百万文档的HotpotQA fullwiki数据集中的多跳推理问题。F1值34.9,当时最优。
引言
MRC现存问题
- 1) 推理问题,单段落倾向于匹配而非复杂推理,提出多跳问答。
- 2) 可解释性,利用显示推理路径保障系统可靠性,HotpotQA要求提供支撑句,这意味着
unordered
和sentence-level
水平的可解释性,但是,人类可以逐步解决问题,即orderd
和entity-level
水平的可解释性。 - 3) 可扩展性, 对实际系统提供质量保障。
现存QA一般遵循DrQA提供检索抽取框架,通过预检索缩小检索段落。这个框架是单段落问答和可扩展信息检索之间的一个简单折衷,相比之下,人类能够在大容量的内存中通过知识进行推理。
由Dual process theory,大脑首先通过implicit, unconscious和intuitive
检索过程称为系统1
,然后进行explicit, conscious和controllable
推理过程称为系统2(咋咋呼呼…)。系统1进行检索,系统2进行分析。对于复杂的推理,这两个系统被协调以迭代地执行快速和慢速思维(Kahneman和Egan,2011)。
本文提出Cognitive Graph QA
(CogQA),有系统1、2模块。首先,从段落提取与问题相关实体和候选答案并进行语义编码,并组成认知图。然后,系统2在图上执行推理过程,并收集线索指导系统1挑选下一实体。重复上述过程,直到找到所有可能的答案,然后根据系统2的推理结果选择最终答案。用BERT和GNN实现。
主要贡献:
- 提出CogQA用于多跳阅读。
- 框架中的认知图结构提供了有序的和实体层次的解释能力,并适合于关系推理。
- 用BERT和GNN实现,超越对手。
2 认知图问答框架(Cognitive Graph QA Framework)
直觉来说,用有向图结构结构进行逐步推导和检索,在作者这篇论文中,认知图 G G G中每个节点对应一个实体或可能答案 x x x,也可能是节点 x x x的可互换表示。
System 1: 读实体
x
x
x的段落
p
a
r
a
[
x
]
para[x]
para[x]和提取候选答案与有用的next-hop entites, 用这些节点扩展图
G
G
G,为系统2提供显示结构。在本文中,我们假设系统2通过计算节点的隐藏表示
X
X
X进行基于深度学习而不是基于规则的推理。因此,当提取跨度时,系统1还需要将
p
a
r
a
[
x
]
para[x]
para[x]总结成语义向量
作为初始隐藏表示。
System 2: 基于图结构更新 X X X作为下游推理结构
由于认知图中的显式推理路径,可解释性得到了享受。除了直接的路径,认知图还可以清楚地显示联合或循环
的推理过程,新的predecessors
可能会带来关于答案的新线索
。线索在架构中是一个灵活的概念,指的是来自predecessors
的信息,指引系统1更好进行抽取。除了新添加的节点之外,由于新的线索,那些具有新的传入边的节点也需要重新访问。将这些称之为frontier nodes
可伸缩性意味着QA的时间消耗不会随着段落数量的增加而显著增加。我们的框架本质上是可以扩展的,因为引用所有段落的唯一操作是通过它们的标题索引来访问一些特定的段落。
传统模型:对于多跳问题,传统的检索提取框架可能会牺牲后续模型的潜力,因为距离问题多跳的段落可能与问题共享很少的共同单词和很少的语义关系,导致检索失败。
CogQA: 然而,这些段落可以通过在我们的框架中迭代扩展线索来发现。
Algorithm 1 CogQA:
- 初始化
- 开始迭代进行图形扩展和推理过程
- 在每一步,访问一个 f r o n t i e r n o d e x frontier node x frontiernodex,并且在线索 c l u e s clues clues和问题 Q Q Q的指导下系统1读 p a r a [ x ] para[x] para[x],抽取 s p a n s spans spans,并且生成语义向量 s e m [ x , Q , c l u e s ] sem[x, Q, clues] sem[x,Q,clues].
- 系统2更新隐藏状态 X X X,并且为后续节点 y y y准备线索 c l u e s [ y , Q ] clues[y, Q] clues[y,Q]
- 最终的预测基于
X
X
X
PS:我自己对算法1的解释:Cognitive Graph QA
S
1
,
S
2
,
Q
,
P
r
e
d
i
c
t
o
r
−
>
F
,
数
据
集
—
>
W
S_1, S_2, Q, Predictor->F, 数据集—>W
S1,S2,Q,Predictor−>F,数据集—>W
- 用 Q Q Q中实体初始化图 G G G,并且标记为 f r o n t i e r n o d e frontier\ node frontier node
- 从
f
r
o
n
t
i
e
r
n
o
d
e
frontier\ node
frontier node pop一个节点
x
x
x,从节点
x
x
x的
predecessor
收集线索 c l u e s [ x , G ] clues[x, G] clues[x,G] //eg. c l u e s clues clues可以是提到 x x x的句子 - 获得数据集 W W W的句子 p a r a [ x ] para[x] para[x] 生成语义向量[x, Q, clues]输入S_1(BERT) // 初始化的 X [ x ] X[x] X[x]
- 如果
X
中
x
X中x
X中x是一个
hop node
, 那么 S 1 S_1 S1在 p a r a [ x ] para[x] para[x]中寻找hop span
和ans span
- for y in
hop span
如果 $y \in G \ and \ y \in W $ 那么 创建一个新的hop node
节点 y y y
如果 KaTeX parse error: Undefined control sequence: \nin at position 26: …and edge(x, y) \̲n̲i̲n̲ ̲G 那么 增加 e d g e ( x , y ) ∈ G edge(x, y) \in G edge(x,y)∈G 标记y节点为frontier node
- for y in
answer spans
增加新的answer node
y y y 和 e d g e ( x , y ) ∈ G edge(x, y) \in G edge(x,y)∈G - 重复4-7
- 用S2更新隐层表示 X X X
- 重复2-8,直到没有 G G G不再变换
- 返回 arg max a n s w e r n o d e x F ( X [ x ] ) \argmax \limits_{answer \ node \ x} F(X[x]) answer node xargmaxF(X[x])
3 实现
实现系统1(BERT)、系统2(GNN)
c
l
u
e
s
[
x
,
G
]
clues[x, G]
clues[x,G]是x的predecessor node
的段落中的句子,x是从中抽取的。为了方便系统1训练,直接传递原始句子作为线索,而不计算隐藏形式。因为原始句子是独立的,并且独立于先前迭代步骤的计算,所以不同迭代步骤的训练是解耦的,从而在训练期间提高效率。细节还要看源码。每次通过GNN的传播步骤更新图节点的隐藏表示
X
X
X。
3.1 System 1
BERT作为系统1,对节点
x
x
x的输入:
[
C
L
S
]
Q
u
e
s
t
i
o
n
[
S
E
P
]
c
l
u
e
s
[
x
,
G
]
[
S
E
P
]
⏟
S
e
n
t
e
n
c
e
A
P
a
r
a
[
x
]
⏟
S
e
n
t
e
n
c
e
B
\underbrace{[CLS]Question[SEP]clues[x,G][SEP]}_{Sentence \ A}\ \underbrace{Para[x]}_{Sentence \ B}
Sentence A
[CLS]Question[SEP]clues[x,G][SEP] Sentence B
Para[x]
c
l
u
e
s
clues
clues是predecessor节点传递的句子。BERT的输出向量表示
T
∈
R
L
×
H
T\in R^{L\times H}
T∈RL×H,L是输入序列的长度, H是隐藏表示的维度。
对答案节点
x
x
x,
P
a
r
a
[
x
]
Para[x]
Para[x]是可能缺失。因此,我们不提取跨度,但仍然可以基于Sentence A
计算
s
e
n
[
x
,
Q
,
c
l
u
e
s
]
sen[x, Q, clues]
sen[x,Q,clues]。当抽取1-hop
节点来初始化
G
G
G时,我们不计算语义向量,输入中只存在Question
部分。
Span Extraction
答案和下一跳实体具有不同的属性。答案抽取在很大程度上依赖于问题所指示的字符。例如:New York City
更可能回答提问的是where
问题超过2019
,而下一跳实体往往是描述与问题中的语句相匹配的实体。因此,我们分别预测回答跨度和下一跳跨度。
引入指针向量(pointer vectors
)
S
h
o
p
E
h
o
p
S
a
n
s
E
a
n
s
S_{hop} \ E_{hop} \ S_{ans} \ E_{ans}
Shop Ehop Sans Eans作为可学习参数来预测范围。输入的第i个字符的概率是开始字符
P
a
n
s
s
t
a
r
t
[
i
]
P_{ans}^{start}[i]
Pansstart[i]的计算方式:
P
a
n
s
s
t
a
r
t
[
i
]
=
e
S
a
n
s
⋅
T
i
∑
j
e
S
a
n
s
⋅
T
j
P_{ans}^{start}[i] = \frac{e^{S_{ans} \cdot T_i}}{\sum_je^{S_{ans} \cdot T_j}}
Pansstart[i]=∑jeSans⋅TjeSans⋅Ti
则
P
a
n
s
e
n
d
[
i
]
P_{ans}^{end}[i]
Pansend[i]用相同的公式计算输入的结束点位置的概率。我们只关注tok K
开始概率最高的位置
s
t
a
r
t
K
{start_K}
startK,对每个K,结束位置
e
n
d
k
end_k
endk计算方式:
e
n
d
k
=
arg max
s
t
a
r
t
K
≤
j
≤
s
t
a
r
t
K
+
m
a
x
L
P
a
n
s
e
n
d
[
j
]
end_k = \argmax \limits_{start_K \leq j \leq start_K + maxL} P_{ans}^{end}[j]
endk=startK≤j≤startK+maxLargmaxPansend[j]
maxL是(答案)跨度最大的概率。(
P
a
n
s
e
n
d
[
i
]
P_{ans}^{end}[i]
Pansend[i]在
s
t
a
r
t
k
+
m
a
x
L
到
s
t
a
r
t
k
+
m
a
x
L
start_k+maxL 到start_k+maxL
startk+maxL到startk+maxL的最大概率)
为了识别不相关的段落,我们利用3.4.1中引入的负采样来训练系统1以产生negative threshold
。在前K个跨度中,起始概率小于负阈值的将被丢弃。因为BERT中第一个字符是
[
C
L
S
]
[CLS]
[CLS],
合成下一句预测任务的所有输入标记,
P
a
n
s
e
n
d
[
0
]
P_{ans}^{end}[0]
Pansend[0]在我们的实现中充当门槛。
我们用剩余的预测答案跨度作为新的“答案节点”来扩展认知图。遵循相同的过程来扩展“下一跳节点”即 S a n s , E a n s , S h o p , E h o p S_{ans}, E_{ans}, S_{hop}, E_{hop} Sans,Eans,Shop,Ehop (这里没看懂)
Semantics Generation
最直接方法用 T 0 T_0 T0作为语义 s e m [ x , Q , c l u e s ] sem[x, Q, clues] sem[x,Q,clues]。然而,BERT中的最后几层主要负责转换跨度预测的隐藏表示。在我们的实验中,在位置0使用倒数第三层输出作为 s e m [ x , Q , c l u e s ] sem[x,Q,clues] sem[x,Q,clues]表现最好。
3.2 System 2
第一个功能是为frontier nodes
准备线索
c
l
u
e
s
[
x
,
G
]
clues[x, G]
clues[x,G]。将其实现为收集x节点
的句子的前驱节点的的原始句子
第二个功能是系统2的核心功能,更新隐藏表示 X X X。隐藏表示 X ∈ R n × H X \in R^{n \times H} X∈Rn×H代表在图 G G G中所有 n n n个实体的理解。要完全理解实体x和问题Q之间的关系,仅仅分析语义 s e m [ x , Q , c l u e s ] sem[x,Q,clues] sem[x,Q,clues]是不够的。
在我们的实现中,GNN的变体被设计为系统2。对于每个节点x,初始隐藏表示
X
[
x
]
∈
R
H
X[x] \in R^H
X[x]∈RH来自系统1的语义表示向量sem[x, Q, clues]。设
X
’
X^’
X’为GNN传播一步后的新隐藏表示
Δ
∈
R
x
×
H
\Delta \in R^{x \times H}
Δ∈Rx×H 是邻居节点的聚合向量, 更新
X
X
X的公司
Δ
=
σ
(
(
A
D
−
1
)
T
σ
(
X
W
1
)
)
)
(
3
)
\Delta = \sigma((AD^{-1})^T \sigma(XW_1))) \ (3)
Δ=σ((AD−1)Tσ(XW1))) (3)
X
’
=
σ
(
X
W
2
+
Δ
)
(
4
)
X^’ = \sigma(XW_2+ \Delta) \ (4)
X’=σ(XW2+Δ) (4)
σ
\sigma
σ是
W
1
,
W
2
W_1, W_2
W1,W2的激活函数,A是
G
G
G的关联矩阵,列标准化
A
D
−
1
AD^{-1}
AD−1,
D
j
j
=
∑
j
A
i
j
D_{jj}=\sum_j A_{ij}
Djj=∑jAij变换后的隐藏向量
σ
(
X
W
1
)
σ(XW1)
σ(XW1)左乘
(
A
D
1
)
T
(AD1)^T
(AD1)T,Defferrard等人(2016年)将其解释为局部光谱滤波器。
在访问边界节点X的迭代步骤中,其隐藏表示X[x]按照等式(3)(4)更新。在实验中,我们观察到这种“异步更新”在性能上没有表现出明显的差异,在G最终确定之后,通过多个步骤将所有节点一起更新X,这在实践中更有效且被采用。
3.3 Predictor
HotpotQA有三类:special question
, alternative question
和general question
它们被视为三个不同的以X为输入的下游预测任务。在测试集中,它们也可以很容易地根据疑问词进行分类。
特殊问题是最常见的情况,要求在段落中查找位置、日期或实体名称等跨度。两个全连接网络做预测函数
F
F
F:
a
n
s
w
e
r
=
a
n
s
w
e
r
n
o
d
e
x
⏟
F
(
X
[
x
]
)
answer = \underbrace{answer \ node \ x}F(X[x])
answer=
answer node xF(X[x])
替代问题和一般问题都旨在比较HotpotQA中实体x和y的某个属性,分别用实体名称和“是或否”来回答。这些问题视为输入为X[x]-X[y]的二分类问题,并且用另外两个FCN解决。??
3.4 Training
我们的模型是在负采样的监督范式下训练的。在训练集中,下一跳和答案跨度是在段落中预先提取的。更准确地说,对于与问题Q相关的每个
p
a
r
a
[
x
]
para[x]
para[x],我们都有跨度数据
D
[
x
,
Q
]
=
(
y
1
,
s
t
a
r
t
1
,
e
n
d
1
)
,
.
.
.
,
(
y
n
,
s
t
a
r
t
n
,
e
n
d
n
)
D[x,Q]={(y_1, start_1, end_1), ..., (y_n, start_n, end_n)}
D[x,Q]=(y1,start1,end1),...,(yn,startn,endn)
s
t
a
r
t
i
,
e
n
d
i
start_i, end_i
starti,endi是
p
a
r
a
[
x
]
para[x]
para[x]的对实体或答案
y
i
y_i
yi模糊匹配
3.4.1 Task #1: Span Extraction
P
a
n
s
s
t
a
r
t
,
P
a
n
s
e
n
d
,
P
h
o
p
s
t
a
r
t
,
P
h
o
p
e
n
d
P_{ans}^{start}, P_{ans}^{end}, P_{hop}^{start}, P_{hop}^{end}
Pansstart,Pansend,Phopstart,Phopend是基于
D
[
x
,
Q
]
D[x, Q]
D[x,Q]
每个段落最多有一个答案跨度
(
y
,
s
t
a
r
t
,
e
n
d
)
(y,start,end)
(y,start,end),因此
g
t
a
n
s
s
t
a
r
t
gt_{ans}^{start}
gtansstart是一个one-hot
向量,其中
g
t
a
n
s
s
t
a
r
t
=
1
gt_{ans}^{start}=1
gtansstart=1。然而,多个不同的下一跳跨度可能出现在一个段落中,因此
g
t
a
n
s
s
t
a
r
t
=
1
/
k
gt_{ans}^{start}=1/k
gtansstart=1/k,k是下一跳节点数量
为了区分不相干段落,无关的负跳节点(negative hop node)提前加入到G中,如3.1
[
C
L
S
]
,
T
0
[CLS], T_0
[CLS],T0的输出生成负阈值。因此,
P
a
n
s
s
t
a
r
t
P_{ans}^{start}
Pansstart对每个负节点是一个one-hot
向量,
g
t
a
n
s
s
t
a
r
t
[
0
]
=
1
gt_{ans}^{start}[0] = 1
gtansstart[0]=1
末端位置和下一跳跨度的损失定义如下:
ζ
=
−
∑
i
g
t
a
n
s
s
t
a
r
t
[
i
]
×
log
P
a
n
s
s
t
a
r
t
[
i
]
\zeta = - \sum \limits_i gt_{ans}^{start}[i] \times \log P_{ans}^{start}[i]
ζ=−i∑gtansstart[i]×logPansstart[i]
3.4.2 Task #2: Answer Node Prediction
为了掌握推理能力,我们的模型必须学会从认知图中识别正确的答案节点。对于训练集中的每个问题,我们为此任务构建一个训练样本。
对每个训练样本,由gold-only graph
合成,是所有正确推理路径和负节点的联合。负节点包括任务#1中使用的negative hop nodes
和two negative answer nodes
。负答案节点由随机抽取的hop node
节点获得
对于特殊问题,我们首先通过对
F
F
F的输出执行softmax来计算每个节点的最终答案概率。
交叉熵损失,F(x)可能概率和one-hot
答案节点
a
n
s
ans
ans,损失函数:
ζ
=
−
l
o
g
(
s
o
f
t
m
a
x
(
F
(
x
)
)
[
a
n
s
]
)
\zeta = -log(softmax(F(x))[ans])
ζ=−log(softmax(F(x))[ans])
替换问题和一般问题用类似方法
该任务的损失不仅被反向传播以优化预测器和系统2,而且微调系统1的语义向量 s e m [ x , Q , c l u e s ] sem[x, Q, clues] sem[x,Q,clues]
4 实验
4.1 数据集
HotpotQA 112,779个问题,84%要多跳推理,90564、7405、7405 训练 开发 测试集测试集都要多跳推理
在训练集中,对于每个问题,提供一个答案和2个黄金(有用)实体的段落,并标出多个支持事实、包含用于推理的关键信息的句子。还有8段无益的负面训练。在评估过程中,只提供问题,同时除了答案之外,还需要支持事实。
为了构建用于训练的认知图,通过基于Levenshtein距离(编辑距离)的模糊匹配从支持事实推断出gold-only认知图中的边(Navarro,2001)。对每一个在
p
a
r
a
[
x
]
para[x]
para[x]支持事实,如果任何gold entity
或答案(表示为y)与支持事实中的跨度模糊匹配,则添加边
e
d
g
e
[
x
,
y
]
edge[x, y]
edge[x,y]
4.2 实验细节
为了挑选出支持事实,我们只需将图中任何节点线索中的句子视为支持事实。
在
G
G
G的初始化中,这些1跳跨度存在于问题中,也可以通过与训练集中支持事实的模糊匹配来检测。我们的框架提取的1-hop实体可以改善其他模型的检索阶段(见4.3),这促使我们将1-hop实体的提取分离到另一个基于BERT的模型,以便在实现中重用。
4.3 Baselines