如何训练一个自己的GPT模型

一、概述

1、什么是GPT

GPT,全称“Generative Pre-training Transformer”,即生成式预训练可迁移注意力模型,简称“文本生成器”。本质上是NLP自然语言处理领域采用Transformer的attention注意力机制解决非精确的模糊化语义问题,从而带来了NLP领域的里程碑式改变。

Transformer的attention机制的核心是通过编解码,将人类语言解析成及其可以理解的数字,模型通过注意力机制寻找向量之间的关系并生成模型参数,再根据参数,通过编码器生成我们符合预期的结果,参数量越大,结果越准确。参数最初是人为标注数据形成的,之后通过强化学习+奖励机制自动生成。从下图可以看到,它与棋类的强化学习后预测下步走法类似,只不过预测的是下一个应该出现的Word单词。

2、GPT的发展

GPT于2018年由埃隆·马斯克联合创办的人工智能研究实验室OpenAI发布,是一种自回归语言模型,这种模型利用深度学习产生类似于人类语言的文本。通俗的解释,GPT就是一种会不断学习并自行完成文字相关工作的电脑程序,且在学习过程中无需任何外界人员操作。

现如今,GPT已经发展到第3.5代,即GPT-3.5,大家目前用到的ChatGPT就是这个版本。与2018年第一版GPT 1.17亿的参数相比,GPT-3.5拥有着1750亿的参数量。这之间巨大的参数差距,极大程度提升了GPT的运行规模,让GPT开始能完成一系列令人难以置信的任务。

现阶段的GPT已经能做到:

  • 1.作为基于问题的搜索引擎(类似百度);
  • 2.能作为历史人物与其交谈的聊天机器人;
  • 3.回答医疗问题;
  • 4.谱写吉他曲谱;
  • 5.英文翻译;
  • 6.自动创作如小说;

等等一系列复杂工作。

GPT-4预计将在23年初发布,相较于GPT-3.5,GPT-4的性能将有着跳跃式的提升,参数量将大于1万亿,已通过图灵测试,更有传言表示GPT-4先进到几乎与人类没有区别的水平。

当然,从零开始训练一个GPT模型的成本是巨大的,GPT3模型实际是在3w张A100卡上训练的。如果成本底点,在1000张A100卡上训练一次需要2个月,购买GPU和配套+机房托管+电费成本至少也要1-2亿。

可是作为穷人,难道就不能学习了吗?当然是可以的,本文就带你一起来学习如何在普通GPU上训练GPT模型。

二、语料准备

要想训练出一个好的模型,需要喂入优质的语料,以下是从网上收集到的部分语料数据集。

1、THUCNews

清华大学自然语言处理与社会人文计算实验室THUCNews中文文本数据集

https://thunlp.oss-cn-qingdao.aliyuncs.com/THUCNews.zip

2、维基百科

https://pan.baidu.com/s/1uPMlIY3vhusdnhAge318TA

json版(wiki2019zh),104万个词条(1,043,224条; 原始文件大小1.6G,压缩文件519M;数据更新时间:2019.2.7),可以做为通用中文语料,做预训练的语料或构建词向量,也可以用于构建知识问答。

3、新闻语料

https://drive.google.com/file/d/1TMKu1FpTr6kcjWXWlQHX7YJsMfhhcVKp/view?usp=sharing

json版(news2016zh),包含了250万篇新闻。新闻来源涵盖了6.3万个媒体,含标题、关键词、描述、正文( 原始数据9G,压缩文件3.6G;新闻内容跨度:2014-2016年)。训练集:243万;验证集:7.7万。

可以做为【通用中文语料】,训练【词向量】或做为【预训练】的语料; 也可以用于训练【标题生成】模型,或训练【关键词生成】模型(选关键词内容不同于标题的数据); 亦可以通过新闻渠道区分出新闻的类型。

4、百科类问答

https://pan.baidu.com/s/12TCEwC_Q3He65HtPKN17cA  # fu45

json版(baike2018qa),含有150万个预先过滤过的、高质量问题和答案,每个问题属于一个类别。总共有492个类别,其中频率达到或超过10次的类别有434个。训练集:142.5万;验证集:4.5万。

可以做为通用中文语料,训练词向量或做为预训练的语料;也可以用于构建百科类问答;其中类别信息比较有用,可以用于做监督训练,从而构建 更好句子表示的模型、句子相似性任务等。

5、社区问答

https://drive.google.com/open?id=1u2yW_XohbYL2YAK6Bzc5XrngHstQTf0v

json版(webtext2019zh) 大规模高质量数据集,含有410万个预先过滤过的、高质量问题和回复。每个问题属于一个【话题】,总共有2.8万个各式话题,话题包罗万象。从1400万个原始问答中,筛选出至少获得3个点赞以上的的答案,代表了回复的内容比较不错或有趣,从而获得高质量的数据集。除了对每个问题对应一个话题、问题的描述、一个或多个回复外,每个回复还带有点赞数、回复ID、回复者的标签。训练集:412万;验证集:6.8万;测试集:6.8万。可用于:

  • 1)构建百科类问答:输入一个问题,构建检索系统得到一个回复或生产一个回复;或根据相关关键词从,社区问答库中筛选出你相关的领域数据
  • 2)训练话题预测模型:输入一个问题(和或描述),预测属于话题。
  • 3)训练社区问答(cQA)系统:针对一问多答的场景,输入一个问题,找到最相关的问题,在这个基础上基于不同答案回复的质量、 问题与答案的相关性,找到最好的答案。
  • 4)做为通用中文语料,做大模型预训练的语料或训练词向量。其中类别信息也比较有用,可以用于做监督训练,从而构建更好句子表示的模型、句子相似性任务等。
  • 5)结合点赞数量这一额外信息,预测回复的受欢迎程度或训练答案评分系统。

6、翻译语料

https://drive.google.com/open?id=1EX8eE5YWBxCaohBO8Fh4e2j3b9C2bTVQ

translation2019zh中英文平行语料520万对。每一个对,包含一个英文和对应的中文。中文或英文,多数情况是一句带标点符号的完整的话。对于一个平行的中英文对,中文平均有36个字,英文平均有19个单词(单词如“she”)。训练集:516万;验证集:3.9万。

可以用于训练中英文翻译系统,从中文翻译到英文,或从英文翻译到中文; 由于有上百万的中文句子,可以只抽取中文的句子,做为通用中文语料,训练词向量或做为预训练的语料。英文任务也可以类似操作。

三、模型训练

1、安装依赖:

2、GPT网络模型定义

GPT 语言模型的定义参考:
1)OpenAI官方发布的GPT-2 TensorFlow实现:
https://github.com/openai/gpt-2/blob/master/src/model.py
2) huggingface/transformers PyTorch 实现:
https://github.com/huggingface/transformers/blob/main/src/transformers/models/gpt2/modeling_gpt2.py

3、简单的莎士比亚作品训练

如果你不是深度学习专业人士,只是想感受一下魔力,尝试一下,那么最快的入门方式就是在莎士比亚的作品上训练一个角色级别的 GPT。首先,我们将其下载为单个 (1MB) 文件,并将其从原始文本转换为一个大的整数流:

接下来我们训练一个初级的GPT模型 :

如果深入其中,你会看到我们正在训练一个上下文大小高达 256 个字符、384 个特征通道的 GPT,它是一个 6 层 Transformer,每层有 6 个头。如果是在A100 GPU 上,此训练运行大约需要 3 分钟,最佳loss为 1.4697,而在GTX1060上,要达到相同loss需要大约30分钟。我们也可以通过调整训练参数来加快训练速度:

根据配置,模型检查点被写入--out_dir目录out-shakespeare-char。因此,一旦训练完成,我们就可以通过将采样脚本指向此目录来从最佳模型中采样:

这会生成一些示例,例如:

哈哈,在 GPU 上训练 40分钟后,对于字符级模型来说效果还不错。通过在此数据集上微调预训练的 GPT-2 模型,很可能会获得更好的结果。

4、复现GPT-2

深度学习专业人士可能对重现 GPT-2 结果更感兴趣,我们在这里尝试下。

4.1 从零开始训练

首先需要标记数据集,这里我们直接使用部分开放的OpenWebText数据集(12.9G大小,是OpenAI使用的可公开子集):

然后我们准备开始训练。要重现 GPT-2 (124M),您至少需要一个 8X A100 40GB 节点并运行:

这个训练过程真是漫长啊,在GTX1060上,基本要训练一年loss才能下降到2.85左右;如果用8张A100 40G显存卡,预计需要4天左右。

我们这些穷人总不能要等上一年半载才能看到结果吧?不要怕,GPT是预训练模型,为了加快速度,我们可以直接加载GPT-2预训练模型,再继续喂入语料训练即可。

4.2 从GPT-2预训练模型开始训练

预训练模型loss情况:

从GPT-2预训练模型进行初始化并以较小的学习率进行训练:

4.3 通过GPT-2预训练模型进行文本输出
4.4 通过本地模型进行文本输出

4.1/4.2步骤本地迭代训练生成的best checkpoint model(最低验证损失)将保存在out_dir目录中,如果要加载继续训练后的模型进行文本输出的话,可以通过--out_dir参数指定位置

测试效果:

5、中文数据集训练

5.1 检查gpt-encoder/decode编解码对中文的处理是否正确
5.2 准备中文数据集及编解码处理

在data目录下新建一个chinese目录,创建input.txt,放入中文素材。(可参考shakespeare)

创建prepare.py并执行,将中文素材处理为编码后的train.bin(素材前90%训练用)、val.bin(素材后10%验证用):

5.3 中文训练

创建config/train_chinese.py训练配置,设置好素材目录、模型输出目录、训练参数等,并启动训练:

5.4 中文生成

源代码位置:https://github.com/yanjingang/nanoGPT

yan 2.24

参考:

nanoGPT

大规模中文自然语言处理语料 Large Scale Chinese Corpus for NLP

斗破苍穹小说、唐诗、诗歌、知乎语料

医疗NLP领域(主要关注中文) 评测数据集 与 论文等相关资源。

完全图解GPT-2

原文链接:如何训练一个自己的GPT模型 | 闫金钢的Blog (yanjingang.com)

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部