今年6月的时候就写了一篇半成品,没有发表,一直拖到现在。现在回看那篇文章,当时对于大模型的理解略显稚嫩,就重新系统的整理一下自己的一些认识。
背景介绍
最近大半年都在做大模型微调方面相关的工作,经过长时间的沉淀,有了部分可以输出的内容,自认为对大模型各部分的理解有一定的深度,希望可以完成一篇质量较高的文章,有错误之处也请指正。
训练流程
这是Andrej Karpathy在微软BUILD2023大会上做主题演讲 “State of GPT”中的一页,演讲具体内容可移步B站。
从上面我们可以很清晰的了解到openai是怎么训练chatgpt的
- 首先,在Pretraining阶段,使用大量的无监督数据,可以是低质量的数据,训练一个base model也就是一个基模型
- 接下来,进行Supervised Finetuning,也就是我们常说的有监督微调(SFT),这一步主要是让模型具备指令跟随的能力
- 后面两部分我们可以统称为RLHF阶段,使模型的输出更符合人类的标准
具体细节我会在下面几个part给大家详细说明
Pretraining
作为最开始的stage,我们首先要训练一个基模型(base model),这个模型的训练过程就是一个预训练的过程,这一步会使用大量的无监督数据。虽然在Andrej Karpathy的演讲中,这部分数据是low-quality&large quantity,我个人认为对于openai的low-quality,对我们来说可能也是比较高质量了,数据方面一定是做了大量的工作,毕竟什么样的数据就带来什么样的模型。
- 数据清洗
- 统计规则
- 训练小模型做分类器
- 去除重复数据
- 去除低安全性数据等
- 基模型训练
- 语言模型
经过pretrining训练好的语言模型还不具备对话能力,还是一个语言模型,你说前半段,他接着你说后半段,内容是连续的,并不一定能回答你问的问题,就需要第二步的训练从而实现指令跟随。
Supervised Finetuning
第二步,有监督微调
从现在开始,我们就要想办法让pretrain阶段训练好的语言模型,能够遵从用户的指令,你让他做选择题,他就做选择题,你让他进行对话总结,他就总结对话。
在构造SFT数据时,是不需要引入额外的知识的,主要目的是激发模型的指令追随能力,这点和现在主流的模型微调SFT不同,现在的SFT基本都是想给模型灌新的知识,并且能够保留模型原有的能力,这在我看来是不可能实现的,具体原因在下面会说到,在这里先卖个关子。
这里列举一些数据构造的任务类型:
- QA对
- 摘要总结
- 信息抽取(实体等)
- 翻译
- 选择题
其实就是对应NLP的不同任务类型,这一步对数据质量要求就比较高了,脏数据会极大程度影响模型的效果,当然这是在你SFT数据量较小的情况下,数据量如果足够多,也不会有啥影响。训练完成后,我们的模型就可以作为一个聊天机器人使用了,通过引入采样,就能让每次对话大概率得到不同的回复。
这个步骤我建议大家可以去尝试一下,现在市面上开源了很多基模型,同时也有一些SFT的开源数据集,使用少量数据就能训一个对话模型出来,对于训练时间、机器资源要求都不高。
RLHF
先发了…再不发又要拖半年了,后续慢慢补充