首页 > 代码库 > 机器人--寒暄库(4)

机器人--寒暄库(4)

 

目前智能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是标识一句话结束,图中的训练单元是lstmlstm的特点是有长短时记忆,所以能够根据输入的多个字来确定后面的多个字,有关lstm的知识可以参考《http://deeplearning.net/tutorial/lstm.html

上面的模型中编码器和解码器共用了同一个lstm层,也就是共享了参数,牛人们尝试把他们分开像https://github.com/farizrahman4u/seq2seq中提到的样子:

技术分享

其中绿色是编码器,黄色是解码器,橙色的箭头传递的是lstm层的状态信息也就是记忆信息,编码器唯一传给解码器的就是这个状态信息

我们看到解码器每一时序的输入都是前一个时序的输出,从整体上来看就是:我通过不同时序输入"How are you <EOL>",模型就能自动一个字一个字的输出"W I am fine <EOL>",这里的W是一个特殊的标识,它既是编码器最后的输出,同时又是解码器的一个触发信号

那么我们训练的时候输入的X,Y应该是什么呢?X="How are you <EOL>"Y="W I am fine <EOL>"?

这是不行的,因为在解码器还没有训练出靠谱的参数之前,我们无法保证第一个时序的输出就是"I",那么传给第二个时序的输入就不一定是I,同样第三、四个时序的输入就无法保证是amfine,那么是无法训练出想要的模型的

我们要这样来做:我们直接把解码器中每一时序的输入强制改为"W I am fine",也就是把这部分从我们训练样本的输入X中传过来,而Y依然是预测输出的"W I am fine <EOL>",这样训练出来的模型就是我们设计的编码器解码器模型了

那么在使用训练好的模型做预测的时候,我们改变处理方式:在解码时以前一时序的输出为输入做预测,这样就能输出我们希望输出的"W I am fine <EOL>"

 

我们采用seq2seq模型的最主要原因就是模型拥有长时记忆能力,而且记忆能力可以根据我们的需求进行控制,这种特性在我们汉语处理中至关重要。有时候一句话的意思需要头和尾加在一起我们才能完全理解,这个道理同样适用机器。

 

下次再谈基于seq2seq模型怎么做寒暄库。经典模型代码

https://github.com/warmheartli/ChatBotCourse/blob/master/chatbotv2/my_seq2seq_v2.py

 

文献资料:

http://cn.arxiv.org/pdf/1409.3215.pdf

机器人--寒暄库(4)