match-LSTM是作者早些时候在文本蕴含(textual entertainment)任务中提出的,可参考《Learning natural language inference with LSTM》
源码:https://github.com/shuohangwang/SeqMatchSeq
参考博客:
- https://blog.csdn.net/laddie132/article/details/79159895
- QA(二):利用Attention机制,带着问题阅读
SQuAD 是由 Rajpurkar 等人提出的一个最新的阅读理解数据集。该数据集包含 10 万个(问题,原文,答案)三元组,原文来自于 536 篇维基百科文章,而问题和答案的构建主要是通过众包的方式,让标注人员提出最多 5 个基于文章内容的问题并提供正确答案,且答案出现在原文中。SQuAD 和之前的完形填空类阅读理解数据集如 CNN/DM,CBT等最大的区别在于:SQuAD 中的答案不再是单个实体或单词,而可能是一段短语,这使得其答案更难预测。SQuAD 包含公开的训练集和开发集,以及一个隐藏的测试集,其采用了与 ImageNet 类似的封闭评测的方式,研究人员需提交算法到一个开放平台,并由 SQuAD 官方人员进行测试并公布结果。下图是一个示例:
模型整体分为三部分:
简单的说:带着问题去阅读原文,然后用得到的信息去回答问题
1. 先利用LSTM阅读一遍passage,得到输出的encoding 序列。
2. 然后带着question的信息,重新将passage的每个词输入LSTM,再次得到passage的encoding信息。但是这次的输入不仅仅只有passage的信息,还包含这个词和question的关联信息,它和question的关联信息的计算方式就是我们在seq2seq模型里面最常用的attention机制。
3. 最后将信息输入answer模块,生成答案。
首先用词向量表示问题和段落,再使用单向 LSTM 编码问题和段落,得到hidden state表示。这里直接使用单向的LSTM,每一个时刻的隐含层向量输出只包含左侧上下文信息。
match-LSTM原先设计是用来解决文版蕴含任务:有两个句子,一个是前提H,另外一个是假设T,match-LSTM序列化地经过假设的每一个词,然后预测前提是否继承自假设。而在问答任务中,将question当做H,passage当做T,则可以看作是带着问题去段落中找答案。这里利用了attention机制(soft-attention)。
对段落p中每个词,计算其关于问题q的注意力分布α,并使用该注意力分布汇总问题表示;将段落中该词的隐层表示和对应的问题表示合并,输入另一个 LSTM 编码,得到该词的 query-aware 表示。具体结构如下:
1. 针对passage每一个词语输出一个α向量,这个向量维度是question词长度,故而这种方法也叫做question-aware attention passage representation。
Answer Pointer的思想是从Pointer Net得到的, 它将 Hr 作为输入,生成答案有两种方式sequence model 和 boundary model。
序列模型不限定答案的范围,即可以连续出现,也可以不连续出现,因此需要输出答案每一个词语的位置。又因答案长度不确定,因此输出的向量长度也是不确定的,需要手动制定一个终结符。假设passage长度为P,则终结符为P+1。
假设答案序列为: a=(a1,a2,…) ,其中ai为选择出来答案的词在原文passage里面的下标位置,ai∈[1,P+1], 其中第P+1 是一个特殊的字符,表示答案的终止,当预测出来的词是终止字符时,结束答案生成。
简单的方式是像机器翻译一样,直接利用LSTM做decoder处理:
对于pointer net网络,实质上仍然是一个attention机制的应用,只不过直接将attention向量作为匹配概率输出。
这里也利用了Attention机制, 在预测第k个答案的词时,先计算出一个权重向量 βk 用来表示在[1, P+1]位置的词,各个词的权重。
1. 对于第k个答案,段落里各个词对应的权重:
边界模型直接假设答案在passage中连续出现,因此只需要输出起始位置s和终止位置e即可。基本结构同Sequence Model,只需要将输出向量改为两个,并去掉终结符。
答案a=(as,ae) 只有两个值
作者对于这种模型扩展了一种 search mechanism,在预测过程中,限制span的长度,然后使用全局搜索,找 p(as) × p(ae)最大的。