Ming Tu, Guangtao Wang, Jing Huang, Yun Tang, Xiaodong He, Bowen Zhou
JD AI Research; Multi-hop Reading Comprehension across Multiple Documents by Reasoning over Heterogeneous Graphs
论文原文:https://arxiv.org/pdf/1905.07374v2.pdf
源码:https://github.com/JD-AI-Research-Silicon-Valley/HDEGraph
文章目录
1 introduction
多跳阅读理解问题,特别是跨文档的多跳阅读理解问题为当前的机器阅读理解学习模型提出了新的挑战。
在这里首先解释以下什么是多跳阅读理解问题,感觉 CogQA 里给的例子比较好理解,这里借用 CogQA 论文里的例子来展示。(CogQA 论文笔记看这里)
多跳阅读理解问题 可以直观地理解为需要多次跳转,将不同的信息进行进一步整合才能得到答案的阅读理解问题。举个例子:
这个问题本身问的是导演,但是没有给出电影的名字,首先需要后面的信息去推断是哪一部电影,才能进一步去寻找该电影的导演。直观理解就是此时需要从多个文档中收集信息并经过一定的多重推导过程才能得到最后答案。
针对多跳理解问题,当前效果比较好的模型主要集中于以下两种模式:
- 对多个文档内容进行初步筛选,再把筛选出来的内容进行拼接为一个新的文档,再利用前面的针对单文档的模型来进行阅读理解和实体的提取。
- 使用 GNN 方法,也就是先通过阅读理解将内容作为 GNN 的新的实体加入网络,再通过 GNN 的结点结构完成下游任务(CogQA 就是类似的思路,CogQA 论文笔记戳这里)
本文使用的还是受到基于 GNN 方法的启发,将异构信息网络的思路引入机器阅读理解模型,提出一种新类型的图模型:异构文档-实体网络(Heterogeneous Document-Entity (HDE) graph)
HDE graph 的特点主要有:
- 此时允许图上的不同结点属于不同的类型(也就是异构信息网络的特点),也就是说此时的图模型可以充分表示不同级别不同类型的信息。这里采用三种类型的结点:候选答案(candidate)+ 文档(document)+ 实体(entity)
- 受到 CFC 的启发,这里用到 co-attention 和 self-attention 来学习初始结点的表示
- 此时将结点之间不同的关系引入图模型(也就是异构信息网络中能够表示不同结点关系的不同类型的边),以更好地完成依赖图模型推断过程。
2 模型解释
先看看整体模型的架构:
整体模型大致可以分为三个部分:
- 上下文编码 context encoding:也就是通过 co-attention 和 self-attention 进行上下文编码,以初始化整个 HDE graph
- 基于异构图的推断过程 Reasoning over HDE graph:通过基于 GNN 的传播算法在整个构造的 HDE graph 上进行推断过程,从而得到各个结点的最终表示
- 针对候选答案打分 score accumulation:也就是利用此时 HDE graph 的结点表示对候选答案进行打分,筛选出最终答案
2.1 上下文编码 context encoding
类似于异构图的思路,实际上就是对一个 query 的预测任务:给定 (s , r , ?) 则此时的目标就是通过给定的 s 实体,r 关系和背景资料支持文档 Sq ,从所有可能的候选答案 Cq 中选择得到最后的结果。
上下文编码部分分为四个模块,如下图所示:
- GRU 编码(蓝色部分)
- 实体提取 Entity extraction(橙色部分)
- 计算实体间 co-attention(绿色部分)
- 自注意力池化 self-attentive pooling(红色部分)
这里作者提了一下本文基于 CFC 的优化的点:
- 比 CFC 更多地计算了 query 和 候选答案 之间的 co-attention
- 用到了自注意力机制来综合 co-attention 给出的信息
2.1.1 GRU 编码(蓝色部分)
首先使用 GRU 分别对 query, 文档 和 候选答案 进行编码,最后输出 query 的编码 H q ∈ R l q ∗ h H_q \in R^{l_q*h} Hq∈Rlq∗h,文档的编码 H s i ∈ R l s i ∗ h H_s^i \in R^{l_s^i * h} Hsi∈Rlsi∗h(这里的 i 表示是第 i 个参考文档),候选答案的编码 H c j ∈ R l c j ∗ h H_c^j \in R^{l_c^j * h} Hcj∈Rlcj∗h,这里的 h 是 RNN 最后输出的维度
2.1.2 实体提取 Entity extraction(橙色部分)
还是前面导演的那个例子,此时从电影的信息需要先抽取出电影名字这个实体,才能进一步地得到最后导演名字作为答案。
注意这里将同时利用问题 query 和 可能的候选答案 来进行实体抽取。使用 simple exact match strategy 的方法(具体来自于 De Cal 2018 等人)得到 query 和 候选答案中各个 mention 的开始和结束位置,此时的各个 mention 将被处理为一个实体。得到实体后将上述 GRU 部分编码结果的实体对应部分提取出来,作为其初始表示。
2.1.3 计算实体间 co-attention(绿色部分)
co-attention 的作用为使得 query 和 document 之间的信息能够互相融合加强
首先通过 GRU 输出的表示,计算 query 和第 i 个文档之间的相似度矩阵(similarity matrix):
这里的 A 用于展示当前 query 中某个词和 文档 中任意某个词之间的两两相关程度
进一步计算注意力文本,也就是 query 和 document 经过注意力机制后的上下文表示(attention context)
注意这里用 softmax 做了一个标准化的操作(column-wise normalization)
再进一步利用一个双向 GRU 对得到的 Cs (也就是文档部分)进行进一步的编码:
此时将得到的 Ds 和 Cq 进行按列的拼接,得到最后的 co-attention 表示:
注意这里最后得到的 Sca 也就是经过了 query 的信息融合和注意力机制的支持文档的信息。将上述的步骤同样用于 query 和 候选答案之间,query 和实体之间,得到 C c a C_{ca} Cca 和 E c a E_{ca} Eca,注意这里总共是计算了三组 co-attention
2.1.4 自注意力池化 self-attentive pooling(红色部分)
也就是将一个有序的上下文表示通过自注意力模块得到一个固定维度的 + 非有序的特征向量,中间经过的是注意力筛选。直观理解就是,此时通过为 co-attention 得到的结果(一个序列)中的每一个词语进行打分,将得分标准化后作为权重经过池化操作,最终得到一个能够体现输入序列的综合信息的特征向量。
给定 co-attention 的输出 Sca,计算如下:
这里的 MLP 是一个两层的 MLP 配上 tanh 作为激活函数,最终得到经过了自注意力池化的表示
S
s
a
S_{sa}
Ssa
同理,考虑 co-attention 的其他两个输出 C c a C_{ca} Cca 和 E c a E_{ca} Eca,经过同样的操作得到 C s a C_{sa} Csa 和 E s a E_{sa} Esa
2.2 基于异构图的推断 Reasoning over HDE graph
这里将 HDE graph 表示为 G = { V , E } G = \{V , E\} G={V,E},V 是结点的表示,而 E 为连接结点的边,此时的结点分为三种:文档,候选答案,抽取出的实体
此时利用 HDE graph 可以表示更多粒度下的信息:
- document 结点可以表示融合了 query 信息的(因为经过了 co-attention)文档层面的整体信息
- 候选答案结点表示经过了 query 信息融合的候选答案中相关的信息
- entity 结点表示了通过 query 信息后的,某文档中的或者 query 本身中存在的可能会对推理有帮助作用的 subject
2.2.1 HDE graph 构建
通过上一步最后的自注意力池化后,此时可以得到各个结点的初始表示。此时进一步地定义它们之间的相关关系,也就是边的关系:
- 文档 + 候选答案:只要该候选答案出现在该文档中至少一次则存在这类的边连接两个实体
- 文档 + 实体:标识该实体是从该文档中提取出来的
- 候选答案 + 实体:标识该实体本身是该候选答案中的一个 mention
- 实体 + 实体:标识两个实体是从同一个文档中提取出来的
- 实体 + 实体:如果两个实体是来自同一个 query 或同一个候选答案的 mention,但不是来自于同一个文档(和上一个边类型区别开)
- 候选答案 + 候选答案 :所有的候选答案之间两两相连
- 实体 + 实体:其他的不满足上述条件的两个实体之间相连
至此,我们将整个 HDE graph 构造完毕
2.2.2 信息传递 Message passing
本文选用的是 GNC 的消息传递策略,分为 聚合(aggregation)和 组合(combination)两个部分。
聚合 也就是将邻居结点的信息进行聚集整合:
这里的 R 是所有的边的种类的集合,
N
i
r
N_i^r
Nir 是所有以边类别 r 与结点 i 相连的邻居结点的集合,
∣
N
i
r
∣
|N_i^r|
∣Nir∣ 表示这样的结点集合中结点的个数,
h
j
k
h_j^k
hjk 是结点 j 在第 k 层的表示,
f
r
f_r
fr 本身是一个转换,可以用 MLP 实现,最后得到的是
z
i
k
z_i^k
zik ,也就是结点 i 的第 k 层表示。
个人觉得这里的思路和 ripplenet 是类似的(RippleNet 论文笔记戳这里),比如此时相连的模式是 1-2-3,则第一层都只有自己的信息,而第二层时,二层的结点 2 的信息中包含了结点 3 的信息,而 三层的结点 1 的信息中包含了二层的结点 2 的信息,自然也就包含了结点 3 的信息,经过多层的传播,此时实现了多跳的信息融合。
组合也就是将结点 i 的原始表示信息和它的多层信息进行综合:
这里的
h
i
k
h_i^k
hik 也就是结点 i 的原始第 k 层表示信息,而
f
s
f_s
fs 同理可以由 MLP 实现
注意到在层数比较大的时候, GNN 很容易遇到平滑问题(smoothing problem ),也就是整个 GNN 中的结点都很相似而没有区分度。为了避免平滑,此时在组合的部分加入一种门机制(gating mechanism):
这里的
f
g
f_g
fg 同理通过 MLP 实现(注意原文用的是单层的 MLP),注意这里实际上是通过
g
i
k
g_i^k
gik 来控制到底多少信息来自于结点 i 的原本表示 h ,又多少信息来自 HDE graph 推断后的表示 u
经过 k 次处理(K 次信息传递),得到每一个结点的最终表示 h i k h_i^{k} hik
2.3 候选答案打分 Score accumulation
得到图最终的表示后,可以基于图中的表示来为候选答案进行打分以提取最终答案
这里的
H
C
H^C
HC 是所有候选答案结点的表示,C 是候选答案个数,
H
E
H^E
HE 是所有和候选答案相连的实体结点的表示,
A
C
C
m
a
x
ACC_{max}
ACCmax 取和某一个候选答案结点相连的所有的实体结点中的最高分,这里的
f
E
,
f
C
f_E, f_C
fE,fC 都是通过两层的 MLP 实现的,激活函数还是用的
t
a
n
h
tanh
tanh,最后的输出
a
∈
R
C
∗
1
a \in R^{C*1}
a∈RC∗1 则表示此时 C 个候选答案各自为正确答案的概率(得分经过标准化)
这里得到最后的 a,则利用 a 和真实的答案标签 → 交叉熵损失函数来进行整体模型的训练
3 实验部分
原文使用的是 WikiHop数据集 进行最后的模型测试。(43K 训练集,2.5K 测试集)
注意这里作者依据经验将整个 query 分为了 relation 和 subject 两类,预训练的词向量用的是 300-dimensional GLoVe 和 100-dimensional character n-gram embeddings
原文里作者还搞了一个结合了 15 个模型的集成学习(用了不同的超参数和随机数种子),融合的时候用的是简单的多数投票策略
现在来看看结果:
为了考察整个模型的不同部分的贡献,原文还做了消融实验:
可以看出此时 HDE graph 的贡献还是蛮显著的,也就是说花这么大力气又是提取实体构建 HDE graph 又是在上面做多跳信息融合确实有效果
阅读仓促,存在错误 / 不足欢迎指出!期待进一步讨论~
转载请注明出处。知识见解与想法理应自由共享交流,禁止任何商用行为!