1. 背景
想必大家都有经历,处于多种原因有个很好的朋友不再跟你聊天了,那么可不可以用他的微信聊天记录来大致还原一下这个人的聊天习惯语气甚至是喜欢发的表情包等等呢?
这篇博客基于GPT2-Chinese大概讲述如何使用朋友的聊天记录训练一个聊天机器人,不过最终效果还是取决于训练的语料是否足够,以及模型的选取,参数调整等等,能运行成功不难,但是调试能很好的模仿就比较难了,大家有兴趣可以多多尝试其他建模方式或者语料选取。
后半篇会大概尝试讲述一下GPT2的原理以及调优。
话不多说,先来把这篇文章可能是最复杂的部分,开发与运行环境给准备好差不多完成demo一半了。
2. GPT-2原理简述
在之前的博客可以复习一下transformer BERT GPT等模型
GPT-2 是使用「transformer 解码器模块」构建的,而 BERT 则是通过「transformer 编码器」模块构建的。这里需要指出的是,二者一个很关键的不同之处在于:GPT-2 就像传统的语言模型一样,一次只输出一个单词(token)
3. 环境准备
运行环境参考:
centOS7 python3.6
运行以下命令
代码语言:txt复制yum -y install python36-devel
代码语言:txt复制git clone
代码语言:txt复制cd gpt2-chatbot
代码语言:txt复制pip3 install -r requirements.txt
4.1 语料准备与预处理
在项目根目录下的data文件夹,将原始训练语料命名为train.txt,存放在该目录下。train.txt的格式如下,每段闲聊之间间隔一行,格式如下:
训练语料下载可以使用
https://github.com/codemayq/chinese_chatbot_corpus
代码语言:txt复制真想找你一起去看电影
突然很想你
我也很想你
想看你的美照
亲我一口就给你看
我亲两口
讨厌人家拿小拳拳捶你胸口
将同事所有的聊天记录处理并复制append到训练文件中(不知道是否可以适当样本加权)
运行preprocess.py,对data/train.txt对话语料进行tokenize,然后进行序列化保存到data/train.pkl。train.pkl中序列化的对象的类型为List,记录对话列表中,每个对话包含的token。
python3 preprocess.py --train_path data/train.txt --save_path data/train.pkl
4.2 训练模型
运行train.py,使用预处理后的数据,对模型进行自回归训练,模型保存在根目录下的model文件夹中。
在训练时,可以通过指定patience参数进行early stop。当patience=n时,若连续n个epoch,模型在验证集上的loss均没有下降,则进行early stop,停止训练。当patience=0时,不进行early stop。
python3 train.py --epochs 40 --batch_size 8 --device 0,1 --train_path data/train.pkl
5. 其他
其实后续可完善部分还是很多的,项目代码还没怎么看明白。随意写几个以后有时间再玩玩:
- 在线学习
- 尝试其他预训练模型
- 每天对微博热搜进行时评
能完善这些估计群会稍微不这么安静了吧。
Ref
- https://zhuanlan.zhihu.com/p/96755231
- https://github.com/yangjianxin1/GPT2-chitchat
- https://github.com/sfyc23/EverydayWechat
- https://github.com/Morizeyao/GPT2-Chinese
- https://zhuanlan.zhihu.com/p/57251615
- paper https://d4mucfpksywv.cloudfront.net/better-language-models/language-models.pdf
- https://github.com/openai/gpt-2
- 机器之心解读模型 https://www.sohu.com/a/336262203_129720