在上期,我们介绍了深度学习对传统向量建模KB-QA方法进行提升的一篇代表论文,可以看出它的效果击败了当时所有的传统方法。本期,我们将以深度学习提升语义解析方法的一篇代表作为例,作为深度学习篇的中篇,为大家进一步揭开知识库问答的面纱。
我们在揭开知识库问答KB-QA的面纱2·语义解析篇中介绍了传统方法之一的语义解析(Semantic Parsing)方法,该方法相比向量建模方法有更强的解释性,具有一定的推理能力。今天,我们将介绍一篇利用深度学习对该语义解析方法进行提升的论文,来自Microsoft公司的Semantic Parsing via Staged Query Graph Generation:Question Answering with Knowledge Base(文章发表于2015年的ACL会议,是当年的Outstanding Paper)。
该文章分析了传统语义解析方法的不足,受信息抽取和向量建模方法的启发,将语义解析过程转化成查询图(Query graph)分阶段生成的过程,使用了卷积神经网络来提升自然语言到知识库关系的映射。该方法在WebQuestion数据集上测试,取得了52.5的F1-score,该性能远超当时的所有方法。
让我们先回想一下传统的语义解析方法,它的思想是把自然语言问题转化为逻辑形式,通过逻辑形式转化为查询语句,在知识库中查询得出最终答案。在进行语义解析生成逻辑形式的过程中,主要是在提取自然语言问题中的信息和利用训练好的语法解析器进行解析,这一过程几乎没有使用到知识库里的信息。而在向量建模和信息抽取方法中,我们不仅对问题进行了特征提取,还借助知识库确定了候选答案范围(相比语义解析中的词汇映射要在大范围的知识库实体关系中寻找映射,这样的方式使得搜索范围大大减小),并将候选答案在知识库中的信息作为特征。相比之下,可以看出传统的语义解析方法和知识库本身的联系是不够紧密的(Decoupled from KB),也就是说,传统语义解析方法对知识库的利用还不够。
再看看语义解析的第一步,词汇映射(Lexicon)。要将自然语言中的谓语关系映射到知识库中的实体关系,是一件很困难的事情,仅仅通过统计方式进行映射,效果并不好。如果我们能考虑知识库的信息,是不是能将词汇映射的范围缩小?使用深度学习的办法通过分布式表达来代替基于统计方法的词汇映射,会不会取得更好的效果?
在语义解析的过程中,如何更好的去利用知识库的知识,缩小语义解析树的搜索范围,并获取更多有益的特征信息?就让我们带着疑问,看一下本文的作者是如何解决这些问题的。
我们来考虑这样一个问句_“__Who first voiced Meg on Family Guy?"_ (谁是第一个为Family Guy里的MegGriffin角色配音的人,_注:Family Guy是美国的一部动画片,MegGriffin是其中的一个角色,有两个人先后为其配音过_)
可以看出,这个问题是有一定难度的,我们在前一期谈到,对于深度学习的向量建模法来说,_first_这种时序敏感(Time-Aware)词常常会被模型忽略而得出错误答案。语义解析方法可以将first解析为逻辑形式的聚合函数(_arg min_),但它又难以将问题中的_Meg_这一缩写词通过词汇表映射为知识库中的_MegGriffin_。
想一想我们人如果给定知识库会怎么去寻找答案?首先我们也许不知道Meg具体是指哪个角色,但是我们可以先去知识库里搜Family Guy,在它对应的知识库子图中搜索和Meg很接近的实体,也就是说我们一开始就借助知识库,帮我们缩小了范围,这样我们就很容易找到Meg其实对应的是MegGriffin。我们可以借助这样的思想来对我们的语义解析进行改进。
为了更好的去利用知识库,我们用一种图的形式来代替语法解析树表示逻辑形式,这个图被称为查询图(_query graph_)。
问句_“__Who first voiced Meg on Family Guy?"_对应的查询图如下图所示:
查询图可以分为以下四个部分:
知识库实体,在图中用圆角矩形表示。中间变量,在图中用白底圆圈表示。聚合函数,用菱形表示。lambda变量(答案),在图中用灰底圆圈表示。图中实体节点到答案变量的路径可以转化为一系列join操作,不同路径可以通过intersection操作结合到一起,因此,该查询图在不考虑聚合函数argmin的情况下可以转化为一个lambda表达式,即:
(如果你不懂 lambda表达式,没有关系,上式表示 我们要寻找x,使得在知识库中存在实体y,满足 1. y和FamilyGuy存在cast关系;2. y和x存在actor关系;3.y和MegGriffin存在character关系,这里我们可以把y想象成是一个中间变量,通过对它增加约束来缩小它的范围,通过它和答案x的关系来确定答案x)
有了查询图,通过将其转化为lambda表达式就可以在知识库中查询得到答案。那么,如何去构造查询图呢?
我们先看看查询图的构成成分。
问题中的主题词(可以看作是一个根节点)到答案变量的这条路径(如Family Guy - y - x)包含了所有的中间变量,这条路径可以看作是从问题到答案的一个核心推导过程,我们将其称作核心推导链(core inferential chain)。
而对于核心推导链里的中间变量,我们可以对它加一些约束(要求它与其他实体具有一定的关系,如 y - character -> Meg Griifin)和聚合函数(如 y - from -> arg min)。
因此我们查询图的生成,可以分为以下几个步骤:确定主题词,确定核心推导链,是否增加约束和聚合。整个过程可以用下面的这个有限状态机自动机表示:
其中状态集合分别表示空集、仅含主题词节点、含核心推导链、含约束节点。而动作集合分别表示选择主题词节点、选择核心推导链、加入聚合函数、加入约束。
因此我们查询图可以分阶段生成,这个生成的过程实质上是一个搜索。依照我们的有限状态自动机,根据图所处的状态,我们可以确定在该状态下可以采取的动作的集合(比如当前我们处在状态,根据有限自动机我们的动作为选择主题词节点,假设检测出来问句中有3个主题词候选,那么我们的动作集合大小为3)。因此,我们的查询图生成实际上是一个搜索过程,如果对这个搜索不加任何限制,那么这个搜索是指数级复杂度的。因此对于每一个状态,我们可以用奖励函数(reward function)对它进行评估,奖励函数得分越高表示这个状态对应的查询图和正确的语义解析表达越接近。我们用一个对数线性(log-linear)模型来学习奖励函数(这里涉及的一些概念不禁让人想起增强学习)。有了奖励函数,我们用best-first的策略利用优先队列进行启发式搜索,算法流程如下:
其中代表在状态下采取动作后得到的新状态,我们将优先队列的大小限制为1000。上述算法可以简单概括为:每次从队列中取出得分最高的状态分别执行动作集中的每一个动作生成一批新的状态并压入优先队列,始终记录得分最高的状态,最终将得分最高的状态作为最后的查询图。
接下来,我们来看看每一种动作是怎么执行的,以及如何去构造奖励函数。我们依旧以问题_“__Who first voiced Meg on Family Guy?"_为例。
我们的第一种动作(action),就是从问题中确定主题词,这个操作称为主题词链接(Linking Topic Entity)。作者使用了S-MART作为实体链接系统,该系统是针对带噪音的短文本设计的,适合用于对问句提取主题词,它会为相应的 实体-自然语言短语 链接对 给出链接得分(Linking Score)。我们最多保留得分最高的10个实体作为候选,第一步如图所示:
接下来,我们确定核心推导链。对于每一个候选的主题词,将它在知识库中对应的实体节点周围长度为1的路径(如下图)和长度为2且包含CVT节点的路径(如下图)作为核心推导链的候选(CVT,即复合值类型 Compound Value Types,是freebase中用于表示复杂数据而引入的概念,不了解的朋友可以点击该链接)。如下图:
核心推导链其实就是将自然语言问题映射为一个谓语序列(如cast-actor),因此我们可以用卷积神经网络来对这个映射进行打分,如下图所示:
我们将自然语言和谓语序列分别作为输入,分别经过两个不同的卷积神经网络得到一个300维的分布式表达,利用表达向量之间的相似度距离(如cosine距离)计算自然语言和谓语序列的语义相似度得分。由于我们上期我们已对卷积神经网络做过介绍,因此这里我们对它不再赘述。需要注意的是,这里的输入采用的是字母三元组(letter-trigram)的方式,这是一个非常有趣的方式,类似于character-CNN。每个单词都将它拆分成几个 字母三元组,作为CNN的输入。比如单词_who_可以拆为#-w-h,w-h-o,h-o-#。每个单词通过前后添加符号#来区分单词界限(并且单词最短只含一个字母,添加两个#可以保证能形成至少一个字母三元组) 。
采用字母三元组的好处在于:1.减小输入维度,这样输入维度可以稳定在字母集大小+1(#号)的三次方,即,而不是字典大小(同时可以处理一些字典中不存在的词和一些低频词,如缩写词等等)。2.相同语义的词语可能因为词根等缘故,前缀或者后缀会比较相似,这样能更好的提取单词语义的特征。3.对于现实生活中的用户,有时候可能会发生单词拼写错误,但错误拼写不会对这种输入方式造成太大影响。
我们通过增加约束和聚合函数的方式扩展查询图,缩小答案的范围,以增加准确率,如下图
如何去增加约束和聚合函数呢?作者采用了基于一些简单规则的方式,比如当实体链接检测到句子中出现其他实体,那么我们可以增加一个约束。又比如句子中出现了first等时序敏感词,我们可以增加聚合节点。具体来说,根据以下规则确定是否要为CVT节点添加约束节点或者聚合节点:
1.约束实体出现在问句中
2.约束谓词表示事件的结束时间,但没有值(这表示它是当前事件)
3.问题中出现约束实体名称的一些单词
4.谓语是_people.marriage_._type_of_union_(这说明关系是否是家庭伴侣关系、婚姻关系还是民事关系)
5.问句中包含单词 first 或者 _oldest_,并且谓语是from形式的谓语(表明事件的起始时间)
6.问句中包含单词 last_, _latest 或 newest ,并且谓语是to形式的谓语(表明事件的结束时间)
而对于答案节点,如果包含以下之一的谓语,我们会添加一个约束节点:
people.person.gender / _common.topic.notable types /_ common.topic.notable_for
我们用对数线性模型训练奖励函数,因此我们要确定输入向量,和信息抽取以及传统语义解析方法一样,我们手工定义一个特征向量来表征整个查询图的信息,将它作为对数线性模型的输入。我们先来对特征有个主观上的感受,例如问题“_Who first voiced Meg on Family Guy?_” 对应的查询图,它的特征如下图所示:
具体来说,我们从 主题词链接、核心推导链、增加约束聚合三个方面定义特征。
a.主题词链接特征:实体链接得分(EntityLinkingScore),由实体链接系统给出。
如 EntityLinkingScore(FamilyGuy,"Family Guy")=0.9
b.核心推导链特征:
1.PatChain:将问句中的主题词替换为实体符号,和谓语序列同时输入两个不同的CNN,根据CNN输出的表达求语义相似度作为特征。
如: PatChain("Who first voiced Meg on <e>", cast-actor) =0.7
2.QuesEP:将谓语序列和主题词的规范名称(canonical name)连接(concatenate)起来作为输入,和问题求语义相似度。
如: _QuesEP(q,“family guy cast-actor”_) = 0.6
3.ClueWeb:用ClueWeb来训练一个更加_in-domain_的模型。如果一句话包含两个实体和谓语,那么就把这句话和谓语作为一组 数据对 输入模型进行训练。_注意:ClueWeb的输入和PatChain是一样的,但是其模型是用不同数据训练的。_
从这定义的三个特征可以看出,这其实是一个ensemble模型,将三种模型的输出结果进行了一个log-linear组合。
c.约束聚合特征:
对于CVT节点有以下特征:
1.约束实体是否出现在问句中 如_ConstraintEntityInQ("Meg Griffin",q)=1_
2.是否是当前发生的事件
3.是否是当前发生的事件,且问句中包含关键词“currently”, “current”, “now”, “present” 和“presently”
4.约束实体单词出现在问句中的百分比 如_ConstraintEntityWord("Meg Griffin",q)=0.5_
5.约束谓语的类型是_people.marriage.type_of_union_
6.问题中是否包含“first” 或 “oldest” ,谓语是from形式谓语,并且CVT节点按该from性质排序是第一
7.问题中是否包含“last”, “latest” 或 “newest” ,谓语是to形式谓语,并且CVT节点按该to性质排序是最后
对于答案节点有以下特征:
1.性别一致性(男性):约束谓语是_gender_,并且问句中出现了以下男性关键词中的一个{“dad”, “father”, “brother”, “grandfather”, “grandson”, “son”, “husband”}
2.性别一致性(女性):约束谓语是_gender_,并且问句中出现了以下女性关键词中的一个{“mom”, “mother”, “sister”, “grandmother”, “granddaughter”, “daughter”, “wife”}
3.当约束谓语是 notable_types 或 notable_for 时,约束实体单词出现在问题中的百分比
d.总体特征
查询图对应的答案数量NumAns和查询图的节点数NumNodes
在信息抽取中,我们的模型是在进行二分类(根据特征向量判定候选答案是否是正确答案),而在本文中,我们对模型不进行二分类,而是根据查询图对应的实体和真实答案的F1-score进行排名。基于lambda-rank算法对一个一层的神经网络进行训练。这样做的好处是,有些查询图虽然查询得到的答案和真实答案不完全相同,但根据它的相同程度(F1-score)也可以说它比完全错误的查询图要好。
在训练数据上,通过实体链接系统确定候选实体,候选实体到正确答案的知识库路径(长度限制为2)作为核心推导链的正样本,错误查询图中的路径作为负样本。根据训练数据,作者生成了17,277个F1-score不为0的查询图(正样本)和1.7M完全错误的查询图(负样本)对卷积神经网络进行训练。
对于奖励函数的训练,为每个问题生成了4000个样例(包含所有正确的查询图和随机选择的负样本)以F1-score作为排名标准来训练排名器(ranker)。
该方法与当时的所有baseline进行了比较,效果如下
可以看出该方法取得了相当大的提升,也因此获得了当年的Outstanding paper。
本方法使用到了外部的实体链接系统,作者也比较了使用Freebase Search API时的性能,F1-score会下降约4.1。同时,作者也对核心推导链所涉及的三个特征的性能进行了比较,核心推导链三个特征的性能如下表:
我们可以发现,其实只使用PatChain的性能就已经很好了(达到了惊人的49.6),原因是WebQuestion里50%的问题可以只是用核心推导链就可以得出正确答案。
最后作者进行了错误分析,随机选择100个答错的问题,发现35%的错误来自核心推导链构建错误,23%来自约束错误,8%来自实体链接错误,剩下34%的错误来自于标签错误或不完整已经问题中的实体有歧义等。也就是说有34%的错误是数据的问题,这再一次显示出了该方法的强大。
由于本期内容较多,我们再做一个快速的回顾:
1.考虑到传统语义解析与KB结合不够紧密,作者提出了查询图的概念
2.查询图的构造由实体链接系统确定主题词,核心推导链,增加约束和聚合这几种操作构成
3.对于查询图的每一个状态,我们都用一个奖励函数对它进行评价,使用优先队列进行启发式搜索构建查询图
4.通过查询图的实体链接得分、核心推导链三个特征、约束聚合手工特征以及全局特征作为输入向量,训练单层神经网络作为排名器得到奖励函数
5.核心推导链使用卷积神经网络(letter-trigram作为输入)进行训练,并且ensemble了三个不同数据训练的模型
总的来说,我们可以看出,该方法几乎融合了传统语义解析、深度学习、信息抽取等方法的优点,还使用了部分手工特征(对数据进行了仔细观察和分析),确实是一个很令人惊叹的方法。
在深度学习篇的中篇和上篇,我们可以看到都使用了卷积神经网络对模型进行提升。下一期,我们将进入深度学习篇的下篇,看如何使用更加复杂的深度学习模型进行KB-QA,为大家进一步揭开KB-QA的面纱。
敬请期待。
Original url: Access
Created at: 2018-11-02 09:41:46
Category: default
Tags: none
未标明原创文章均为采集,版权归作者所有,转载无需和我联系,请注明原出处,南摩阿彌陀佛,知识,不只知道,要得到
最新评论