目前智能QA系统都是基于seq2seq模型来开发(如google),seq2seq模型基于one-hot的词嵌入,每个词用一个数字代替不足以表示词与词之间的关系,word2vec通过多维向量来做词嵌入,能够表示出词之间的关系,比如:男-女≈王子-公主。基于seq2seq的思想,利用多维词向量来实现模型,预期会有更高的准确性。(~~说人话:就是把每个汉字按照一定的规则转换为一个多维矩阵表示,联系越紧密的词,在空间上距离越近,那么我们就可以得到各种近义词,如 高兴=开心 等)
so 为什么要基于seq2seq模型来做智能问答,其他模型不行吗?
答案 是yes。其他模型也可以完成一个比较好的QA模型,业界流行2大方法论:1、基于文法规则的NLP,2、基于统计学的NLP。只是这2种方式的实现的代价不一样。基于文法规则的来做NLP,优势是准确率会非常高,你想想,每个组词规则、每句话的主谓宾都给你标出来,这样的NLP如果做出来了是接近完美的;劣势也很明显,工作量太巨大,汉语光汉字就有几万个,组词规则会更多,很难做到完全统计,难以快速迭代应用。相反基于统计学的NLP(seq2seq是统计学模型),他的准确率未必会有前者高,但是他的兑现速度快,可以在实际应用过程不断迭代,提高准确率。这种方法的思路就是基于一批有限规模的语料库,做机器学习,让机器不断学习文法规则,以适用于某一特定领域,达到智能交互的目的。当前比较大厂商的QA都是基于第2中方法的思路来做,比如:京东、图灵、百度等。
接着谈什么是seq2seq,为什么在统计学的诸多模型中,要选用他?
在网上找的一个简洁的说明,主要参考《Sequence to Sequence Learning with Neural Networks》这篇论文,核心思想如下图:
ABC是输入语句,WXYZ是输出语句,EOS是标识一句话结束,图中的训练单元是lstm,lstm的特点是有长短时记忆,所以能够根据输入的多个字来确定后面的多个字,有关lstm的知识可以参考《http://deeplearning.net/tutorial/lstm.html》
上面的模型中编码器和解码器共用了同一个lstm层,也就是共享了参数,牛人们尝试把他们分开像https://github.com/farizrahman4u/seq2seq中提到的样子:
其中绿色是编码器,黄色是解码器,橙色的箭头传递的是lstm层的状态信息也就是记忆信息,编码器唯一传给解码器的就是这个状态信息
那么我们训练的时候输入的X,Y应该是什么呢?X="How are you <EOL>",Y="W I am fine <EOL>"?
那么在使用训练好的模型做预测的时候,我们改变处理方式:在解码时以前一时序的输出为输入做预测,这样就能输出我们希望输出的"W I am fine <EOL>"了
https://github.com/warmheartli/ChatBotCourse/blob/master/chatbotv2/my_seq2seq_v2.py
文献资料:
http://cn.arxiv.org/pdf/1409.3215.pdf