又是一篇之前读的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 的原文表示来预测答案范围。
1.模型概述
Match-LSTM模型的输入由两部分组成:段落(passage)和问题(question)。passage使用一个矩阵P[d * P]表示,其中d表示词向量维度大小,P表示passage中tokens的个数;question使用矩阵Q[d * Q]表示,其中Q表示question中tokens的个数。
Match-LSTM模型的输出即问题的答案有两种表示方法:
- 其一是使用一系列整数数组,其中是中的一个整数,表示在段落中某个token具体的位置,这里的整数数组不一定是连续的,对应Sequence Model ;
- 第二种表示方法是假设答案是段落中一段连续的token组合,即仅使用两个整数来表示答案,表示答案在段落中开始的位置,则表示结束位置,和是中的整数,对应Boundary Model 。
故对Match-LSTM模型的训练集样本来说,其可用下面的三维数组来表示:
总结一下,在模型实现上,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网络预测答案在原文中起始和结束位置
模型结构图:
简单的说:带着问题去阅读原文,然后用得到的信息去回答问题:
- 先利用LSTM阅读一遍passage,得到输出的encoding 序列。
- 然后带着question的信息,重新将passage的每个词输入LSTM,再次得到passage的encoding信息。但是这次的输入不仅仅只有passage的信息,还包含这个词和question的关联信息,它和question的关联信息的计算方式就是我们在seq2seq模型里面最常用的attention机制。
- 最后将信息输入answer模块,生成答案。
2.LSTM preprocessing Layer
LSTM preprocessing Layer的目的是将token的上下文信息包含到passage和question中的每个token的向量表示中。分别将passage和question输入LSTM preprocessing Layer,直接使用单向LSTM,故而每一个时刻的隐含层向量输出只包含左侧上下文信息.
经过LSTM preprocessing Layer后,passage和question表示如下矩阵:
其中是passage的向量矩阵表示,其大小为,表示隐藏层的节点个数;是question的向量矩阵表示,其大小为。
3.match-LSTM
在文本蕴含任务中,输入一个文本对,假设句T和蕴含句H,这里将question当做T,passage当做H。下面是match-LSTM的构建,实质上就是一个attention机制。
其中:
- ,这都是需要训练的参数。
-
是attention时的中间结果,表示passage中第i个词和query中每个词的交互信息(对应的每一列对应query中每一个词);
其维度变化过程为:[l Q] = [l l] [l Q] + ([l l] [l 1] + [l l] [l 1] + [l 1]) |Q| -
是attention计算出来的权重,表示在passage的第i个token对question中每个词的注意力权重向量。
其维度变化过程为:[1 Q] = ([1 l] [l Q] + 1 * |Q|) - 表示mathch-LSTM中,第 个token的隐藏层输出,计算方式如下公式(3-4)
- 表示将x复制次,公式中同理
上式中公式3-1,3-2这种 attention 被称为 BahdanauAttention。 Passage 中第 t 个上下文向量会根据 所有 Question 的隐向量 & Passage 中 t-1 时刻的上下文向量 来确定对Question 每个 token 的权重。可以把下图的 Y 理解为 passage,把 X 理解为question。
这里可以针对passage每一个词语输出一个向量,这个向量维度是question词长度,故而这种方法也叫做question-aware attention passage representation。
下面将attention向量()与原query编码向量()点乘,得到passage中第i个token的question关联信息,再与passage中第i个token的编码向量做concat,粘贴为一个向量,然后输出到LSTM网络中。
其中,是attention的结果。
这里所有的资料都写成了的形式,但是熟悉lstm内部结构(可参考本博)的应该知道,lstm需要的previous state是个tuple,也就是(),而这里只提到了我觉得是因为attention只用到了,但是公式中只字未提是不是有点缺乏严谨~~~(当然源码中用了state这个“tuple”而不只是)
上述就是match-LSTM的标准结构,这里更进一步,为了捕捉到更丰富的上下文信息,再增加一个反向match-LSTM网络。基本结构同上。最终,只需要将正向match-LSTM输出的隐含层向量和反向match-LSTM输出的隐含层向量拼接起来即可。
其中
4.Answer Pointer Layer
将Match-LSTM Layer的输出作为这一层的输入。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向量作为匹配概率输出。
其中:
- 是与0向量的concat,即
- 这里的来自:
答案a第k个词对应passage位置为:
也就是对于答案中的每个词,其产生过程是:
- 在P的末尾设置一个停止标记,如果选择它,则停止迭代。新的
- 先用上个状态中的隐状态输出、match-lstm的输出结果做attention,产生的权重结果;并将attention权重向量作为预测结果,用最大值的index作为k状态的答案输出,如果预测的index是P+1则停止,答案生成完毕;
- 将LSTM中的上一状态,并用attention结果作为输入重新输入LSTM,得到当前状态隐状态
- 步骤二和步骤三循环,直到步骤二中预测的index是P+1,或者超出设置的超参数(答案最长长度)。
Sequence Model的模型评判计算公式如下:
其中:
这里公式中的表示的是最大的softmax值。
对上面公式4-1-4取对数函数,就得到了模型训练loss:
4.2.Boundary Model
边界模型直接假设答案在passage中连续出现,因此只需要输出起始位置s和终止位置e即可。基本结构同Sequence Model,只需要将输出向量改为两个,并去掉终结符。那么同理loss定义为:
Boundary Model的计算步骤可以根据上面修改为:
- 先用上个状态中的隐状态输出、match-lstm的输出结果做attention,产生的权重结果;并将attention权重向量作为预测结果,用最大值的index作为k状态的起始位置或者;
- 将LSTM中的上一状态,并用attention结果作为输入重新输入LSTM,得到当前状态隐状态
- 步骤一和步骤二执行两次,得到和。
5.实验
模型参数设置:
- 隐藏层大小:150
- 优化方法:Adamax(β1 = 0.9,β2 = 0.999)
- minibatch:30
- 没有用L2正则
最终结果:
6.源码解析
参考网址
- Match-LSTM and Answer Pointer 介绍原理
- 机器阅读理解Match-LSTM模型 介绍原理
- 论文分享 - Machine Comprehension Using Match-LSTM and Answer Pointer
- QA(二):利用Attention机制,带着问题阅读
- 2016 MACHINE COMPREHENSION USING MATCH-LSTM AND ANSWER POINTER