QA(二):利用Attention机制,带着问题阅读

MACHINE COMPREHENSION USING MATCH-LSTM AND ANSWER POINTER

摘要

本文介绍一种结合 math-LSTM 和Pointer Net利用end-end的来解决QA问题的方式

模型

最主要的还是 match-LSTM:有两个句子,一个是前提,另外一个是假设,match-LSTM序列化的经过假设的每一个词,然后预测前提是否继承自假设。

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

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

下面介绍详细的模型

1. 预处理层LSTM Preprocessing层

首先对文本和问题分别单独用LSTM进行单向的encoder

Hp=LSTM(P)Hq=LSTM(Q)

HpR[l,p],HqR[l,q]
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向量:
hri=LSTM(zi,hri1)

由attention机制我们可以知道,这里的zi 是融合passage的input和对qustion的attention信息:

zi=[hpif(Hq)]

Hp 是prcess层利用LSTM将passage预处理后得到的,
第i个词的向量为hpiRl ,我们在hpi 之后加一个qustion相关的信息,

令:f(Hq)=Hqαi

其中αi 是文本passage里面的第i个词,首先计算第i个词和question里面每一个词的相关性权重

αi 就是attention的alignment model:

Gi=tanh(WqHq+(Wphpi+Wrhri1+bp)eQ)αi=softmax(wtGi+beQ)
# tensorflow 里面有现成的BahdanauAttention类
match_lstm = BahdanauAttention(l, q)

这样我们就得到了αi

这样我们可以完整的迭代这个序列模型:

hri=LSTM(zi,hri1)

同理我们将passage倒叙,可以得到倒叙的LSTM模型

hri^=LSTM(zi^,hri1^)

我们令forward和backward得到的转台矩阵分别为Hr,Hr^ , 我们把两个矩阵直接连接起来得到最终的状态矩阵

Hr=[HrHr^]

HrR[2l,p]
# 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得到的,
它将Hr 作为输入,生成答案有两种方式:
1. sequence,自动生成答案序列, 序列里面的词是从passage里面选取出来的
2. boundary,答案从passage里面截取,模型生成的是开始和结束下标

Sequence

假设我们的答案序列为:
a=(a1,a2,...)
其中ai 为选择出来答案的词在原文passage里面的下标位置,
ai[1,P+1] , 其中第P + 1 是一个特殊的字符,表示答案的终止,当预测出来的词是终止字符时,结束答案生成。

简单的方式是像机器翻译一样,直接利用LSTM做decoder处理:
假设a1,a2,..,ak1

Ok=LSTM(ak1,hk1)p(ak|Ok)=argmaxP+1(softmax(WOk))

找到passage里面概率最大的词的就可以了

这里也利用上节讲的Bahdanau Attention机制,
在预测第k个答案的词时,我们先计算出一个权重向量
βk 用来表示在[1, P+1]位置的词,各个词的权重

先得到隐藏向量:
hak=LSTM([Hr;0],hak1)

计算权重:

Fk=tanh(V[Hr;0]+(Wahak1+ba)eP+1)βk=softmax(vtFk+ceP+1)

然后p(ak=j)=βk,j

βk,j 最大的一个下标就是ak 的值

代码和match-LSTM基本一致

Boundary

这种模型很简单,答案a=(as,ae) 只有两个值
计算方式和上面sequene模型一样,只是有亮点不同

  1. 没有显示的结束标记,所有在LSTM input的时候不要补0
  2. asae

实验

使用预训练过的词向量
Boundary模式的answer层忧郁是固定的,可以用bi-dir LSTM
Boundary模式要注意避免截取的段落过长

后续改进

Question Answering Using Match-LSTM and Answer Pointer

1. 预处理层LSTM Preprocessing层

单向LSTM -> BiLSTM

Hq=[hforqhbackq]

Hp=[hforphbackp]

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真的是很好的两种方式

Extending Match-LSTM

这个工作并没有对Match-Lstm层做任何改动

1. 预处理层LSTM Preprocessing层增加attention

P,Q互为attention聚焦

Hp=LSTM(P,attention(Q))Hq=LSTM(Q,attention(P))

这个改进其实更近一步,在预处理阶段就带着对方的信息处理每一个词

2. Conditional Span Decoder

在上文的处理中,answer start 和 end是独立处理的,这里还是恢复以来关系:

P(ae=i,as=j|Hr)=P(ae=i|Hr)=P(as=j|Hr)P(ae=i|as=j,Hr)

其实如果做到以来,直接用LSTM其实就是上述的概率
这里作者做了些改进:
Hr 经过softmax后得到as 的概率向量hs,j
p(as=j|Hr)=hs,j=softMax[Hr])

然后ps,jHr 一起作为LSTM的输入

he,j=LSTM([ps,j,Hr]))

p(ae=i,as=j|Hr)=softmax(he,j)


这里写图片描述
graph 对比图

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章