GRU模型与LSTM模型设计上十分的相似,LSTM包含三个门函数(input gate、forget gate和output gate),而GRU模型是LSTM模型的简化版,仅仅包含两个门函数(reset gate和update gate)。reset gate决定先前的信息如何结合当前的输入,update gate决定保留多少先前的信息。如果将reset全部设置为1,并且update gate设置为0,则模型退化为RNN模型。
从上面GRU模型和LSTM模型的定义可总结出区别如下
1:GRU包含2个门函数、LSTM包含三个门函数。
2:GRU模型没有output gate,因此它不需要计算输出。
3:LSTM中input gate和forget gate的作用分别为控制输入的信息和控制先前的信息。而GRU中由update gate同时控制输入和先前的信息,即公式中变量z。reset gate直接应用于先前的隐藏状态的控制,即公式中变量f。
4:输出不再需要加入一个非线性函数。
LSTM模型和GRU模型在应用中的选择
1:从上面的区别可以看出,GRU模型的参数相对更少,因此训练的速度会稍快,从实验中也可以得出该结论。
2:当你的训练数据足够多的时候,LSTM模型会表现的更好。
实验步骤
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模型计算特征(sequence_len, batch_size, rnn_size)。
6:对时序的GRU特征进行选择,这里采用max-pooling。
7:采用问题和答案最终计算的特征,计算目标函数(cosine_similary)。
参数设置
1:、这里优化函数采用论文中使用的SGD(采用adam优化函数时效果会差大概2个点)。
2、学习速率为0.1。
3:、训练100轮,大概需要6个小时的时间。
4、margin这里采用0.15,其它参数也试过0.05、0.1效果一般。
5、这里训练没有采用dropout和l2约束,之前试过dropout和l2对实验效果没有提升,这里就没有采用了。
6、batch_size这里采用问题30字、答案100字。
7、rnn_size为150(继续调大没有明显的效果提升,而且导致训练速度减慢)
8、目标函数采用cosine_similary。
实验效果对比
QA_CNN:0.62左右
QA_LSTM:0.66左右
QA_BILSTM:0.68左右
QA_GRU :0.6378左右
QA_BIGRU :0.669左右
注:这里分别实验了单向的GRU算法、双向的GUR算法、单向的LSTM和双向的LSTM算法。单向GRU/LSTM的算法只能捕获当前词之前词的特征,而双向的GRU/LSTM算法则能够同时捕获前后词的特征,实验证明双向的GRU/LSTM比单向的GRU/LSTM算法效果更佳。LSTM算法性能稍优于GRU算法,但是GRU算法训练速度要比LSTM算法快。实际使用可以根据自己的要求做出权衡。