【论文笔记】Question Answering over Freebase with Multi-Column Convolutional Neural Networks
论文原址:https://www.aclweb.org/anthology/P15-1026.pdf
该文章发于ACL 2015,作者提出了一个基于Freebase,使用multi-column convolutional neural networks(MCCNNs)的自动问答模型,分别从答案路径(answer path), 答案背景信息(answer context), 以及答案类型(answer type) 来理解问题,并学习它们的分布式表示(distributed representations),在不使用任何手动特征及词表等条件下在问答数据集WEBQUESTIONS 上取得了很好的结果。
在上一篇论文中(Question answering with subgraph embeddings)介绍了传统方法之一的向量建模,该方法具有操作性强,不需要任何手工的特征等优点。本文即介绍了利用深度学习对该向量建模方法进行提升。文章使用了卷积神经网络的一种变体(作者称为multi-column)从三个方面(答案路径Answer Path,答案上下文信息Answer Context,答案的类型Answer Type)对问题和答案的分布式表达进行学习,使得该分布式表达相比之前的向量建模方法能够包含更多有效的特征。该方法在WebQuestion数据集上测试,取得了40.8的F1-score。
- 向量建模方法的再思考问题
传统的向量建模方法本身存在一些缺陷。首先是对于问题的向量化,对问题的向量化,传统的向量建模方法采用了类似词袋模型的方式,这样是不考虑问题的语言顺序
E.G.
- “谢霆锋的爸爸是谁?” “谢霆锋是谁的爸爸?” 这两个问题用该方法得到的表达是一样的,然而这两个问题的意思显然是不同的
对于这个缺陷,我们可以使用深度学习的模型对问题进行量化,比如使用循环神经网络,卷积神经网络等模型提取问题特征,这样的方式考虑了语言顺序,并且提取特征的能力也更加强大。
- 第二个缺陷是,在对答案进行向量化的时候,直接想答案的路径(问题主题词到答案实体的路径)和下文信息(答案实体周围的知识库子图)一起作为答案特征,通过multi-hot的方式对答案进行向量化。事实上,这样的形式不利于模型区分答案的特征(仅仅根据答案的multi-hot向量是不好区分哪些是答案的类型,哪些来自答案的上下文,哪些来自问题的主题词到答案实体的路径)
因此我们可以将问题的特征表示拆解开,用三个向量分别表示答案的三个特征,即答案路径,答案上下文信息,答案类型,对于每一个答案特征向量,都用一个卷积网络去对问题进行特征抽取,将抽取出的分布式表达和该答案对应特征向量的分布式表达进行点乘,这样我们就可以得到一个包含三部分的得分函数:
其中q代表问题,a代表答案,fi(q)代表问题经过卷积神经网络输出分布式表达,表达gi(a)答案在对应特征下的分布式表达。
有了得分函数,我们就可以像向量建模方法一样,通过定义margin-based ranking损失函数对模型参数进行训练。接下来我们看一下fi(q)和gi(a)是怎么计算得到的
- Multi-Column卷积神经网络
对于问题特征提取,作者使用Multi-Column卷积神经网络,其结构是指上是共享word-embedding层的三个text-CNNs,text-CNNs模型在文本分类问题上取得了很好的效果。
-
- 词向量
对于问题序列q=w1…wn,对于其中的每一个单词wi,所对应的one-hot形式u(wi),我们可以通过word-embedding矩阵Wv转化为一个d维的分布式向量(这里的word-embedding矩阵是通过word2vec等pre-train方式初始化的),即wi=Wv * u(wi)
-
- 卷积操作
对于一个含n个单词的问题q,我们可以得到一个n*d的矩阵。如果我们把该矩阵想象成是一个图片,那么我们就可以像对图片一样进行卷积操作了。与图片卷积操作的不同之处在于,每一个卷积核的大小(即卷积窗口)是m*d,表示每次对m个单词的embedding进行卷积操作。
-
- 池化操作
对于每一个卷积核的输出(假设卷积核大小为m,在n*d的矩阵上进行卷积,那么输出是一个n-m+1维的向量),通过对该向量进行max-pooling操作(即取最大值)可以得到一个标量,该标量将作为问题最终表达fq的某一维度(可以理解成一个卷积核负责对整个问题提取一个一维的特征)。因此通过控制卷积核的数目我们可以控制最终输出的维度,即k个卷积核可以输出一个k维的最终表达(注意这里卷积核大小可以不同,一般设置为2,3,4)。
对于不同长度的问题,会通过补零(padding)操作将所有问题的长度限定到规定长度。
这样,我们通过三个text-CNNs,在共享word-embedding的情况下,就可以得到f(q1)f(q2)f(q3),和。(事实上,在这篇文章中所使用的卷积操作,对于每一个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卷积神经网络提取三种问题的分布式表达,再通过答案的路径、上下文信息和类型得到答案相应的三种分布式表达,通过分别点乘再求和的方式得到最终的答案-问题对得分。
- 实验分析与总结
模型的参数这里不再赘述。值得一提的是这篇文章采用的关于候选答案的寻找方式。和向量建模方法类似,也是寻找问题中主题词n跳范围内(一般取两跳)的实体作为候选答案集合。然而对于有些问题,其候选答案集合很大,因此我们采取一种启发式方法,如果同一路径候选答案数超过200,则随机选择200个作为候选。如果某个候选答案得分最高,那么我们把它所在的答案路径中的所有其他节点(不在200个候选集合的节点)也计算得分,选出得分最高的作为最终答案。
实验依旧是在benchmark——WebQuestion上进行,取得了40.8的F1-score,这个性能击败了几乎当时所有的传统方法。并且我个人认为如果引入现在的一些深度学习技巧(诸如batch normalization、Adam等)并且加大模型的参数数量,改进word-embedding预训练等,效果还有上升的空间。我相信该方法如果面对更大规模的数据集会比传统方法取得更好的效果。
由于这篇文章考虑了答案的三个因素(路径、上下文、类型),为了探究哪个因素对最终效果影响最大。作者通过测试 在得分函数中去除某一因素、只使用single column、不进行多任务训练、只使用1 hop范围作为候选答案(该顺序对应下表的顺序)等情况下的模型性能,来对模型进行分析。
分布式表达,虽然没有传统的信息抽取和语义解析那么具有解释性,但是,我们却可以通过衡量分布式表达的余弦(Cosine)距离和通过得分函数来观察到一些可解释性。为此,作者还进行了两个实验。
首先,我们想知道对于一个问题,我们的模型最关注这个问题的哪个单词,即显著性单词检测(Salient words detection) 。我们可以进行这样的实验,要检测问题中的某一个单词的显著性,我们可以将该单词替换为某些停顿词(如to is a等),计算替换了单词之后的表达fi(q'),再计算该表达和原始表达的欧式距离(可以多替换几种停顿词取平均距离)作为显著性得分,这里给出了一些例子:
我们可以看出来,问题词(wh-)、问题词相关的名词和动词都对找出最终答案有重要影响。
我们也可以通过问题fi(q)表达之间的cosine距离来寻找相似的问题,如下表
我们通过计算问题(字体加粗)的表达,通过cosine距离寻找最近的问题表达所对应的问题,可以看出这些问题在语义上还是很相似的。如相同语义“who found/own/start *” 和 “who be the owner of *”的距离很接近
最后,作者也列举了一些错误分析(通过对错误情况进行分析,对我们提出改进的方法很有帮助),错误主要有以下三种情况:
-
- 候选答案生成(Candidate Generation)
有些问题的主题词是难以正确提取出来的,比如缩写词和表达不全,如问题“where did jfk and his wife live”,很难将jfk这个缩写词对应到John F. Kennedy这个人名上,这样会导致我们无法得到正确的候选答案集合。要解决这种情况,可能需要对问题进行一些预处理。
-
- 问题歧义(Ambiguous Questions)
对于数据集中有些有歧义的问题,难以获得和正确答案相应的关系,如问题“who is aidan quinn”,答案是演员,我们很难通过该问题who is推断出和职业相关。这种情况该怎么办呢?
-
- 时序敏感(Time-Aware)问题
对于问题中带有 first / second 这种与时间顺序相关的词语,如“who is johnny cash’s first wife” ,答案可能给出的是second wife的名字(模型只关注到了wife而忽略了first的含义,并没有进行额外的推理)。对于这种情况,可能需要定义专门(ad-hoc)的操作,注意的是,这一点是该类方法相比语义解析方法的一个缺点。
- 思考
该模型可以说非常充分的考虑到了候选答案的各种信息,并基于深度学习取得了很好地效果,针对于作者后面所做的错误分析是可以突破的一些地方,同时在模型里作者使用的是词向量,可以尝试基于字符向量做一定的改进。