引言
在一个多月前的Microsoft Build 微软开发者大会上,OpenAI的科学家Andrej Karpathy做了个关于LLM(大型语言模型)是怎么训练的,有什么特点,以及如何从中获得更好结果的演讲”State of GPT”。
我之前已经分享过了Andrej在这个演讲中提到的重要观点 2.6 LLM不想成功,但你可以要求成功
他前20多分钟关于GPT如何被训练出来的内容非常硬核,很多人表示难理解,但是我觉得这部分内容对于我们不是在做底层技术的普通人来说,可以不钻入细节,但是如果大致知晓是怎么训练的,对于我们理解模型的特点(优势和缺陷)还是有很大帮助的,也能给我们的使用过程带来启发,所以我今天常识结合Andrej这次的演讲和我基于其他学习材料获得的理解给大家做一次介绍,希望对你有启发。
GPT的训练四阶段
阶段一:预训练(Pretraining),这是大型语言模型(LLM)训练的最主要阶段,大概会占用模型95%以上的训练时间,花费数百万美元。该阶段模型会有上千亿的从网络爬取的语料(低质量,高数量)进行训练,模型训练的目标是预测下一个单词,训练完成后会得到一个基础模型(Base model),像GPT-3,LLaMA,PaLM都是这样的基础模型。
阶段二:监督微调(Supervised Finetuning),这个过程会使用专门的由人类外包商生成的结构化的包含提示词和理想结果的语料(高质量,低数量)进行训练,通常只需要几天的时间,这个阶段模型训练的目标依然是预测下一个单词,完成后会得到一个监督微调模型(SFT Model),除GPT和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个子词。
在获得了语料和对语料进行分词后便进入了实际的预训练过程,预训练实际就是不断遮住模型的眼睛,让模型猜测下一个单词是什么的过程。训练的目标是不断迭代,使得模型猜出来的下一个词和实际文本内容的下一个词一样,这时候涉及一个指标叫训练损失(Training Loss),这是机器学习模型在训练数据上的预测错误的度量。简单来说,损失函数是一种衡量模型预测和实际目标之间差距的方法。在训练过程中,模型的目标是最小化这个损失。
在这个阶段训练得到的是Base Model,像是前面提到的,这个模型的目标是预测下一个单词,而不是充当一个聊天机器人或者助理的角色,举个例子,如果你向这个模型输入prompt:
北京的常驻人口有多少?
得到的结果可能会是:
上海的常驻人口有多少?
广州的常驻人口有多少?
深圳的常驻人口有多少?
因为在GPT的训练语料里,这些问题可能常常更紧密地放在了一起,不过到了GPT-2的时候,就有很多人发现了其实可以通过prompt的技巧去让模型扮演助手的角色或者回答问题,实现的方式是类似于写以下的prompt:
Q:北京的面积有多大?
A:1.6万平方公里
Q:北京有多少个行政区?
A:16个
Q:北京的常驻人口有多少?
A:这时你得到的结果可能就是:2184万
这一过程的本质是把你的问题,或者你需要base model帮你做的事伪装成一个文档中连续内容的一个缺口,让模型去自动进行尝试补全。但是这一过程存在很多的不稳定和不确定性,得到的结果常常不令人满意,对使用者也有较高的要求,所以现在这类模型通常不是一个提供给普通用户使用的模型,而是让开发者应用,需要涉及到一定的开发能力和prompt技巧。
阶段二:监督微调(Supervised Finetuning)
为了解决上面的base model只是预测下一个单词,不理解人类输出指令的问题,模型训练的过程中就加入了这一监督微调的过程。本质上来说,就是给模型提供一系列的示例,让模型看到“prompt”和“respone”,让模型去理解“指令”,去理解人类的输入是什么意思。
经过这一层的处理,已经相当于让模型理解prompt指令和它该生成的内容之间的关系了,你也可以理解这是把少示例提示(few-shot)这一prompt技术通过finetuning直接包装进了模型内部,经过这一层的包装,模型已经从简单的预测下一个单词变成了一个助手的角色。
阶段三:奖励建模(Reward Modeling)和 阶段四:强化学习(Reinforcement Learning)
我直接把这两个阶段放在了一起,因为本质上阶段三是为阶段四提供服务的,是一个独立存在并无意义的过程。大多数的模型都只训练到了阶段一和阶段二,后两个阶段可能是OpenAI用了些独门秘籍,目前英文世界也只有ChatGPT以及从OpenAI出去的人创立的Claude从有这一训练过程。GPT-3是2020年训练出来的,API也很快就开放使用了,但是在当时并没有引起太普遍的反响,是GPT-3基础上微调出来的GPT-3.5-turbo,也就是GPT在2022年底发布后才引发了大规模的关注和公众认知的,也大致能说明这后两个阶段的训练过程有多困难以及影响有多大。
在奖励建模(Reward Modeling)阶段,OpenAI会让前一阶段训练得到的SFT Model去针对数十万个prompt生成内容,然后让人类外包商对同一个prompt下的多个结果进行选择及评分,依赖于这一阶段得到的数据,OpenAI会训练模型去预测一个回答可能会获得的人类评分。
在强化学习(Reinforcement Learning)阶段,由于前面三个阶段的模型积累,模型已经既能对prompt生成回答,也能自己预测所生成的回答大概能得到什么样的评分了,所以模型需要做的只是不断迭代,生成尽可能获得更高得分的回答。
所以你其实可以认为,这两个阶段的本质是,让模型更符合人类偏好,生成更可能被人类打高分的回答,具体来说,是被那些在奖励建模阶段的人类外包商打高分的回答。本质上来说,如果那些参与训练过程的人水平是中庸的,是有偏见的,那么得到的模型也将会有对应的特征。
👆目前模型评分排名前三的全部都是基于人类反馈进行强化学习的模型(RLHF Model)