Knowledge Base Question Answering via Encoding of Complex Query Graphs
这篇文章是上交和阿里于2018年发表在ACL上,主题依然是与query graph相关,属于SP + DL的范畴。
Overview
作者提到之前的KBQA做法处理的多是简单问题,不能很好地解决复杂问题。对于复杂的问题或者说复杂的query graph,如何进行embedding是一大挑战。最近一段时间,SP + NN的做法在简单的问答上取得了非常好的效果,因此本文也采用了深度学习的方法(作者认为他们在当时是首个采用神经网络对CQG进行embedding的)。
基于semantic parsing的KBQA做法需要对query graph和问题进行相似度匹配以选取出最优的query graph,之前的做法是将query graph分成几个不同的semantic components(以下均称为SC),然后计算问题和每个SC之间的相似度。但是作者认为这样做有两个局限性:
- SC和问题不能直接比较,因为SC传递的只是partial信息
- 独立地计算各个SC与问题的相似度会缺少全局的信息
下图每个虚线框内就是一个SC
因此,为了解决以上的问题,本文又提出一种基于神经网络的语义相似度匹配方法,对问题和SC都进行embedding,映射到embedding space,然后再计算相似度。另外,为了更好的使SC与问题对齐,作者在对问题embedding时加入了dependency parsing的信息,这能使模型捕捉到局部信息。
本文的contributions如下:
- 设计了一种end-to-end的深度学习模型来解决KBQA问题
- 在对问题embedding的时候加入dependency信息,丰富了问题的向量化表示
- 对当时的entity linking SOTA进行集成增强
Method
下面来看方法,主要分为四个部分:
- Query Graph Generation
- NN-based Semantic Matching Model
- Entity Linking Enrichment
- Training
Query Graph Generation
首先,基于SP的方法需要生成一张query graph,本文和之前的做法比较相似,考虑四个方面的限制:entity、type、time、ordinal.以下均以问题“Who is youngest president of United State after 2002”为例。
-
Focus Linking:这一步大概的意思就是从原问题中提取出上述的四个方面对应的所有candidates,作者把这些候选词统称为focus mentions。对于entity,作者使用了S-MART,但是经过了他们的ensemble enrichment;对于type,他们遍历所有的type和问题中所有的uni、bi、tri-gram进行相似度匹配,选前10的作为候选;对于时间,直接使用正则匹配;对于序数,他们用predefined的词表进行匹配。
-
Main-Path Constraint:通过连接从答案结点到不同focus mentions的1-hop或2-hop路径来得到不同的main-path
-
Entity Constraint:在Main-Path中加入实体的限制,直接看例子比较好理解,就比如下图中的 v 1 v_{1} v1结点对应是实体是president,于是就加上相应限制
-
Type Constraint:这一步是对答案加上类型的限制,用的是IsA谓词
-
Time and Ordinal Constraint:把时间和顺序都变成2-hop的谓词序列。
下图是包含了所有constrains之后的完整query graph,看图再对应以上的说法能理解的更容易一些
NN-based Semantic Matching Model
生成了许多candidate query graph之后,下一步就是计算每一个query graph与问题之间的相似度然后选取出最好的一个。这一部分作者分为三个部分:
- Semantic Component Representation
- Question Representation
- Semantic Similarity Calculation
Semantic Component Representation
先来看怎么对SC进行embedding。首先,构建出SC的方式是:我们先把答案中的focus nodes用 < E > <E> <E>或者 < T m > <Tm> <Tm>来代替,分别表示实体或时间。然后连接答案和每个focus node,就得到了不同的SC,也就是第一张图中的每个虚线框。
接下来,作者将每个SC的两个方面分别进行embedding,这一部分感觉没有说清楚,文中说的是predicate ids和predicate names两个方面,这在文章前面都没有提及。但我的理解是predicate ids就是这个SC中有几种predicate,predicate names就是这个SC中的文本信息。
对于SC的word序列 { p 1 w , … , p n w } \{p^{w}_{1},\dots,p^{w}_{n}\} {p1w,…,pnw},直接用一个embedding矩阵 E w ∈ R d × V w E_{w} \in R^{d \times V_{w}} Ew∈Rd×Vw得到每个词的embedding,然后取平均 p ( w ) = 1 ∣ n ∣ ∑ i = 1 n p i w p^{(w)}\ =\ \frac{1}{|n|}\sum_{i=1}^{n}p^{w}_{i} p(w) = ∣n∣1∑i=1npiw。对于predicate ids序列 { p 1 i d , … , p m i d } \{p^{id}_{1},\dots,p^{id}_{m}\} {p1id,…,pmid},同样的方法,使用一个embedding矩阵 E i d ∈ R d × V p E_{id} \in R^{d \times V_{p}} Eid∈Rd×Vp, V p V_{p} Vp表示predicate sequences的数量,得到 p ( i d ) p^{(id)} p(id)。最终将这两者相加得到SC的表示: p = p ( w ) + p ( i d ) p\ =\ p^{(w)}+p^{(id)} p = p(w)+p(id)。
Question Representation
下面是问题的表示学习。首先是语义的学习,作者使用双层GRU,然后把两个方向的最后一个hidden vector拼接起来作为token级别的embedding: q ( t o k ) = [ h n → ; h 1 ← ] q^{(tok)}\ =\ [\overrightarrow{h_{n}};\overleftarrow{h_{1}}] q(tok) = [hn;h1]。然后是结构信息,也就是之前提到的dependency parsing,这一步的目的是encode question at local level。作者还是把答案(问题中的答案可以由wh-word来代替)到focus node的依存关系路径搞出来,然后带进原问题替换掉相应的词,例如 “What is the longest river in the United States” 就变成了 “What(answer) n s u b j → \overrightarrow{nsubj} nsubj river p r e p → \overrightarrow{prep} prep in p o b j → \overrightarrow{pobj} pobj <E>(focus node)”。然后把这种形式的问题再输入一个GRU用相同的方法得到依存关系的表示 q p ( d e p ) q_{p}^{(dep)} qp(dep)。最后也是把两者相加: q p = q ( t o k ) + q p ( d e p ) q_{p}\ =\ q^{(tok)}+q_{p}^{(dep)} qp = q(tok)+qp(dep)。
Semantic Similarity Calculation
相似度计算采用的是余弦相似度,但是在计算之前作者进行了一个max pooling
S
s
e
m
(
q
,
G
)
=
cos
(
m
a
x
i
p
(
i
)
,
m
a
x
i
q
p
(
i
)
)
S_{sem}(q,G)\ =\ \cos(max_{i}p^{(i)},\ max_{i}q_{p}^{(i)})
Ssem(q,G) = cos(maxip(i), maxiqp(i))
但是这里作者没有说为什么
q
p
q_{p}
qp会有多个,
p
p
p有多个是因为不同的SC。
Entity Linking Enrichment
这一部分感觉就是本文的一个小trick,对现有的entity linking算法用集成的方法进行了强化,就不多叙述了。
Training
最终的query graph与问题之间的相似度是考虑了多个特征,具体如下:
根据这些特征得到了 S ( q , G ) S(q,G) S(q,G)。然后本文也是采用的negative sampling + hinge loss
Experiment
数据集:ComplexQuestions、WebQuestions、SimpleQuestions
知识库:Freebase、FB2M
Analysis
首先,作者对比了他们的semantic matching与之前的做法,用的是SimpQ数据集
可以看到比其中两个做法略低,作者的解释也很有意思:“since answering simple questions is not the main goal of this paper”,但是能处理复杂问题不应该对简单问题更加手到擒来么?
消融实验,主要针对的是query graph的embedding
最后作者又比较了不同的semantic相似度计算做法来证明他们的semantic composition更好,baseline是question embedding不加dependency信息,对余弦相似度进行summation, S s e m = ∑ i cos ( q p ( i ) , p ( i ) ) S_{sem}\ =\ \sum_{i} \cos(q_{p}^{(i)},p^{(i)}) Ssem = ∑icos(qp(i),p(i))。
Reflection
这篇文章值得学习的地方在于采用深度学习的做法对CQG进行编码,但是感觉存在很多没说清楚的地方:
- pooling的地方不同的 q p ( i ) q_{p}^{(i)} qp(i)代表什么?
- S ( q , G ) S(q,G) S(q,G)是怎么考虑表中的特征进行计算的?