搜狗开源业内最全「阅读理解工具集合」,助力研发人员快速构建高效模型
机器阅读理解是当前智能问答领域中的热门研究问题,它的目标是根据给定的问题和文章(段落),在文章(段落)中抽取或改写文字片段作为问题的答案。举例来说,当前多数的搜索引擎,当用户输入的搜索关键字是一个问题时,就会尝试从搜索结果的网页中寻找答案并以最高优先级呈现给用户。例如搜索“搜狗的吉祥物是什么”,搜索引擎就会反馈如下:
这其中所利用到的技术便是“机器阅读理解”。
近年来,由于神经网络的复兴和大规模数据集的可访问,阅读理解的研究取得了很大的进展,相继涌现出许多优秀的机器阅读理解模型。例如,在SQuAD 1.0的排行榜中就已经有80多个提交的模型,其中有相当一部分模型的性能已经超越了人类的表现。
这里存在一个问题。作为一个研究人员或开发者,为了比较这些模型的优缺点并加以利用,重现这些模型是非常必要的。但在已有的模型中,很多模型并没有提供官方的实现;而目前已开源的部分模型,由于其所使用的深度学习框架和实现思路存在差异,对许多人来说,理解、比较、改进和重现这些模型又存在着较大困难。
搜狗搜索针对这样问题,近期提出并开源了
“搜狗阅读理解工具集合”
((Sogou Machine Reading Comprehension,以下简称“SMRC”)。SMRC 主要针对抽取式机器阅读理解任务,提供了包含数据集读取、预处理、神经网络模型基件、训练和评估的完整框架,同时对已发表的数十种机器阅读理解模型进行了复现和整合,用以帮助使用者快速、高效地重现已有模型或开发自己的阅读理解模型。
该工具集合也是目前业内最全的TensorFlow版本的阅读理解工具集合。目前与SMRC类似的工具集有 Allen AI的AllenNLP和UCL机器阅读理解组的Jack The Reader等。但AllenNLP和Jack The Reader更多的是提供适用于多个自然语言处理任务的框架,其中仅包含少量阅读理解模型(例如AllenNLP中针对SQuAD数据集的模型只有BiDAF和QANet)。SMRC则更多地深挖阅读理解任务,在建立一套模型构建和训练框架的同时,提供了10+ 个模型的实现。
项目链接: (请戳此处)
论文链接:
(请戳此处)
下面我们来看,SMRC具体有哪些内容——
一、工具集合框架
如上图所示,工具集合根据机器阅读理解的流程,将工具包分为四个模块:数据集读取器,数据预处理,模型构建和模型训练。 这四个模块的设计为管道流程,可用于大多数机器阅读理解任务。
数据集读取器
机器阅读理解取得快速进展,一个重要的原因就是各种大规模、高质量问答数据集的发布。为了避免重复开发读取数据集的代码,SMRC提供了一些典型的数据集如SQuAD1.0、SQuAD2.0、CoQA的读取模块;同时,为了增强语言多样性,SMRC还提供了支持中文数据集CMRC2018的模块。另一方面,用户也可以通过继承 base_dataset,针对其他数据集开发自定义的读取器。
数据处理
为了准备训练模型的数据,我们需要建立一个词汇表、提取语言特征,并将离散特征映射到索引中。该工具包提供了满足这些要求的模块:Vocabulary Builder 、Feature Extractor、Batch Generator。
模型构建
机器阅读理解任务的核心部分就是构建一个有效且高效的模型。SMRC除了提供内置的模型(我们将在后面介绍)外,还提供了机器阅读理解任务中常用的神经网络组件,以便于用户构建自定义的模型。遵循 “功能 API” 的思想,SMRC 将它们包装为 Tensorflow 层的 MRC 特定补充:
-
Embedding:包括Vanilla Embedding,PartiallyTrainableEmbedding、CoVeEmbedding,ElmoEmbedding和BertEmbedding等。
-
Recurrent:BiSTM和BiGRU是基本的循环层,此外SMRC还提供了它们的CUDNN版本——CudnnBiSTM 和 CudnnBiGRU。
-
相似度函数:SMRC提供了一系列用于计算文本之间的词级相似度的函数,例如DotProduct、TriLinear和MLP等。
-
Attendtion:注意力层通常与相似性函数一起使用,例如BiAttention,UniAttention和SelfAttention。
-
基本层:一些基本层用于机器阅读理解模型,例如VaritionDropout和Highway,ReduceSequence。
-
基本操作:这些主要是屏蔽操作,例如,masked softmax, mask logits 。
通过继承基础模型类并组合上述组件,开发人员基本可以快速地构建大多数主流机器阅读理解模型。
模型训练 在训练模型时,我们通常关心指标如何随着 train/dev 集而变化,何时执行early stopping,模型收敛需要多少时期等等。由于大多数模型都采用类似的训练策略,所以SMRC提供了一个训练模块,主要功能包括保持训练、评估和推理处理、保存最佳权重、与指数移动平均值协作以及记录训练摘要。每个模型还提供了用于保存和加载模型权重的界面。
二、内置模型
提供丰富的内置模型是SMRC的一大特色,这些内置模型都是对已有的优秀模型的复现。其中包括:
BiDAF:
与之前工作中的注意机制不同,BiDAF的核心思想是双向注意力,它模拟了query-to-context 和 context-to-query 的注意力。(Bidirectional Attention Flow for Machine Comprehension (ICLR 2017))
DrQA:
旨在解决开放域问题解答。 DrQA 使用文字嵌入、基本语言特征和简单的注意机制,证明了没有复杂结构设计的简单模型也可以在机器阅读理解中获得好的结果。(Reading Wikipedia to Answer Open-Domain Questions (ACL 2017))
FusionNet:
基于对以往工作中注意力方法的分析,Huang 等人提出了FusionNet,从三个方面扩展了注意力。他们提出使用词的历史和 fully aware attention,这使得模型结合了来自不同语义层的信息流。此外,这个想法也适用于自然语言推理。(Fusing via Fully-aware Attention with Application to Machine Comprehension (ICLR 2018))
R-Net:
R-Net的主要贡献是自我匹配的注意机制。在上下文和问题的门控匹配之后,引入了段落自匹配来汇总整个段落的证据并改进段落表示。(Gated Self-Matching Networks for Reading Comprehension and Question Answering (ACL 2017))
QANet:
QANet的体系结构改编自Transformer,它仅包含卷积和自注意力(self-attention)。由于不使用循环层,QANet在训练时间内提高了313倍的速度,在推理时间内提高了49倍的速度。(Combining Local Convolution with Global Self-Attention for Reading Comprehension (ICLR 2018))
IARNN:
SMRC中实现了两种基于内部注意力的RNN(IARNNs),这有利于句子表示并且在答案选择任务中有效。 IARNN-word 在输入RNN模型之前对问题上下文的单词表示进行加权。与仅实现输入字嵌入的IARNN-word不同,IARNN-hidden可以通过向计算注意力权重添加附加上下文信息来捕获多个单词之间的关系。(Inner Attention based Recurrent Neural Networks for Answer Selection (ACL 2017))
BiDAF ++:
在BiDAF基础上,引入了多段机器阅读理解的模型。基于BiDAF,BiDAF ++增加了自我注意力层以增加模型容量。(Simple and Effective Multi-Paragraph Reading Comprehension (ACL 2018))
BERT&ELMo:
预训练模型如BERT和ELMo在许多自然语言处理任务中都表现极好。在SMRC中,使用BERT、ELMo 和Cove作为嵌入层来提供强大的上下文表示。同时,SMRC还包括用于机器阅读理解的BERT模型,以及修改版本。
三、快速构建及检验
SMRC提供了简单的接口,对于用户来说简单易用,且具有可扩展性。对于主流阅读理解模型,只需要十多行的代码便可完成训练和测试。下面以SquAD1.0为例,快速构建并训练一个内置模型(DrQA):
1、下载数据集
$ wget https://rajpurkar.github.io/SQuAD-explorer/dataset/train-v1.1.json
$ wget https://rajpurkar.github.io/SQuAD-explorer/dataset/dev-v1.1.json
$ wget https://nlp.stanford.edu/data/glove.840B.300d.zip #used in DrQA
$ unzip glove.840B.300d.zip
2、准备数据集阅读器和鉴别器
train_file = data_folder + "train-v1.1.json"
dev_file = data_folder + "dev-v1.1.json"
reader = SquadReader()
train_data = reader.read(train_file)
eval_data = reader.read(dev_file)
evaluator = SquadEvaluator(dev_file)
3、构建词汇表并加载预训练嵌入
vocab = Vocabulary(do_lowercase=False)
vocab.build_vocab(train_data + eval_data, min_word_count=3,
min_char_count=10)
word_embedding =
vocab.make_word_embedding(embedding_folder+"glove.840B.300d.txt")
4、用特征提取器。特征提取器只是在使用语言特征时才需要:
feature_transformer =
FeatureExtractor(features=['match_lemma','match_lower','pos','ner','context_tf'],
build_vocab_feature_names=set(['pos','ner']),word_counter=vocab.get_word_counter())
train_data = feature_transformer.fit_transform(dataset=train_data)
eval_data = feature_transformer.transform(dataset=eval_data)
5、构建用于训练和评估的批处理生成器,其中在使用语言特征时需要附加特征和特征词汇表。
train_batch_generator = BatchGenerator(vocab,train_data, training=True, batch_size=32, \
additional_fields =
feature_transformer.features,feature_vocab=feature_transformer.vocab)eval_batch_generator = BatchGenerator(vocab,eval_data, batch_size=32, \
additional_fields = feature_transformer.features,
feature_vocab=feature_transformer.vocab)
6、导入内置模型并编译训练操作,调用train_and_evaluate等函数进行训练和评估。
model = DrQA(vocab, word_embedding, features=feature_transformer.features,\
feature_vocab=feature_transformer.vocab)
model.compile()
model.train_and_evaluate(train_batch_generator, eval_batch_generator, evaluator, epochs=40, eposides=2)
以上这些代码适用于所有内置模型,以及示例中的所有数据集上。你可以按照上面的代码在不同的数据集上分别尝试不同的模型,看看效果如何。
SMRC在Github中提供的对比结果如下:
在Table 1中是针对SQuAD1.0的模型结果,可以看出复现模型与原模型的性能基本一致。而另一方面,当模型加入了BERT或ELMo这样的预训练后,其结果往往会有极大的提升,因此它们也是NLP的一个新趋势。
SQuAD 2.0和CoQA的任务与SQuAD1.0并不相同,因此有些模型不能直接应用到这两个数据集上。基于BiDAF、BiADF++等模型的测试,可以看出内置模型有时候甚至比原模型更好。此外,也可以将BiDAF应用在CMRC数据集上,搜狗搜索提供的测试结果F1/EM 为57.01/35.0,这提供了一个新的基线。
四、总结
搜狗搜索开源的“搜狗阅读理解工具集合”,提供了TensorFlow版本的数据集读取、预处理、神经网络模型基件、训练和评估等完整的阅读理解任务框架,使开发人员能够快速构建自定义的机器阅读模型。此外,SMRC还以统一的框架提供了十多种机器阅读理解模型,方便了开发人员复现和检验已有的模型。这些工作将大大地加速相关的学术研究。同时,SMRC也给所有想要评估和尝试落地机器阅读理解技术的算法从业人员提供了上手的捷径和产品化的初动力。
据了解,目前搜狗搜索已经将相关技术应用于产品及业务中。在法律领域,搜狗律师的问答机器人具备逻辑分析和推理能力,在递进式问询过程中,挖掘判决书中的结构化数据,帮助用户理清已发生的事实,并在充分、准确理解用户法律诉求的基础上,给出可能的判决结果、法律建议或相似案例;在医疗领域,搜狗搜索的智能分诊功能,首创引入了基于人工智能技术的智能诊断助手,模拟医生与病人对话的模式与用户进行病情沟通,根据用户实际症状帮助判断用户可能患有的疾病。
参考资料:
[1] SMRCToolkit
[2] Sogou Machine Reading Comprehension Toolkit
[3] 论文原文《基于文档门控制器的开放域问答》
[4] 搜狗夺国际顶级挑战赛CoQA第一名
[5] CoQA: A Conversational Question Answering Challenge
[6]
SQuAD2.0: The Stanford Question Answering Dataset
雷锋网版权文章,未经授权禁止转载。详情见。