对话模型就是你一句我一句,上下文相关,句子长度还不一样,也就是由一个序列转化成另一序列,经典的seq2seq模型可以相应用上去,较为成熟的应用有神经机器翻译,不仅得益于其丰富且较为正规的语料,还有其中的损失评价函数也较为适合翻译问题,其结果往往不错,而对话往往表达更为多样,不同人的回答往往相差九千九百里,语料质量往往比较差,且损失函数也没有很好地选择,Vinyals 在它的文章 A Neural Conversational Model 中提到在与其他模型比较时,用了人的感觉标准去判断句子的好坏进而比较模型的优劣。相对于一些简单且在一定领域的对话其训练效果是可以的,比如简单的问答,哲学问题,讨论工作等。
基本的 seq2seq 序列模型是组合编码层(两三层LSTM)和解码层(两三层LSTM)
encoder 将输入(说话)编码成一个语义向量 c (其中LSTM模型是多对一的)
decoder 将 c 解码成输出(回答) (其中LSTM模型是多对一的)
考虑句子前后关联性,还可以加入双向Bi-LSTM
考虑句子中(说话)某个成分在当前解码(回答)节点的重要性,引入注意力机制
现在最为标准的一套seq2seq, 就是带有注意力机制的。
输入序列每次一个token输入, 输出序列每次一个token输出, 基于贪婪算法,每次选取最高概率的token输出,并与该token 预测下一个回答token,另一种不那么贪婪的算法称为beam search, beam size 为k, 也就是每次选取概率最高的前k个token输入,对每个token 都进行预测,再产生前k个token 输出, 现在就有 k*k 个token,类似树的查找,计算出概率最大前k个 token
序列(两个token),最后就是得到概率最大的前k个token序列{回答长度},最后选取第一个token序列?