论文浅尝 – ICLR 2020 | 用于文本推理的神经模块网络
论文笔记整理: 邓淑敏,浙江大学在读博士,研究方向为低资源条件下知识图谱自动化构建关键技术研究。
论文链 接 : https://openreview.net/pdf?id=SygWvAVFPr
Demo链接: https://demo.allennlp.org/reading-comprehension
代码链接 : https://nitishgupta.github.io/nmn-drop/
这篇文章解决的任务是复杂问题问答,比如回答“谁在第二节比赛中得到最高分?”类似的问题。解决这个任务需要:理解问题 -> 在蕴含答案的文本中做信息抽取 à 符号推理,所以问题的难点也显而易见:( 1 )理解问句语义,将复杂问题拆分成简单问题;(2)文本理解,理解文本中实体、关系和事件等;(3)进行推理,比如判断大小,计数等。传统的方法比如语义解析,或者pipeline的模型,要么需要基于结构化或半结构化数据去做,要么在子任务中依赖更多的监督信号,这对复杂问题问答任务来说都很难实现。因此这篇文章提出用神经模块网络去解决这个问题,先将问题解析成logical form,然后在文本中运行可执行的模块。这里的模块可看成用于推理的可学习的函数。
模块概览
复杂问题问答包含的推理可分为两大类:自然语言推理和符号推理。自然语言推理可以看成是文本信息抽取的过程,符号推理就是基于抽取出的结构化知识进行推理判断。这两大类推理中定义的模块如上图所示。
下面看一个用神经模块网络解复杂问题问答的例子。
第一步:将问题解析成logical form。
将问题解析成logical form
第二步:在蕴含答案的文本中执行模块。
模块运行的最终结果
执行第一个模块:find () ,找出得分这个实体
执行第二个模块: find-num() ,找出得分的数值
执行第三个模块:max -num() ,找出最大的得分值
执行第四个模块:extract -argument() ,找出得到最大得分的人,这个模块类似于事件抽取中的argument extraction
那接下来的问题就在于,如何组合这些模块,以及如何学习出这些模块。组合这些模块目前主要用一些seq -to-seq的模型,至于学习这些模块,下面给出学习find() 模块的示例。
问题的嵌入用Q表示,蕴含答案的文本嵌入用P表示,f ind(Q) -> P ,输入问句的tokens,输出蕴含答案的文本中和输入tokens相同或相似的token分布,如下图所示
find(Q) -> P 示例
具体做法就是先计算一个“问题-蕴含答案文本”的相似度矩阵
然后按行标准化S,得到“问题-蕴含答案文本”的权重矩阵 。
最后得到蕴含答案文本的token权重分布:
其他模块的做法这里就不赘述了,可以参见原文。
本文的实验用了DROP数据集( https://www.aclweb.org/anthology/N19-1246.pdf ),实验结果如下
实体预测的实验结果比较
由于篇幅限制省略了一些细节,如果大家对这篇文章的工作感兴趣,可以阅读原文,也欢迎一起交流。
OpenKG
开放知识图谱(简称 OpenKG)旨在促进中文知识图谱数据的开放与互联,促进知识图谱和语义技术的普及和广泛应用。
点击 阅读原文 ,进入 OpenKG 博客。