引言
在一个多月前的Microsoft Build 微软开发者大会上,OpenAI的科学家Andrej Karpathy做了一个关于大型语言模型(LLM)训练过程、特点以及如何从中获得更好结果的演讲,名为"State of GPT"。我之前已经分享过了Andrej在这个演讲中提到的重要观点 “LLM不想成功,但你可以要求成功”。他前20多分钟关于ChatGPT如何被训练出来的内容非常硬核,很多人表示难理解,但是我觉得这部分内容对于我们不是在做底层技术的普通人来说,可以不钻入细节,但是如果大致知晓是怎么训练的,对于我们理解模型的特点(优势和缺陷)还是有很大帮助的,也能给我们的使用过程带来启发。所以我今天尝试结合Andrej这次的演讲和我基于其他学习材料获得的理解给大家做一次介绍,希望对你有启发。当然,你也可以直接去看Andrej演讲的内容:视频点这里。
ChatGPT的训练四阶段
阶段一:预训练(Pretraining)
这是大型语言模型(LLM)训练的最主要阶段,大概会占用模型95%以上的训练时间,花费数百万美元。该阶段模型会有上千亿的从网络爬取的语料(低质量,高数量)进行训练,模型训练的目标是预测下一个单词,训练完成后会得到一个基础模型(Base model),像GPT-3、LLaMA、PaLM都是这样的基础模型。
阶段二:监督微调(Supervised Finetuning)
这个过程会使用专门的由人类外包商生成的结构化的包含提示词和理想结果的语料(高质量,低数量)进行训练,通常只需要几天的时间,这个阶段模型训练的目标依然是预测下一个单词,完成后会得到一个监督微调模型(SFT Model),除ChatGPT和Claude外,大多数和用户对话的模型都是这种类型的模型,如Vicuna-13B。
阶段三:奖励建模(Reward Modeling)
在上一个阶段训练得到的监督微调模型已经可以生成输出了,到了这个阶段,会由人类外包商对SFT model在同一个prompt下生成的结果进行评价比较,在这个阶段,模型训练的目标是预测一个回答可能得到的人类评分,这是个用于训练的过程模型,不是给用户使用的,通常会花费几天的训练时间。
阶段四:强化学习(Reinforcement Learning)
在这个阶段,训练的语料是人类外包商提供的提示词(prompt),而模型训练的目标是根据这些提示词生成内容,目标是获得最大化的Reward Model提供的奖励,通常也是花费几天的训练时间就能完成,最终得到的强化学习模型(RL Model),像ChatGPT和Claude就是这样的模型。
以下是每个阶段的详细介绍
阶段一:预训练(Pretraining)
在预训练阶段,首先是语料选择的问题,训练语料的数量和质量都很重要。GPT-3大概用了3000亿token的语料,他们未公布具体的语料构成,但是可以拿Meta训练LLaMA用的语料数据作为参照,其中:
- 67.0%是Common Crawl,也就是常规网络爬取的数据集,这部分数据集的特点是内容涵盖的类型很丰富,但是因为内容可能是任何人写的,质量可能偏低,也会包含大量的噪声和不相关内容,例如广告、导航菜单、版权声明等。
- 15.0%是C4数据(Colossal Clean Crawled Corpus,“庞大的清洁爬取语料库”),这个数据集包含了大量的网页文本,这些文本已经过清理,移除了广告、重复内容、非英语文本、和其他不适合训练的元素。这个数据集的目标是提供一个大规模、高质量、多样性强的英语文本数据集,以支持各种自然语言处理任务。尽管C4已经过清理,但仍然包含了来自互联网的各种文本,因此可能包含一些质量低下或有误导性的信息。
- 剩余18%的训练语料数据质量相对高些,主要是来自Github、维基百科、书籍、Arxiv论文、股票交易所的材料等。
注:结合训练语料的数据量级和来源构成看,我们需要理解的是,像ChatGPT等LLM几乎学习过了人类在互联网上发表过的所有学科和领域的知识,所以它“常识”很丰富;但同时,因为训练语料中“平庸”的知识占比太高了,而模型的主要目标又是预测下一个单词,所以你很可能得到的是平庸普通被平均过的内容,你需要一定的prompt技巧才能把更高级更优质的输出给逼出来。
重新回到训练过程,在获得大规模的训练语料后,OpenAI也不是直接对语料进行训练,而是先将文本内容分解成了更细小的子词单元(subword units),也就是我们常听到的token进行训练。你可能会像我一样困惑为什么要费这种劲,直接拿完整的单词训练不好么,为什么要分词,其中的逻辑是这样的:
- 处理未知单词:在训练过程中,可能会遇到一些模型从未见过的单词,如果以单词为单位进行tokenization,那么模型将无法处理这些未知单词。而如果以子词或字符为单位进行tokenization,即使遇到未见过的单词,模型也可以将其分解为已知的子词或字符,从而能够处理未知单词。
- 缩小词汇表大小:如果以单词为单位进行tokenization,那么词汇表的大小将会非常大,这会增加模型的复杂性和计算负担。以子词或字符为单位进行tokenization,可以显著减小词汇表的大小。
- 捕捉词根和词缀信息:许多英语单词都是由词根和词缀(前缀和后缀)构成的。通过子词单元进行tokenization,可以帮助模型捕捉到这些词根和词缀信息,对理解和生成文本有所帮助。
所以,GPT选择了子词单元作为token进行训练,这样既能够处理未知单词,也能够缩小词汇表的大小,并且能够捕捉到一些语言的内在规则。大多数模型在训练时都会这么做,但是他们采用的分词规则可能会不太相同,比如GPT-3在训练前分出了50257个子词,而LLaMA用了32000个子词
阶段二:监督微调(Supervised Finetuning)
为了让模型不仅仅是预测下一个单词,还能理解人类的指令,训练过程中加入了监督微调。本质上,这个阶段是通过提供一系列示例,让模型学习“prompt”和“response”之间的关系,理解人类的输入。这相当于将少示例提示(few-shot)通过微调直接内置到模型中,使其从简单的预测单词转变为一个助手角色。
阶段三:奖励建模(Reward Modeling)和 阶段四:强化学习(Reinforcement Learning)
这两个阶段本质上是相辅相成的,阶段三为阶段四提供支持。大多数模型只训练到阶段一和阶段二,而后两个阶段可能是OpenAI的独特之处。目前,只有ChatGPT和Claude等模型经历了这两个阶段。GPT-3在2020年训练完成并很快开放API,但并未引起广泛关注。直到2022年底基于GPT-3微调的GPT-3.5-turbo(即ChatGPT)发布后,才引发了大规模关注,这也说明了后两个阶段的训练难度和影响之大。
在奖励建模阶段,OpenAI会让前一阶段的SFT Model生成数十万个prompt的内容,然后由人类外包商对同一prompt下的多个结果进行选择和评分。基于这些数据,OpenAI训练模型去预测一个回答可能获得的人类评分。
在强化学习阶段,模型已经能够生成回答并预测其评分。此时,模型需要不断迭代,生成尽可能获得高评分的回答。
因此,这两个阶段的本质是让模型更符合人类偏好,生成更可能被人类打高分的回答。具体来说,是被那些在奖励建模阶段的人类外包商打高分的回答。如果那些参与训练的人水平中庸或有偏见,得到的模型也会具有相应的特征。