微软Build 2023开发者大会:OpenAI创始人Andrej Karpthy揭秘GPT训练细节
OpenAI的创始人之一,大神Andrej Karpthy刚在微软Build 2023开发者大会上做了专题演讲:State of GPT(GPT的现状)。
题目很普通,内容很劲爆。
大家都知道OpenAI训练ChatGPT的细节是不公开的。
而这次演讲是OpenAI官方
第一次详细阐述其大模型内部原理和RLHF训练细节
并且,Andrej真的有当导师的潜力,把非常技术的内容讲得深入浅出,而又异常透彻。这个演讲完全可以让非专业人士也能理解,认真看完演讲会有一种醍醐灌顶的感觉。
下面直接上演讲链接:
https://www.bilibili.com/video/BV1ts4y1T7UH
程序锅也独家整理了演讲的PPT
有需要的可以后台回复
文章很长,整体演讲分为两部分
在第一部分我想告诉你我们是如何训练GPT的;
在第二部分中,我们将了解如何将GPT有效地用于您的应用程序。
在此,我主要介绍第一部分,OpenAI如何训练GPT,当中有哪些细节。
修改后的译文如下:
大家好。 我很高兴在这里向您介绍 GPT 的状态,更广泛地介绍大型语言模型快速发展的生态系统。
我想把演讲分成两部分:
在第一部分我想告诉你我们是如何训练GPT的;
在第二部分中,我们将了解如何将GPT有效地用于您的应用程序。
首先让我们看一下如何训练GPT的新兴秘诀,并记住这一切都是非常新的,并且仍在迅速发展。
这是一张有点复杂的幻灯片,我将逐一介绍它。

粗略地说,我们有四个主要阶段:预训练、有监督微调、奖励建模、强化学习,依次类推。
现在在每个阶段我们都有一个数据集来支持。我们有一个算法,我们在不同阶段的目的,将成为训练神经网络的目标。然后我们有一个结果模型,然后在上图底部有一些注释。
Pretraining 预训练
我们要开始的第一个阶段是预训练阶段。

这个阶段在这个图中有点特殊,因为这个图没有按比例缩放。
实际上预训练消耗的时间占据了整个训练pipeline的99%。
因此,这个阶段就是我们在超级计算机中使用数千个 GPU 以及数月的训练来处理互联网规模数据集的地方。
其他三个阶段是微调阶段,更多地遵循少量 GPU 和数小时或数天的路线。
那么让我们来看看实现基础模型的预训练阶段。
首先,我们要收集大量数据。这是我们称之为数据混合的示例,该示例来自 Meta 发布的这篇论文,他们发布了这个 Llama 基础模型。

由上图可以看出,大约1个T的数据,作为Llama基础模型的训练集。那么数据有了,如何把这些数据转化成机器能够看懂的语言?
所以在我们实际训练这些数据之前,我们需要再经过一个预处理步骤,即标记化(tokenization)。

tokenization是文本片段与整数之间的一种无损转换,这个阶段有许多算法。通常您可以使用诸如字节编码之类的东西,将所有的文本转化为一个很长的整数列表。

下面我用LLama为例,是Meta的一个相当新的模型。
你可以看到,LLama的参数数量大概是650亿。现在,尽管与GPT3的1750亿个参数相比,Llama 只有65个B参数,但 LLama 是一个明显更强大的模型,直观地说,这是因为该模型的训练时间明显更长,训练了1.4 万亿标记而不是 3000 亿标记。所以你不应该仅仅通过模型包含的参数数量来判断模型的能力。
这里我展示了一些粗略的超参数表,这些超参数通常用于指定 Transformer 神经网络。比如头的数量,尺寸大小,层数等等。 在底部,我展示了一些训练超参数。例如,为了训练 65 B 模型,Meta 使用了 2,000 个 GPU,大约训练了 21 天,大约花费了数百万美元。 这是您在预训练阶段应该记住的粗略数量级。 现在,当我们实际进行预训练时,会发生什么? 一般来说,我们将获取标记并将它们放入数据批次中。

我们将tokenization后的数组输入Transformer,不可能全部一次性输入,需要用batch思想分批导入。
在此批量大小是B,T是最大上下文长度。
在我的这个图里,长度T只有10,实际工作里这可能是 2000、4000 等等。这些是非常长的行。
批量化后,我们就需要开始训练了。

我们只关注一个特定的单元格,但同样的事情会发生在这个图中的每个单元格上。
让我们看看绿色单元格。绿色单元会查看它之前的所有标记,所有标记都是黄色的,我们将把整个上下文输入到 Transformer 神经网络中,Transformer 将尝试预测 序列中的下一个标记,在本例中为红色。
不幸的是,我现在没有太多时间来详细介绍Transformer这个神经网络架构。
对于我们的目的来说,Transformer只是一大堆神经网络的东西,通常有几百亿个参数,或者类似的东西。当然,当您调整这些参数时,您会得到这些单元格中的每一个单元格的预测分布略有不同。
例如,如果我们的词汇表大小是 50,257 个标记,那么我们将拥有那么多数字,因为我们需要为接下来发生的事情指定概率分布。基本上,我们有可能发生任何事情。
现在,在这个特定的例子中,对于这个特定的单元格,513 将是下一个标记,因此我们可以将其用作监督源来更新Transformer的权重。将同样的做法应用于并行中的每个单元格,并且不断交换批次,并且试图让Transformer对序列中接下来出现的标记做出正确的预测。
由上图可以看到,预训练的目标其实很简单。
Each cell only "sees" cells in its row, andonly cells before it (on the left of it), to predict the next cell (on the right of it)
就是去预测下一个词,根据softmax概率分布,取出相应的词作为输出。
让我更具体地向您展示当您训练其中一个模型时的情况。

这实际上来自纽约时报,他们在莎士比亚上训练了一个小的 GPT,这是莎士比亚的一小段,他们在上面训练了一个 GPT。
一开始,在初始化时,GPT 以完全随机的权重开始,因此也将获得完全随机的输出。但是,随着时间的推移,当训练 GPT 的时间越来越长时,我们会从模型中获得越来越连贯和一致的样本。 当然,你从中抽样的方式是预测接下来会发生什么,你从那个分布中抽样,然后不断将其反馈到过程中,基本上就是对大序列进行抽样。到最后,你会看到 Transformer 已经学会了单词,以及在哪里放置空格,在哪里放置逗号等等。
随着时间的推移,模型正在做出越来越一致的预测。
然后以下这些,是您在进行模型预训练时会查看的图类型。

实际上,我们在训练时查看随时间变化的损失函数,低损失意味着我们的Transformer正在预测正确 - 为序列中正确的下一个整数提供更高的概率。
训练一个月后,我们将如何处理这个模型?
我们注意到的第一件事,在这个领域,这些模型基本上在语言建模过程中学习了非常强大的通用表示,并且可以非常有效地微调它们以用于您可能感兴趣的任何下游任务 .

举个例子,如果对情感分类感兴趣,过去的方法是收集一堆正面和负面的信息,然后为此训练某种 NLP 模型, 但新方法是忽略情感分类,直接去进行大型语言模型预训练,训练大型Transformer,然后你可能只有几个例子,已经可以非常有效地为该任务微调你的模型。
这在实践中非常有效。
这样做的原因基本上是 Transformer 被迫在语言建模任务中同时处理大量任务,因为就预测下一个标记而言,它被迫了解很多关于文本的结构和其中所有不同的概念。这就是 GPT-1。
在 GPT-2 前后,人们注意到比微调更好的是,你可以非常有效地提示(prompt)这些模型。
这些是语言模型,它们想要完成文档,所以你可以通过排列这些假文档来欺骗它们执行任务。

在这个例子中,例如,我们有一些段落,然后我们做 QA(问和答),QA,QA,几次提示,然后我们做 Q,然后,当 Transformer 试图完成文档时,它实际上是在回答我们的问题。
这就是一个提示工程(prompt engineering)基础模型的示例,通过提示工程让模型相信它正在模仿文档并让它执行特定的任务。
这开启了提示高于微调(prompt over finetuning)的时代。我们看到,即使没有对任何神经网络进行微调,它也可以在很多问题上非常有效。
从那时起,我们就看到了每个人都知道的,基础模型的完整进化树:

并非所有这些模型型号都可用。
例如,GPT-4 基础模型从未发布。您可能通过 API 与之交互的 GPT-4 模型不是基础模型,而是辅助模型,我们稍后将介绍如何获取这些模型;
GPT-3 基础模型可通过名为 DaVinci 的 API 获得;
GPT-2 基础模型可在我们的 GitHub 存储库上作为权重获得; 目前最好的(可以公开获得的)基础模型是 Meta 的 Llama 系列,尽管它没有商业许可。
需要指出的一件事是,基础模型不是助手(assistant,即类似ChatGPT的问答助手),它们不想回答你的问题,它们只是想完成文件。

所以如果你告诉基础模型:“写一首关于面包和奶酪的诗”,它会用更多的问题来回答问题。它只是在完成它认为是文档的内容。
但是,您可以在基础模型里以特定方式提示以更可能得到结果。例如,“这是一首关于面包和奶酪的诗"。在这种情况下,它将正确地自动完成。
你甚至可以欺骗基础模型成为助手,你这样做的方法是创建一个特定的小提示,让它看起来像是人和助手之间有一份文件,他们正在交换信息。

然后,在底部,您将查询放在最后,基础模型将自我调整为有用的助手和某种答案(生成这种形式的文档)。
这不是很可靠,在实践中也不是很好,尽管它可以做到。
Supervised Finetuning 有监督微调
相反,我们有不同的途径来制作实际的 GPT 助手(GPT Assistant),而不仅仅是基础模型文档完成器。 这将我们带入有监督的微调。

在有监督的微调阶段,我们将收集少量但高质量的数据集。在这种情况下,我们要求人工承包商收集及时和理想响应形式的数据。
我们收集很多这样的东西,通常是类似数万个这种数量。然后我们仍将对这些数据进行语言建模,因此算法上没有任何改变。 我们只是换出一个训练集。它曾经是互联网文档,那是一种量很大但质量不高的数据,我们换成用QA即时响应的数据。那是低数量但高质量的。
我们还是做语言建模,然后,训练之后,我们得到一个SFT(Supervised Finetuning 监督微调)模型。
你可以实际部署这些模型,它们是实际的助手,它们在一定程度上起作用。
让我向您展示示例演示的样子。这里有一个人类承包商可能会想出的东西,这是一个随机的演示:

你写了一篇关于垄断一词的相关性的简短介绍,或者类似的东西,然后承包商也写下了一个理想的回应。当他们写下这些回复时,他们遵循大量的标签文档,并且要求他们生成提供帮助、真实且无害的回答。
这是这里的标签说明。
你可能看不懂,我也看不懂,它们很长,人们按照说明并试图完成这些提示。
这就是数据集的样子,你可以训练这些模型,这在一定程度上是有效的。
Reward Modeling 奖励建模
现在,我们可以从这里继续流程,进入 RLHF,即“从人类反馈中强化学习”,它包括奖励建模和强化学习。

让我介绍一下,然后我将回过头来讨论为什么您可能想要完成额外的步骤,以及这与 仅有SFT 模型相比如何。
在奖励建模步骤中,我们现在要做的是将数据收集转变为比较形式。
下面是我们的数据集的示例。
顶部是相同的提示,它要求助手编写一个程序或一个函数来检查给定的字符串是否为回文。
然后我们做的是采用已经训练过的 SFT 模型,并创建多个补全。在这种情况下,我们有模型创建的三个补全。然后我们要求人们对这些补全进行排名。

如果你盯着它看一会儿——顺便说一下,要比较其中的一些预测是非常困难的事情,而且这可能需要人们甚至几个小时来完成一个提示补全的比较。但假设我们决定,其中一个比其他的好得多,依此类推,我们对它们进行排名。
然后,我们可以对这些补全之间的所有可能对,进行看起来非常像二元分类的东西(以进行排序)。

接着,要做的是将提示按行排列,这里所有三行的提示都是相同的,但补全方式不同,黄色标记来自 SFT 模型,我们在最后附加另一个特殊的奖励读出标记,基本上只在这个单一的绿色标记上监督Transformer。Transformer会根据提示的完成程度预测一些奖励。
Transformer对每个补全的质量进行了猜测,然后,一旦对每个补全进行了猜测,我们就有了模型对它们排名的基本事实,而我们实际上可以强制其中一些数字应该比其他数字高得多,我们将其制定为损失函数,并训练我们的模型,使得模型做出与来自人类承包商的比较事实数据相一致的奖励预测。
这就是我们训练奖励模型的方式。这使我们能够对提示的完成程度进行评分。
Reinforcement Learning 强化学习
现在我们有了奖励模型,但我们还不能部署它。
因为它本身作为助手不是很有用,但是它对于现在接下来的强化学习阶段非常有用。

因为我们有一个奖励模型,所以我们可以对任何给定提示(prompt)的任意完成/补全(completion)质量进行评分。
我们在强化学习期间所做的基本上是再次获得大量提示,然后针对奖励模型进行强化学习。
这就是它的样子:

我们接受一个提示,将其排成行,现在我们使用想要训练的模型,将该模型初始化为 SFT 模型,以创建一些黄色的补全。
然后,再追加奖励标记,按照已经固定不变的奖励模型读出奖励分数,现在这个奖励模型的评分不再变化。奖励模型告诉我们这些提示的每一次完成的质量。
我们现在基本上可以用(和前面)相同的语言建模损失函数,但我们目前正在对黄色标记进行训练,并且我们正在通过奖励模型指示的奖励来权衡语言建模目标。
例如,在第一行中,奖励模型表示这是一个相当高的完成度,因此我们碰巧在第一行采样的所有标记都将得到强化,它们将 获得更高的未来概率。相反,在第二行,奖励模型真的不喜欢这个完成,负 1.2,因此我们在第二行采样的每个标记在未来都会有更低的概率。
我们在很多提示、很多批次上一遍又一遍地这样做,基本上,我们得到一个在这里创建黄色标记的策略,让所有完成标记都会根据我们在前一阶段训练的奖励模型获得高分。
这就是我们训练的方式——这就是 RLHF 流程。
最后,您得到了一个可以部署的模型。例如,ChatGPT 是 RLHF 模型。您可能会遇到其他一些模型,例如 Kuna 13B 等,这些都是 SFT 模型。
我们有基础模型、SFT 模型和 RLHF 模型,这基本上是可用模型列表的事物状态。
你为什么想要做 RLHF?一个不太令人兴奋的答案是它的效果更好。

以上这个图来自instructGPT论文。
这些 PPO 模型是 RLHF,根据前一段时间的这些实验,我们看到把它们提供给人类时,它们在很多比较中更受欢迎。与提示为助手的基础模型相比,与 SFT 模型相比,人类基本上更喜欢来自 RLHF 模型的标记(输出文字)。
它就是工作得更好。
但你可能会问为什么?为什么效果更好?
我不认为社区有一个一致的令人惊奇的答案,但我可能提供一个原因:它与计算比较容易程度与生成容易程度之间的不对称有关。

让我们以生成俳句为例。假设我请模特写一首关于回形针的俳句。
如果你是一个试图提供训练数据的承包商,那么想象一下,作为一个为 SFT 阶段收集基本数据的承包商,你应该如何为一个回形针创建一个漂亮的俳句?
你可能不太擅长这个。
但是,如果我给你举几个俳句的例子,你可能会比其他人更能欣赏其中的一些俳句。
因此,判断其中哪一个是好的是一项容易得多的任务。
基本上,这种不对称性使得比较成为一种更好的方式,可以潜在地利用你作为一个人和你的判断力来创建一个稍微更好的模型。
但是,RLHF 模型在某些情况下并不是对基础模型的严格改进。
特别是,我们注意到,例如,RLHF模型失去了一些熵,这意味着它们给出了更多的峰值结果。

它们可以输出更低的变化,可以输出比基础模型变化更少的样本。
基础模型有更多熵,会给出很多不同的输出。我仍然更喜欢使用基础模型的一种地方是。。。比如有 n 个东西并且想要生成更多类似东西的场景中。

这是我刚刚编造的一个例子
我想生成很酷的口袋妖怪名字。我给了它七个口袋妖怪的名字,让基础模型完成了文档。它给了我更多的口袋妖怪名字。
这些都是虚构的,我还试图查找它们,确定它们不是真正的口袋妖怪。
这是我认为基础模型擅长的任务,因为它仍然有很多熵,并且会给你很多不同的、很酷的、更多的东西,看起来像你以前给它的任何东西。
说了这么多,这些是你现在可以使用的辅助模型,有一些数字:

伯克利有一个团队对许多可用的助手模型进行排名,并基本上给了它们 ELO 评级。
目前最好的模型毫无疑问是 GPT-4,其次是 Claude,GPT-3.5,然后是一些模型,其中一些可能作为权重提供,比如 Kuna、Koala 等。
这里排名前三的是 RLHF 模型,据我所知,我相信所有其他模型都是 SFT 模型。