MACHINE COMPREHENSION USING MATCH-LSTM AND ANSWER POINTER
摘要
本文介绍一种结合 math-LSTM 和Pointer Net利用end-end的来解决QA问题的方式
模型
最主要的还是 match-LSTM:有两个句子,一个是前提,另外一个是假设,match-LSTM序列化的经过假设的每一个词,然后预测前提是否继承自假设。
简单的说:带着问题去阅读原文,然后用得到的信息去回答问题
- 先利用LSTM阅读一遍passage,得到输出的encoding 序列
- 然后带着question的信息,重新将passage的每个词输入LSTM,再次得到passage的encoding信息。但是这次的输入不仅仅只有passage的信息,还包含这个词和question的关联信息,它和qustion的关联信息的计算方式就是我们在seq2seq模型里面最常用的attention机制。
- 然后将信息输入answer模块,生成答案
下面介绍详细的模型
1. 预处理层LSTM Preprocessing层
首先对文本和问题分别单独用LSTM进行单向的encoder
l 是LSTMcell的隐藏层大小,p和q分别是文本passage 和 问题question的长度
代码很简单,两个序列分别经过LSTM序列模型,就得到encoder向量。
lstm_cell_question = tf.nn.rnn_cell_impl.BasicLSTMCell(l, state_is_tuple=True)
encoded_question, q_rep = tf.nn.dynamic_rnn(lstm_cell_question, question,masks_question,dtype=tf.float32)
lstm_cell_passage = tf.nn.rnn_cell_impl.BasicLSTMCell(l, state_is_tuple=True)
encoded_passage, p_rep = tf.nn.dynamic_rnn(lstm_cell_passage, passage,masks_passage, dtype=tf.float32)
2. Match-LSTM 层
带着qustion来阅读passage,利用的是利用了 Bahdanau Attention机制机制,具体可以见该论文。
但是为了详细描述,在这里还是详细的描述一遍:
整体的思路可以看作我们在decoder passage,我们聚焦的是qustion向量:
由attention机制我们可以知道,这里的
第i个词的向量为
令:
其中
# tensorflow 里面有现成的BahdanauAttention类
match_lstm = BahdanauAttention(l, q)
这样我们就得到了
这样我们可以完整的迭代这个序列模型:
同理我们将passage倒叙,可以得到倒叙的LSTM模型
我们令forward和backward得到的转台矩阵分别为
# LSTM Cell
cell = BasicLSTMCell(l, state_is_tuple=True)
lstm_attender = AttentionWrapper(cell, match_lstm)
reverse_encoded_passage = _reverse(encoded_passage)
# bi-dir LSTM
output_attender_fw, _ = tf.nn.dynamic_rnn(lstm_attender, encoded_passage, dtype=tf.float32, scope="rnn")
output_attender_bw, _ = tf.nn.dynamic_rnn(lstm_attender, reverse_encoded_passage, dtype=tf.float32, scope="rnn")
output_attender_bw = _reverse(output_attender_bw)
# concat
output_attender = tf.concat([output_attender_fw, output_attender_bw], axis=-1)
3. Answer Pointer
Answer Pointer的思想是从Pointer Net得到的,
它将
1. sequence,自动生成答案序列, 序列里面的词是从passage里面选取出来的
2. boundary,答案从passage里面截取,模型生成的是开始和结束下标
Sequence
假设我们的答案序列为:
其中
简单的方式是像机器翻译一样,直接利用LSTM做decoder处理:
假设
找到passage里面概率最大的词的就可以了
这里也利用上节讲的Bahdanau Attention机制,
在预测第k个答案的词时,我们先计算出一个权重向量
先得到隐藏向量:
计算权重:
然后
代码和match-LSTM基本一致
Boundary
这种模型很简单,答案
计算方式和上面sequene模型一样,只是有亮点不同
- 没有显示的结束标记,所有在LSTM input的时候不要补0
as≤ae
实验
使用预训练过的词向量
Boundary模式的answer层忧郁是固定的,可以用bi-dir LSTM
Boundary模式要注意避免截取的段落过长
后续改进
Question Answering Using Match-LSTM and Answer Pointer
1. 预处理层LSTM Preprocessing层
单向LSTM -> BiLSTM
2. regularization
在所有LSTM外面都加上Dropout,droupout概率为0.2
3. 调整op,size大小
不同的optimal Adam -> AdaMax
不同的batch-szie
gradient clipping =0.5
实验效果

图中可以看出,虽然改进的Final Match-LSTM 在训练集上面指标下降,但是在测试集上面是有提升的
其实在训练过程中dropout和batch_normal真的是很好的两种方式
这个工作并没有对Match-Lstm层做任何改动
1. 预处理层LSTM Preprocessing层增加attention
P,Q互为attention聚焦
这个改进其实更近一步,在预处理阶段就带着对方的信息处理每一个词
2. Conditional Span Decoder
在上文的处理中,answer start 和 end是独立处理的,这里还是恢复以来关系:
其实如果做到以来,直接用LSTM其实就是上述的概率
这里作者做了些改进:
然后

graph 对比图