- 什么是有效负载?如何控制您的库卡机器人?
- KUKA库卡机械手KR360维修保养技巧分享
- 维修保养|库卡KUKA机器人KR 210维修保养经验丰富
- 库卡KUKA机器人维修保养小手册
- 维修保养|KUKA库卡机器人维修保养干货知识
让机器人替你聊天,还不被人看出破绽!如何训练一个克隆版的你?
让机器人替你聊天,还不被人看出破绽!如何训练一个克隆版的你?
聊天机器人到底是什么呢?说白了,就是计算机程序通过听觉或文本方法进行对话。
当今最流行的四个对话机器人是:苹果的Siri、微软Cortana、谷歌助理、亚马逊的Alexa。他们能够帮你查比分、打电话,当然,偶尔他们也会出错。
本文,我们主要会详细介绍聊天机器人在文本方面的运作。
在这篇文章中,我们将看到如何使用深度学习模型训练聊天机器人用我们所希望的方式在社交媒体上进行对话。
意图&深度学习
如何训练一个高水平的聊天机器人呢?
高水平的工作聊天机器人是应当对任何给定的消息给予最佳反馈。这种最好的反应应该满足以下要求:
回答对方问题
反馈相关信息
问后续问题或用现实方法继续对话
这三个方面是机器人表现出来的内容,而隐含其中没有表现出来的则是一系列流程:理解发送者的意图,确定反馈信息的类型(问一个后续问题,或者直接反应等),并遵循正确的语法和词法规则。
请注意,意图二字至关重要。只有明确意图,才能保证在后续流程的顺利进行。对于意图,读者通过本篇文章,将会看到,深度学习是最有效的解决意图问题的方法之一。
深度学习的方法
聊天机器人使用的深度学习模型几乎都是Seq2Seq。2014年,IlyaSutskever,OriolVinyals,andQuocLe发表了《SequencetoSequenceLearningwithNeuralNetworks》一文。摘要显示,尽管机器翻译已经做的很好,但Seq2Seq却模型能更好的完成各种各样的NLP的任务。
Seq2Seq模型由两个主要部件组成,一个是编码器RNN,另一个是解码器RNN。从高层次上来说,编码器的工作是将输入文本信息生成固定的表示。解码器则是接收这个表示,并生成一个可变长度的文本,以响应它。
让我们来看看它是如何在更详细的层次上工作的。
正如我们所熟知的,编码器RNN包含了许多隐藏的状态向量,它们每个都表示从上一次时间步骤中获取的信息。例如,在第3步序中的隐藏状态向量是前三个单词的函数。通过这个逻辑,编码器RNN的最终隐藏状态向量可以被认为是对整个输入文本的一种相当精确的表示。
而解码器RNN负责接收编码器的最后隐藏状态向量,并使用它来预测输出应答的单词。让我们看看第一个单元。该单元的工作是使用向量表示v,并决定其词汇表中哪个单词是最适合输出响应的。从数学上讲,这就意味着我们计算词汇中的每一个单词的概率,并选择值的极大似然。
第二单元是向量表示v的函数,也是先前单元的输出。LSTM的目标是估计以下条件概率。
让我们来解构这个方程式意味着什么。
左侧指的是输出序列的概率,这取决于给定输入序列。
右侧包含p(yt|v,y1,,yt),它是所有单词的概率向量,条件是在前一步的向量表示和输出的情况下。其中pi等价于西格玛(或累计求和)的乘法。则右侧可降为p(Y1|V)*p(y2|v,y1)*p(Y3|v,y1,y2)
在继续之前,让我们先做一个简单的例子。
让我们在第一张图片中输入文本:你明天有空吗?
大多数人都会怎么回答呢?一般都会用yes、yeah、no开始。
在我们完成了网络训练之后,概率p(Y1|V)将是一个类似于下面的分布。
再来看我们需要计算的第二个概率,p(y2|v,y1)表是一个函数,词的分布y1以及向量的表示结果v,而pi将产生最终结果并作为我们的最终反应。
Seq2Seq模型的最重要特性之一是它提供的多功能性。当你想到传统的ML方法(线性回归,库卡机器人驱动器维修,支持向量机)和深等深学习方法时,这些模型需要一个固定的大小输入,并产生固定大小的输出。
但是输入的长度必须事先知道。这是对诸如机器翻译、语音识别和问答等任务的一个很大的限制。这些任务我们都不知道输入短语的大小,我们也希望能够生成可变长度响应,而不仅仅局限于一个特定的输出表示。而Seq2Seq模型允许这样的灵活性!
自2014以来,Seq2Seq模型已经有了很多改进,你可以在这篇文章结尾相关论文部分中阅读更多关于Seq2Seq的文章。
数据集的选择
在考虑将机器学习应用于任何类型的任务时,我们需要做的第一件事都是选择数据集,并对我们需要的模型进行训练。对于序列模型,我们需要大量的会话日志。从高层次上讲,这个编码器-解码器网络需要能够正确理解每个查询(编码器输入)所期望的响应类型(解码器输出)。
一些常见的数据集包括:康奈尔电影对话语料库、ubuntu语料库和微软的社交媒体对话语料库。
虽然大多数人都在训练聊天机器人来回答具体信息或提供某种服务,但我更感兴趣的是更多的有趣的应用程序。有了这篇文章,我想看看我是否可以用我自己的生活中的对话日志来训练一个Seq2Seq的模型来学习对信息的反应。
获取数据
我们需要创建一个大量的对话数据,在我的社交媒体上,我使用了Facebook、GoogleHangouts、SMS、Linkedin、Twitter、Tinder和Slack等着与人们保持联系。
Facebook:这是大部分培训数据的来源。facebook有一个很酷的功能,让你可以下载你所有的Facebook数据。包含所有的信息、照片、历史信息。
Hangouts:您可以根据这个文章的指示来提取聊天数据
SMS:可以快速获得所有之前的聊天记录(sms备份+是一个不错的应用程序),但我很少使用短信。
Linkedin:Linkedin确实提供了一种工具,可以在这里获取数据的归档。
Twitter:这其中没有足够的私人信息。
Tinder:这其中的对话不是数据集。
Slack:我的Slack刚刚开始使用,只有几个私有消息,库卡机器人,计划手动复制。
创建数据集
数据集的创建是机器学习的一个重要组成部分,它涉及到数据集预处理。这些源数据存档格式不同,并且包含我们不需要的部分(例如,fb数据的图片部分)。
正如您所看到的,Hangouts数据的格式与facebook数据有一点不同,而linkedin的消息以csv格式进行。我们的目标是使用所有这些数据集来创建一个统一的文件,命名为(FRIENDS_MESSAGE,YOUR_RESPONSE)
为了做到这一点,我编写了一个python脚本,可以在这里查看。
此脚本将创建两个不同的文件。其中一个是Numpy对象(conversationDictionary.npy)包含所有输入输出对。另一个是一个大的txt文件(conversationData.txt)包含这些输入输出对的句子形式,一个对应一个。通常,我喜欢共享数据集,但是对于这个特定的数据集,我会保持私有,因为它有大量的私人对话。这是最后一个数据集的快照。
词向量
LOL,WTF,这些都是在我们的会话数据文件中经常出现的所有单词。虽然它们在社交媒体领域很常见,但它们并不是在很多传统的数据集中。通常情况下,我在接近NLP任务时的第一个直觉是简单地使用预先训练的向量,因为它们能在大型主体上进行大量迭代的训练。
然而,由于我们有这么多的单词和缩写,而不是在典型的预先训练的单词向量列表中,因此,生成我们自己的单词向量对于确保单词正确表达是至关重要的。