知识库问答KB-QA——深度学习(1)

本文将介绍一篇利用深度学习对该向量建模方法进行提升的论文,来自北京航空航天大学和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),对于每一个答案特征向量,都用一个卷积网络去对问题进行特征提取,将提取出的分布式表达和该答案对应特征向量的分布式表达进行点乘,这样我们就可以得到一个包含三部分的得分函数:
    S ( q , a ) = f 1 ( q ) ⊤ g 1 ( a ) ⏟ answer path  + f 2 ( q ) ⊤ g 2 ( a ) ⏟ answer context  + f 3 ( q ) ⊤ g 3 ( a ) ⏟ answer type  S(q, a)=\underbrace{\mathbf{f}_{1}(q)^{\top} \mathbf{g}_{1}(a)}_{\text {answer path }}+\underbrace{\mathbf{f}_{2}(q)^{\top} \mathbf{g}_{2}(a)}_{\text {answer context }}+\underbrace{\mathbf{f}_{3}(q)^{\top} \mathbf{g}_{3}(a)}_{\text {answer type }} S(q,a)=answer path  f1(q)g1(a)+answer context  f2(q)g2(a)+answer type  f3(q)g3(a)
    其中 q q q 代表问题, a a a 代表答案, f i ( q ) f_{i}(q) fi(q) 代表问题经过卷积神经网络输出的分布式表达, g i ( a ) g_{i}(a) gi(a) 表示答案在对应特征下的分布式表达。
    有了得分函数,就可以像向量建模方法一样,通过定义margin-based ranking损失函数对模型参数进行训练。

接下来看一下 f i ( q ) f_{i}(q) fi(q) g i ( a ) g_{i}(a) gi(a) 是怎么计算得到的。

Multi-Column卷积神经网络

对于问题的特征提取,作者使用Multi-Column卷积神经网络,其结构实质上是共享word-embedding层 的三个text-CNNs,text-CNNs模型在文本分类问题上取得了很好的效果。

词向量(Word-embedding):对于问题序列 q = w 1 … w n q=w_{1} \ldots w_{n} q=w1wn,对于其中的每一个单词 w i w_{i} wi 它对应的one-hot形式 u ( w i ) {u}\left(w_{i}\right) u(wi),我们可以通过word-embedding矩阵 W v {W}_{v} Wv 转化为一个 d d d 维的分布式向量(这里的word-embedding矩阵是通过word2vec等pre-train方式初始化的),即 w i = W v u ( w i ) \mathbf{w}_{i}=\mathbf{W}_{v} \mathbf{u}\left(w_{i}\right) wi=Wvu(wi)

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

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

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

在这里插入图片描述
这样,我们通过三个text-CNNs,在共享word-embedding的情况下,就可以得到 f ( q 1 ) f\left(q_{1}\right) f(q1) , f ( q 2 ) f\left(q_{2}\right) f(q2) f ( q 3 ) f\left(q_{3}\right) f(q3)。(事实上,在这篇文章中所使用的卷积操作,对于每一个column只采用了一个卷积核,一个卷积核对一个卷积窗口的卷积结果并非一个值而是一个向量,max-pooling作用在每一个卷积窗口的卷积结果上,具体方式可以参看后面的图。个人认为这样的卷积方式减少了参数,显得特征提取更加粗粒度,效果很可能不如text-CNNs)

接下来,用三个向量来分别表示答案的三种特征。

答案路径(Answer Path):从问题中的主题词到答案在知识库中形成一条路径,我们记录该路径上的每一个实体关系,可以通过multi-hot的形式 u p ( a ) {u}_{p}(a) up(a) 来进行表示,答案路径的分布式表达可表示为 g 1 ( a ) = 1 ∥ u p ( a ) ∥ 1 W p u p ( a ) g_{1}(a)=\frac{1}{\left\|\mathbf{u}_{p}(a)\right\|_{1}} \mathbf{W}_{p} \mathbf{u}_{p}(a) g1(a)=up(a)11Wpup(a),这里由于路径的长度不确定,所以使用一范来做一个归一化normalization。

答案上下文信息(Answer Context):将答案实体对应1跳(hop)范围内的实体关系和实体作为答案实体的上下文信息。通过同样的方式可以得到答案上下文信息的分布式表达 g 2 ( a ) = 1 ∥ u c ( a ) ∥ 1 W c u c ( a ) g_{2}(a)=\frac{1}{\left\|\mathbf{u}_{c}(a)\right\|_{1}} \mathbf{W}_{c} \mathbf{u}_{c}(a) g2(a)=uc(a)11Wcuc(a)

答案类型(Answer Type):在信息抽取中提到,答案的类型是一个很重要的特征。类型是一种特殊的实体关系,比如时间2009-12-17 的类型是 datetime,James Cameron 的类型是people.person 和 film.producer。 在实际操作中,可以在freebase里通过实体关系common.topic.notable.types 来查询实体对应的所有类型。同样,可以得到相应的分布式表达 g 3 ( a ) = 1 ∥ u t ( a ) ∥ 1 W t u t ( a ) g_{3}(a)=\frac{1}{\left\|\mathbf{u}_{t}(a)\right\|_{1}} \mathbf{W}_{t} \mathbf{u}_{t}(a) g3(a)=ut(a)11Wtut(a)。注意,如果候选答案是一个值,那么就用该值的类型(string/float/datetime)作为答案类型,比如答案是2009-12-17,那么类型就是string。

至此,得到了包含三个部分的得分函数:
S ( q , a ) = f 1 ( q ) ⊤ g 1 ( a ) ⏟ answer path  + f 2 ( q ) ⊤ g 2 ( a ) ⏟ answer context  + f 3 ( q ) ⊤ g 3 ( a ) ⏟ answer type  S(q, a)=\underbrace{\mathbf{f}_{1}(q)^{\top} \mathbf{g}_{1}(a)}_{\text {answer path }}+\underbrace{\mathbf{f}_{2}(q)^{\top} \mathbf{g}_{2}(a)}_{\text {answer context }}+\underbrace{\mathbf{f}_{3}(q)^{\top} \mathbf{g}_{3}(a)}_{\text {answer type }} S(q,a)=answer path  f1(q)g1(a)+answer context  f2(q)g2(a)+answer type  f3(q)g3(a)

整个流程如下图所示:
在这里插入图片描述
(图中方块带红色斜线的为主题词,红色箭头表示路径,绿色椭圆表示答案类型,蓝色虚线椭圆表示上下文信息范围)

对于问题“when did Avatar release in UK”和它的答案2009-12-17,我们通过multi-column卷积神经网络提取三种问题的分布式表达,再通过答案的路径、上下文信息和类型得到答案相应的三种分布式表达,通过分别点乘再求和的方式得到最终的答案-问题对得分。

实验分析与总结

模型的参数这里不再赘述。值得一提的是这篇文章采用的关于候选答案的寻找方式。和向量建模方法类似,也是寻找问题中主题词n跳范围内(一般取两跳)的实体作为候选答案集合。然而对于有些问题,其候选答案集合很大,因此我们采取一种启发式方法,如果同一路径候选答案数超过200,则随机选择200个作为候选。如果某个候选答案得分最高,那么我们把它所在的答案路径中的所有其他节点(不在200个候选集合的节点)也计算得分,选出得分最高的作为最终答案。

实验依旧是在benchmark——WebQuestion上进行,取得了40.8的F1-score,这个性能击败了几乎当时所有的传统方法。如果引入现在的一些深度学习技巧(诸如batch normalization、Adam等)并且加大模型的参数数量,改进word-embedding预训练等,效果还有上升的空间。该方法如果面对更大规模的数据集会比传统方法取得更好的效果。

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

在这里插入图片描述
其中w/o表示without,可以看出答案的路径对效果影响最大(问题主题词到答案实体的路径其实相当于问题到答案的推理过程),其次是答案的类型,影响最小的是答案的上下文信息(仔细想想,其实答案实体的上下文信息很多对寻找该问题的答案没有帮助,比如询问奥巴马的出生地,那么奥巴马的其他很多信息如社会关系、职位等等对答案没有帮助,相当于噪音)。

分布式表达,虽然没有传统的信息抽取和语义解析那么具有解释性,但是,我们却可以通过衡量分布式表达的余弦(Cosine)距离和通过得分函数来观察到一些可解释性。为此,作者还进行了两个实验:

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

在这里插入图片描述
可以看出,问题词(wh-)、问题词相关的名词动词都对找出最终答案有重要影响。
也可以通过问题表达 f i ( q ) f_{i}\left(q\right) fi(q) 之间的cosine距离来寻找相似的问题,如下表:

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

  1. 候选答案生成:有些问题的主题词是难以正确提取出来的,比如缩写词和表达不全,如问题“where did jfk and his wife live” ,很难将jfk这个缩写词对应到John F. Kennedy这个人名上,这样会导致无法得到正确的候选答案集合。要解决这种情况,可能需要对问题进行一些预处理。
  2. 问题歧义:对于数据集中有些有歧义的问题,难以获得和正确答案相应的关系,如问题“who is aidan quinn”,答案是演员,我们很难通过该问题who is推断出和职业相关。
  3. 时序敏感(Time-Aware)问题:对于问题中带有 first / second 这种与时间顺序相关的词语,如“who is johnny cash’s first wife” ,答案可能给出的是second wife的名字(模型只关注到了wife而忽略了first的含义,并没有进行额外的推理)。对于这种情况,可能需要定义专门(ad-hoc)的操作,注意的是,这一点是该类方法相比语义解析方法的一个缺点。

下篇博客将介绍深度学习对语义解析方法的提升,将以Micorsoft ACL 2015年的Outstanding paper为例,文章:知识库问答KB-QA——深度学习(2)。

参考文献

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值