前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >基于seq2seq模型的chatbot对话系统的tensorflow实现

基于seq2seq模型的chatbot对话系统的tensorflow实现

作者头像
机器学习AI算法工程
发布2019-10-28 17:31:55
9030
发布2019-10-28 17:31:55
举报
数据处理

这里我们借用[DeepQA]里面数据处理部分的代码,省去从原始本文文件构造对话的过程直接使用其生成的dataset-cornell-length10-filter1-vocabSize40000.pkl文件。有了该文件之后数据处理的代码就精简了很多,主要包括:

1. 读取数据的函数loadDataset()

2. 根据数据创建batches的函数getBatches()和createBatch()

3. 预测时将用户输入的句子转化成batch的函数sentence2enco()

完整源码、预训练模型 获取方式:

关注微信公众号 datayx 然后回复 对话 即可获取。

#使用方法

1,下载代码到本地(data文件夹下已经包含了处理好的数据集,所以无需额外下载数据集)

2,训练模型,将chatbot.py文件第34行的decode参数修改为False,进行训练模型

(之后我会把我这里训练好的模型上传到网上方便大家使用)

3,训练完之后(大概要一天左右的时间,30个epoches),再将decode参数修改为True

就可以进行测试了。输入你想问的话看他回复什么吧==

这里还需要注意的就是要记得修改数据集和最后模型文件的绝对路径,不然可能会报错。

分别在44行,57行,82行三处。好了,接下来就可以愉快的玩耍了~~

模型构建

有了数据之后看一下模型构建的代码,其实主体代码还是跟前面说到的tf官方指导文档差不多,主要分为以下几个功能模块:

1. 一些变量的传入和定义

2. OutputProjection层和sampled_softmax_loss函数的定义

3. RNNCell的定义和创建

4. 根据训练或者测试调用相应的embedding_attention_seq2seq函数构建模型

5. step函数定义,主要用于给定一个batch的数据,构造相应的feed_dict和run_opt

接下来我们主要说一下我做的主要工作,就是beam_search这部分,那么如何编程实现呢,首先我们要考虑的是在哪里进行beam search,因为beam search是在预测时需要用到,代替greedy的一种搜索策略,所以第一种方案是在tf之外,用python实现,这样做的缺点是decode速度会很慢。第二种方案是在tf内模型构建时进行,这样做的好处是速度快但是比较麻烦。

在网上找了很久在tensorflow的一个issue里面发现了一个方案,他的思路是修改loop_function函数,也就是之前根据上一时刻输出得到下一时刻输入的函数,在loop function里面实现top_k取出概率最大的几个序列,并把相应的路径和单词对应关系保存下来。但是存在一个问题就是一开始decode的时候传入的是一句话,也就是batch_size为1,但是经过loop_function之后返回的是beam_size句话,但是再将其传入RNNCell的时候就会报错,如何解决这个问题呢,想了很久决定直接从decode开始的时候就把输入扩展为beam_size个,把encoder阶段的输出和attention向量都变成beam_size维的tensor,就说把decoder阶段的RNN输入的batch_size当做为beam_size。

但是这样做仍然会出现一个问题,就是你会发现最后的输出全部都相同,原因就在于decoder开始的时候样本是beam_szie个完全相同的输入,所以经过loop_function得到的beam_size个最大序列也是完全相同的,为了解决这个问题我们需要在第一次编码的时候不取整体最大的前beam_size个序列,而是取第一个元素编码结果的前beam_size个值作为结果。这部分代码就在seq2seq文件中。

模型训练

其实模型训练部分的代码很简单,就是每个epoch都对样本进行shuffle然后分batches,接下来将每个batch的数据分别传入model.step()进行模型的训练,这里比较好的一点是,DeepQA用的是embedding_rnn_seq2seq函数,训练过程中loss经过30个人epoch大概可以降到3点多,但是我这里改成了embedding_attention_seq2seq函数,最后loss可以降到2.0以下,可以说效果还是很显著的,而且模型的训练速度并没有降低,仍然是20个小时左右就可以完成训练。

模型预测

预测好模型之后,接下来需要做的就是对模型效果进行测试,这里也比较简单,主要是如何根据beam_search都所处的结果找到对应的句子进行输出。代码如下所示:

测试效果,根据用户输入回复概率最大的前beam_size个句子:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-01-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习AI算法工程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模型构建
  • 模型训练
  • 模型预测
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档