LSTM_CNN在问答系统中的应用
在前面的随笔中,已经分别介绍了CNN算法和LSTM算法在问答系统中的应用。其中LSTM算法在抽取特征之后,针对不同时序产生的特征状态,做max-pooling或者avg-pooling获得最终的特征。无论是max-pooling或者avg-pooling只是对不同的特征做出最后的选择,因此这里我们可以采用一些其他的技巧对特征进行选择。本次实验即时对这里的特征选择进行改造,采用CNN算法的结构对所有的时序特征做出最后的选择,即LSTM_CNN算法。整个算法的流程图如下:
LSTM_CNN算法实验步骤
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模型计算特征(sequence_len, batch_size, rnn_size)。
6:对时序的LSTM特征进行选择,这里采用CNN算法(卷积+最大池)。
7:采用问题和答案最终计算的特征,计算目标函数(cosine_similary)。
目标函数参数设置
1:、这里优化函数采用论文中使用的SGD。
2、学习速率为0.05。
3:、训练300轮。
4、margin这里采用0.05,其它参数也试过0.1、0.2效果一般。
5、这里训练没有采用dropout和l2约束,之前试过dropout和l2对实验效果没有提升,这里就没有采用了。
6、batch_size这里采用128。
7、rnn_size为200。
8、filter_size为1、2、3(相比1、2的组合效果稍好),num_filter为500.
9、目标函数采用cosine_similary,实验时也试过欧几里德距离,但是效果不佳。
实验效果对比
QA_CNN:0.62左右
QA_LSTM:0.66左右
QA_LSTM_CNN:0.67左右
注:这里只做了单向的LSTM_CNN,和单向的LSTM算法相比,效果提升大概为1%左右。
如果有任何问题欢迎发送邮件到lirainbow0@163.com。