自己动手写个聊天机器人吧

学习来源于Sirajology的视频 Build a Chatbot

昨天写LSTM的时候提到了聊天机器人,今天放松一下,来看看chatrobot是如何实现的。

前天和一个小伙伴聊,如果一个机器人知道在它通过图灵测试后可能会被限制,那它假装自己不能通过然后逃过一劫,从此过上自由的生活会怎样。

Retrieval based model

以前很多聊天机器人是以 Retrieval based model 模型来进行对话的,这个模型就是程序员事先写好一些回答,然后机器人在接收到一个问题的时候,就去搜索并选择相关的答案。

Machine Learning Classfier

最近,大家开始使用机器学习的分类器,例如 Facebook 的 chatbot API。

你可以提前设定一些问题和答案,然后系统会把词语进行分类,进一步来识别出用户的意图,这样你在问两句不一样的话时,机器人可以识别出它们的意图是一样的。

Generative Model

最难的就是在没有预先设定问答数据时就能自动生成答案的机器人,下面这篇Google的论文就是研究这样的机器人的。

他们在两个数据集上训练一个神经网络模型,一个是电影对话,一个是IT support对话记录,这样就有日常对话和专业领域知识了。

这个模型不需要写很多代码,但是需要很多数据。

结果是还不错:

接下来要用 Torch 和 Lua 重建一下论文里的 Neural Network 模型。

第一步,输入数据,定义变量

-- Data
print("-- Loading dataset")
dataset = neuralconvo.DataSet(neuralconvo.CornellMovieDialogs("data/cornell_movie_dialogs"),
                    {
                      loadFirst = options.dataset,              -- 定义要用多少数据
                      minWordFreq = options.minWordFreq         -- 想要保持在词汇表里的单词的最小频率
                    })

第二步,建模

-- Model
-- options.hiddenSize:隐藏层数
-- dataset.wordsCount: 数据集的词数
model = neuralconvo.Seq2Seq(dataset.wordsCount, options.hiddenSize)
model.goToken = dataset.goToken
model.eosToken = dataset.eosToken

这里用到的模型是 seq2seq,它包含两个 LSTM 递归神经网络,第一个是 encoder 负责处理 input,第二个是 decoder 负责生成 output。

为什么要用 seq2seq?

DNN需要 inputs 和 outputs 的维度是固定的,而我们接收的是一句话,输出的也是一句话,都是一串单词。

所以需要一个模型可以保持一定长度的记忆。

LSTM 可以将可变长度的inputs转化为固定维度的向量表达。所以在给了足够多的数据后,模型可以将两个相似的问题识别成同一个 thought vector 表达出来。在学习模型之后,不仅可以得到权重,还有 thought vectors。

第三步,加一些 hyperparameters

要用到 NLL Criterion ,NLL 就是 Negative Log Likelihood,可以改进句子的预测。

-- Training parameters
model.criterion = nn.SequencerCriterion(nn.ClassNLLCriterion())    -- 改进句子的预测
model.learningRate = options.learningRate
model.momentum = options.momentum
local decayFactor = (options.minLR - options.learningRate) / options.saturateEpoch    -- 改进 learning rate
local minMeanError = nil      -- 改进 learning rate

接下来就是用 Backpropagation 来训练模型:

-- Enabled CUDA
if options.cuda then
  require ‘cutorch‘
  require ‘cunn‘
  model:cuda()
elseif options.opencl then
  require ‘cltorch‘
  require ‘clnn‘
  model:cl()
end

训练的目标是让error越来越小,每个例子有一个输入句子和一个目标句子。

local err = model:train(input, target)

最后把好的model存下来。

-- Save the model if it improved.

if minMeanError == nil or errors:mean() < minMeanError then

print("\n(Saving model ...)")

torch.save("data/model.t7", model)

minMeanError = errors:mean()

end

model.learningRate = model.learningRate + decayFactor

model.learningRate = math.max(options.minLR, model.learningRate)

end

现在可以去 AWS 训练你的机器人了,投入的数据越多,聊得越开心。



其他资料:

The code for this video is here

Here’s the Neural Conversational Model paper

check out the machine-generated support conversations, they’re mind-blowingly good

You should train this baby in the cloud using AWS. See ML for Hackers #4 for a tutorial on how to use AWS

Some great info on LSTM architecture

Link to Facebook’s Chatbot API if you’re curious

时间: 2024-08-03 21:36:08

自己动手写个聊天机器人吧的相关文章

自己动手开发智能聊天机器人完全指南(附完整源码)

一.前言 本文是<自己动手开发智能聊天机器人完全指南(附完整源码)>的第二篇,也是21天实战人工智能系列<知识图谱完全项目案例剖析>里面的知识图谱应用的案例.前文中实现了一个最基本的人工智能聊天机器人,其能力完全等同于刚出生的婴儿,还谈不上智能,只是初步具备了人工智能问聊天器人的雏形.从读者的反馈中,发现大家对于当前智能连天机器人的技术发展还不太了解.针对这部分问题,我们后续会有专题探讨,人工智能聊天机器人的主要实现技术,和当前主流的实现方法. 今天要讲的内容则是,如何给你的智能聊

用 TensorFlow 做个聊天机器人

上一次提到了不错的学习聊天机器人的资源,不知道小伙伴们有没有去学习呢. 自己动手做聊天机器人教程 我最近每天都会学一点,拿出解读来和大家分享一下. 本文结构: 聊天机器人的架构简图 用 TensorFlow 实现 Chatbot 的模型 如何准备 chatbot 的训练数据 Chatbot 源码解读 1. 聊天机器人的架构简图 学习资源: [自己动手做聊天机器人 九-聊天机器人应该怎么做] (http://www.shareditor.com/blogshow/?blogId=73) 聊天机器人

自己动手做个微信聊天机器人

长夜慢慢无人聊天, 自己动手做个微信聊天机器人陪自己. 智力太低, 还是让他调戏别人吧. 看了上面的动画图片是不是有人好奇程序是怎么实现的? 解决方案其实很简单: 1. 通过微信的web接口可以实现自动回复.登录.发图片.自动加好友等等的功能, 你可以通过wx.qq.com调试得到接口,当然也可以通过baidu搜索到别人已经弄到的api. 我这里主要用到了登录.扫马登陆.同步联系人.同步消息接口.掉线自动重连.获取图片.获取头像.获取微信群成员.发送图片.发送表情.发送mp3. 撤回消息.发送文

基于torch学汪峰写歌词、聊天机器人、图像着色/生成、看图说话、生成字幕

手把手教你基于torch玩转 学汪峰写词.自动聊天机器人.图像着色.图像生成.看图说话.生成字幕 作者:骁哲.李伟.小蔡.July.说明:本教程出自七月在线开发/市场团队.及七月在线5月深度学习班学员之手,有何问题欢迎加Q群交流:472899334.时间:二零一六年十月十二日. 前言 我们教梵高作画的教程发布之后,国庆7天,上百位朋友一一陆续动手尝试,大有全民DL.全民实验之感.特别是来自DL班的小蔡同学,国庆7天连做10个开源实验,并把这10个实验的简易教程(含自动聊天机器人)发布在社区上:h

自己动手做聊天机器人教程

自己动手做聊天机器人 一-涉及知识(2016-06-09) 自己动手做聊天机器人 二-初识NLTK库(2016-06-10) 自己动手做聊天机器人 三-语料与词汇资源(2016-06-12) 自己动手做聊天机器人 四-何须动手?完全自动化对语料做词性标注(2016-06-17) 自己动手做聊天机器人 五-自然语言处理中的文本分类(2016-06-21) 自己动手做聊天机器人 六-教你怎么从一句话里提取出十句话的信息(2016-06-22) 自己动手做聊天机器人 七-文法分析还是基于特征好啊(20

【自己动手写神经网络】小白入门连载(二)--机器人时代必须得有人工神经(不是神经病)

[自己动手写神经网络]小白入门连载(一) 在上一章中,我们已经介绍了神经网络的基本概念.思想,并提及了有关人工神经元模型的部分内容.在本章中,将对人工神经元模型做更多的介绍. 图2.1 多输入生物神经元示意图 在上一章中提到了一个简单的神经元模型,并且该模型只有一个输入p.这意味着只能有一个额外的神经元与之相连接,这显然是不够的.因此,一个实用的神经元必须是可以接受多个输入的,如图2.1所示,神经元拥有3个输入p1.p2和p3.其中,w和b是根据网络情况不断进行调整的,而传入函数s和传输函数f是

自己动手做聊天机器人 一-涉及知识【转】

转自:http://www.shareditor.com/blogshow/?blogId=63 人工智能一直以来是人类的梦想,造一台可以为你做一切事情并且有情感的机器人,像哆啦A梦一样,现在这已经不是一个梦了:iPhone里会说话的siri.会下棋的阿法狗.小度机器人.大白......,他们都能够具有智能,和人类交互,帮人类解决问题,这听起来非常神奇,实际上我们自己也可以做一个这样的机器人,从今天开始分享我将我学习和制作的过程 智能机器人可以做到的事情可以很复杂:文字.语音.视频识别与合成:自

【自己动手写神经网络】小白入门连载(二):机器人时代必须得有人工神经(不是神经病)

[自己动手写神经网络]小白入门连载(一) 在上一章中,我们已经介绍了神经网络的基本概念.思想,并提及了有关人工神经元模型的部分内容.在本章中,将对人工神经元模型做更多的介绍. 图2.1 多输入生物神经元示意图 在上一章中提到了一个简单的神经元模型,并且该模型只有一个输入p.这意味着只能有一个额外的神经元与之相连接,这显然是不够的.因此,一个实用的神经元必须是可以接受多个输入的,如图2.1所示,神经元拥有3个输入p1.p2和p3.其中,w和b是根据网络情况不断进行调整的,而传入函数s和传输函数f是

基于Perfect用Swift语言编写Slack聊天机器人

基于Perfect用Swift语言编写Slack聊天机器人 本项目是专门为Slack聊天机器人定制的模板服务器. 完整的源代码下载在Github https://github.com/PerfectServers/SlackBot 在本项目模板中,一个聊天机器人可以加入授权频道,读取频道内所有用户发送的"曲奇"并记录在案,而且可以直接答复用户的有关曲奇饼干的问题. 预备知识 在您决定编译.测试或者部署您自己的基于Perfect软件框架体系的聊天机器人之前,以下基础知识??不可或缺??: