本文主要是总结下自己最近学习到的机器阅读理解的相关知识。文章的主要结构分以下步骤:
阅读理解任务主要是让机器根据给定的文本回答与文本相关的问题,15年以前由于小规模的数据集和基于规则的方法问题不能兴起,后面兴起了是因为:1、深度学习框架的阅读理解提出。2、大规模数据集的公布是的这个任务兴起。1
常见的阅读理解的任务按照其答案形式可分为:完型填空、多项选择题、片都抽取和自由作答。2
任务定义:给定文章 C、问题 Q 和一系列候选答案集合,多项选择任务通过最大化条件概率来从候选答案集合 A 中挑选出正确答案回答问题 Q
自己接触过的数据集有:RACE高考的阅读理解题目,其中数据的一个example:
正文,option_0:问题,option_1:选项a,option_2:选项b,option_3:选项c,option_4:选项d,label:答案。如下图所示。
基于RACE数据集下的阅读理解项目:
https://github.com/NoviScl/BERT-RACE
代表数据集:RACE、MCTest数据集
任务定义:给定文章 C,将其中的一个词或者实体 a (a∈C) 隐去作为待填空的问题,完形填空任务要求通过最大化条件概率 P(a|C-{a}) 来利用正确的词或实体 a 进行填空。
完型填空这个任务有个好处就是,问题的答案一定是从原文中截取出来的,而不用从文章中提炼出概括性的话语。
此类的数据集还有:CBT、LAMBADA、CliCR、CLOTH、Who-did-What.
任务定义:给定文章 C(其中包含 n 个词,即)和问题 Q,片段抽取任务通过最大化条件概率 P(a|C,Q) 来从文章中抽取连续的子序列作为问题的正确答案。
自己接触过的数据集有SQuAD1.0和SQuAD2.0。其一个example的格式:
片段抽取任务:从原文中抽取一个连续的句子,或者词语,作为问题的答案。
代表数据集:SQuAD、DuoRC、NewsQA、TriviaQA
基于SQuAD的阅读理解项目:
https://github.com/eva-n27/BERT-for-Chinese-Question-Answering
任务定义:给定文章 C 和问题 Q,自由作答的正确答案 a 有时可能不是文章 C 的子序列,即 a⊆C 或 aØC。自由作答任务通过最大化条件概率 P(a|C,Q) 来预测回答问题 Q 的正确答案 a。
自由作答任务的答案形式最为灵活。如 MS MARCO [3] 中,提供了 10 篇相关的文章,回答问题时需要对文章中的线索进行归纳总结,与片段抽取任务相比,自由作答任务的答案不再限制于原文中的句子,更符合人们平时的作答习惯。这部分文本摘要的生成也同样是属于这部分内容。给你一篇小短文,然后概括出这篇小短文的摘要。同样是属于自由作答的环节。
上面的例子展示了:文本摘要的结果。摘要的生成是使用指针生成网络来进行的。
自己复现指针网络项目:https://github.com/hquzhuguofeng/New-Pointer-Generator-Networks-for-Summarization-Chinese
代表数据集:DuReader、MS MARCO、CNN&DailyMail 数据集
这个部分主要分析阅读理解任务的各个特点:
完形填空任务的数据集易于构建,可以用准确率指标进行评价。但是由于这一任务的答案限定为原文中的一个词或实体,所以并不能很好的测试机器对自然语言的理解能力且与实际应用相距较远.
多项选择任务由于提供了候选答案,答案的形式相较于完形填空而言更为灵活,构建数据集可以直接利用现有的语言测试中的多项选择题目,所以较为容易。由于该任务要求从备选答案中选出正确答案,模型的搜索空间相对较小,对自然语言理解的测试较为局限,提供备选答案与实际应用场景不太相符
片段抽取任务是一个适中的选择,数据集相对容易构建,模型效果也可以使用精确匹配和 F1 分数进行衡量,答案限定为原文中的子片段,相较于多项选择有了更大的搜索空间,也在一定程度上能测试机器对自然语言的理解能力,但是和实际应用仍有一定差距.
自由作答任务答案形式非常灵活,能很好的测试对自然语言的理解,与现实应用最为贴近,但是这类任务的数据集构造相对困难,如何有效的评价模型效果有待进行更为深入的研究
典型的机器阅读理解系统一般包括:Embedding Encoder、Featrues Extraction、Content & Question Interaction、Answer prediction / generation.3
在人类阅读理解过程中,当有些问题不能根据给定文本进行回答时,人们会利用常识或积累的背景知识进行作答,而在机器阅读理解任务中却没有很好的利用外部知识,这是机器阅读理解和人类阅读理解存在的差距之一。
为了引入额外的外部知识,一些学者提出了基于知识的机器阅读理解任务,与之前所介绍的任务不同,这一任务的输入除了文章和问题,还有从外部知识库中抽取的知识,以此来提高机器进行答案预测的准确率。
代表性的基于知识的机器阅读理解数据集有 MCScript ,其中的文本关于人类的一些日常活动,有些问题仅根据给定文本不能作答,需要一定的常识。例如回答“用什么来挖洞”(What was used to dig the hole?)这一问题,依据常识我们知道一般是用“铲子”(a shovel)而不是用“手”(bare hands)。
基于知识的机器阅读理解任务的挑战主要有:
1.相关外部知识的检索(如何从知识库中找到“用铲子挖洞”这一常识);
2.外部知识的融合(知识库中结构化的知识如何与非结构化的文本进行融合)。
在机器阅读理解任务中,文章是预先定义的,再根据文章提出问题,这与实际应用不符。人们在进行问答时,通常先提出一个问题,再利用相关的可用资源获取回答问题所需的线索。
为了让机器阅读理解任务与实际应用更为贴合,一些研究者提出了多文档机器阅读理解任务,不再仅仅给定一篇文章,而是要求机器根据多篇文章对问题进行作答。这一任务可以应用到基于大规模非结构化文本的开放域问答场景中。多文档机器阅读理解的代表数据集有 MS MARCO 、TriviaQA 、SearchQA 、DuReader 和 QUASAR 。
多文档机器阅读理解的挑战有:
1.相关文档的检索(如何从多篇文档中检索到与回答问题相关的文档)
2. 噪声文档的干扰(一些文档中可能存在标记答案,但是这些答案与问题可能存在答非所问的情况)
3. 检索得到的文档中没有答案
4. 可能存在多个答案(例如问“美国总统是谁”,特朗普和奥巴马都是可能的答案,但是哪一个是正确答案还需要结合语境进行推断)
5. 需要对多条线索进行聚合(回答问题的线索可能出现在多篇文档中,需要对其进行总结归纳才能得出正确答案)
机器阅读理解任务中所提出的问题一般是相互独立的,而人们往往通过一系列相关的问题来获取知识。当给定一篇文章时,提问者先提出一个问题,回答者给出答案,之后提问者再在回答的基础上提出另一个相关的问题,多轮问答对话可以看作是上述过程迭代进行多次。为了模拟上述过程,出现了对话式阅读理解,将对话引入了机器阅读理解中。
对话式阅读理解的代表性数据集有 CoQA 、QuAC 等。下图展示了 CQA 中的一个对话问答的例子。对于给定的文章,进行了五段相互关联的对话,不仅问题之间存在联系,后续的问题可能与之前的答案也有联系,如问题 4 和问题 5 都是针对问题 3 的答案 visitors 进行的提问。
对话式阅读理解存在的挑战有:
针对SQuAD数据集、RACE数据集、CoQA数据集进行模型的分析。
数据集 | 模型 |
---|---|
SQuAD1.0 | Bert |
SQuAD2.0 | Bert |
RACE | Bert |
CoQA | Bert |
CoQA | SDNet |
使用同一模型bert对以上数据集进行学习。
SQuAD
由于 SQuAD 的答案限定于来自原文,模型只需要判断原文中哪些词是答案即可,因此是一种抽取式的 QA 任务而不是生成式任务。Bert模型在处理SQuAD时可以总结为以下框架:
Embed层 负责将原文和问题中的 tokens 映射为向量表示;
Encode 层主要使用 LSTM 来对原文和问题进行编码,这样编码后每个 token 的向量表示就蕴含了上下文的语义信息;
Interaction层是大多数研究工作聚焦的重点,该层主要负责捕捉问题和原文之间的交互关系,并输出编码了问题语义信息的原文表示,即 query-aware 的原文表示;
Answer层则基于 query-aware 的原文表示来预测答案范围。
我们可以在斯坦福SQuAD2.0数据集上单一模型Bert的state-of-the-art是:
squad1.0和squad2.0的区别在于:
squad2.0 增加了对抗性问题(无法回答的问题),系统不仅必须回答问题,还要确定何时语境段落中没有答案、可以放弃回答问题。
RACE
它的形式类似于英语考试中的阅读理解(选择题),给定一篇文章,通过阅读并理解文章(Passage),针对提出的问题(Question)从四个选项中选择正确的答案(Answers)。该题型的正确答案并不一定直接体现在文章中,只能从语义层面深入理解文章,通过分析文章中线索并基于上下文推理,选出正确答案。相对以往的抽取类阅读理解,算法要求更高,被认为是「深度阅读理解」。
它的难点在于:由于正确答案并没有直接使用文章中的话术来回答,不能直接从文中检索得到答案。必须从语义层面深入理解文章,才能准确回答问题。
相关代码:https://github.com/NoviScl/BERT-RACE
CoQA
以往的机器阅读理解以及基于此研究出来的对话机器都有一个显著的特点,对话不够自然。基于这一问题开发的CoQA旨在实现以下几个目标:4
还原人类对话的性质:人们在日常对话中很少像阅读理解一样,基于材料给出常常的问题,或者基于材料生搬硬套出一个答案,要还原对话的这一本质,就需要解决传统阅读理解问题的问题-文章依赖性,以及实现基于对话历史的问答
保证答案的自然性:正如前文所述,以往的阅读理解会依赖材料截取答案,导致答案不够自然,不够口语化。因此要通过CoQA训练出形式较为自由的抽象答案(如上图相关回答),而不是简单的信息提取。
实现QA系统在不同领域的稳健性:以往的QA数据集来源于单一领域(如NewsQA, SQuAD, MS Marco, RACE等)而CoQA的数据来源于七个领域(域内:children’s
stories, literature, middle and high school English exams, news, Wikipedia,域外: science and Reddit),以提高模型的泛化能力。
难点在于:近一半的CoQA问题中都用到了共指关系(如下图),需要根据历史信息得出正确答案。
这个数据集我用了两个模型去跑。一是BERT,二是SDNET模型。
上图中的state-of-the-art我们可以看到SDNET和BERT的效果相差不多。BERT已经被证实有强大的特征抽取能力,就不具体阐述了,现在具体来说明SDNET模型为什么可以得到这样的成绩。
在这之前我们来看看leaderboard中BiDAF++ 和 DrQA+seq2seq with copy attention的成绩,这里只说明这两个模型,其他模型暂时没去了解。
DrQA+seq2seq with copy attention
DrQA:Document Retriever + Document Reader用于根据问题找出指定范围,并根据指定范围得出问题的答案。由于DrQA无法生成与文章不相重合的答案,于是使用seq2seq with copy attention 将DrQA找到文章中问题的依据转化为自然语言。
BiDAF++
bidaf原本是,针对DuReader阅读理解数据集数据集实现并升级了一个经典的阅读理解模型,它的亮点在于:双向注意流(bidaf)网络,它是一个多阶段的层次化过程,它在不同的粒度级别上表示上下文,并使用双向注意流机制在不进行早期总结的情况下获得一个查询感知的上下文表示。
模型大概的总结为:首先是对文本内容从字符和词的不同粒度进行embedding,将得到的结果进行拼接,经过双层的LSTM进一步处理,截至前三层,都还是对context和query的文本不同表达。
进入注意流层,这里提供了两个方向的注意力,一种的由context到query,一种是query到centext。值得注意的是这里每一步的注意力并没有依赖之前的注意力值,而是直接流入下一步,有效避免信息损失
经过model的BI-LSTM的处理,用softmax给出答案的起始位置。
BIDAF之所以效果没有SDNet和BERT好的原因在于,它们都没有将重点放在正文/问题和答案之间的聚焦机制上面,模型没有学习到三者之间的一个权重分布。而是将上下文表示的更加好一点。而DRQA的问题在于,将正文的依据和问题答案分开来了,同样也是没有attend到三者之间的关系。
SDNET4CoQA相关代码:https://github.com/microsoft/SDNet
BERT4CoQA相关代码:https://github.com/hquzhuguofeng/Bert-for-coqa
https://arxiv.org/abs/1907.01118 ↩︎
https://stacks.stanford.edu/file/druid:gd576xb1833/thesis-augmented.pdf ↩︎
https://www.sohu.com/a/329167296_500659 ↩︎
https://blog.csdn.net/cindy_1102/article/details/88560048 ↩︎