学会提问的BERT:端到端地从篇章中构建问答对

2020 年 8 月 9 日 AINLP

文 |  苏剑林


机器阅读理解任务,相比不少读者都有所了解了,简单来说就是从给定篇章中寻找给定问题的答案,即“篇章 + 问题 → 答案”这样的流程,笔者之前也写过一些关于阅读理解的文章,比如《基于CNN的阅读理解式问答模型:DGCNN》[1]等。至于问答对构建,则相当于是阅读理解的反任务,即“篇章 → 答案 + 问题”的流程,学术上一般直接叫“问题生成(Question Generation)”,因为大多数情况下,答案的构造相对容易,直接从文中利用规则随机选取即可(虽然这样会产生很多实际不可提问的假答案),所以很多文章都只关心“篇章 + 答案 → 问题”这一步。

本文将带来一次全端到端的“篇章 → 答案 + 问题”实践,包括模型介绍以及基于bert4keras[2]的实现代码,欢迎读者尝试。

效果

输入篇章:世界第二高山峰是乔戈里峰,位于中国境内。
生成问答:世界第二高山峰叫什么名字?   乔戈里峰
乔戈利峰是世界第几高峰     第二

输入篇章:7月28日,泰国将迎来十世王玛哈·哇集拉隆功国王的68岁诞辰。
生成问答:泰国的十世王是谁     玛哈·哇集拉隆功国王
泰国的十世王玛哈·哇集拉隆多少岁?    68岁
泰国的玛哈·哇集拉隆功国王的生日是哪一天?    7月28日
玛哈·哇集拉隆功国王是哪个国家的     泰国

输入篇章:泼水节,亦称宋干节,已有700年的历史,是傣族(中国)、德昂族最盛大的传统节日。
生成问答:泼水节又称为什么     宋干节
泼水节是我国哪一民族一年中最盛大的节日?    傣族
泼水节有多少年历史了?    700年

思路分析

本文的目标是完全端到端地实现“篇章 → 答案 + 问题”,包括答案的选取也是由模型自动完成,不需要人工规则。其实说起来也很简单,就是用“BERT + UniLM”的方式来构建一个Seq2Seq模型(UniLM的Attention Mask,加上BERT的预训练权重),如果读者还不了解UniLM,欢迎先阅读《从语言模型到Seq2Seq:Transformer如戏,全靠Mask》[3]

笔者之前在文章《万能的seq2seq:基于seq2seq的阅读理解问答》[4]中也给出过通过Seq2Seq模型来做阅读理解的实现,即直接用Seq2Seq模型来构建p(答案∣篇章,问题),图示如下:

▲用Seq2Seq的思路做阅读理解

事实上,在上述模型的基础上稍微改动一下,将问题也列入生成的目标之中,就可以实现问答对生成了,即模型变为p(问题,答案∣篇章),如下图:

▲稍微修改一下,用来做问答对生成

但是,直觉上不难想到“篇章 → 答案”、“篇章 + 答案 → 问题”的难度应该是低于“篇章 + 问题 → 答案”的,所以我们将问题和答案的生成顺序调换一下,变为p(答案,问题∣篇章),最终的效果会更好:

▲先生成答案,再生成问题,效果更好些

实现分析

模型就介绍到这里了,其实也没什么好说的,就是确定好哪些是输入、哪些是输出,然后“BERT + UniLM”套上去就行了。下面是笔者的参考实现[5]

task_question_answer_generation_by_seq2seq.py

这里值得讨论的是解码的思路。一般的Seq2Seq模型,解码到一个[SEP]就结束了,而本文的模型需要解码到两个[SEP]才能结束,截止到第一个[SEP]的是答案,而两个[SEP]之间的则是问题。理论上来说,从给定篇章中我们可以构建很多问答对,换句话说目标不是唯一的,所以我们不能用Beam Search之类的确定性解码算法,而是要用随机解码算法(相关概念可以参考《如何应对Seq2Seq中的“根本停不下来”问题?》[6]中的“解码算法”一节)。

但问题是,如果完全使用随机解码算法,那么生成的问题会过于“天马行空”,也就是可能会出现一些跟篇章无关的内容,比如篇章是“我国火星探测器天问一号发射成功”,生成的问题可能是“我国第一颗人造卫星是什么”,虽然相关,但是过于发散了。所以,这里建议使用一个折中的策略:用随机解码来生成答案,然后用确定性解码来生成问题,这样能尽量保证问题的可靠性。当然,如果读者更关心生成问题的多样性,那么全部使用随机解码也行,反正就自己调试啦。

读者还需要注意的是,上述参考脚本中并没有对答案进行约束,那么生成的答案可能并不是篇章中的片段。毕竟这只是个参考实现,离实用还有一定距离,请有兴趣的读者根据自己的需求自行理解和修改代码。此外,由于问答对构建已经完全变成了一个Seq2Seq问题,所以用来提升Seq2Seq性能的技巧都可以用来提高问答对的生成质量,比如之前讨论过的《Seq2Seq中Exposure Bias现象的浅析与对策》[7],这些都交给读者自己尝试了。

文章小结

本文是一次端到端的问答对生成实践,主要是基于“BERT + UniLM”的Seq2Seq模型来直接根据篇章生成答案和问题,并讨论了关于解码的策略。总的来讲,本文的模型没有什么特殊之处,但是因为借助了BERT的预训练权重,最终生成的问答对质量颇有可圈可点之处。



欢迎加入AINLP预训练模型技术交流群
进群请添加AINLP小助手微信 AINLPer(id: ainlper),备注预训练模型


推荐阅读

这个NLP工具,玩得根本停不下来

征稿启示| 200元稿费+5000DBC(价值20个小时GPU算力)

完结撒花!李宏毅老师深度学习与人类语言处理课程视频及课件(附下载)

从数据到模型,你可能需要1篇详实的pytorch踩坑指南

如何让Bert在finetune小数据集时更“稳”一点

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

文本自动摘要任务的“不完全”心得总结番外篇——submodular函数优化

Node2Vec 论文+代码笔记

模型压缩实践收尾篇——模型蒸馏以及其他一些技巧实践小结

中文命名实体识别工具(NER)哪家强?

学自然语言处理,其实更应该学好英语

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。


阅读至此了,分享、点赞、在看三选一吧🙏

登录查看更多
1

相关内容

包括微软、CMU、Stanford在内的顶级人工智能专家和学者们正在研究更复杂的任务:让机器像人类一样阅读文本,进而根据对该文本的理解来回答问题。这种阅读理解就像是让计算机来做我们高考英语的阅读理解题。

知识荟萃

精品入门和进阶教程、论文和代码整理等

更多

查看相关VIP内容、论文、资讯等
【KDD2020-UCLA-微软】GPT-GNN:图神经网络的预训练
专知会员服务
62+阅读 · 2020年8月19日
基于多头注意力胶囊网络的文本分类模型
专知会员服务
77+阅读 · 2020年5月24日
【哈工大】基于抽取的高考作文生成
专知会员服务
36+阅读 · 2020年3月10日
BERT技术体系综述论文:40项分析探究BERT如何work
专知会员服务
139+阅读 · 2020年3月1日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
【关系抽取】详聊如何用BERT实现关系抽取
深度学习自然语言处理
32+阅读 · 2020年3月21日
万能的Seq2Seq:基于Seq2Seq的阅读理解问答
PaperWeekly
7+阅读 · 2019年12月18日
基于机器阅读理解(MRC)的信息抽取方法
DataFunTalk
13+阅读 · 2019年11月1日
ACL 2019 | 理解 BERT 每一层都学到了什么
THU数据派
9+阅读 · 2019年9月9日
3分钟看懂史上最强NLP模型BERT
新智元
23+阅读 · 2019年2月27日
如何用最强模型BERT做NLP迁移学习?
AI100
3+阅读 · 2019年2月3日
Generating Fact Checking Explanations
Arxiv
9+阅读 · 2020年4月13日
Arxiv
20+阅读 · 2019年9月7日
Arxiv
8+阅读 · 2019年3月21日
VIP会员
相关资讯
【关系抽取】详聊如何用BERT实现关系抽取
深度学习自然语言处理
32+阅读 · 2020年3月21日
万能的Seq2Seq:基于Seq2Seq的阅读理解问答
PaperWeekly
7+阅读 · 2019年12月18日
基于机器阅读理解(MRC)的信息抽取方法
DataFunTalk
13+阅读 · 2019年11月1日
ACL 2019 | 理解 BERT 每一层都学到了什么
THU数据派
9+阅读 · 2019年9月9日
3分钟看懂史上最强NLP模型BERT
新智元
23+阅读 · 2019年2月27日
如何用最强模型BERT做NLP迁移学习?
AI100
3+阅读 · 2019年2月3日
Top
微信扫码咨询专知VIP会员