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

原创 2017年04月26日 11:04:07

学习来源于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

推荐阅读
历史技术博文链接汇总
也许可以找到你想要的

版权声明:本文为博主原创文章,未经博主允许不得转载。

用 TensorFlow 做个聊天机器人

上一次提到了不错的学习聊天机器人的资源,不知道小伙伴们有没有去学习呢。 自己动手做聊天机器人教程 我最近每天都会学一点,拿出解读来和大家分享一下。本文结构: 聊天机器人的架构简图 用 Tensor...
  • aliceyangxi1987
  • aliceyangxi1987
  • 2017年05月01日 11:49
  • 28496

一种相对完善的聊天机器人框架

目录1. 背景介绍2. 框架介绍3. 参考文献
  • qiang12qiang12
  • qiang12qiang12
  • 2016年11月12日 19:49
  • 1543

使聊天机器人具有个性

本文结构: 模型效果 模型的三个模块 模块细节 今天的论文是 《Assigning Personality/Identity to a Chatting Machine for Coherent Co...
  • aliceyangxi1987
  • aliceyangxi1987
  • 2017年07月18日 10:27
  • 2862

【原创】聊天机器人与自动问答技术

聊天机器人属于自动问答(Question Answering)的一个方向,对它的研究很大一部分源自于图灵测试,本文主要探讨一下基本的聊天机器人技术的基本原理和实现机制。...
  • heiyeshuwu
  • heiyeshuwu
  • 2015年01月21日 11:18
  • 13296

三十五、一个lstm单元让聊天机器人学会甄嬛体

当今比较流行的seq2seq基本都是用lstm组成的编码器解码器模型实现,开源的实现大都基于one-hot的embedding(没有词向量表达的信息量大),因此打算自己实现一个基于word2vec词向...
  • jiangjingxuan
  • jiangjingxuan
  • 2017年01月25日 14:00
  • 1615

Tensorflow搞一个聊天机器人

 Tensorflow搞一个聊天机器人 catalogue 0. 前言 1. 训练语料库 2. 数据预处理 3. 词汇转向量 4. 训练 5. 聊天机器人 - 验证效果 ...
  • starzhou
  • starzhou
  • 2017年09月11日 08:52
  • 236

使用深度学习打造智能聊天机器人

本文对目前使用深度学习来构建聊天机器人的技术进行了总结和归纳。
  • malefactor
  • malefactor
  • 2016年07月13日 20:22
  • 25614

三十八、原来聊天机器人是这么做出来的

tensorflow自带的seq2seq模型基于one-hot的词嵌入,每个词用一个数字代替不足以表示词与词之间的关系,word2vec通过多维向量来做词嵌入,能够表示出词之间的关系,比如:男-女≈王...
  • jiangjingxuan
  • jiangjingxuan
  • 2017年01月25日 14:02
  • 1742

智能聊天机器人的基本原理(转载)

简单扫了一下智能聊天机器人是怎么实现的, 比如清华机器人小图,还有人人的小黄鸡,下面的博客写的很好。 zzfrom: http://www.cnblogs.com/huj690/archive/...
  • bb4903052
  • bb4903052
  • 2014年07月02日 13:24
  • 2452

浅析聊天机器人的技术和前景

最近利用业余时间,团队开发了一个简单的聊天机器人雏形(http://robot.ly863.com)。对聊天机器人的技术和前景有了简单的了解。大概的整理下,期望与大家分享和交流,能在这个领域内进一步的...
  • aofengdaxia
  • aofengdaxia
  • 2014年01月17日 19:25
  • 12995
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:自己动手写个聊天机器人吧
举报原因:
原因补充:

(最多只允许输入30个字)