论文笔记
模型
由四个模块组成,分别是输入模块,记忆模块,推理模块和回答模块
输入模块
输入一个自然语言问题,使它经过embedding层将单词序列转换为embedding序列,使用双向LSTM将它编码,这些编码就是双向LSTM的隐藏状态
记忆模块
候选生成
虽然所有的KB中的实体都可以作为候选的答案,但是这样做代价非常高昂而且没有必要。我们只考虑和句子中主题词距离很近的词语。答案就是对实体节点的一个文本描述(例如,年龄)。举个例子,Ohio 是问题“Who was the secretary of state of Ohio in 2011?”的主体词。在得到问题的主题词之后,我们要手机所有和它相连的h hops以内的实体作为候选答案。
知识库表示
从KB中得到的每一个候选答案,我们将它们编码为三种类型的信息,分别是答案类型,路径和上下文。
Answer type 答案类型
实体类型信息是排序答案的重要线索。举个例子,如果一个问题使用了疑问词where ,那么答案中那些类型与地点相关的就更可能是正确答案。我们使用一个BiLSTM来编码它的描述来得到一个d维向量Ht
Answer path 答案路径
我们定义一个答案路径:一个从候选答案到主题词实体的关系序列。举个例子,对于Ohio 这个问题,(见图)Jon A.Hused 的答案路径既可以表示为关系id的序列[office_holder,governing_officials]或者文本描述[office,holder,governing,officials]。因此我们通过BiLSTM编码答案路径为H i p 1 H^{p1}_i H i p 1 ,H i p 2 H^{p2}_i H i p 2 则是通过计算关系embeddings的平均值(通过一个关系embedding层)
Answer context 答案上下文
答案上下文指的是候选答案周围的实体,并且这些实体在有限制条件的情况下可以帮助回答问题。例如,还是上面的例子,实体Jon A.Hused 的上下文包括了政府职务头衔secretary of state 和开始日期2011-01-09 。然而,对于没有限制条件的简单问题,答案上下文并不是必须的而且可能吸收噪音。我们使用两种策略来解决这个问题:
使用了一个importance module 来聚焦于重要的答案层面(之后解释)
我们仅仅考虑那些与问题有重叠(overlap)的上下文节点。
特别地,对于每一个候选答案的上下文节点,我们首先计算它和问题的最长公共子序列,当且仅当我们得到一个非终结的子串,再将它通过BiLSTM编码。最后,候选答案的答案上下文会被编码为所有上下文节点的平均,记作向量H i c H^c_i H i c 。
Key-value 记忆模块
在我们的模型中,我们使用了一个key-value记忆网 络来存储候选答案。不像基础的记忆网络,它的addressing阶段 基于key的记忆,reading阶段 基于值记忆,通过这样的功能分离,为编码先验知识提供了很好地灵活性。因此,在编码完答案类型,路径和上下文之后,我们使用线性预测:
M i k t = f t k ( H i t 1 ) M^{kt}_i=f^k_t(H^{t_1}_i) M i k t = f t k ( H i t 1 ) M t v t = f t v ( H i t 1 ) M^{vt}_t=f^v_t(H^{t1}_i) M t v t = f t v ( H i t 1 ) M i k p = f p k ( [ H i p 1 ; H i p 2 ] ) M^{kp}_i=f^k_p([H^{p1}_i;H^{p2}_i]) M i k p = f p k ( [ H i p 1 ; H i p 2 ] ) M i v p = f p v ( [ H i p 1 ; H i p 2 ] ) M^{vp}_i=f^v_p([H^{p1}_i;H^{p2}_i]) M i v p = f p v ( [ H i p 1 ; H i p 2 ] ) M c k = f c k ( H i c ) M^k_c=f^k_c(H^c_i) M c k = f c k ( H i c ) M c v = f c v ( H i c ) M^v_c=f^v_c(H^c_i) M c v = f c v ( H i c )
M i k t M^{kt}_i M i k t 和M i v t M^{vt}_i M i v t 是答案类型A i t A_i^t A i t 的d维key和value向量表示。相似的,我们同样有key和value表示答案路径和上下文。使用M来作为key-value记忆,它的行M i = { M i k , M i v } M_i=\{M^k_i,M^v_i\} M i = { M i k , M i v } ,这里M i k = [ M i k t ; M i k p ; M i k c ] M^k_i=[M^{k_t}_i;M^{k_p}_i;M_i^{k_c}] M i k = [ M i k t ; M i k p ; M i k c ] 组成了key,
M i v = [ M i v t ; M i v p ; M i v c ] M^v_i=[M^{v_t}_i;M^{v_p}_i;M_i^{v_c}] M i v = [ M i v t ; M i v p ; M i v c ] 组成values。这里的[,]和[;]表示按行和按列连接。
推理模块
推理模块由一个泛化模块还有我们的双层双向注意力网络组成。这个双层双注意力网络用来捕捉问题和KB间的双向交互。主注意力网络包括了KB-aware注意力模块,根据KB来聚焦于问题的重要部分,importance module 则根据问题来聚焦于KB中的重要部分。副注意力网络通过进一步利用双向注意力机制来增强问题和KB向量。
KB-aware 注意力模块
问题中的所有单词并不都是一样的。我们是用一个KB-aware注意力机制来聚焦于问题中的重要部分,(例如图3)。特别地,我们首先使用self attention在所有的问题的词向量H Q H^Q H Q 上来得到d维的问题向量q,公式如下:q = B i L S T M ( [ H Q A Q Q T , H Q ] ) q = BiLSTM([H^QA^{QQ^T},H^Q]) q = B i L S T M ( [ H Q A Q Q T , H Q ] ) A Q Q = s o f t m a x ( ( H Q ) T H Q ) A^{QQ} = softmax((H^Q)^TH^Q) A Q Q = s o f t m a x ( ( H Q ) T H Q )
softmax默认应用于输入张量的最后一个维度。使用问题总结向量q,应用另一个基于记忆的attention(A t t a d d Att_{add} A t t a d d )来得到答案类型m t m_t m t ,路径m p m_p m p ,上下文m c m_c m c :m x = ∑ i = 1 ∣ A ∣ a i X ⋅ M i v x m_x=\sum_{i=1}^{|A|}a^X_i\cdot M_i^{v_x} m x = ∑ i = 1 ∣ A ∣ a i X ⋅ M i v x a x = A t t a d d ( q , M k x ) a^x = Att_{add}(q,M^{k_x}) a x = A t t a d d ( q , M k x )
这里x ∈ { t , p , c } x\in \{t,p,c\} x ∈ { t , p , c } ,A t t a d d ( x , y ) = s o f t m a x ( t a n h ( [ x T , y ] W 1 ) W 2 ) Att_{add}(x,y)=softmax(tanh([x^T,y]W_1)W_2) A t t a d d ( x , y ) = s o f t m a x ( t a n h ( [ x T , y ] W 1 ) W 2 ) ,W 1 ∈ R 2 d × d W_1\in R^{2d\times d} W 1 ∈ R 2 d × d ,W 2 ∈ R d × 1 W_2\in R^{d\times 1} W 2 ∈ R d × 1
,这都是可训练的权重
至此我们根据问题得到了KB summary m = [ m t ; m p ; m c ] m=[mt;mp;mc] m = [ m t ; m p ; m c ] 。继续计算问题到KB的attention,在问题单词q i q_i q i 和KB之间,通过公式A Q m = H Q T m A^{Qm}=H^{Q^T}m A Q m = H Q T m ,对A Q m A^{Qm} A Q m 的最后一个维度应用maxpooling,也就是说a i Q = m a x j A i j Q m a_i^Q=max_jA^{Qm}_{ij} a i Q = m a x j A i j Q m ,我们选择q i q_i q i 和知识库之间最强的链接。这之后的想法是问句中的每一个单词都有特定的意义,(例如指明了答案类型,路径或者上下文),max pooling可以帮助找出这个目标。我们在应用一个softmax来得到一个向量a ~ Q \widetilde{a}^Q a Q ,这个就是一个KB-aware question attention 向量,因为它根据KB指明了q i q_i q i 的重要程度
Importance 模块
importance模块聚焦于重要的KB部分,通过问题中的相关性来进行衡量。(通过问题来衡量知识库中哪一部分重要)。首先要计算一个∣ Q ∣ × ∣ A ∣ × 3 |Q|\times |A|\times 3 ∣ Q ∣ × ∣ A ∣ × 3 (应该是这么多维度)的attention 张量,A Q M A^{QM} A Q M 它表示了每一对链接的强度{ q i , A j x } x = { t , p , c } \{q_i,A^x_j\}^{x=\{t,p,c\}} { q i , A j x } x = { t , p , c } 。然后我们取A Q M A^{QM} A Q M 的问句单词维数的最大值并将它标准化得到注意力矩阵A ~ M \widetilde{A}^M A M ,它表示了每一个候选答案某一方面的重要性。之后,我们继续计算question-aware记忆表示M ~ k \widetilde{M}^k M k 。(论文公式4)M ~ v = { M ~ i = 1 ∣ A ∣ } ∈ R ∣ A ∣ × d \widetilde{M}^v=\{\widetilde{M}^{|A|}_{i=1}\}\in R^{|A|\times d} M v = { M i = 1 ∣ A ∣ } ∈ R ∣ A ∣ × d M ~ i v = ∑ j = 1 3 M i j v \widetilde{M}^v_i=\sum_{j=1}^3M^v_{ij} M i v = ∑ j = 1 3 M i j v M ~ k = { M ~ i k } i = 1 ∣ A ∣ ∈ R ∣ A ∣ × d \widetilde{M}^k=\{\widetilde{M}^k_i\}^{|A|}_{i=1}\in R^{|A|\times d} M k = { M i k } i = 1 ∣ A ∣ ∈ R ∣ A ∣ × d M ~ i k = A ~ i M M i k \widetilde{M}^k_i=\widetilde{A}^M_iM^k_i M i k = A i M M i k A ~ = s o f t m a x ( A M T ) T \widetilde{A}=softmax(A^{M^T})^T A = s o f t m a x ( A M T ) T A M = m a x i { A i Q M } i = 1 ∣ Q ∣ A^M=max_i\{A^{QM}_i\}^{|Q|}_{i=1} A M = m a x i { A i Q M } i = 1 ∣ Q ∣ A Q M = ( M k H Q ) T A^{QM}=(M^kH^Q)^T A Q M = ( M k H Q ) T
Enhancing 模块
进一步加强问题和KB表示,通过利用双向attention。计算KB-enhanced问题表示q ~ \widetilde{q} q 它利用了相关的KB信息,通过在A Q M A^{QM} A Q M 的最后一个维度应用max pooling。那就是说A M Q = m a x k { A . , . , k Q M } k = 1 3 A^Q_M=max_k\{A^{QM}_{.,.,k}\}^3_{k=1} A M Q = m a x k { A . , . , k Q M } k = 1 3 ,然后将其标准化得到一个question-to-KB attention 矩阵A ~ M Q \widetilde{A}^Q_M A M Q ,我们从这个矩阵计算出了question-aware KB summary并且将它吸收至问题表示H ~ Q = H Q + a ~ Q ⨀ ( A ~ M Q M ~ v ) T \widetilde{H}^Q=H^Q+\widetilde{a}^Q\bigodot(\widetilde{A}^Q_M\widetilde{M}^v)^T H Q = H Q + a Q ⨀ ( A M Q M v ) T 。最后,我们得到了一个d维KB-enhanced问题表示向量q ~ = H ~ Q a ~ Q \widetilde{q}=\widetilde{H}^Q\widetilde{a}^Q q = H Q a Q 。相似地,我们可以计算一个question-enhanced KB表示M ‾ k \overline{M}^k M k 吸收了相关的问题信息:
M ‾ k = M ~ k + a ~ M ⨀ ( A ~ Q M ( H ~ Q ) T ) \overline{M}^k=\widetilde{M}^k+\widetilde{a}^M\bigodot(\widetilde{A}^M_Q(\widetilde{H}^Q)^T) M k = M k + a M ⨀ ( A Q M ( H Q ) T )
a ~ M = ( A ~ M Q ) T a ~ Q ∈ R ∣ A ∣ × 1 \widetilde{a}^M=(\widetilde{A}^Q_M)^T\widetilde{a}^Q\in R^{|A|\times1} a M = ( A M Q ) T a Q ∈ R ∣ A ∣ × 1
A ~ Q M = s o f t m a x ( A M Q T ) ∈ R ∣ A ∣ × ∣ Q ∣ \widetilde{A}^M_Q=softmax(A^{Q^T}_M)\in R^{|A|\times|Q|} A Q M = s o f t m a x ( A M Q T ) ∈ R ∣ A ∣ × ∣ Q ∣
泛化模块
我们在回答问题之前增加了一个one-hop attention。我们使用问题表示q ~ \widetilde{q} q 在key 记忆矩阵M ‾ k \overline{M}^k M k 上通过注意力机制查询,并从值记忆中取回最相关的信息,这些信息被用来使用取更新问题向量。最后,我们应用一个residual 层和batch norm,帮助模型优化。因此我们有:
q ^ = B N ( q ~ + q ′ ) \widehat{q}=BN(\widetilde{q}+q') q = B N ( q + q ′ ) q ′ = G R U ( q ~ , m ~ ) q'=GRU(\widetilde{q},\widetilde{m}) q ′ = G R U ( q , m ) m ~ = ∑ i = 1 ∣ A ∣ a i ⋅ M ~ i v \widetilde{m}=\sum_{i=1}^{|A|}a_i\cdot\widetilde{M}^v_i m = ∑ i = 1 ∣ A ∣ a i ⋅ M i v a = A t t a d d G R U ( q ~ , M ‾ k ) a=Att^{GRU}_{add}(\widetilde{q},\overline{M}^k) a = A t t a d d G R U ( q , M k )
回答模块
给定一个问题Q的表示q ^ \widehat{q} q 和候选答案{ A i } i = 1 ∣ A ∣ \{A_i\}^{|A|}_{i=1} { A i } i = 1 ∣ A ∣ 的表示{ M ‾ i k } \{\overline{M}^k_i\} { M i k } ,我们可以计算一个匹配得分S ( q ^ , M ‾ i k ) S(\widehat{q},\overline{M}^k_i) S ( q , M i k ) 在每一对( Q , A i ) (Q,A_i) ( Q , A i ) ,S ( q , a ) = q T ⋅ a S(q,a)=q^T\cdot a S ( q , a ) = q T ⋅ a 。候选答案根据这个得分来进行排序