来谈谈那些很棒的检索式Chatbots论文(一)
作者:LeonMao
本文为授权转载,转载请联系作者,原文链接,可点击阅读原文直达:
https://zhuanlan.zhihu.com/p/65062025
已经关注Retrieval-Based Chatbots一段时间了,期间也看了不少这方面的论文,以及在这些论文里面又发现了一些很不错的论文。这段时间一直在做相关的实验,现在实验效果也出来了,准备将自己的成果写成一篇论文,并且总结下这段时间看过的论文。
目前计划先讲SMN、DAM、IMN和MRFN这四篇论文,其中SMN和DAM的作者已经将代码放出,都是提供Tensorflow版本,为了方便实验,我自己将两份代码用Pytorch改写了,SMN的代码我放到了自己的github上,不过感觉自己放上去的版本还需要修改下,后续将会做下补充再重新上传代码~(感觉给自己挖了挺多坑的,希望自己有毅力将每个坑填好)
第二篇讲DAM的文章出来了,有兴趣想了解DAM模型的可以看下:
LeonMao:来谈谈那些很棒的检索式Chatbots论文(二)zhuanlan.zhihu.com
SMN(Sequential Matching Network)
讲回正题,Retrieval-Based Chatbots即检索式的聊天机器人,在人机的多轮对话中(多轮的QA)从多个候选回复中选出最优的回复,这便是我们的目标。这次讲的论文是SMN,其论文全名为Sequential Matching Network: A New Architecture for Multi-turn Response Selection in Retrieval-Based Chatbots
这篇论文是吴俣大佬的,这个结构影响了后续相关的论文,不少论文都采用了这种结构,首先放出论文地址及其源码:
https://arxiv.org/pdf/1612.01627v2.pdfarxiv.org
MarkWuNLP/MultiTurnResponseSelectiongithub.com
Introduction
在这论文之前,有关Retrieval-Based Chatbots的做法是将context里所有的utterances都连接在一起,将这个长长的context做处理然后和response作匹配。而正如论文的名称,该论文提出了一个新的框架,不再将utterances拼接起来,而是每个utterance都和response做匹配,然后再用RNN去构建utterance间的关系,最后的匹配分数通过RNN的隐藏层计算得出。除了提出这个新的框架外,作者还在论文里提出了一个新的数据集,这个数据集(豆瓣对话语料库)也被后续相关的论文所使用。
关于多轮对话的例子,通过图一可以很直观的看出:
在论文中作者也谈到,不同于单轮的对话,多轮对话需要考虑到前几轮对话中的信息,而不单单只关注于最近的那个对话,所以如何识别出context中重要的信息(例如单词、短语、句子),哪些信息是对选择合适的回复起关键作用;如何构建utterances之间的关系,这些都是需要考虑的问题。
Model Overview
上面的图就是SMN的模型结构,可以很清楚的看到,SMN让response和每个utterance做匹配,形成2D的response-utterance相似度矩阵(similarity matrix),除了从单词层面(word embedding)做匹配外,还在子序列层面(经过一层GRU后的隐藏状态)做匹配,这样就能得到两种粒度(granularity)的匹配表示了,这也是图中
接着将这两个相似度矩阵做卷积和池化操作,以抽取匹配信息。经过前面的操作,抽取出response和每个utterance的匹配信息,紧接着就是将这些信息积累起来,作者这里用GRU,对所有的匹配信息按时间顺序(chronological order)进行积累,最后用得到的隐藏状态计算匹配程度。
文章中将模型分为三层,接下来将详细的介绍每一层的公式:
Utterance-Response Matching
Matching Accumulation
Matching Prediction
Utterance-Response Matching
模型的输入是response和context里面的utterances,接下来用
其中
其中
在拿到了两种表示后,就可以计算相似度矩阵了。
注意到
得到两个相似度矩阵后,进行卷积和池化的操作,具体公式如下:
在具体的实验中,输入的通道数量是2(因为有
Matching Accumulation
经过上面的处理,我们得到
这层的作用是用于构建utterances之间的依赖和时间上的联系。
Matching Prediction
在得到
1、直接用最后的隐藏状态,即
2、给予每个隐藏状态一个权重然后加和,即
3、参考了论文Hierarchical attention networks for document classification,具体公式为:
最后用下面的公式得到匹配分数:
上面公式就是用线性层将维度降为2,再用softmax归一化,即将其转化成二分类问题,表示这个候选的response是否可选。
论文还详尽的介绍了豆瓣对话语料库,并且做了实验去研究应该在context中取多少个utterance,即取多少轮对话,实验证明轮数取10的时候效果最好。
感觉除了读论文,好好研究作者开源的代码对自己提升也很大,因为很多细节只有看了代码后才会清楚,后续应该会放出自己复现的pytorch代码,下一篇文章将会写DAM~