基于GPT2-Python人工智能机器人客服付费

文案狗 2725 2021-10-03 GPT2

资源介绍

  项目描述

  •   本项目是基于GPT2的中文闲聊机器人,模型实现基于HuggingFace的transformers。

  •   本项目受 GPT2启发,精读作者的代码,获益匪浅。

  •   在生成阶段,使用了Temperature、Top-k Sampling和Nucleus Sampling等,可参考论文The Curious Case
    of Neural Text Degeneration

  •   根据微软的DialoGPT的思想,在项目中添加了互信息。训练了两个模型:Dialogue Model与MMI Model(maximum mutual
    information scoring function)。首先使用Dialogue Model生成多个候选response,然后使用MMI
    Model从候选response中,选取loss最小的作为最终的response

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

  •   本项目被微软的DialoGPT项目引用(为了简化生成方法,加快生成速度,删除了MMI的生成方法)

  运行环境

  python3.6、 transformers==4.2.0、pytorch==1.7.0

  项目结构

  •   data

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

  •       train.pkl:对原始训练语料进行tokenize之后的文件,存储一个list对象,list的每条数据表示一个多轮对话,表示一条训练数据

  •   model:存放对话生成的模型

  •       epoch40:经过40轮训练之后得到的模型

  •       config.json:模型参数的配置文件

  •       pytorch_model.bin:模型文件

  •   vocab

  •       vocab.txt:字典文件。默认的字典大小为13317,若需要使用自定义字典,需要将confog.json文件中的vocab_size字段设为相应的大小。

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

  •   train.py:训练代码

  •   interact.py:人机交互代码

  •   preprocess.py:数据预处理代码

  模型参数简介(详见模型的config.json文件)

  •   initializer_range: 0.02

  •   layer_norm_epsilon: 1e-05

  •   n_ctx: 1024

  •   n_embd: 768

  •   n_head: 12

  •   n_layer: 12

  •   n_positions: 1024

  •   vocab_size: 21128

  训练思路

  对每条训练数据进行拼接,然后将其输入到模型中,进行训练。

  对于如下多轮闲聊训练数据,在训练模型时,将训练数据进行如下拼接:"[CLS]想看你的美照[SEP]亲我一口就给你看[SEP]我亲两口[SEP]讨厌人家拿小拳拳捶你胸口[SEP]"。然后将上述拼接结果作为模型的输入,让模型进行自回归训练。

  想看你的美照

  亲我一口就给你看

  我亲两口

  讨厌人家拿小拳拳捶你胸口

  使用方法

  将模型文件夹model_epoch40_50w放到model目录下,执行如下命令,进行对话

    python interact.py --no_cuda --model_path model_epoch40_50w (使用cpu生成,速度相对较慢)
  或
  python interact.py --model_path model_epoch40_50w --device 0 (指定0号GPU进行生成,速度相对较快)

  数据预处理

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

  真想找你一起去看电影

  突然很想你

  我也很想你

 

  想看你的美照

  亲我一口就给你看

  我亲两口

  讨厌人家拿小拳拳捶你胸口

 

  美女约嘛

  开好房等你了

  我来啦

  运行preprocess.py,对data/train.txt对话语料进行tokenize,然后进行序列化保存到data/train.pkl。train.pkl中序列化的对象的类型为List[List],记录对话列表中,每个对话包含的token。

python preprocess.py --train_path data/train.txt --save_path data/train.pkl

  训练模型

  运行train.py,使用预处理后的数据,对模型进行自回归训练,模型保存在根目录下的model文件夹中。

  在训练时,可以通过指定patience参数进行early
stop。当patience=n时,若连续n个epoch,模型在验证集上的loss均没有下降,则进行early
stop,停止训练。当patience=0时,不进行early stop。

  代码中默认关闭了early stop,因为在实践中,early stop得到的模型的生成效果不一定会更好。

  python train.py --epochs 40 --batch_size 8 --device 0,1 --train_path data/train.pkl

  更多的训练参数介绍,可直接看train.py中的set_args()函数中的参数说明

  人机交互

  运行interact.py,使用训练好的模型,进行人机交互,输入Ctrl+Z结束对话之后,聊天记录将保存到sample目录下的sample.txt文件中。

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

  执行interact.py时,可以尝试通过调整topk、topp、repetition_penalty、max_history_len等参数,调整生成的效果。更多的参数介绍,可直接看interact.py的set_args()函数中的参数说明
如果要使用GPU进行生成,则不要调用--no_cuda参数,并且通过--device gpu_id来指定使用哪块GPU。

  生成样例

  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:我们不用上课的呀

END
相关标签

发表评论