技术动态 | 揭开知识库问答 KB-QA 的面纱 5 · 深度学习上篇

作者,四川大学博士生,刘大一恒。本文已经获得 ChatbotMagazine 公众号授权。
内容速览
☛ 向量建模方法的再思考☛ Multi-Column卷积神经网络

☛ 实验分析与总结

自2015年开始,深度学习用于KB-QA的方法取得了很好的效果,并逐渐成为了KB-QA的主流方法。也涌现出了一批使用深度学习提升传统的语义解析、信息抽取和向量建模方法的优秀论文。本期,我们先以深度学习提升向量建模方法为例,作为深度学习篇的上篇,为大家进一步揭开知识库问答的面纱。我们在揭开知识库问答KB-QA的面纱4·向量建模篇介绍了KB-QA(强烈建议在阅读本文章之前阅读该文章,点击末端“阅读原文”即可查看。)中介绍了传统方法之一的向量建模(Vector Modeling)方法,该方法具有操作性强,不需要任何手工的特征等优点。今天,我们将介绍一篇利用深度学习对该向量建模方法进行提升的论文,来自北京大学和Microsoft研究院的 Question Answering over Freebase with Multi-Column Convolutional Neural Networks(文章发表于2015年的ACL会议)。

该文章使用了卷积神经网络的一种变体(作者称为multi-column)从三个方面(答案路径Answer Path,答案上下文信息Answer Context,答案的类型Answer Type)对问题和答案的分布式表达进行学习,使得该分布式表达相比之前的向量建模方法能够包含更多有效的特征。该方法在WebQuestion数据集上测试,取得了40.8的F1-score。

向量建模方法的再思考
在上期的向量建模方法中,我们谈到该方法本身存在一些缺陷。首先是对于问题的向量化。对问题的向量化,传统向量建模方法采用了类似词袋模型的方式,相当于它并未考虑问题的语言顺序比如 “谢霆锋的爸爸是谁?” “谢霆锋是谁的爸爸?” 这两个问题用该方法得到的表达是一样的,然而这两个问题的意思显然是不同的)。

对于这个缺陷,我们可以使用深度学习的模型对问题进行向量化,比如使用循环神经网络(Recurrent Nerual Networks, RNNs)、卷积神经网络(Counvoulutional Nerual Networks, CNNs )等模型提取问题特征,这样的方式考虑了语言的顺序,并且提取特征的能力也更加强大。

第二个缺陷是,在对答案进行向量化的时候,直接将答案的路径(问题主题词到答案实体的路径)和上下文信息(答案实体周围的知识库子图)一起作为答案特征,通过multi-hot的方式对答案进行向量化。事实上,这样的形式不利于模型区分答案的特征(仅仅根据答案的multi-hot向量是不好区分哪些是答案的类型,哪些来自答案的上下文,哪些来自问题主题词到答案实体的路径)。

因此我们可以将问题的特征表示拆解开,用三个向量分别表示答案的三个特征,即答案路径(Answer Path),答案上下文信息(Answer Context),答案类型(Answer Type),对于每一个答案特征向量,都用一个卷积网络去对问题进行特征提取,将提取出的分布式表达和该答案对应特征向量的分布式表达进行点乘,这样我们就可以得到一个包含三部分的得分函数:

其中代表问题,代表答案,代表问题经过卷积神经网络输出的分布式表达,表示答案在对应特征下的分布式表达。有了得分函数,我们就可以像向量建模方法一样,通过定义margin-based ranking损失函数对模型参数进行训练。

接下来,我们再看一下是怎么计算得到的。

Multi-Column卷积神经网络
对于问题的特征提取,作者使用Multi-Column卷积神经网络,其结构实质上是共享word-embedding层的三个text-CNNs,text-CNNs模型在文本分类问题上取得了很好的效果。(这两个概念是Deep Learning for NLP中的重要概念,我在这里只作简单介绍,不再展开深入讨论,想深入了解的朋友可以查看相应的论文)。(如果对text-CNNs了解的朋友可以跳过下面这一段)

词向量(Word-embedding):对于问题序列,对于其中的每一个单词它对应的one-hot形式,我们可以通过word-embedding矩阵转化为一个维的分布式向量(这里的word-embedding矩阵是通过word2vec等pre-train方式初始化的),即

卷积操作(Convolution):对于一个含个单词的问题,我们可以得到一个的矩阵。如果我们把该矩阵想象成是一个图片,那么我们就可以像对图片一样进行卷积操作了。与图片卷积操作的不同之处在于,每一个卷积核的大小(即卷积窗口)是,表示每次对个单词的embedding进行卷积操作。

池化操作(Pooling):对于每一个卷积核的输出(假设卷积核大小为,在的矩阵上进行卷积,那么输出是一个维的向量),通过对该向量进行max-pooling操作(即取最大值)可以得到一个标量,该标量将作为问题最终表达的某一维度(可以理解成一个卷积核负责对整个问题提取一个一维的特征)。因此通过控制卷积核的数目我们可以控制最终输出的维度,即个卷积核可以输出一个维的最终表达(注意这里卷积核大小可以不同,一般设置为2,3,4)。

上述流程可以用下面这个图片来表达,注意,对于不同长度的问题,会通过补零(padding)操作将所有问题的长度限定到固定长度。

这样,我们通过三个text-CNNs,在共享word-embedding的情况下,就可以得到,。(事实上,在这篇文章中所使用的卷积操作,对于每一个column只采用了一个卷积核,一个卷积核对一个卷积窗口的卷积结果并非一个值而是一个向量,max-pooling作用在每一个卷积窗口的卷积结果上,具体方式可以参看后面的图。个人认为这样的卷积方式减少了参数,显得特征提取更加粗粒度,效果很可能不如text-CNNs)接下来,我们用三个向量来分别表示答案的三种特征。

答案路径(Answer Path):从问题中的主题词到答案在知识库中形成一条路径,我们记录该路径上的每一个实体关系,可以通过multi-hot的形式来进行表示,答案路径的分布式表达可以表示为,这里由于路径的长度不确定,所以使用一范来做一个归一化normalization。

答案上下文信息(Answer Context):我们将答案实体对应1跳(hop)范围内的实体关系和实体作为答案实体的上下文信息。通过同样的方式我们可以得到答案上下文信息的分布式表达

答案类型(Answer Type):在信息抽取中我们提到,答案的类型是一个很重要的特征。类型是一种特殊的实体关系,比如时间2009-12-17 的类型是 datetime,James Cameron 的类型是people.person 和 film.producer。 在实际操作中,可以在freebase里通过实体关系common.topic.notable.types 来查询实体对应的所有类型。通过同样的方式,我们可以得到相应的分布式表达。注意,如果候选答案是一个值,那么就用该值的类型(string/float/datetime)作为答案类型,比如答案是2009-12-17,那么类型就是string。

至此,我们得到了包含个三部分的得分函数:

整个流程如下图所示:

(图中方块带红色斜线的为主题词,红色箭头表示路径,绿色椭圆表示答案类型,蓝色虚线椭圆表示上下文信息范围)对于问题“when did Avatar release in UK”和它的答案2009-12-17,我们通过multi-column卷积神经网络提取三种问题的分布式表达,再通过答案的路径、上下文信息和类型得到答案相应的三种分布式表达,通过分别点乘再求和的方式得到最终的答案-问题对得分。

我们可以通过我在揭开知识库问答KB-QA的面纱4·向量建模篇介绍了KB-QA提到的同样的方式构造损失函数和多任务学习来训练模型参数。

实验分析与总结
模型的参数这里不再赘述。值得一提的是这篇文章采用的关于候选答案的寻找方式。和向量建模方法类似,也是寻找问题中主题词n跳范围内(一般取两跳)的实体作为候选答案集合。然而对于有些问题,其候选答案集合很大,因此我们采取一种启发式方法,如果同一路径候选答案数超过200,则随机选择200个作为候选。如果某个候选答案得分最高,那么我们把它所在的答案路径中的所有其他节点(不在200个候选集合的节点)也计算得分,选出得分最高的作为最终答案。实验依旧是在benchmark——WebQuestion上进行,取得了40.8的F1-score,这个性能击败了几乎当时所有的传统方法。并且我个人认为如果引入现在的一些深度学习技巧(诸如batch normalization、Adam等)并且加大模型的参数数量,改进word-embedding预训练等,效果还有上升的空间。我相信该方法如果面对更大规模的数据集会比传统方法取得更好的效果。

由于这篇文章考虑了答案的三个因素(路径、上下文、类型),为了探究哪个因素对最终效果影响最大。作者通过测试 在得分函数中去除某一因素、只使用single column、不进行多任务训练、只使用1 hop范围作为候选答案(该顺序对应下表的顺序)等情况下的模型性能,来对模型进行分析。

那么你猜猜对于答案的路径、上下文、类型这三个因素,去除哪个因素之后对性能影响最大呢?实验结果如下表

其中w/o表示without,可以看出答案的路径对效果影响最大(问题主题词到答案实体的路径其实相当于问题到答案的推理过程),其次是答案的类型,影响最小的是答案的上下文信息(仔细想想,其实答案实体的上下文信息很多对寻找该问题的答案没有帮助,比如询问奥巴马的出生地,那么奥巴马的其他很多信息如社会关系、职位等等对答案没有帮助,相当于噪音)。分布式表达,虽然没有传统的信息抽取和语义解析那么具有解释性,但是,我们却可以通过衡量分布式表达的余弦(Cosine)距离和通过得分函数来观察到一些可解释性。为此,作者还进行了两个实验。

首先,我们想知道对于一个问题,我们的模型最关注这个问题的哪个单词,即显著性单词检测(Salient words detection) 。我们可以进行这样的实验,要检测问题中的某一个单词的显著性,我们可以将该单词替换为某些停顿词(如to is a等),计算替换了单词之后的表达,再计算该表达和原始表达的欧式距离(可以多替换几种停顿词取平均距离)作为显著性得分,这里给出了一些例子:

我们可以看出来,问题词(wh-)、问题词相关的名词和动词都对找出最终答案有重要影响。我们也可以通过问题表达之间的cosine距离来寻找相似的问题,如下表:

我们通过计算问题(字体加粗)的表达,通过cosine距离寻找最近的问题表达所对应的问题,可以看出这些问题在语义上还是很相似的。如相同语义“who found/own/start *” 和 “who be the owner of *”的距离很接近。最后,作者也列举了一些错误分析(通过对错误情况进行分析,对我们提出改进的方法很有帮助),错误主要有以下三种情况:

候选答案生成:有些问题的主题词是难以正确提取出来的,比如缩写词和表达不全,如问题“where did jfk and his wife live” ,很难将jfk这个缩写词对应到John F. Kennedy这个人名上,这样会导致我们无法得到正确的候选答案集合。要解决这种情况,可能需要对问题进行一些预处理。

问题歧义:对于数据集中有些有歧义的问题,难以获得和正确答案相应的关系,如问题“who is aidan quinn”,答案是演员,我们很难通过该问题who is推断出和职业相关。这种情况该怎么办呢?

时序敏感(Time-Aware)问题:对于问题中带有 first / second 这种与时间顺序相关的词语,如“who is johnny cash’s first wife” ,答案可能给出的是second wife的名字(模型只关注到了wife而忽略了first的含义,并没有进行额外的推理)。对于这种情况,可能需要定义专门(ad-hoc)的操作,注意的是,这一点是该类方法相比语义解析方法的一个缺点。

那么,下一期,我们就将介绍深度学习对语义解析方法的提升,我们将以Micorsoft ACL 2015年的Outstanding paper为例,为大家带来揭开知识库问答KB-QA的面纱6·深度学习中篇,进一步揭开KB-QA的面纱。

– End –


ChatbotMagazine 是智言科技(深圳)有限公司旗下的一个技术分享栏目,智言科技是一家专注于基于知识图谱问答系统研发的 AI 公司。欢迎扫描二维码关注 ChatbotMagazine 公众号。


OpenKG.CN

中文开放知识图谱(简称OpenKG.CN)旨在促进中文知识图谱数据的开放与互联,促进知识图谱和语义技术的普及和广泛应用。

发表评论

邮箱地址不会被公开。 必填项已用*标注