当前闲聊机器人有两种实现方式:基于检索 与 基于生成
基于检索的chatbot
检索这种方式,在搜索与推荐系统中通常会用的到。具体来说是衡量一种相似度;
在人机对话的开放域,我们虽然想要实现非常自然的人机对话,但是基于当前技术限制,如果把机器人真的当做一个独立对象去对话,它必须有推理与知识能力,目前AI水平是无法达到的;如果换一个角度来看问题,如果仅仅是给用户一个可以接受的回答,并推动对话不断进行下去这样的目标实现起来就比较容易。(个人感觉更像是为突破图灵测试的一种方法)
我们首先对语料进行检索匹配,筛选出最合适的回答
再对待选回答进行rank,基于一些更宏观的考虑比如上下文,最后将的得分最高的给用户
对语料检索匹配
基于检索的方法本质上是计算相似度,如果用户给一个query,我们将其与语料库中的对话进行匹配,相似分数最高的是不是就是最优解?
然后问题就落在如何定义所谓的相似度?什么是语句的相似?听起来就像我们在推荐系统中定义什么是用户可能喜欢。那么我们就需要再进行两步:
1、定义影响相似性的特征
一些重要的词、词频、词性、RNN、词嵌入等
2、定义特征输入-分数的匹配函数
cos相似度、CNN深度学习等算法
这样的检索功能其实应用到客服问答领域非常合适,只要命中知识库哪个问题,就返回该问题下的回答
考虑上下文进行response 评分
经过上一轮检索匹配接下来我们就有了几个候选response,我们需要进行其他维度的考虑使得回复更合理;比如很有可能出现前文提到的信息bot又重新出现。所以我们需要将上下文考虑进去,从而使得对话看起来比较智能
1.我们将待选回复r 与历史对话u都经过词嵌入以及GRU序列神经网络预处理
2、将每一个预处理后的r向量分别与u向量进行match相似计算
3、将结果进行CNN处理 (提取特征并缩小矩阵)
4、再通过一个GRU网络处理,这层GRU是上下相连的,即考虑了上下文处理
5、经过最后的输出层给出一个分数
分数最高的是我们r是我们返回给用户的答复
总结
基于检索的bot核心思想是从语料库中寻找最适合的匹配回答,那么bot的效果就会被相似计算的特征设计以及语料库的丰富度影响
基于生成的chatbot
生成模型在深度学习领域应用广泛,在自然语言方面应用最为成功的就是机器翻译;像之前介绍序列模型时还有一些诗歌与音乐的创作也属于这类模型的应用。
对于闲聊bot来讲,模型更像是类似机器翻译的 编码-解码 的生成模式,输入一个语句,最后模型返回另一个语句
模型左侧是编码器、右侧是解码器;
理解的话,可以认为是编码器将语句特征提炼出来给解码器,然后解码器以该特征作为条件限制去按照训练过的参数去生成另一个语句。比如机器翻译就可以理解为某个语义从一个语言到另一个语言的映射。
考虑上下文
对于聊天机器人来讲,不仅需要单次对话看起来不错,还需要在多轮对话中也有好的表现(不要前面提过的后面又忘了),毕竟这个场景用户一定是进行多轮对话
图中可以看到模型通过一条绿色线context-RNN将encoder-decoder模型串了起来
也就是说每一次模型编码都会考虑前序编码结果。这样每次解码生成的语句就已经考虑了上下文的信息
考虑情感化
聊天场景除了对话流通顺,还需要给用户提供惊喜,来自于情感的惊喜。有了情感化的chatbot才更像一个聊天的人而不是bot。这是提高用户感受的重要因素
绿框中的Z节点就是模型对情感化的考虑
通过将contextRNN的h作为输入,进行情感分类处理,输出结果同h一同作为输入进入解码器。相当于解码器是在标记条件Z下进行生成,从而使得生成语句附带情感属性
这是一篇论文中加入情感因素后的实例,可以看到机器人在不同情感下的回复,有点意思但是距离人类还有距离。这里的情感分类有6种,准确率确实会低,大概60%多一点。如果是三元情感分类(积极-消极-中性)准确率可能就90%左右(之前的数据,现在应该会高)。越丰富复杂的情感,机器就越难以捕捉,但足够有趣,做好情感化是chatbot一个发展方向。
情感分析应用
上文中加入情感因素的语句生成虽然效果不那么好,但是如果只是情感分类,感知还是很明显的。比如已经落地的Emoji,在社交网络中用户打字后系统给予表情推荐用以代替语言。印象中微信与搜狗很早已经有做这个了,不过感觉应该是简单的单词匹配,没有涉及情感,但是使用体验不错。还有我大天朝的表情包就是个大场景
考虑知识/主题
基于生成的chatbot效果不佳有一个很重要的原因是,人类语言很多信息都是隐藏在语言背后的,就拿人来讲,4岁孩子和成年人对话中,成年人也会觉着聊来聊去就那些,小孩子懂太少,说太多听不懂;所以通过知识/主题(先验知识)对bot的response生成进行信息增添可能会有效果。
加入知识
聊天过程涉及的范围很广,用户可能会询问那部电影、哪个地方、天气等具有一定目的性的问题,我们完全可以像任务型对话一样,通过查询数据库、通过槽位追问得到信息来作为条件限制解码器的输出
主题限制
通过主题限制语句生成达到较好的效果,下面是小冰的一个应用
仍然是在encoder-decoder 基础上,应用了topic model,即对用户的消息进行了主题分类,
每个主题下本身就是一个词频的概率分布,知道是哪个主题后,将前面的高频词汇抓出来转化为向量。再将其引入注意力模型中,结和传统的注意力模型相加起来作为输入进入解码器,使得解码器的内容在主题范围内。
相似的方式还有好几个,但是本质上都是通过加入先验知识(主题、知识库、上下文、情感)对解码器进行输出优化。基础的架构都是编码-解码模型
加入强化学习DM
上述基于生成的语句通常加了很多先验知识,但是还是可能呈现飘忽不定的现象。因为对话缺乏灵魂,chat场景与task一样需要策略管理系统。
不同之处在于task的策略学习比较容易定义,任务对话填写槽位时给予reward,每次actor都会有相对明确的reward。
而在chat场景,对话没有明确的目标,定义reward比较麻烦,reward是滞后的。可能需要在用户获得满意结果时给予一个很大的reward,不满意的时候各一个很大的惩罚。距离用户满意所耗费的轮数会给一个小的惩罚等等。
强化学习东西挺多,挖坑放着
结语
感觉chatbot机器人确实落地问题挺大的,但这也是预期肯定会存在的,毕竟如果聊天都跟真人似的,就距离强人工智能不远了~~
比较靠谱的还是检索类的chatbot,完全可以应用在客服场景。另外感觉在一些垂直细分场景(情感咨询、教育)做是否会更好,毕竟领域窄了,语料可以构建得更好,提高稳定性;前一阵子看到国外有一个chatbot机器人用来和用户聊深度学习的知识,所以说窄领域可能会有一定的惊喜。https://www.lilabot.com/
(笔者正寻求NLP、人机对话方向产品职位 微信:cheng390552021)