21

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

 4 years ago
source link: https://kexue.fm/archives/7630
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

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

输入篇章:世界第二高山峰是乔戈里峰,位于中国境内。 生成问答:世界第二高山峰叫什么名字? 乔戈里峰 乔戈利峰是世界第几高峰 第二 输入篇章:7月28日,泰国将迎来十世王玛哈·哇集拉隆功国王的68岁诞辰。 生成问答:泰国的十世王是谁 玛哈·哇集拉隆功国王 泰国的十世王玛哈·哇集拉隆多少岁? 68岁 泰国的玛哈·哇集拉隆功国王的生日是哪一天? 7月28日 玛哈·哇集拉隆功国王是哪个国家的 泰国 输入篇章:泼水节,亦称宋干节,已有700年的历史,是傣族(中国)、德昂族最盛大的传统节日。 生成问答:泼水节又称为什么 宋干节 泼水节是我国哪一民族一年中最盛大的节日? 傣族 泼水节有多少年历史了? 700年

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

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

yqQRVzY.png!web

用Seq2Seq的思路做阅读理解

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

f2Ur2a3.png!web

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

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

QbqQNrV.png!web

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

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

task_question_answer_generation_by_seq2seq.py

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

但问题是,如果完全使用随机解码算法,那么生成的问题会过于“天马行空”,也就是可能会出现一些跟篇章无关的内容,比如篇章是“我国火星探测器天问一号发生成功”,生成的问题可能是“我国第一课人造卫星是什么”,虽然相关,但是过于发散了。所以,这里建议使用一个折中的策略:用随机解码来生成答案,然后用确定性解码来生成问题,这样能尽量保证问题的可靠性。另外,读者还需要注意的是,上述参考脚本中并没有对答案进行约束,那么生成的答案可能并不是篇章中的片段。毕竟这只是个参考实现,离实用还有一定距离,请有兴趣的读者根据自己的需求自行理解和修改代码。

最后,由于问答对构建已经完全变成了一个Seq2Seq问题,所以用来提升Seq2Seq性能的技巧都可以用来提高问答对的生成质量,比如之前讨论过的 《Seq2Seq中Exposure Bias现象的浅析与对策》 ,这些都交给读者自己尝试了。

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

转载到请包括本文地址: https://kexue.fm/archives/7630

更详细的转载事宜请参考: 《科学空间FAQ》

如果您还有什么疑惑或建议,欢迎在下方评论区继续讨论。

如果您觉得本文还不错,欢迎/本文。打赏并非要从中获得收益,而是希望知道科学空间获得了多少读者的真心关注。当然,如果你无视它,也不会影响你的阅读。再次表示欢迎和感谢!

如果您需要引用本文,请参考:

苏剑林. (2020, Jul 25). 《学会提问的BERT:端到端地从篇章中构建问答对 》[Blog post]. Retrieved from https://kexue.fm/archives/7630


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK