登录
首页精彩阅读使用机器学习算法来构建智能聊天机器人
使用机器学习算法来构建智能聊天机器人
2019-07-15
收藏
使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

翻译 | CDA数据分析研究院,转载需授权

原文 | https://blog.statsbot.co/chatbots-machine-learning-e83698b1a91e

你是否曾与苹果的Siri,亚马逊的Alexa,微软的Cortana或其他助手交谈以设置闹钟、给朋友打电话或安排会议?许多人可能会说对的我的确这么做过,尽管会话助手在常见和日常任务中都很有用,但很难迫使会话助手就一般性的,有时是哲学性质的话题进行讨论。

Statsbot团队邀请了数据科学家,dmitry Persiyanov,来解释如何用神经会话模型修复这个问题,以及如何使用机器学习来创建聊天机器人。

通过自然语言与机器交互是通用人工智能的要求之一。人工智能的这一领域被称为对话系统,语音对话系统或聊天机器人。机器需要为你提供信息丰富的答案,维持对话的上下文,并且难以与人类(理想情况下)区分。

在实践中,最后一项要求尚未达到,但幸运的是,如果机器人有用,并且是一个有趣的沟通者,可以进行一些有趣的沟通,那么人类就准备好与他们进行对话了。

对话系统目前有两种主要类型:面向目标(Siri,Alexa,Cortana等)和一般会话(Microsoft Tay bot)。

前者帮助人们使用自然语言解决日常问题,而后者尝试与人们进行范围广泛的对话。

在这篇文章中,我将给出一个基于深度神经网络的一般会话对话系统进行比较概述。我将描述主要的架构类型和推进它们的方法。

我希望这篇文章最终能成为每个想要用机器学习创建聊天机器人的人的切入点。如果你读完这篇文章直到最后,你就可以训练自己的会话模型了。

准备好了么?

让我们开始吧!

我将参考循环神经网络和单词嵌入,所以你应该知道它们是如何工作的,以便轻松地理解这篇文章。


生成和选择模型

一般会话模型可以简单地分为两种主要类型 - 生成模型和选择性(或排名)模型。此外,混合模型也是可能的。但常见的是,这些模型构思了对话语境的几个句子并预测了这种语境的答案。在下图中,你可以看到此类系统的说明。

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

在这篇文章中,当我说“网络使用单词序列”或“单词被传递给RNN”时,我的意思是单词嵌入被传递到网络,而不是单词ID。


关于对话数据表示的注释

在深入讨论之前,我们应该讨论一下对话数据集是什么样的。下面描述的所有模型都是成对训练(上下文,回复)。上下文是在回复之前的几个句子(可能是一个)。 这个句子只是它的词汇表中的一系列标记。

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

为了更好地理解,请查看表格。从两个人之间的原始对话中提取了三个样本:

- 嗨! - 嗨,你好。 - 你几岁? - 二十二。你呢? - 我也是!哇!

请注意批处理中每个句子末尾的“ ”(序列结尾标记。这个特殊标记有助于神经网络理解句子的边界并明智地更新其内部状态。

某些模型可能会使用来自数据的附加元信息,例如说话者的ID,性别,情感等。

现在,我们准备继续讨论生成模型。


生成模型

我们从最简单的会话模型开始,“ 神经对话模型”。

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

为了对对话进行建模,本文采用了一个序列到序列(seq2seq)框架,该框架出现在神经机器翻译领域,并成功地适应了对话问题。该体系结构由两个具有不同参数集的RNN组成。左边的一个(对应于ABC标记)称为编码器, 而右边的一个(对应于 -WXYZ标记)称为解码器

编码器如何工作的?

编码器RNN每次构造一个上下文的标记序列,并更新它的隐藏状态。在处理整个上下文序列之后,它产生一个最终隐藏的状态,这个隐藏状态结合了上下文的意义并用于生成答案。

解码器如何工作?

解码器的目标是从编码器获取上下文表示并生成一个答案。为此目的,在解码器RNN中维护词汇上的softmax层。在每个时间步长中,该层采用解码器隐藏状态并输出其词汇表中所有单词的概率分布。

以下是生成回复的工作原理:

  1. 使用最终编码器隐藏状态(h_0)初始化解码器隐藏状态。
  2. 传递标记作为解码器的第一个输入并更新隐藏状态(h_1)
  3. 从softmax层(使用h1)采样(或以最大概率取一个)第一个字(w1)。
  4. 将此单词作为输入传递,更新隐藏状态(h1 - > h2)并生成新单词(w_2)。
  5. 重复步骤4,直到生成标记或超出最大答案长度。
使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

解码器中生成回复,适用于那些喜欢公式而不是单词的人。这里,w_t是时间步长t上采样的单词; θ是解码器参数,phi是密集层参数,g表示密集层,p-hat是时间步长t词汇表的概率分布。

在生成回复时使用argmax,当使用相同的上下文时,总是会得到相同的答案(argmax是确定性的,而采样是随机的)。

我上面描述的过程只是模型推理部分,但也有模型训练部分,它以稍微不同的方式进行工作 - 在每个解码步骤,我们使用正确的单词y_t而不是生成的单词(w_t)作为输入。换句话说,在训练时,解码器使用正确的回复序列,但删除了最后一个标记并且标记被预先添加。

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

解码器推断阶段的说明。前一时间步长的输出作为当前时间步长的输入。

目标是在每个时间步长上最大化限度的提高下一个正确的单词的概率。更简单地说,我们要求网络通过为序列提供正确的前缀来预测序列中的下一个单词。通过最大似然训练进行训练,这导致经典的交叉熵损失:

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

这里,y_t是在时间步骤t的回复中的正确答案。


生成模型的修改

现在我们对序列到序列框架有了基本的了解。我们如何为这些模型添加更多泛化能力?有很多方法:

  1. 向编码器或/和解码器RNN 添加更多层
  2. 使用双向编码器。由于解码器的正向生成结构,使得解码器无法实现双向传输。
  3. 试验嵌入。你可以预先初始化单词嵌入,也可以与模型一起从头开始学习它们。
  4. 使用更高级的回复生成过程 - beamsearch。我的想法是不“贪婪地”生成答案(通过将argmax用于下一个单词),但考虑更长链词的概率并在其中进行选择。
  5. 使你的编码器或/和解码器卷积的。Convnet可能比RNN更快地工作,因为它们可以有效地并行化。
  6. 使用注意机制。注意机制最初是在神经机器翻译论文中引入的,并且已经成为一种非常流行且强大的技术。
  7. 在每次执行步骤时,将最终编码器状态传递给解码器。解码器仅查看最终编码器状态一次,然后可能会忘记它。一个好的主意是将其与单词嵌入一起传递给解码器。
  8. 不同编码器/解码器状态大小。我上面描述的模型要求编码器和解码器具有相同的隐藏状态大小(因为我们用最终编码器的状态初始化解码器状态)。你可以通过从编码器最终状态向初始解码器状态添加投影(密集)层来消除此要求。
  9. 使用字符而不是单词或字节对编码来构建词汇表。字符级模型是值得考虑的,因为它们的词汇量较小,并且可以理解词汇中没有的单词,因此它们的工作速度更快。字节对编码(BPE)是两全其美的。我们的想法是在序列中找到最常见的指标对,并将它们合并为一个指标。

生成模型的问题

稍后,我将为你提供流行实现的链接,以便你可以训练自己的对话模型。但现在我想告诉你一些你将面对的生成模型的常见问题。

通用回复

通过极大似然训练的生成模型倾向于预测一般回复的高概率,例如“好”,“否”,“是”和“我不知道”的广泛情境。

回复不一致/如何合并元数据

seq2seq模型的第二个主要问题是它们可以为释义的上下文生成不一致的回复,但具有相同的意义:

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

最常被引用的与之相关的工作是“ 基于角色的神经对话模型”。作者为每个话语使用说话者的ID来产生答案,这不仅取决于编码器状态,还取决于说话者的嵌入。扬声器嵌入与模型一起从头开始学习。

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

使用这个想法,你可以使用你拥有的不同元数据来扩充你的模型。例如,如果你知道说话的时态(过去/现在/将来),你可以在推理时以不同的时态生成回复!你可以调整回复者的性格(性别,年龄,情绪)或回复属性(时态,情绪,问题/非问题等),同时你有这些数据来训练模型。


为了你的练习

下面是一些不同框架中的seq2seq模型,如果你可以打开的话,可以看一下,都是一些外网的模型数据之类的。

TensorFlow

  • 谷歌官方的实现
  • 另外两个实现,你可能会觉得使用PyTorch更舒服(seq2seq用于翻译,但你可以使用相同的代码进行对话)
  • 使用seq2seq进行翻译(你可以使用相同的代码但是使用对话的数据)
  • 来自IBM的实现

Keras

  • 流行的实现方法和良好的API

论文和指南

  • 关于序列到序列聊天机器人的教程
  • 注意机制 - Bahdanau的注意 - Luong的注意 - 使用多头注意+前馈网络机器翻译任务的最新技术。 - 关于RNN注意的教程
  • 字节对编码纸
  • ConvS2S论文

深入选择性模型

完成生成模型之后,让我们了解选择性神经对话模型的工作原理(它们通常被称为DSSM,代表深层语义相似性模型)。

选择模型不是估计概率p(回复|上下文; w),而是学习相似性函数 - sim(回复,上下文; w),其中回复是预定义的可能答案池中的元素之一(参见下图)。

直觉是网络将上下文和候选答案作为输入,并返回它们彼此之间的可信度。

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

选择性(或排名或dssm)网络由两个“塔”组成:第一个用于上下文,第二个用于响应。每座塔都可能拥有你想要的任何结构。塔取其输入并将其嵌入语义向量空间(图中的向量R和C)。然后,计算上下文和应答向量之间的相似性,即使用余弦相似度。

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

在推理时,我们可以计算给定上下文和所有可能答案之间的相似性,并选择具有最大相似性的答案。

为了训练模型,我们使用三重损失。Triplet loss在triplets上定义(context, replycorrect, replywrong),等于:

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

选择性模型的三重损失。它与SVM中的最大边际损失非常相似。

什么是replywrong?它也被称为“负面”样本(replycorrect称为“正面”样本),在最简单的情况下,它是来自答案池的随机回复。因此,通过最小化这种损失,我们以绝对值不提供信息的排序方式学习相似性函数。但请记住,在推理阶段,我们只需要比较所有回复的分数,并选择一个得分最高的。


选择模型中的抽样方案

你可能会问,我们为什么要从数据集中随机抽取样本?也许使用更复杂的抽样方案是个好主意?确实如此。如果你仔细观察,你可能会发现三元组的数量是O(n³),因此正确选择负数是很重要的,因为我们无法完成所有这些(大数据,你知道)。

例如,我们可以从池中抽取K个随机否定回复,对其进行评分,并选择最高得分的那个作为否定答案。这种方案被称为“硬负面”开采。如果你想深入挖掘,请阅读“ 深度嵌入学习中的采样事项 ”一文。


生成性与选择性:利弊

此时,我们已经了解了生成模型和选择模型的工作原理。但是你选择哪种类型?这完全取决于你的需求。下表是为了帮助你做出决定。

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人


最难的部分是评估

其中一个最重要的问题是如何评估神经对话模型。有许多自动指标用于评估聊天机器人与机器学习

  • 选择性模型的精确度/召回率/准确度
  • 生成模型的困惑/损失值
  • BLEU / METEOR从机器翻译得分

但是最近的一些研究)表明,所有这些指标都与人类对特定情境的答复适当性的判断密切相关。

例如,假设你有上下文“Statsbot是否破坏了我们处理数据的方式”?,然后回答“当然是这样”。但是你的模型会回答例如“这绝对是真的。”之类的话来回答上下文。上面显示的所有指标都会给出这样一个答案的低分,但我们可以看到这个答案与你的数据提供的一样好。

使用<a href='/map/jiqixuexi/' style='color:#000;font-size:inherit;'>机器学习</a>算法来构建智能聊天机器人

因此,目前最合适的方法是使用目标指标对模型进行人工评估,然后选择最佳模型。是的,这似乎是一个昂贵的过程(你需要使用像Amazon Mechanical Turk这样的东西来评估模型),但是目前我们没有更好的东西。无论如何,研究界都朝这个方向发展。


为什么我们不能在智能手机中看到它们?

最后,我们准备创建最强大,最智能的会话模型,通用的人工智能,对吧?如果是这样的话,拥有数千名研究人员的苹果,亚马逊和谷歌等公司已经将它们与个人助理产品一起部署。

尽管在这个领域做了很多工作,神经对话系统还没有准备好在开放领域与人交谈,并为他们提供信息/有趣/有用的答案。但至于封闭领域(例如技术支持或问答系统),有成功的案例。


总结

会话模型起初可能看起来很难掌握(而且不仅仅只有一开始)。当你准备练习时,选择一些简单的架构,从一个流行的数据集或者自己的数据集(Twitter,Reddit或其他)中选取一个,并在上面训练一个会话模型。

数据分析咨询请扫描二维码

客服在线
立即咨询