- 论文原文:https://www.aclweb.org/anthology/P15-1026.pdf
1. 简介
- 本文章采用卷积神经网络的一种变体(作者称为multi-column)从三个方面(答案路径Answer Path,答案上下文信息Answer Context,答案的类型Answer Type)对问题和答案的分布式进行学习,使得该分布式表达相比之前的向量建模方法包含更多有效的特征。
- 在传统向量建模方法中存在一些问题
- 第一个是存在于问题的向量化。
- 传统向量建模方法采用了类似词袋模型的方式,相当于它并未考虑问题的语言顺序(比如 “谢霆锋的爸爸是谁?” “谢霆锋是谁的爸爸?” 这两个问题用该方法得到的表达是一样的,然而这两个问题的意思显然是不同的)。
- 对于这个缺陷,我们可以使用深度学习的模型对问题进行向量化,比如使用循环神经网络(Recurrent Nerual Networks, RNNs)、卷积神经网络(Counvoulutional Nerual Networks, CNNs )等模型提取问题特征,这样的方式考虑了语言的顺序,并且提取特征的能力也更加强大。
- 第二个问题存在于答案向量化。
在对答案进行向量化的时候,直接将答案的路径(问题主题词到答案实体的路径)和上下文信息(答案实体周围的知识库子图)一起作为答案特征,通过multi-hot的方式对答案进行向量化。事实上,这样的形式不利于模型区分答案的特征(仅仅根据答案的multi-hot向量是不好区分哪些是答案的类型,哪些来自答案的上下文,哪些来自问题主题词到答案实体的路径)。
因此我们可以将问题的特征表示拆解开,用三个向量分别表示答案的三个特征,即(答案路径Answer Path,答案上下文信息Answer Context,答案的类型Answer Type),对于每一个答案特征向量,都用一个卷积网络去对问题进行特征提取,将提取出的分布式表达和该答案对应特征向量的分布式表达进行点乘,这样我们就可以得到一个包含三部分的得分函数:
其中\(q\)代表问题,\(a\)代表答案,\(f_i(q)\)代表问题经过卷积神经网络输出的分布式表达,\(g_i(a)\)表示答案在对应特征下的分布式表达。
有了得分函数,我们就可以像向量建模方法一样,通过定义margin-based ranking损失函数对模型参数进行训练。
- 第一个是存在于问题的向量化。
2. Multi-Column卷积神经网络
对于问题的特征提取,作者使用Multi-Column卷积神经网络,其结构实质上是共享word-embedding层的三个text-CNNs,text-CNNs模型在文本分类问题上取得了很好的效果。
text-CNNs
词向量(Word-embedding):对于问题序列\(q=w_1...w_n\),对于其中的每一个单词\(w_i\)它对应的one-hot形式\(u(w_i)\),我们可以通过word-embedding矩阵\(W_v\)转化为一个\(d\)维的分布式向量(这里的word-embedding矩阵是通过word2vec等pre-train方式初始化的),即\(w_i=W_vu(w_i)\)
卷积操作(Convolution):对于一个含\(n\)个单词的问题\(q\),我们可以得到一个\(n×d\)的矩阵。如果将这个矩阵想象成是一个图片,那么就可以对该图片进行卷积操作了。与图片卷积操作的不同之处在于,每一个卷积核的大小(即卷积窗口)是\(m×d\),表示每次对\(m\)个单词的embedding进行卷积操作。
池化操作(Pooling):对于每一个卷积核的输出(假设卷积核大小为\(m\),在\(n×d\)的矩阵上进行卷积,那么输出是一个\(n-m+1\)维的向量),通过对该向量进行max-pooling操作(即取最大值)可以得到一个标量,该标量将作为问题最终表达\(f_q\)的某一维度(可以理解成一个卷积核负责对整个问题提取一个一维的特征)。因此通过控制卷积核的数目我们可以控制最终输出的维度,即\(k\)个卷积核可以输出一个\(k\)维的最终表达(注意这里卷积核大小可以不同,一般设置为2,3,4)。流程可如下图,对于不同长度问题,会通过补零(padding)操作将所有问题的长度限定到固定长度
这样我们通过三个text-CNNs,在共享word-embedding的情况下,就可以得到\(f_1(q)\),\(f_2(q)\)和\(f_3(q)\)。(事实上,在这篇文章中所使用的卷积操作,对于每一个column只采用了一个卷积核,一个卷积核对一个卷积窗口的卷积结果并非一个值而是一个向量,max-pooling作用在每一个卷积窗口的卷积结果上,具体方式可以参看后面的图。个人认为这样的卷积方式减少了参数,显得特征提取更加粗粒度,效果很可能不如text-CNNs)
用三个向量来分别表示答案的三种特征。
答案路径(Answer Path):从问题中的主题词到答案在知识库中形成的一条路径,我们记录该路径上的每一个实体关系,可以通过multi-hot的形式\(u_p(a)\)来进行表示,答案路径的分布式表达\(g_1(a)\)可以表示为\(g_1(a)=\frac 1 {\begin{Vmatrix}u_p(a)\end{Vmatrix}}_1W_pu_p(a)\),这里由于路径的长度不确定,所以使用一范式来做一个归一化normalization。
答案上下文信息(Answer Context):我们将答案实体对应1跳(hop)范围内的实体关系和实体作为答案实体的上下文信息。通过同样的方式我们得到答案上下文信息的分布式表达\(g_2(a)=\frac 1 {\begin{Vmatrix}u_c(a)\end{Vmatrix}}_1W_cu_c(a)\)
答案类型(Answer Type):答案类型是一个很重要的特征。类型是一个特殊的实体关系。在实际操作中,可以在freebase里通过实体关系common.topic.notable.types 来查询实体对应的所有类型。通过同样的方式,我们可以得到相应的分布式表达\(g_3(a)=\frac 1 {\begin{Vmatrix}u_t(a)\end{Vmatrix}}_1W_tu_t(a)\),注意如果候选答案是一个值,那么就用该值的类型(string/float/datetime)作为答案的类型,比如答案是2009-12-17,那么类型就是string。
至此,我们得到了包含三部分的得分函数:
整个流程如下图:
(图中方块带红色斜线的为主题词,红色箭头表示路径,绿色椭圆表示答案类型,蓝色虚线椭圆表示上下文信息范围)
对于问题“when did Avatar release in UK”和它的答案2009-12-17,我们通过multi-column卷积神经网络提取三种问题的分布式表达,再通过答案的路径、上下文信息和类型得到答案相应的三种分布式表达,通过分别点乘再求和的方式得到最终的答案-问题对得分。
可通过向量建模中提到的同样的方式构造损失函数和多任务学习来训练模型参数。
3. 存在问题
- 候选答案生成:有些问题的主题词是难以正确提取出来的,比如缩写词和表达不全,如问题“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)的操作,注意的是,这一点是该类方法相比语义解析方法的一个缺点。