Retrieve, Read, Rerank: Towards End-to-End Multi-Document Reading Comprehension

ACL 2019 Retrieve, Read, Rerank: Towards End-to-End Multi-Document Reading Comprehension

github

本文所关注的是阅读理解中的多文档输入问题,即如何根据问题在给定的多个输入文档中找到对应答案的区域。解决此类问题的一种方法便是retriever -> reader -> reranker的pipeline,其中:

  • retriever:从给定的多个输入文档的多个段落中找到可能包含答案的部分,从而减小搜索空间
  • reader:从检索到的包含答案的多个段落中确定具体的区域,即答案所在部分的起始和终止索引
  • reranker:由于多个输入文档中可能会包含多个对应的答案,reranker对其进行重排序,从而确定最符合的答案。

    在这里插入图片描述

但是在先前的方法中,每一模块完成任务时会对输入文档进行独立的编码,即每一部分的编码表示是不同的,这会造成不同模块之间文档的上下文表示间的不一致性,而且前面模块所获取的较好的文档表示也无法被下游的模块所应用。

因此,作者在本文中提出了一种端到端的训练模型 R E 3 Q A RE^3QA ,即将context retrievalreading comprehensionanswer reranking三部分整合到一起进行训练,而且不同模块之间共享文档的上下表示信息,这样在一定程度上缓解了如上所述的几个问题。最后在TriviaQA和SQuAD两个数据集上进行实验,实验结果证明了想法的有效性并且优于baseline。

Model

R E 3 Q A RE^3QA 的模型架构如下所示:


在这里插入图片描述

在上图彩色区域所示的三部分采用端到端方式进行训练外,模型在此之前仍需要进行文档的剪枝(document pruning)来减小搜索空间。然后将过滤剩下的文档按照滑动窗口的方式将其划分为包含重叠的多个区段(segment),再使用预训练的transformer进行编码,根据得到的上下文表示计算对应的分数,最后根据分数进行排序,删除冗余的部分,只保留选择的部分用于下游的训练。

其中文档排序采用的度量指标为TE-IDF cosine similarity;分段时采用的是窗口大小为 l l 、步长为 r r 的方式,文档 d d 最后可被分为多个段落 C = { c 1 , . . . , c 2 } C = \{c_{1}, ..., c_{2}\} 。接着通过transformer进行编码获取文档的表示 c c ,同样也可以获取关于问题的表示 q q ,最终段落的表示为 [ [ C L S ] ; q ; [ S E P ] ; c ; [ S E P ] ] [[CLS]; q; [SEP]; c; [SEP]] (和BERT中输入的表示是一致的)。由于这里采用的是多层的Transformer,因此最终的表示可以表达为: h i = TransformerBlock ( h i 1 ) h^i = \text{TransformerBlock}(h^{i-1})

Early-Stopped Retriever

尽管在retrieval之前进行了文档的剪枝,但是在将选择的文档划分段落后仍然具有很多的段落。为了提高编码的效率和使下游的模型更加关注文中重要的部分,这里采用了一种称为early-stopped的机制。

如上所述,这里采用的Transformer具有很多层,那么每一层都可以获取到关于段落的表示。作者在这里根据每一层的表示通过MLP计算一个分数, μ = spftmax ( w μ h J ) score r = w r tanh ( W r i = 1 L x μ i h i J ) \mu=\text{spftmax}(w_{\mu}h^J) \\ \text{score}^r = w_{r} \tanh (W_{r} \sum_{i=1}^{L_{x}}\mu_{i}h_{i}^J) 只选择分数较高的N个传到下一层,N这里是不断减小的,这样通过不断的传递,最终Transformer的输出只是N个重要段落的表示。将分数进行正则化后对应的目标函数为: L I =   i = 1 2 y i r log ( softmax ( score r ) i ) L_{I} = \ \sum_{i=1}^2 y_{i}^r \log(\text{softmax}(\text{score}^r)_{i})

Distantly-Supervised Reader

经过上一模块的检索得到了包含答案的多个重要的候选段落和对应的表示 h I h^I ,Reader需要从中找出答案具体的位置,即答案对应的起始和终止索引。假设候选答案 a i a_{i} 的起始和终止索引分别记为 α i \alpha_{i} β i \beta_{i} ,那么Reader会为每一个可能的区域计算一个分数 s i = s c o r e α i s + s c o r e β i e s_{i}=score_{\alpha_{i}^s} + score_{\beta_{i}^e} ,那么根据分数进行排序得到对应的区域 A = { a 1 , . . . , a M } A = \{a_{1},...,a_{M}\} 。由于数据集包含对应的标签,因此目标函数表示为: L I I = i = 1 L x y i s log ( softmax ( s c o r e s ) i ) j = 1 L x y i e log ( softmax ( s c o r e e ) j ) L_{II} = - \sum_{i=1}^{L_{x}}y_{i}^s \log(\text{softmax}(score^s)_{i}) - \sum_{j=1}^{L_{x}}y_{i}^e \log(\text{softmax}(score^e)_{j})

Answer Reranker

进行前面的两步模型已经从给定的文档中找出了对应问题的多个答案,但是这些候选答案中仍有可能会存在着冗余的部分,因此作者在这里提出了一种剪枝算法Span-level NMS:


在这里插入图片描述

其实算法的思想也很简单,假设上一步得到的候选答案为 A A (包含起始和终止索引),对应的分数为 S S 。首先将分数最高的答案挑选出来放到 B B 中,看 A A 中剩下的答案的起始和终止索引和选择的答案对应的索引有没有重叠,如果有就将其从 A A 中删除,再进行下一次的选择、删除,直到 A A 为空或者 B B 中答案个数到达指定的阈值就停止,那么最后得到的候选答案就是最终的答案。

接着需要对 B B 中的答案进行打分排序,为了更好的训练Reranker,这里设置了两种类型的标签 y i h a r d y_{i}^{hard} y i s o f t y_{i}^{soft} ,对应的目标函数为: L I I I = i 1 M y i h a r d log ( softmax ( s c o r e a ) i ) + i = 1 M y i s o f t s c o r e i a j = 1 M s c o r e j a L_{III}=- \sum_{i-1}^{M^*} y_{i}^{hard} \log(\text{softmax}(score^a)_{i}) + \sum_{i=1}^{M^*} ||y_{i}^{soft} - \frac{score_{i}^a}{\sum_{j=1}^{M^*} score_{j}^a}||

Training

训练对应的损失函数即为上述三部分的和,对应的训练过程为:


在这里插入图片描述

实验部分可见原文~


在这里插入图片描述

发布了267 篇原创文章 · 获赞 91 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/Forlogen/article/details/103696036