自己动手写个聊天机器人吧
学习来源于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
- 驳“反驳老赵之“伪”递归”
- 关于今天很热的--FizzBuzzWhizz
- 了解EF CodeFirst的Migrator功能与Migrator.Net对比
- struts技术的logic标签
- 【翻译】使用Visual Studio创建Asp.Net Core MVC (一)
- 你不知道的Javascript:有趣的setTimeout
- ADO.NET 2.0 中的新增 DataSet 功能
- WinRar 4.20 – 文件扩展名欺骗(0Day)
- 黑掉ATM取款机?只需一条短信
- DNS迭代穷举脚本
- 走进计算机取证分析的神秘世界
- SYNPROXY:最廉价的抗DoS攻击方案
- 如何使用AndroidStudio将开源项目library发布到jcenter
- Android Studio 使用Gradle多渠道打包
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 刺激!一行代码即可导出所有浏览记录
- 你不知道的 node 爬虫原来这么简单
- 带货直播系统源码中,商品详情页是如何搭建起来的
- 基于飞桨复现CVPR 2020 GhostNet的全程解析
- 【即时通信IM】红包消息如何构建?
- YOLOv4损失函数全面解析
- Pandas进阶修炼120题,给你深度和广度的船新体验
- 5万字、97 张图总结操作系统核心知识点
- C++核心准则CP.100:不要使用无锁编程方式,除非绝对必要
- 神了,Excel的这个操作我今天才知道
- DataFrame(7):DataFrame运算——逻辑运算
- 高性能网关设计实践
- LASSO回归姊妹篇:R语言实现岭回归分析
- 学了这个,三歪再也不想写各种setter了
- 使用 GitLab CI 与 Argo CD 进行 GitOps 实践