machine comprehension using match-lstm and answer pointer

又是一篇之前读的paper,最近把之前读的paper整理整理…

今天的主角又是在斯坦福的SQuAD的基础上,虽然是一篇比较早的文章,但是该文章是第一个在SQuAD上实现的端到端的神经网络(end-end),对于入门attention,QA的小伙伴来说还是很不错的~

前言

SQuAD 是由 Rajpurkar 等人提出的一个最新的阅读理解数据集。该数据集:

  • 包含 10 万个(问题,原文,答案)三元组(500多篇文章,2万多个段落,10万个问题);
  • 原文来自于 536 篇维基百科文章,而问题和答案的构建主要是通过众包的方式,让标注人员提出最多 5 个基于文章内容的问题并提供正确答案,且答案出现在原文中。每个问题3人标注,降低了人工标注误差
  • SQuAD 和之前的完形填空类阅读理解数据集如CNN/DM,CBT等最大的区别在于:SQuAD 中的答案不再是单个实体或单词,而可能是一段短语,这使得其答案更难预测。
  • SQuAD 包含公开的训练集和开发集,以及一个隐藏的测试集,其采用了与 ImageNet 类似的封闭评测的方式,研究人员需提交算法到一个开放平台,并由 SQuAD 官方人员进行测试并公布结果。

几乎所有做 SQuAD 的模型都可以概括为同一种框架:Embed 层,Encode 层,Interaction 层和 Answer 层

  • Embed 层负责将原文和问题中的 tokens 映射为向量表示;
  • Encode 层主要使用 RNN 来对原文和问题进行编码,这样编码后每个 token 的向量表示就蕴含了上下文的语义信息;、
  • Interaction 层是大多数研究工作聚焦的重点,该层主要负责捕捉问题和原文之间的交互关系,并输出编码了问题语义信息的原文表示,即 query-aware 的原文表示;
  • 最后 Answer 层则基于 query-aware 的原文表示来预测答案范围。
    在这里插入图片描述
QA 系统基本框架

1.模型概述

Match-LSTM模型的输入由两部分组成:段落(passage)和问题(question)。passage使用一个矩阵P[d * P]表示,其中d表示词向量维度大小,P表示passage中tokens的个数;question使用矩阵Q[d * Q]表示,其中Q表示question中tokens的个数。

Match-LSTM模型的输出即问题的答案有两种表示方法:

  • 其一是使用一系列整数数组 a = ( a 1 , a 2 , … ) a = (a1, a2,…) a=(a1,a2,),其中 a i a_i ai [ 1 , P ] [1, P] [1,P]中的一个整数,表示在段落中某个token具体的位置,这里的整数数组不一定是连续的,对应Sequence Model ;
  • 第二种表示方法是假设答案是段落中一段连续的token组合,即仅使用两个整数来表示答案 a = ( a s , a e ) a = (a_s, a_e) a=(as,ae) a s a_s as表示答案在段落中开始的位置, a e a_e ae则表示结束位置, a s a_s as a e a_e ae [ 1 , P ] [1, P] [1,P]中的整数,对应Boundary Model 。

故对Match-LSTM模型的训练集样本来说,其可用下面的三维数组来表示:
( P n , Q n , a n ) n = 1 N {(P_n,Q_n,a_n)}^N_{n=1} (Pn,Qn,an)n=1N


总结一下,在模型实现上,Match-LSTM 的主要步骤如下:

(1) LSTM预处理层(LSTM preprocessing Layer):

  • Embed 层使用词向量表示原文和问题;
  • Encode 层使用单向 LSTM 编码原文和问题 embedding;

(2) match-LSTM层(Match-LSTM Layer):匹配原文和问题

  • Interaction层对原文中每个词,计算其关于问题的注意力分布,并使用该注意力分布汇总问题表示,将原文该词表示和对应问题表示输入另一个 LSTM编码,得到该词的 query-aware 表示;
  • 在反方向重复步骤 2,获得双向 query-aware 表示;

(3) Ans-Ptr层(Answer Pointer(Ans-Ptr) Layer):从原文中选取答案

  • Answer 层基于双向 query-aware 表示使用Sequence Model 或 Boundary Model预测答案范围。其中:
    • 序列模型(Sequence Model):使用Ptr-Net网络,不做连续性假设,预测答案存在与原文的每一个位置
    • 边界模型(Boundary Mode):直接使用Ptr-Net网络预测答案在原文中起始和结束位置

模型结构图:
在这里插入图片描述

简单的说:带着问题去阅读原文,然后用得到的信息去回答问题:

  1. 先利用LSTM阅读一遍passage,得到输出的encoding 序列。
  2. 然后带着question的信息,重新将passage的每个词输入LSTM,再次得到passage的encoding信息。但是这次的输入不仅仅只有passage的信息,还包含这个词和question的关联信息,它和question的关联信息的计算方式就是我们在seq2seq模型里面最常用的attention机制。
  3. 最后将信息输入answer模块,生成答案。

2.LSTM preprocessing Layer

LSTM preprocessing Layer的目的是将token的上下文信息包含到passage和question中的每个token的向量表示中。分别将passage和question输入LSTM preprocessing Layer,直接使用单向LSTM,故而每一个时刻的隐含层向量输出只包含左侧上下文信息.

经过LSTM preprocessing Layer后,passage和question表示如下矩阵:
(2-1) H p = L S T M → ( P ) H q = L S T M → ( Q ) H^{p}=\overrightarrow{LSTM}(P) \quad H^{q}=\overrightarrow{LSTM}(Q) \tag {2-1} Hp=LSTM (P)Hq=LSTM (Q)(2-1)

其中 H p H^p Hp是passage的向量矩阵表示,其大小为 [ l ∗ P ] [l * P] [lP] l l l表示隐藏层的节点个数; H q H^q Hq是question的向量矩阵表示,其大小为 [ l ∗ Q ] [l * Q] [lQ]

3.match-LSTM

在文本蕴含任务中,输入一个文本对,假设句T和蕴含句H,这里将question当做T,passage当做H。下面是match-LSTM的构建,实质上就是一个attention机制。

(3-1) G i → = tanh ⁡ ( W q H q + ( W p h i p + W r h i − 1 r → + b p ) ⊗ e Q ) \overrightarrow{G_{i}}=\tanh(W^qH^q+(W^ph^p_i+W^r\overrightarrow{h_{i-1}^r} + b^p) \otimes e_{Q}) \tag{3-1} Gi =tanh(WqHq+(Wphip+Wrhi1r +bp)eQ)(3-1)
(3-2) α i → = s o f t m a x ( w T G i → + b ⊗ e Q ) \overrightarrow{\alpha_i}=softmax(w^T\overrightarrow{G_i} + b \otimes e_Q) \tag{3-2} αi =softmax(wTGi +beQ)(3-2)
其中:

  • W q , W p , W r ϵ R l ∗ l , b p , w ϵ R l ∗ 1   a n d   b ϵ R W^q,W^p,W^r \epsilon \mathbb{R} ^{\color {red}{l*l} },b^p,w \epsilon \mathbb{R} ^{\color {red}{l*1} } and b \epsilon \mathbb{R} Wq,Wp,WrϵRll,bp,wϵRl1 and bϵR,这都是需要训练的参数。
  • G i → ϵ R l ∗ Q \overrightarrow{G_{i}} \epsilon \mathbb{R}^{\color {red}{l*Q}} Gi ϵRlQ是attention时的中间结果,表示passage中第i个词和query中每个词的交互信息(对应的每一列对应query中每一个词);
    其维度变化过程为:[l Q] = [l l] [l Q] + ([l l] [l 1] + [l l] [l 1] + [l 1]) |Q|
  • α i → \overrightarrow{\alpha_i} αi 是attention计算出来的权重,表示在passage的第i个token对question中每个词的注意力权重向量。
    其维度变化过程为:[1 Q] = ([1 l] [l Q] + 1 * |Q|)
  • h i − 1 r → ϵ R l ∗ 1 \overrightarrow{h_{i-1}^r} \epsilon \mathbb{R}^{l*1} hi1r ϵRl1表示mathch-LSTM中,第 i − 1 i-1 i1 个token的隐藏层输出,计算方式如下公式(3-4)
  • x ⊗ e Q x\otimes e_Q xeQ表示将x复制 e Q e_Q eQ次,公式中同理

上式中公式3-1,3-2这种 attention 被称为 BahdanauAttention。 Passage 中第 t 个上下文向量会根据 所有 Question 的隐向量 & Passage 中 t-1 时刻的上下文向量 来确定对Question 每个 token 的权重。可以把下图的 Y 理解为 passage,把 X 理解为question。
在这里插入图片描述

这里可以针对passage每一个词语输出一个 α i → \overrightarrow{\alpha_i} αi 向量,这个向量维度是question词长度,故而这种方法也叫做question-aware attention passage representation。


下面将attention向量( α i → \overrightarrow{\alpha_i} αi )与原query编码向量( H Q H^Q HQ)点乘,得到passage中第i个token的question关联信息,再与passage中第i个token的编码向量做concat,粘贴为一个向量 z i → \overrightarrow{z_i} zi ,然后输出到LSTM网络中。

(3-3) z i → = [ h i p H Q α i T → ] \overrightarrow{z_i}=[\begin{matrix} h_i^p\\ H^Q\overrightarrow{\alpha_i^T} \end{matrix}] \tag{3-3} zi =[hipHQαiT ](3-3)
(3-4) h i r → = L S T M → ( z i → , h i − 1 r → ) \overrightarrow{h_i^r}=\overrightarrow{LSTM}(\overrightarrow{z_i}, \overrightarrow{h_{i-1}^r}) \tag{3-4} hir =LSTM (zi ,hi1r )(3-4)
其中 H q ϵ R l ∗ Q   a n d   α i → ϵ R 1 ∗ Q   a n d   h i p ϵ R l ∗ 1   a n d   z i → ϵ R 2 l ∗ 1   a n d   h i r → ϵ R 2 l ∗ 1 H^q \epsilon \mathbb{R}^{\color {red} {l*Q}} and  \overrightarrow{\alpha_i} \epsilon \mathbb{R}^{\color {red}{1*Q}} and h^p_i \epsilon \mathbb{R}^{\color {red}{l*1}} and  \overrightarrow{z_i} \epsilon \mathbb{R}^{\color {red}{2l*1}}  and  \overrightarrow{h_i^r} \epsilon \mathbb{R}^{\color {red}{2l*1}} HqϵRlQ and αi ϵR1Q and hipϵRl1 and zi ϵR2l1 and ir ϵR2l1, H Q α i T → H^Q\overrightarrow{\alpha_i^T} HQαiT 是attention的结果。

这里所有的资料都写成了 L S T M → ( z i → , h i − 1 r → ) \overrightarrow{LSTM}(\overrightarrow{z_i}, \overrightarrow{h_{i-1}^r}) LSTM (zi ,hi1r )的形式,但是熟悉lstm内部结构(可参考本博)的应该知道,lstm需要的previous state是个tuple,也就是( h t − 1 , c t − 1 h_{t-1},c_{t-1} ht1,ct1),而这里只提到了 h t − 1 h_{t-1} ht1我觉得是因为attention只用到了 h t − 1 h_{t-1} ht1,但是公式中只字未提 c t − 1 c_{t-1} ct1是不是有点缺乏严谨~~~(当然源码中用了state这个“tuple”而不只是 h t − 1 h_{t-1} ht1

上述就是match-LSTM的标准结构,这里更进一步,为了捕捉到更丰富的上下文信息,再增加一个反向match-LSTM网络。基本结构同上。最终,只需要将正向match-LSTM输出的隐含层向量 H r → \overrightarrow{H_r} Hr 和反向match-LSTM输出的隐含层向量 H r ← \overleftarrow{H_r} Hr 拼接起来即可。

(3-5) H r = [ H r → H r ← ] H^r=[\begin{matrix} \overrightarrow{H_r}\\ \overleftarrow{H_r} \end{matrix}] \tag{3-5} Hr=[Hr Hr ](3-5)
其中 H r → , H r ← ϵ R l ∗ P   a n d   H r ϵ R 2 l ∗ P \overrightarrow{H_r},\overleftarrow{H_r} \epsilon \mathbb{R}^{l*P} and H^r \epsilon \mathbb {R}^ {2l*P} Hr ,Hr ϵRlP and HrϵR2lP

4.Answer Pointer Layer

将Match-LSTM Layer的输出 H r H^r Hr作为这一层的输入。Match-LSTM 的 Answer Pointer Layer 层包含了两种预测答案的模式:

  • Sequence Model 将答案看做是一个整数组成的序列,每个整数表示选中的 token 在原文中的位置,因此模型按顺序产生一系列条件概率,每个条件概率表示基于上轮预测的 token 产生的下个 token 的位置概率,最后答案总概率等于所有条件概率的乘积。(其实有点怀疑这种方式产生的答案,人能读得懂吗?)
  • Boundary Model 简化了整个预测答案的过程,只预测答案开始和答案结束位置,相比于 Sequence Model 极大地缩小了搜索答案的空间,最后的实验也显示简化的 Boundary Model 相比于复杂的 Sequence Model 效果更好,因此 Boundary Model 也成为后来的模型用来预测答案范围的标配。

4.1.Sequence Model

序列模型不限定答案的范围,即可以连续出现,也可以不连续出现,因此需要输出答案每一个词语的位置。又因答案长度不确定,因此输出的向量长度也是不确定的,需要手动制定一个终结符。假设passage长度为P,则终结符为P+1。
pointer net网络,实质上仍然是一个attention机制的应用,只不过直接将attention向量作为匹配概率输出。

(4-1-1) F k = tanh ⁡ ( V H ˉ r + ( W a h k − 1 a + b a ) ⊗ e p + 1 ) F_k=\tanh(V \bar H^r+(W^a \mathbf h_{k-1}^a + b^a) \otimes e_{p+1}) \tag{4-1-1} Fk=tanh(VHˉr+(Wahk1a+ba)ep+1)(4-1-1)
(4-1-2) β k = s o f t m a x ( v T F k + c ⊗ e p + 1 ) \beta_k=softmax (v^TF_k + c \otimes e_{p+1}) \tag{4-1-2} βk=softmax(vTFk+cep+1)(4-1-2)
其中:

  • H ˉ r ϵ R 2 l ∗ ( P + 1 ) \bar H^r \epsilon \mathbb{R}^{2l*(P+1)} HˉrϵR2l(P+1) H r H^r Hr与0向量的concat,即 H ˉ r = H r : 0 ] \bar H^r=H^r:0] Hˉr=Hr:0]
  • F k ϵ R l ∗ ( p + 1 ) , h k − 1 a ϵ R l × 2 l , W a ϵ R l × l , v ϵ R l , b a ϵ R l , c ϵ R 是 一 个 实 数 F_k \epsilon \mathbb{R}^{l*(p+1)},\mathbf h_{k-1}^a \epsilon \mathbb{R}^{l×2l} , W^a \epsilon \mathbb{R}^{l×l},v \epsilon \mathbb{R}^{l}, b^a \epsilon \mathbb{R}^{l}, c \epsilon \mathbb{R}是一个实数 FkϵRl(p+1)hk1aϵRl×2lWaϵRl×lvϵRlbaϵRlcϵR
  • 这里的 h k − 1 a h_{k-1}^a hk1a来自:
    h k a = L S T M → ( H ˉ r β k T ⎵ a t t e n t i o n , h k − 1 a ) \mathbf h_k^a = \overrightarrow{\rm{LSTM}} ( \underbrace{\bar H^r \mathbf \beta_k^T}_{\color{blue}{\rm{attention}}}, \mathbf h_{k-1}^a) hka=LSTM (attention HˉrβkT,hk1a)

答案a第k个词对应passage位置为:
(4-1-3) p ( a k = j ∣ a 1 , a 2 , . . . , a k − 1 , H r ) = β k , j p(a_k=j|a_1,a_2,...,a_{k-1},H^r)=\beta_{k,j} \tag{4-1-3} p(ak=ja1,a2,...,ak1,Hr)=βk,j(4-1-3)

也就是对于答案中的每个词 a i a_i ai,其产生过程是:

  • 在P的末尾设置一个停止标记,如果选择它,则停止迭代。新的 H ˉ r ∈ R ( m + 1 ) × 2 h \bar H^r \in \mathbb R^{(m+1) \times 2h} HˉrR(m+1)×2h
  • 先用上个状态中的隐状态输出 h k − 1 a h^a_{k-1} hk1a、match-lstm的输出结果 H r H^r Hr做attention,产生 H r H^r Hr的权重结果 β k \beta_k βk;并将 β k \beta_k βkattention权重向量作为预测结果,用最大值的index作为k状态的答案输出 a k a_k ak,如果预测的index是P+1则停止,答案生成完毕;
  • 将LSTM中的上一状态 h k − 1 a h^a_{k-1} hk1a,并用attention结果作为输入重新输入LSTM,得到当前状态隐状态 h k a h^a_{k} hka
  • 步骤二和步骤三循环,直到步骤二中预测的index是P+1,或者超出设置的超参数(答案最长长度)。

Sequence Model的模型评判计算公式如下:
(4-1-4) p ( a ∣ H r ) = ∏ k p ( a k ∣ a 1 , a 2 , . . . , a k − 1 , H r ) p(a|H^r)=\prod_k p(a_k|a_1,a_2,...,a_{k-1},H^r) \tag{4-1-4} p(aHr)=kp(aka1,a2,...,ak1,Hr)(4-1-4)
其中:
(4-1-5) p ( a k = j ∣ a 1 , a 2 , . . . , a k − 1 , H r ) = β k , j p(a_k = j | a1,a2,...,a_{k−1},H_r) = β_{k,j} \tag{4-1-5} p(ak=ja1,a2,...,ak1,Hr)=βk,j(4-1-5)
这里公式中的 p ( a k ∣ a 1 , a 2 , . . . , a k − 1 , H r ) p(a_k|a_1,a_2,...,a_{k-1},H^r) p(aka1,a2,...,ak1,Hr)表示的是最大的softmax值。

对上面公式4-1-4取对数函数,就得到了模型训练loss:
(4-1-6) − ∑ n − 1 N log ⁡ p ( a n ∣ P n , Q n ) -\sum_{n-1}^{N}\log p(a_n|P_n,Q_n) \tag{4-1-6} n1Nlogp(anPn,Qn)(4-1-6)

4.2.Boundary Model

边界模型直接假设答案在passage中连续出现,因此只需要输出起始位置s和终止位置e即可。基本结构同Sequence Model,只需要将输出向量改为两个,并去掉终结符。那么同理loss定义为:
p ( a ∣ H r ) = p ( a s ∣ H r ) ⋅ p ( a e ∣ a s , H r ) p(\mathbf a \mid H^r) = p(a_s \mid H^r) \cdot p(a_e \mid a_s, H^r) p(aHr)=p(asHr)p(aeas,Hr)
Boundary Model的计算步骤可以根据上面修改为:

  • 先用上个状态中的隐状态输出 h k − 1 a h^a_{k-1} hk1a、match-lstm的输出结果 H r H^r Hr做attention,产生 H r H^r Hr的权重结果 β k \beta_k βk;并将 β k \beta_k βkattention权重向量作为预测结果,用最大值的index作为k状态的起始位置 a s a_s as或者 a k a_k ak
  • 将LSTM中的上一状态 h k − 1 a h^a_{k-1} hk1a,并用attention结果作为输入重新输入LSTM,得到当前状态隐状态 h k a h^a_{k} hka
  • 步骤一和步骤二执行两次,得到 a s a_s as a k a_k ak

5.实验

模型参数设置:

  • 隐藏层大小:150
  • 优化方法:Adamax(β1 = 0.9,β2 = 0.999)
  • minibatch:30
  • 没有用L2正则

最终结果:
在这里插入图片描述

6.源码解析

详见 QA系统Match-LSTM代码研读

参考网址

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值