用于中文闲聊的GPT2模型:GPT2-chitchat

2019 年 12 月 11 日 AINLP

作者:坚新

研究方向:自然语言处理

项目地址,点击文末阅读原文直达:

https://github.com/yangjianxin1/GPT2-chitchat




编者按:AINLP技术群的坚新同学发布了一个新项目:GPT2-chitchat (GPT2 for Chinese chitchat/用于中文闲聊的GPT2模型),以下是来自该项目的详细介绍,欢迎Star。





GPT2 for Chinese chitchat

项目描述

  • 本项目使用GPT2模型对中文闲聊语料进行训练,使用 HuggingFace的transformers实现GPT2模型的编写与训练。

  • 在闲暇时间用 GPT2-Chinese模型训练了几个长文本的生成模型,并且精读了一遍作者的源码,获益匪浅,加深了自己对GPT2生成模型的一些理解,于是将GPT2模型用于闲聊对话的生成,非常感谢作者的分享。

  • 本项目中沿用了原项目中的部分结构和一些命名方式,同时也对很多代码细节做出了自己实现。

  • 解码器的逻辑使用了Temperature、Top-k Sampling和Nucleus Sampling等,可参考论文The Curious Case of Neural Text Degeneration

  • 代码中给出了许多详细的中文注释,方便大家更好地理解代码(能力有限,可能有些代码或注释有误,望大家不吝赐教)

运行环境

python3.6、 transformers==2.1.1、pytorch==1.3.1

项目结构

  • config:存放GPT2模型的参数的配置文件

  • data

    • train.txt:默认的原始训练集文件,存放闲聊语料

    • train_tokenized.txt:对原始训练语料进行tokenize之后的文件

  • model:存放模型

  • sample:存放人机闲聊生成的历史聊天记录

  • vocabulary:存放GPT2模型的字典

  • train.py:训练代码

  • interact.py:人机交互代码

模型参数(详见config/model_config_dialogue_small.json文件)

  • initializer_range: 0.02

  • layer_norm_epsilon: 1e-05

  • n_ctx: 300

  • n_embd: 768

  • n_head: 12

  • n_layer: 10

  • n_positions: 300

  • vocab_size: 13317

使用方法

在项目根目录下创建data文件夹,将原始训练语料命名为train.txt,存放在该目录下。train.txt的格式如下,每段闲聊之间间隔一行


训练模型:

python train.py --epochs 30 --batch_size 8 --device 0,1 --raw(若要对原始训练语料进行tokenize,则要指定--raw参数。若要用GPU训练,则通过--device指定GPU)

python train.py --epochs 30 --batch_size 8 --no_cuda --raw(指定--no_cuda参数,则使用CPU训练,速度要慢得多)

python train.py --epochs 30 --batch_size 8 --no_cuda(若已经对原始语料进行tokenize,可以不用指定--raw,避免重复tokenize,节约时间)

人机交互:

python interact.py --no_cuda --model_path path_to_your_model --max_history_len 3(由于闲聊对话生成的内容长度不是很长,因此生成部分在CPU上跑速度也挺快的)

更多的参数介绍,可直接看train.py和interact.py中的setup_train_args()函数中的参数说明

闲聊语料分享

中文闲聊语料 数据集地址 语料描述
常见中文闲聊 chinese_chatbot_corpus 包含小黄鸡语料、豆瓣语料、电视剧对白语料、贴吧论坛回帖语料、微博语料、PTT八卦语料、青云语料等
50w中文闲聊语料 百度网盘【提取码:jk8d】 由作者GaoQ1提供的比较高质量的闲聊数据集,整理出了50w个多轮对话的语料

模型分享

模型 百度网盘 模型描述
50w中文闲聊语料训练模型 百度网盘【提取码:gi5i】 闲聊语料为67M,包含50w个多轮对话,用两块1080Ti,大概跑了五六天,训练了40个epoch,最终loss在2.0左右,继续训练的话,loss应该还能继续下降。

模型使用方法:把下载好的模型文件pytorch_model.bin和config.json放在model目录下(否则需要通过--model_path参数指定模型的路径),执行如下命令:

python interact.py --no_cuda --model_path path_to_your_model --max_history_len 5(由于闲聊对话生成的内容长度不是很长,因此生成部分在CPU上跑速度也挺快的。根据需求调整max_history_len参数)

python interact.py --no_cuda --model_path path_to_your_model --max_history_len 5 --topp 0.8(--topp为0到1之间的小数,用于调用Nucleus Sampling)

输入Ctrl+Z结束对话之后,聊天记录将保存到sample目录下的sample.txt文件中

interact.py的参数

执行interact.py时,可以尝试通过调整topk、topp、repetition_penalty、max_history_len等参数,调整生成的效果。详细的参数描述可以查看interact.py的set_interact_args()函数

生成样例

Sample 1:

  user :你好啊
chatbot:你好,请问您是?
user :我是你的主人啊
chatbot:你是狗吗?
user :你才是狗
chatbot:你不是狗我是你的小主人
user :你这个大笨蛋
chatbot:你大笨蛋,你是想挨打了
user :你全家都是大笨蛋
chatbot:我是你爸爸
user :算了,不跟你吵了,你在干嘛呢
chatbot:我在上班啊,你还没下班呢啊你
user :我周末要做作业啊
chatbot:不是才交了吗,早晚做完啊
user :好多作业啊,还没做完呢
chatbot:我在抄,我妈让我周五交,还有事
user :你就不怕被你妈妈骂吗
chatbot:不怕
user :你周末有去哪里玩吗
chatbot:没时间啊,忙得很啊
user :忙着干嘛呢
chatbot:不知道啊,我周末没有作业,我想睡觉,然后还得找人

Sample 2:

  user :你好啊
chatbot:你好我好大家好
user :你在干嘛呢
chatbot:你不上课啊
user :今天是周末啊,笨蛋
chatbot:我在学校呢
user :我也是,周末还要做作业
chatbot:我还没写呢我们都还没写
user :周末你有去哪里玩吗
chatbot:没有去南京
user :南京有什么好玩的啊
chatbot:我们没去南京
user :你刚刚又说你去了南京,你是不是耍我啊
chatbot:我刚刚才到南京
user :你好笨啊
chatbot:我没有
user :你是大笨蛋
chatbot:你才是大笨蛋
user :你全家都是大笨蛋
chatbot:你个傻冒
user :你个智障
chatbot:哈哈哈

Sample 3:

  user :在干嘛
chatbot:睡觉
user :这么早就睡觉啦
chatbot:嗯啊你也早点睡啊
user :我再玩一会儿手机
chatbot:早点休息晚安
user :拜拜啦
chatbot:晚安晚安
user :多喝热水
chatbot:哈哈哈
user :多喝热水
chatbot:好的咯

Sample 4:

  user :在吗
chatbot:在
user :我不开心
chatbot:怎么啦
user :最近好累啊
chatbot:是挺累的
user :作业好多啊
chatbot:还好还好
user :我觉得我快要挂科了
chatbot:我也是啊,但是我觉得我快熬出头了
user :不说了,我还有好多作业没写
chatbot:我也是啊好多啊
user :那先这样,下次再聊,再见了
chatbot:好哒

Sample 5:

  user :你去过广州吗
chatbot:去过呀,但是没有找到工作呢
user :那你去过北京吗
chatbot:没有啊
user :北京有什么好玩的
chatbot:没有你想象的那么好
user :是吗,我还没过北京
chatbot:那里我也不怎么熟,我去过北京
user :北京天安门呢
chatbot:没去过,不过可以去玩玩

Sample 6:

  user :你好
chatbot:你好
user :在干嘛呢
chatbot:在想你呢
user :好害羞啊
chatbot:害羞什么啊
user :你这样夸我,我觉得不好意思呀
chatbot:我夸你你还不好意思呢
user :是啊,哈哈哈
chatbot:你是不是在考验我
user :你怎么会这样想呢
chatbot:我说我在夸你,这么客气,
user :你有睡午觉吗
chatbot:有啊
user :我现在有点困呢
chatbot:我也是
user :等下还要去上课,好烦啊
chatbot:我们不用上课的呀

不足之处

虽然使用了多轮历史对话作为response的生成条件,但是chatbot还是不能很好地掌握上下文的逻辑。比如Sample3与Sample5中,chatbot无法知道自己"是否在南京","是否去过北京"。对于下面Sample7和Sample8这种重复性的提问(user重复输入一样的对话内容),也无法给出一致的答案。

Sample 7:

  user :你在干嘛
chatbot:在睡觉
user :你在干嘛
chatbot:上班
user :你在干嘛
chatbot:想我了?
user :你在干嘛
chatbot:我在看歌手
user :你在干嘛
chatbot:在家里过节呢
user :你在干嘛
chatbot:看球赛
user :你在干嘛
chatbot:我在想你
user :你在干嘛
chatbot:在吃饭
user :你在干嘛
chatbot:搞学术
user :你在干嘛
chatbot:我在看电视

Sample 8:

  user :天气怎样
chatbot:不错
user :天气怎样
chatbot:挺好的
user :天气怎样
chatbot:不错不错,挺美的
user :天气怎样
chatbot:不错不错
user :天气怎样
chatbot:下大雨,好冷啊
user :天气怎样
chatbot:风和日丽的不要不要的
user :天气怎样
chatbot:下大雨

chatbot偶尔也会"智商离线",生成的内容"惨不忍睹",如Sample8

Sample 9:

  user :在干嘛呢
chatbot:上班呢
user :这么晚还上班啊
chatbot:是滴,你呢
user :我再上课啊
chatbot:那么辛苦,吃饭不
user :你要请我吗
chatbot:你来
user :我没钱啊
chatbot:那是什么狗屁
user :你好笨啊
chatbot:我们都是要保养保养,保养,保养,保养,保养,牙套牙
user :你好笨啊
chatbot:好好说话
user :拜拜
chatbot:爱你呦芸芸

Future Work

更多地在解码器上下功夫,比如使用互信息(mutual information):训练一个额外的网络,给定一个reponse,该网络能够计算出概率P(Source|response),Source为response的上文。该网络的目的就是对于生成的多个response,选出P(Source|response)最大的response作为最终的回复。

Reference

  • The Curious Case of Neural Text Degeneration

  • transformers

  • GPT2-Chinese

  • DialoGPT:Large-Scale Generative Pre-training for Conversational Response Generation





本文由作者授权AINLP原创发布于公众号平台,点击'阅读原文'直达原文链接,欢迎投稿,AI、NLP均可。


推荐阅读

知识图谱存储与查询:自然语言记忆模块(NLM)

BERT论文笔记

XLNet 论文笔记

当BERT遇上知识图谱

Nvidia League Player:来呀比到天荒地老

我们建了一个免费的知识星球:AINLP芝麻街,欢迎来玩,期待一个高质量的NLP问答社区

关于AINLP


AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLP君微信(id:AINLP2),备注工作/研究方向+加群目的。


登录查看更多
7

相关内容

Chatbot,聊天机器人。 chatbot是场交互革命,也是一个多技术融合的平台。上图给出了构建一个chatbot需要具备的组件,简单地说chatbot = NLU(Natural Language Understanding) + NLG(Natural Language Generation)。

知识荟萃

精品入门和进阶教程、论文和代码整理等

更多

查看相关VIP内容、论文、资讯等
【Amazon】使用预先训练的Transformer模型进行数据增强
专知会员服务
56+阅读 · 2020年3月6日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
116+阅读 · 2019年12月31日
【Strata Data Conference】用于自然语言处理的深度学习方法
专知会员服务
48+阅读 · 2019年9月23日
自然语言生成资源列表
专知
17+阅读 · 2020年1月4日
下载 | 最全中文文本分类模型库,上手即用
机器学习算法与Python学习
30+阅读 · 2019年10月17日
【Github】GPT2-Chinese:中文的GPT2训练代码
AINLP
52+阅读 · 2019年8月23日
一文详解Google最新NLP模型XLNet
PaperWeekly
17+阅读 · 2019年7月1日
NLP - 基于 BERT 的中文命名实体识别(NER)
AINLP
466+阅读 · 2019年2月10日
CNN与RNN中文文本分类-基于TensorFlow 实现
七月在线实验室
13+阅读 · 2018年10月30日
使用PaddleFluid和TensorFlow训练序列标注模型
PaperWeekly
6+阅读 · 2018年7月11日
开源|基于tensorflow使用CNN-RNN进行中文文本分类!
全球人工智能
11+阅读 · 2017年11月12日
A Sketch-Based System for Semantic Parsing
Arxiv
4+阅读 · 2019年9月12日
Arxiv
11+阅读 · 2019年6月19日
Star-Transformer
Arxiv
5+阅读 · 2019年2月28日
Music Transformer
Arxiv
5+阅读 · 2018年12月12日
Arxiv
7+阅读 · 2018年12月10日
VIP会员
相关VIP内容
【Amazon】使用预先训练的Transformer模型进行数据增强
专知会员服务
56+阅读 · 2020年3月6日
Transformer文本分类代码
专知会员服务
116+阅读 · 2020年2月3日
《动手学深度学习》(Dive into Deep Learning)PyTorch实现
专知会员服务
116+阅读 · 2019年12月31日
【Strata Data Conference】用于自然语言处理的深度学习方法
专知会员服务
48+阅读 · 2019年9月23日
相关资讯
自然语言生成资源列表
专知
17+阅读 · 2020年1月4日
下载 | 最全中文文本分类模型库,上手即用
机器学习算法与Python学习
30+阅读 · 2019年10月17日
【Github】GPT2-Chinese:中文的GPT2训练代码
AINLP
52+阅读 · 2019年8月23日
一文详解Google最新NLP模型XLNet
PaperWeekly
17+阅读 · 2019年7月1日
NLP - 基于 BERT 的中文命名实体识别(NER)
AINLP
466+阅读 · 2019年2月10日
CNN与RNN中文文本分类-基于TensorFlow 实现
七月在线实验室
13+阅读 · 2018年10月30日
使用PaddleFluid和TensorFlow训练序列标注模型
PaperWeekly
6+阅读 · 2018年7月11日
开源|基于tensorflow使用CNN-RNN进行中文文本分类!
全球人工智能
11+阅读 · 2017年11月12日
相关论文
Top
微信扫码咨询专知VIP会员