【EMNLP20 论文笔记】HGN:基于分层图网络的多跳阅读理解模型

Yuwei Fang, Siqi Sun, Zhe Gan, Rohit Pillai, Shuohang Wang, Jingjing Liu
Microsoft Dynamics 365 AI Research; Hierarchical Graph Network for Multi-hop Question Answering


原文:https://arxiv.org/pdf/1911.03631.pdf
源码:https://github.com/yuwfan/HGN (official ** pytorch)


多跳阅读理解数据集 HotpotQA 排名第六(2021/3/29)




1 introduction


相较于传统的阅读理解问题,多跳阅读理解为模型提出了新的挑战。此时为了正确回答问题,需要模型同时有从多个文档,多个段落收集信息并将各个信息进行一定的逻辑整合推理的能力。看下面一个来自于多跳阅读理解问题的经典数据集 HotpotQA 的例子:

此时为了回答问题需要先通过问题中提到的 “Big Stone Gap” 找到 director(支持文档 S1),再顺次推理得到最后的答案(支持文档 S4),也就是说此时不仅限于传统的阅读理解数据集的要求,同时需要模型能够将多个文档的信息进行整合(比如 S1 和 S4 共同作用)再利用相关信息推理得到最后的答案。

存在的挑战之一为如何融合不同粒度的信息(这里中间步骤的信息可以是文章 / 段落 / 句子 / 实体)以推理得到最后的答案。某些方法采用实体图(entity graph)的方法,通过在图上进行推理以得到最后的答案。但是注意到这样的操作存在一定的问题:

  • 部分模型直接选取实体图中的实体作为答案(显然不合理,答案不一定是实体)
  • 部分模型将实体的表示重新放回原本文档的表示以获得答案 ans span(举例大名鼎鼎的 DFGN),但是此时只是为了得到答案而作的操作,无法利用实体图的特点得到推理过程和对应的 evidence
  • 同理,大多数模型进行的推理过程比较简单,难以支持较为复杂的问题

直观来说,想要从一系列文档中得到一个需要多跳推理的阅读理解问题的答案,需要经过以下几个步骤:

  • 选择出和问题相关的段落
  • 从段落中取出相关证据 evidence
  • 利用证据推理得到最后答案

基于以上的思路,本文提出一个新的帮助多跳阅读理解问题解答和推理的模型:Hierarchical Graph Network (HGN),这里使用构造分层图(hierarchical graph)的形式来整合不同粒度的信息

这里包含四种类型的结点:问题 questions + 段落 paragraphs + 句子 sentence + 实体 entities,首先用预训练模型(BERT / RoBERTa)来进行上下文信息的编码(contextual encoding),得到这些分层图中结点的初始表示;再将上面得到的表示通过一个 GNN 来完成图传播,得到更新的表示后再用于后续的几个子任务。注意到最后的答案不一定就是 GNN 中的实体,此时同时使用一个 span prediction 的模块来得到最后的 ans span




2 Hierarchical Graph Network


2.1 overview

先来看看模型整体结构:

此时主要分为四个主要的部分:

  • Graph Construction Module 图构造模块:用于构造分层图(hierarchical graph)以连接不同粒度,不同来源 source 的信息。
  • Context Encoding Module 上下文编码模块:也就是通过一个 RoBERTa-based 的编码器得到图中各个结点的初始表示
  • Graph Reasoning Module 图推理模块:利用基于图注意力的方法(graph-attention-based)完成结点的表示更新
  • Multi-task Prediction Module 多任务预测模块:同时完成多个子任务以得到最后的答案:选择段落 + 寻找支持证据 + 实体预测 + 提取 answer span


2.2 Graph Construction 图构造模块


主要目标是构造分层图,也就是得到里面的结点和边的关系

这里主要分为两个部分完成:

  • 选取得到相关的多跳段落(multi-hop paragraphs)
  • 对选取段落的对应的 句子 / 实体 之间添加边作连接
Paragraph Selection

首先寻找第一跳的结点,也就是从问题出发得到的初始结点,具体按照以下步骤进行 →

① 寻找 title 和问题 Q 中的任何一个 phrase 匹配的段落(title matching)

② 同时训练一个段落评分器(paragraph ranker),具体就是预训练的 RoBERTa 后面接上一个二分类器,判断各个段落内确实有支持证据的概率

③ 如果此时有多个段落通过 title matching 被选中,则只有评分最高的两个段落会被最后保留

④ 如果此时 title matching 没有选中任何一个段落,继续搜索段落内出现了 Q 问题中涉及的实体 entity 的段落

⑤ 如果还是没找到任何一个段落,此时选取通过 ranker 后评分最高的段落

进一步考察第二跳的结点:第二跳的结点应该是和第一跳结点存在一定的相连关系的实体,但是这里不考虑直接依赖实体匹配(会引入大量噪声),这里利用的是第一跳的段落中的超链接(hyperlink)来寻找可能存在的第二段落,并构建两个结点之间的边,注意这里的边是双向的。

同理为了避免引入过多噪音,多跳操作的每一个引入新的 paragraph 都通过 ranker 保留前 N 个评分最高的段落,其他舍弃


Nodes and Edges

注意此时提取得到的结果本身就是自带一种层级关系的 → 比如段落内包含句子 → 句子包含实体

此时共存在四种结点:问题结点 + 段落结点 + 句子结点 + 实体结点

此时按照如下规则建立结点和结点之间的边的关系(共七种)

  • 问题结点和段落结点相连(first-hop 的段落)
  • 问题结点和问题中本身出现的实体结点相连
  • 将当前段落结点(paragraph node)和该段落的所有句子结点(sentence node)相连
  • 句子结点通过句子中包含的超链接和其他段落结点相连
  • 针对每一个句子结点,此时提取出该句子中的所有实体,并将所有实体结点和该句子结点相连
  • 段落之间相连
  • 出现在同一个段落的句子之间相连


2.3 Context Encoding 上下文编码模块


这里给定一个建立好框架的分层图,负责得到所有图中的结点的对应的初始表示( initial representations)

将所有选取出的段落 paragraphs 拼接得到上下文 C,再和当前问题 Q 向量拼接 → 扔进一个预训练好的 RoBERTa + 一个跟在后面的 bi-attention layer(也就是双向注意力),此时得到上下文表示 C 和问题表示 Q: Q = { q 0 , q 1 , . . . , q m − 1 }   ∈ R m ∗ d Q = \{q_0 , q_1, ... , q_{m-1}\} \ \in R^{m*d} Q={q0,q1,...,qm1} Rmd C = { c 0 , c 1 , . . . , c n − 1 } ∈ R n ∗ d C = \{c_0 , c_1 , ... , c_{n-1}\} \in R^{n*d} C={c0,c1,...,cn1}Rnd
这里的 m 和 n 分别是问题和上下文的长度,注意这里的每一个 qi 和 ci 都是长度为 d 的向量

再把这里得到的表示 C 放进一个双向的 LSTM ( BiLSTM ,注意这里是实际上使用的时候是共享参数的),得到的输出记作 M ∈ R n ∗ 2 d M \in R^{n*2d} MRn2d

此时通过 M 得到 C 中不同的三种结点的不同的表示(段落 paragraph + 句子 sentence + 实体 entity),此时基于 (backward LSTM 的起始结点的隐藏状态)和(forward LSTM 的结束结点的隐藏状态)分别计算 pi 和 si 和 ei:

这里的 P s t a r t ( i ) , S s t a r t ( i ) , E s t a r t ( i ) P^{(i)}_{start}, S^{(i)}_{start}, E^{(i)}_{start} Pstart(i),Sstart(i),Estart(i) 分别表示第 i 个段落/ 句子 / 实体结点的起始位置,而 P e n d ( i ) , S e n d ( i ) , E e n d ( i ) P^{(i)}_{end}, S^{(i)}_{end}, E^{(i)}_{end} Pend(i),Send(i),Eend(i) 同理对应结束位置,这里的 [ ; ] [ ; ] [;] 也就是向量拼接,得到的拼接结果再通过一个 MLP 层,注意这里的参数不是共享的

综上,此时得到的 pi 和 si 和 ei 也就是第 i 个 段落 / 句子/ 实体结点的对应的初始表示

同理这里得到问题结点的初始表示,对于 RoBERTa + 一个跟在后面的 bi-attention layer 给出的输出 Q,再通过一个池化层得到问题 Q 的初始表示: q = m a x p o o l i n g ( Q ) q = maxpooling(Q) q=maxpooling(Q)

注意这里满足维度都是 d,也就是 q , p i , e i , s i ∈ R d q, p_i , e_i ,s_i \in R^d q,pi,ei,siRd



2.4 Graph Reasoning 图推理模块


负责更新此时分层图中的结点表示,也可以理解为将整体的上下文的信息都融入表示。通过在构造的分层图上进行推理实现,这里定义: P = { p i } i = 1 n p ;   S = { s i } i = 1 n s ;   E = { e i } i = 1 n e ; P = \{p_i\}_{i=1}^{n_p}; \text{ } S = \{s_i\}_{i=1}^{n_s}; \text{ } E = \{e_i\}_{i=1}^{n_e}; P={pi}i=1np; S={si}i=1ns; E={ei}i=1ne;,注意这里的 np 和 ns 和 ne 分别表示三种结点出现在整个图中的数量,同理定义 H = { q , P , S , E } ∈ R g ∗ d ;   g = n p + n e + n s + 1 H = \{q,P,S,E\} \in R^{g*d}; \text{ } g = n_p+n_e+n_s+1 H={q,P,S,E}Rgd; g=np+ne+ns+1

这里使用 Graph Attention Network (GAT) 来模拟信息在图上传递的过程:GAT 将所有的结点作为输入,对于第 i 个结点的表示 hi,此时通过 i 结点对应的邻居结点 Ni 的情况来更新 hi 的表示得到 h’:

这里的 N i N_i Ni 表示结点 i 的所有的邻居结点的集合,W 是需要学习的权重矩阵,这里的 aij 是注意力系数:
这里的 w e i j w_{e_{ij}} weij 是关系类型 ij 对应的权重(也就是结点 i 这种结点和 结点 j 这种结点对应相连的时候的对应的关系对应的权重),这里的 f ( ) f() f() 是 LeakyRelu 激活函数,经过推理后得到所有结点的更新表示,记作 H’: H ′ = { h 0 ′ , h 1 ′ , . . . , h g ′ } ∈ R g ∗ d H' = \{h_0', h_1', ... , h_g'\} \in R^{g*d} H={h0,h1,...,hg}Rgd


再基于门控注意力机制对上面的信息作一个融合,得到后续用于作 span 提取的上下文表示集合 G:
这里的 W m , W m ′ , W s , W t W_m, W'_m,W_s,W_t Wm,Wm,Ws,Wt 都是需要学习的权重矩阵



2.5 Multi-task Prediction Module 多任务预测模块


得到结点的更新表示后用于几个子任务:

  • 基于 paragraph 结点的段落选择
  • 基于句子结点的支持证据预测
  • 基于实体结点和上下文表示 G 的答案预测

对于 段落选择任务 = 当前的段落到底有没有包含确实的证据支持证据预测任务 = 当前的句子结点到底是不是支持证据,直接通过两层的 MLP 作为一个分类器来实现:

这里的 o s e n t ∈ R n s o_{sent} \in R^{n_s} osentRns 表示每一个句子是否真的是支持证据, o p a r a ∈ R n p o_{para} \in R^{n_p} oparaRnp 同理

进一步预测当前实体 E 是不是答案,同理通过一个 MLP:

注意这里计算的 o e n t i t y o_{entity} oentity 本身并不帮助我们得到预测的答案,只是算算而已,用在损失函数里。注意本身正确答案可能就不是任意一个实体,则此时直接将实体的损失函数记作 0

真的拿来作答案决策的为:
这里是从综合上下文表示 G 中选择答案开始和结尾的结点,同理经过两层 MLP,分别预测当前的结点是不是答案的开始 / 结束位置

同理,这里利用 G 的第一个隐藏表示配合 MLP 来预测答案类型:
注意如果这里预测出来的答案类型为 yes 或者 no,就直接回答对应的 yes / no,不再返回上面预测出的起始位置 + 结束位置的答案


最后的训练是多个子任务共同训练的:

这里的 λ 1 , λ 2 , λ 3 , λ 4 \lambda_1, \lambda_2, \lambda_3, \lambda_4 λ1,λ2,λ3,λ4 都是超参数,损失函数用的都是交叉熵损失函数(本质都转化为了分类问题)





3 Experiments


这里用到的数据集是 HotpotQA,也就是经典的多跳阅读理解数据集了

针对这个数据集一般存在两个子任务:

  • 答案预测
  • 支持证据预测

来看看效果:


作者分析了几个点:

  • 很多错误集中于(同义但是不同表述的答案),比如 “EPA vs. Environmental Protection Agency” / “American-born vs. U.S. born”,可以认为就还是算是答对了吧这种 …
  • 缺乏常识帮助模型进行判断,如果将常识同时加入模型或许会有一定的提升(比如模型不知道 “second” means “Code#02”
  • 在需要离散推理的部分表现不好,比如一些需要比较两个东西的问题
  • 可能有的问题存在多个正确的答案,一般模型只能够给出一个
  • 在多跳推理部分出现错误,或者明明给出了正确的对应的支持证据最后还是给了错误的答案




阅读仓促,存在错误 / 不足欢迎指出!期待进一步讨论~
转载请注明出处。知识见解与想法理应自由共享交流,禁止任何商用行为!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值