机器阅读理解(QA,Question Answer)和机器问题生成(QG,Question Generation)是自然语言处理领域的对偶问题,在工业和学术界都有重要的研究价值。
因业务需要,最近我刚好接触了这两块内容,本文和大家分享一下机器如何答题和出题。
一、机器阅读理解
传统的机器阅读理解(MRC)是NLP语义理解的重要分支,给定文章 和问题 ,输出答案 ,即建模
1)区间答案:给定一篇文章和问题,模型从文章中抽取答案片段;
2)自由回答:给定一篇文章和问题,模型端到端生成答案;
3)多项选择:给定一篇文章和问题以及多个选项,模型输出正确选项。
其实这三种题型在我们的初中高中考试里都碰到过无数次,语文阅读理解也是我上学时最“畏惧”的题目之一(经常看了后文忘了前文)。
部分数据集例如SQuAD2.0,为了加大难度额外设置了“无答案”问题,即所谓的拒答。其他 MRC 代表性数据集有 CoQA、RACE等。
MRC数据集
关于MRC的实现方法,早期主要基于关键词匹配的检索方法,即根据问题在文章中逐句检索,找到最相关的语句作为答案。
随着深度学习的兴起,机器阅读理解进入神经网络时代。MRC模型的输入为文章和问题,首先模型针对两部分输入各自编码,称为编码层。
随后,由于文章和问题之间存在相关性,需要建立二者的联系,加深模型对于上下文的理解。NLP中的Attention等网络非常适合处理该任务,我们将这个模块称为交互层。
最后,根据之前建立的语义联系,模型可以在输出层预测问题的答案。此外,在输出层需要确定模型优化时的评估函数和损失函数。
整体结构大致如下所示:
SQuAD和CoQA榜单的Top1模型准确率都已超过90%,优于人类测评结果,证明浅层的机器阅读理解任务已经完全解决了。
二、机器问题生成
在实际场景中,相比回答问题,给定一篇非结构化文档让模型自动构建“答案—问题”对同样价值显著,可以大幅缓解人工标注成本。
问题生成demo
因为答案可以通过关键词或序列标注从文档中预先获取(一般是有意义的实体),我们可以直接提供答案和文档,建模 。
另一方面,也可以把答案生成作为任务的一部分,让模型端到端依次输出,即建模 。
由于“答案”一般比问题更短,容易想到生成“文档->答案+问题”的难度要低于“文档->问题+答案”,整个过程可以用Seq2Seq框架解决。
问题生成任务向上泛化,可以延伸出基于文档的对话生成(Document based Dialog)等任务,给定一篇文档,模型需要生成主题受限的连续对话。
关于该任务,可以参考之前的一篇推文:如何验证声称通过了图灵测试的AI机器人?
三、实验与baseline
机器阅读理解
MRC最流行的基线模型应该是BERT+下游微调的形式,将文档和问题拼接并用“SEP”分割,经过预训练语言模型深度编码后,用两个Dense层分别预测答案在文档中的开始位置和结束位置。
如果文档很长超过了模型的输入长度,需要添加截断/滑窗等操作来处理。
很多比赛的SOTA方案为了提高最终结果,会使用对抗训练、自蒸馏、模型融合或引入额外的神经网络和任务来辅助训练。
对于“拒答”问题,一种简单的方法是对输入序列首字符“CLS”的Embedding做一个二分类,预测是否存在答案。
机器问题生成
MQG目前效果最好同时最优雅的模型是微软的UNILM,官方提供了完整的开源项目。
目前的方案需要用户同时提供答案和文档,UNILM直接使用BERT和特殊的Attention-mask将MQG建模成Seq2Seq问题。
在训练阶段,文档和答案部分使用了普通的双向Transformer,模型可以充分学习上下文信息;问题部分使用单向Transformer, 第 个token只能观察到 的token序列,以防数据泄露。
在测试阶段,和GPT等自回归模型类似,UNILM根据P和A递归生成Q,直到输出结束符。
测试文档demo
我测试了已经微调好的UNILM,输入上面这篇文档,模型输出问题:“做哪三件事可以帮助你的大脑良好工作?”
从这个demo看,模型的效果还是非常不错的,感兴趣的同学可以来自己试一试。
['What', 'three', 'things', 'do', 'you', 'do', 'to', 'help', 'your', 'mind', 'work', 'well',