让机器人替你聊天,还不被人看出破绽!如何训练一个克隆版的你?
聊天机器人究竟是何方神圣呢?简而言之,它是一种能够通过听觉或文本与你我对话交流的计算机程序。
当今市场上,苹果的Siri、微软的Cortana、谷歌的助理以及亚马逊的Alexa等四大对话机器人备受瞩目。它们能为你查询比分、拨打电话,偶尔也会出现一些小失误。
本文将为你深入解读聊天机器人在文本对话方面的运作机制。
我们将探讨如何使用深度学习模型训练聊天机器人,使其在社交媒体上进行自然流畅的对话。
意图与深度学习
如何训练一个高水平的聊天机器人?关键在于让机器人对任何给定的消息都能给予最佳反馈。这种最佳反馈应满足以下要求:回答问题、反馈相关信息、以及通过后续问题或自然方式延续对话。这些表现背后隐藏着的是一系列流程,包括理解发送者的意图、确定反馈信息的类型(如提问或回应),以及遵循正确的语法和词法规则。值得注意的是,“意图”二字至关重要。深度学习是解决“意图”问题的有效方法之一。
深度学习的方法
聊天机器人使用的深度学习模型大多是Seq2Seq(序列到序列)模型。Seq2Seq模型由两个主要部件组成:一个编码器RNN(循环神经网络)和一个解码器RNN。编码器的工作是将输入文本信息生成固定表示,而解码器则接收这个表示,并生成可变长度的文本作为回应。
让我们详细了解Seq2Seq模型是如何运作的。编码器RNN包含许多隐藏的状态向量,每个向量都表示上一步骤的信息。例如,第三个隐藏状态向量是前三个单词的函数。编码器RNN的最终隐藏状态向量可以看作是对整个输入文本的一种精确表示。解码器RNN则负责接收编码器的最后隐藏状态向量,并预测应答的单词。
对于聊天机器人来说,Seq2Seq模型的一个重要特性是其多功能性。传统的机器学习模型通常需要固定大小的输入和输出,但对于机器翻译、语音识别和问答等任务来说,输入的大小是未知的。Seq2Seq模型允许我们克服这一限制,生成可变长度的响应。自2014年以来,Seq2Seq模型已经经历了许多改进。你可以在阅读本文结尾的“相关论文”部分时了解更多关于Seq2Seq的信息。数据集的选择与整理
当我们考虑将机器学习应用于各种任务时,首要的步骤就是数据集的选择和模型的训练。对于序列模型来说,会话日志的采集尤为关键。想象一下这个编码器-解码器网络,它像是一个沟通桥梁,需要理解查询的语境并给出相应的回应。
我们拥有许多经典的数据集,如康奈尔电影对话语料库、ubuntu语料库以及微软的社交媒体对话语料库等。它们为我们提供了丰富的对话场景。但今天,我想探索一条不同的路径,那就是使用我日常生活中的对话日志来训练一个Seq2Seq模型。
数据的获取
数据的获取是充满挑战且充满乐趣的过程。我的社交圈涉及Facebook、Google Hangouts、SMS、Linkedin、Twitter、Tinder和Slack等多个平台。每一个平台都有其独特的数据获取方式。
Facebook,作为我主要的社交平台,为我提供了大量的数据。Hangouts也是一个重要的数据来源,通过遵循特定的指南,我们可以轻松地提取出对话数据。对于SMS,虽然我不常使用,但也有工具帮助我获取之前的聊天记录。Linkedin也为我们提供了获取数据归档的途径。Twitter中的私人信息较少,而Tinder上的对话并不适合作为数据集。Slack上虽然我有一些私人消息,但数量有限。
数据集的创建与预处理
数据的预处理是机器学习旅程中不可或缺的一环。不同的数据源有其独特的格式和复杂的内容。我们的目标是将所有这些数据整合到一个统一的格式中,例如(FRIENDS_MESSAGE,YOUR_RESPONSE)。
为此,我已经编写了一个Python脚本。这个脚本会生成两个文件:一个是Numpy对象,包含所有的输入和输出对;另一个是大的txt文件,以句子为单位,一一对应地展示这些对话内容。尽管我喜欢分享数据集,但这个特定的数据集包含许多私人对话,因此我会保持私有。
词向量的生成
在社交媒体对话中,缩写和俚语经常出现,如“LOL”和“WTF”。这些词汇在传统的数据集中并不常见。虽然预先训练的词向量在许多任务中表现良好,但为了确保我们的词汇得到正确的表达,生成我们自己的词向量至关重要。
为了生成这些词向量,我们采用了word2vec模型的经典方法。通过观察单词在句子中的上下文,模型会创建词向量。在向量空间中,具有相似上下文的单词会被紧密地放置在一起。关于如何创建和训练word2vec模型的详细步骤,我推荐阅读Varma罗汉的博客。不过需要注意的是,我后来了解到TensorFlow的Seq2Seq可以直接对单词进行训练生成embeddings,因此我决定不使用预先生成的词向量。
TensorFlow与Seq2Seq模型的构建
完成数据集的创建和词向量的生成后,我们就可以开始构建Seq2Seq模型了。我使用Python脚本完成了模型的创建和训练。整个过程的核心是TensorFlow的嵌入_RNN_seq2seq()函数。关于这个函数的具体使用,你可以查阅相关文档。
训练的追踪与反馈
你会发现响应主要以空白为主,这是由于网络重复输出填充和eos口令造成的。这一现象很正常,因为填充口令在整个数据集中是最常见的口令。接着,你会看到网络开始输出每一个输入字符串都带有“哈哈”的响应。这看似直观,因为“哈哈”是一个通用且广泛接受的反应,无论面对何种情况,都可以使用。慢慢地,你会看到更完整的思想和语法结构出现在响应中。一旦我们拥有一个经过适当训练的Seq2Seq模型,我们就可以着手建立类似于Facebook Messenger的聊天机器人。
建立简单的FB Messenger聊天机器人并非难事。实际上,我仅花了不到30分钟就完成了所有步骤。我们的基本思路是,使用一个简单的Express应用程序来建立服务器,并在Heroku上安装它,然后设置一个Facebook页面连接。最终,你将拥有一个类似这样的Facebook聊天应用程序。
你可以向聊天机器人发送消息,它将会作出响应。接下来,我们将部署一个训练有素的TensorFlow模型,将一切整合在一起。由于目前尚未找到TensorFlow和Node之间的官方支持包装器,我决定使用Slack服务器来部署我的模型,并让聊天机器人与之交互。你可以查看Slack服务器代码以及聊天机器人的index.js文件来了解更多细节。
如果你想要与这个机器人聊天,可以点击相关链接进行测试。初次响应可能需要一些时间,因为服务器需要启动。尽管机器人的回应可能难以判断其是否真的如我所说那样说话(因为没有太多人与之交谈),但从社交媒体标准来看,其语法是可以接受的。你可以选择一些好的结果,但大多数都相当有趣。这甚至可以帮助我在晚上睡得更好。
让我特别感兴趣的是,“juju green”似乎与Juju Smith-Schuster(钢人队宽接收器)和Draymond Green(金州勇士前锋)有关。这是一个有趣的组合。虽然现在的表现还不够完美,但我们可以考虑一些改进方法。
从与chatbot的交互中可以看到许多改进空间。经过几条信息后,你会发现它并不能很好地将思想联系在一起,一些反应似乎是随机的和不连贯的。为了提高我们聊天机器人的性能,有以下几种方法可以尝试:
1. 合并其他数据集以帮助网络从更大的会话语料库中学习。这将消除聊天机器人的“个性化”,使其更加通用。我相信这将有助于产生更真实的对话。
2. 处理编码器与解码器之间的消息关联问题。例如,当对话结束时,可能在第二天开始一个新的对话时话题完全无关。这会影响模型的训练。
3. 使用双向LSTM、注意力机制和套接字等技术来提高模型的性能。
4. 优化超参数,如LSTM单元数量、LSTM层数、优化器选择、训练迭代次数等。
如果你一直在关注这个过程,你应该对创建聊天机器人所需步骤有一个大致的概念。让我们再次回顾一下流程:从社交媒体网站获取对话数据,使用脚本提取(消息、响应)对;为对话中出现的每个单词生成单词向量(可选);在Seq2Seq模型中创建、训练和保存序列;创建Facebook聊天机器人;创建一个Flask服务器来部署保存的Seq2Seq模型;编辑索引文件并与Flask服务器通信。详细的步骤可以在GitHub repo中找到。
机器人培训
- 达芬奇机器人献爱心 将主刀公益手术
- 亚马逊将在英国招聘2000多人 重点开发Alexa和无人
- 美、德、英、日、中5国机器人发展全景大盘点
- 国产机器人窗口期 不可错失制造2025弯道超车机会
- 一个小时,这只机械狗“自学”会了走路!
- 三穗长吉镇:无人机飞防作业 稳粮增豆保丰收
- 依靠静电着陆的新型机器人
- 工业机器人推广应用座谈会
- 在苹果的智能机器人软件公司是一种怎样的体验
- 四大家族之KUKA工业机器人应用案例分析
- 万事俱备只欠东风?机器人产业的东风到底在哪
- 欧洲 6 轮送货机器人开始在美国大学推广
- 芜湖:考核第一!6项冠军!
- 人工智能有望打破医疗资源不均衡
- 立讯精密:已进军新能源汽车市场,目标成为全
- 90后用机器人炒菜周入10万,炒菜机器人真的有可