Attention机制在时序模型中的应用,已经被证明能够提升模型的性能。本文参考《Inner Attention based Recurrent Neural Networks for Answer Selection》,该论文以时序模型输出状态设计Attention为基线(QA_LSTM_ATTENTION),提出了三种不同的内部Attention设计方案和一种优化方案。本文实现了论文中的两种方案即IARNN-WORD和IARNN-GATE。
传统的Attention机制被应用于特征抽取器之后,例如QA_LSTM_ATTENTION。由于RNN算法用于处理时序特征的特点,隐含状态迭代更新,因此t时刻的状态包含了从开始到t时刻的所有信息。当我们加入问题的attention信息用于找出最有用的信息的时候,往往靠近时序末端的特征因为包含了之前的所有信息而更容易被挑选出来。综上所述,传统的attention机制更加偏向于后面的状态特征。
为了处理上述的偏差问题,作者考虑将attention加在特征抽取之前,即输入层。文章设计了四种不同的方案,本文挑选了其中的IARNN-WORD和IARNN-GAGE算法。
其中IARNN-WORD算法结构图如下:
IARNN-WORD算法的改变主要来自于将attention的计算放在了答案特征抽取之前,避免出现传统attention算法计算t时刻权值时,包含了之前时刻的特征信息。算法最后对每个时刻的特征输出求取平均来作为最后的特征(综合考虑多个时刻的特征,避免出现特征信息丢失,但是容易引入噪声覆盖信号特征),这里实现采用的是max-pooling,即将attention权值加在每个时刻的特征输出(只拿主要信息,丢掉了其他的低频特征和噪声)。
IARNN-WORD算法的实现较为直观和简单,文章还设计了另一种attention机制方法,即将attention的计算放在了GRU模块的内部(GRU算法的介绍参照这里),GRU模块主要由两个门函数控制信息的传输,文章通过将attention机制加入门函数中来影响时序信息的传输。其计算公式如下:
IARNN-GATE算法结构如下:
IARNN-WORD算法实验步骤
1:本次实验采用insuranceQA数据,你可以在这里获得。实验之前首先对问题和答案按字切词,然后采用word2vec对问题和答案进行预训练(这里采用按字切词的方式避免的切词的麻烦,并且同样能获得较高的准确率)。
2:由于本次实验采用固定长度的LSTM,因此需要对问题和答案进行截断(过长)或补充(过短)。
3:实验建模Input。本次实验采用问答三元组的形式进行建模(q,a+,a-),q代表问题,a+代表正向答案,a-代表负向答案。insuranceQA里的训练数据已经包含了问题和正向答案,因此需要对负向答案进行选择,实验时我们采用随机的方式对负向答案进行选择,组合成(q,a+,a-)的形式。
4:将问题和答案进行Embedding(batch_size, sequence_len, embedding_size)表示。
5:对问题采用LSTM模型计算特征r_q(sequence_len, batch_size, rnn_size),对时序的LSTM特征进行选择,这里采用max-pooling。
6:采用问题的特征r_q和答案的输入根据图1的attention计算方式,计算经过attention加权之后的输入。
7:采用LSTM模型计算答案的特征,文章中对LSTM模型计算的特征采用average的方式获得最后的特征,这里采用max-pooling。
8:根据问题和答案最终计算的特征,计算目标函数(cosine_similary)。
IARNN-GATE算法实验步骤
1:本次实验采用insuranceQA数据,你可以在这里获得。实验之前首先对问题和答案按字切词,然后采用word2vec对问题和答案进行预训练(这里采用按字切词的方式避免的切词的麻烦,并且同样能获得较高的准确率)。
2:由于本次实验采用固定长度的GRU,因此需要对问题和答案进行截断(过长)或补充(过短)。
3:实验建模Input。本次实验采用问答三元组的形式进行建模(q,a+,a-),q代表问题,a+代表正向答案,a-代表负向答案。insuranceQA里的训练数据已经包含了问题和正向答案,因此需要对负向答案进行选择,实验时我们采用随机的方式对负向答案进行选择,组合成(q,a+,a-)的形式。
4:将问题和答案进行Embedding(batch_size, sequence_len, embedding_size)表示。
5:根据通用的GRU模型计算问题的特征r_q。
6:根据图3公式对GRU模型结构进行改造。
7:采用问题的特征r_q和答案的输入根据图4的计算方式,获得经过attention加权的GRU特征,文章中对模型计算的特征采用average的方式获得最后的特征,这里采用max-pooling。
8:根据问题和答案最终计算的特征,计算目标函数(cosine_similry)。
参数设置:
IARNN-WORD算法参数设置:
1:、这里优化函数采用论文中使用的SGD(采用adam优化函数时效果会差大概1个点)。
2、学习速率为0.1。
3:、训练150轮,大概需要7个小时的时间。
4、margin这里采用0.2,其它参数也试过0.15、0.1效果一般。
5、这里训练没有采用dropout和l2约束,之前试过dropout和l2对实验效果没有提升,这里就没有采用了。
6、batch_size为20。
7、这里问题和答案长度都采用100字。
8、rnn_size为300(继续调大没有明显的效果提升,而且导致训练速度减慢)
9、字预训练采用100维。
IARNN-GATE算法参数设置:
1:、这里优化函数采用论文中使用的SGD(采用adam优化函数时效果会差大概1个点)。
2、学习速率为0.1。
3:、训练150轮。
4、margin这里采用0.2,其它参数也试过0.15、0.1效果一般。
5、这里训练没有采用dropout和l2约束,之前试过dropout和l2对实验效果没有提升,这里就没有采用了。
6、batch_size为32
7:这里问题长度保持30字、答案100字。
8、rnn_size为200(继续调大没有明显的效果提升,而且导致训练速度减慢)
9、字预训练采用100维。
实验结果对比:
IARNN-WORD :0.6911
IARNN-GATE :0.6916
如果有任何问题欢迎发送邮件到lirainbow0@163.com。