OpenAI联合创始人Karpathy《State of GPT》:深入浅出解读大模型训练和应用
【ANDY】本文分为两部分,第一部分为演讲全文,第二部分为要点总结。业界大神级人物 Karpathy 的演讲内容丰富,清晰易懂,既有理论,也包含实操。
Source: https://build.microsoft.com/en-US/sessions/db3f4859-cd30-4445-a0cd-553c3304f8e2
Andrej Karpathy
AI研究员兼OpenAI创始成员
Andrej Karpathy是OpenAI的研究员和创始团队成员。从2017年到2022年,他担任特斯拉的AI总监,领导了特斯拉Autopilot的计算机视觉团队。他在斯坦福大学获得计算机科学博士学位,在那里开发了早期的多模态深度神经网络,用于处理图像和文本,例如图像字幕应用程序。
他还是CS231n(http://cs231n.stanford.edu/)的主要讲师,这是斯坦福大学的第一门深度学习课程,由他设计,后来成为人工智能课程中规模最大的课程之一。
------+------+------[分割线]------+------+------
大家好!
我很高兴在这里向您介绍 GPT 的现状——更具体地讲——关于快速增长的大型语言模型生态系统。
我想将演讲分为两部分:
第一部分,如何训练GPT助手(GPT assistants)。
第二部分,如何有效地将这些助手用于应用程序。
首先,来看看如何训练这些助手的最新方法。
请记住:这一切都是非常新的,且发展迅速。
到目前为止,大致的方法如下:
这是一张复杂的幻灯片,所以我将逐一介绍它。
大致而言,有四个主要阶段:
预训练(Pretraining)
有监督微调(Supervised Finetuning)
奖励建模(Reward Modeling)
强化学习(Reinforcement Learning)
按顺序依次进行。
在每个阶段,都有一个为该阶段提供支持的数据集;和一个算法,就我们的目的而言,它将成为训练神经网络的目标;然后得到一个最终的模型。
底部还有一些备注。
Pretraining 预训练
我们要开始的第一阶段是预训练阶段。这个阶段在这个图中有点特殊,并且图表的比例并不准确,因为几乎所有的计算工作都是在这个阶段进行的,占据了99%的训练计算时间和计算量。
这就是我们正在处理超级计算机中具有数千个GPU的互联网规模数据集的地方,并且训练时间可能长达数月。
其它三个阶段是微调阶段,使用较少数量的GPU,并且只需要几个小时或几天的时间。
让我们看一下实现基本模型的预训练阶段。
首先,要收集大量数据。下面是一个我们称之为数据混合的示例,来自 Meta 发布的这篇论文,在该文中,他们发布了这个基于 LLaMA 的模型。
您可以大致看到输入到这些集合中的数据集类型。有Common Crawl,它只是一个Web抓取,C4,这也是一个Common Crawl,然后还有一些高质量的数据集。例如,GitHub、Wikipedia、书籍、ArXiv、StackExchange等。它们都混合在一起,然后根据一些给定的比例进行采样,这形成了 GPT 神经网络的训练集。
在真正开始对这些数据进行训练之前,需要再经历一个预处理步骤,即标记化(tokenization)。基本上是从互联网上抓取的原始文本的翻译成整数序列,因为这是GPT运行的原生表示。
这是一种无损的文本和标记(token)以及整数之间的转换方式,有许多算法可用于此阶段。通常情况下,您可以使用像字节对编码(byte pair encoding)这样的方法,它会迭代地合并小的文本片段并将它们分组为标记。
这里我展示了一些这些标记的示例片段,然后这是将实际输入到Transformer中的原始整数序列。
这里展示了两个控制此阶段的超参数的示例。
关于GPT-4的训练方式等详细信息,我们没有发布太多的信息。所以我使用了GPT-3的数据,但是GPT-3现在已经有大约三年的历史了,有点过时。但LLaMA是Meta的一个相当新的模型。
这些大致是我们在进行预训练时要处理的数量级。词汇量通常为 10000 个标记。上下文长度通常为 2000、4000,或者现在甚至达到 100000。这决定了 GPT 在尝试预测序列中的下一个整数时将查看的最大整数数。
你可以看到,LLaMA的参数数量大致是650亿。尽管与 GPT-3 的1750亿个参数相比,LLaMA 只有650亿个参数,但 LLaMA 是一个功能更强大的模型,直观地讲,这是因为该模型的训练时间要长得多,在这种情况下,1.4万亿个标记,而不仅仅是3000亿个标记。不应该仅仅通过模型包含的参数数量来判断模型的能力。
下面,我将展示一些包含许多超参数的表格,这些超参数通常用于指定Transformer神经网络。所以头的数量,尺寸大小,层数等等。
在底部,我展示了一些训练超参数。例如,为了训练 65B 模型,Meta 使用了 2000 个 GPU,大约训练了 21 天,大约花费了数百万美元。这就是你在预训练阶段应该记住的粗略数量级。
当我们真正进行预训练时,会发生什么?一般来说,我们将获取我们的标记,并将它们布置成数据批次。我们有这些数组将馈送到Transformer中,这些数组是 B,即批量大小,这些都是按行堆叠的独立示例,B x T,T 是最大上下文长度。
在我的图片中,只有 10 个,但这是上下文长度,所以这可能是 2000、4000 等等。这些是非常长的行,我们所做的就是把这些文档打包成行,然后用这些特殊的文本结尾标记来分隔它们,基本上告诉Transformer新文档从哪里开始。
这里我有几个文档的例子,然后我把它们扩展到这个输入中。
我们将所有这些数字输入Transformer。让我只关注一个特定的单元格,但是同样的事情将发生在这张图中的每个单元格上。
让我们看一下绿色单元格。绿色单元格将查看它之前的所有标记,因此所有标记都是黄色的。我们将把整个上下文输入到Transformer神经网络中。Transformer将尝试预测序列中的下一个标记,在本例中为红色。
不幸的是,我没有太多时间去介绍这个神经网络架构的全部细节,但它只是一大堆神经网络的东西,它通常有几个100亿个参数,或者类似量级。
当然,当调整这些参数时,你会得到每个单元格的预测分布略有不同。例如,如果我们的词汇量是 50257 个标记,那么我们将有那么多数字,因为我们需要为接下来发生的事情指定一个概率分布,这样我们基本上就有了接下来可能发生的事情的概率。
在这个特定单元格的特定示例中,接下来将出现 513。因此,我们可以将其用作监督来源来更新Transformer的权重。所以我们基本上把它应用到平行的每个单元格上。并且不断交换批次,试图让Transformer对下一个序列中的标记做出正确的预测。
让我更具体地向您展示当您训练其中一个模型时会是什么样子。
这实际上来自纽约时报,他们训练了一个关于莎士比亚的小GPT。这是莎士比亚的一小段,用它训练了他们的GPT。
在初始化开始时,GPT 从完全随机的权重开始,所以只是得到完全随机的输出。但随着时间的推移,随着训练 GPT 的时间越来越长,会从模型中得到越来越连贯和一致的样本。
当然,从中抽样的方式是预测接下来会发生什么。从这个分布中采样,然后不断反馈到过程中,基本上可以对大序列进行采样。
所以到最后,会看到Transformer已经学会了单词,在哪里放置空格,在哪里放置逗号等等。因此,随着时间的推移,我们正在做出越来越一致的预测。
这些是在进行模型预训练时查看的图。
实际上,我们正在研究随时间推移的损失函数,因为您可以进行训练。低损耗意味着我们的Transformer预测正确 —— 为序列中的正确下一个整数提供更高的概率。
训练一个月后,我们将如何处理这个模型?
我们注意到的第一件事是,我们在这个领域,这些模型基本上是在语言建模的过程中,学习非常强大的一般表示,并且可以非常有效地微调它们,以适应你可能感兴趣的任何任意下游任务。
举个例子,如果你对情绪分类感兴趣,过去的方法就是收集一堆积极和消极的东西,然后为此训练某种NLP模型。但是新的方法是忽略情绪分类,去做大型语言模型的预训练,训练大型Transformer,你可能只有几个例子,你可以非常有效地微调你的模型来完成这项任务。
这在实践中非常有效。这样做的原因是,基本上Transformer被迫在语言建模任务中处理大量任务,因为仅仅在预测下一个标记方面,它就被迫理解很多关于文本的结构和其中的所有不同概念。
这就是 GPT-1。
在 GPT-2 的时候,人们注意到实际上比微调更好,实际上可以非常有效地提示(prompt)这些模型。
这些是语言模型,它们想要完成文档,所以你实际上可以通过排列这些假文档来欺骗它们执行任务。
例如,在这个例子中,我们有一些段落,然后我们有点像做,“Q&A,Q&A,Q&A”,这被称为少量提示尝试,然后我们做Q,然后当Transformer尝试完成文档时,它实际上是在回答我们的问题。
这是一个提示工程(prompt engineering)基础模型的例子,让它相信它有点模仿一个文档,它正在让它执行一个任务。
这开启了提示高于微调(prompt over finetuning)的时代。这实际上可以在很多问题上很好地工作,即使没有训练任何神经网络微调等。
从那以后,我们已经看到了每个人都训练过的基础模型的整个进化树。并非所有这些型号都可用。例如,GPT-4 基本模型从未发布。您可能通过 API 与之交互的 GPT-4 模型不是基本模型。而是辅助模型,我们将介绍如何获得这些模型。
GPT-3 基本模型可通过名为 DaVinci 的 API 获得,GPT-2 基本模型甚至可以在我们的 GitHub 存储库中作为权重使用。但目前最好的基础模型可能是 Meta 的 LLaMA 系列,尽管它没有商业许可。
需要指出的一件事是基本模型不是助手。它们不想回答你的问题。它们只想完成文件。所以如果你告诉它们,“写一首关于面包和奶酪的诗”,它只会用更多的问题回答问题。它只是完成了它认为是一份文件的东西。
但是,对于更有可能工作的基本模型,您可以以特定方式提示它们。举个例子,这里有一首关于面包和奶酪的诗,在这种情况下,它会自动正确完成。
甚至可以欺骗基本模型成为助手。这样做的方式是:创建一个特定的几个小提示,让它看起来像是人类和助手之间有某种文档,它们正在交换某种信息。
然后在底部,把查询放在最后,基本模型会有点像条件本身,就像一个有用的助手和答案。但这不是很可靠,在实践中效果也不是很好,尽管可以做到。
Supervised Finetuning 有监督微调
相反,我们有不同的途径来制作实际的 GPT 助手,而不仅仅是基本的模型文档完成者。因此,这需要我们进行有监督微调。因此,在有监督微调阶段,我们将收集小型但高质量的数据集。在这种情况下,我们将要求人类承包商收集迅速和理想响应形式的数据。我们将收集很多这样的,通常是数以万计或类似的东西。
然后,我们仍然会对这些数据进行语言建模。所以算法上没有任何变化。我们只是交换了一个训练集。所以它曾经是互联网文档,这是一个高数量/低质量,基本上是QA快速响应类型的数据,那就是低数量/高质量。
所以我们仍然会做语言建模。然后经过训练,我们得到一个SFT(Supervised Fine-Tuning)模型,你可以实际部署这些模型,它们是实际的助手,它们在某种程度上是有效的。
让我向您展示示例演示可能是什么样子的。所以这是人类承包商可能会想出的东西。这里有一些随机的提示,“你能写一个关于垄断一词相关的简短介绍吗”或类似的东西?然后承包商也写出一个理想的回应。
当它们写出这些回复时,它们遵循了大量的标签文档,并被要求提供帮助、真实和无害。这些是此处的标签说明。你可能看不懂,我看不懂,但它们很长,这只是人们按照说明并尝试完成这些提示。
这就是数据集的样子。你可以训练这些模型,这在某种程度上是有效的。
Reward Modeling 奖励建模
可以从这里继续流程,进入RLHF(Reinforcement Learning from Human Feedback),从人类反馈中进行强化学习,其中包括奖励建模和强化学习。
让我介绍一下,然后我将回到为什么您可能想要完成额外的步骤以及它与仅SFT模型的比较。
在奖励建模步骤中,我们现在要做的是将数据收集转变为比较的形式。
下面是我们的数据集的外观示例。我有相同的提示,顶部相同的提示,它要求助手编写一个程序或函数来检查给定字符串是否是回文。
然后我们所做的是采用我们已经训练过的SFT模型,并创建多个完成。因此,在本例中,我们有三个模型创建的完成。然后我们要求人们对这些完成进行排名。
如果你盯着这个看一会儿,顺便说一下,这些事情很难比较其中一些预测,这可能需要人们甚至花费几个小时才能获得单个提示完成对。但是,假设我们决定其中一个比其它的要好得多,依此类推,所以我们对它们进行排名。然后,我们可以遵循一些看起来非常像这些完成之间所有可能对的二元分类的东西。
我们现在要做的是将提示按行布局,并且此处所有三行的提示都是相同的。所以它都是相同的提示,但完成是不同的,所以黄色标记来自SFT模型。
然后我们所做的就是在最后附加另一个特殊的奖励读数标记,我们基本上只监督这个绿色标记的Transformer,Transformer会基于它完成该提示有多好给出一些奖励。
它基本上可以猜测每个完成的质量。然后,一旦它对它们中的每一个都进行了猜测,我们也有了基本事实,即告诉我们它们的排名。因此,我们实际上可以强制要求其中一些数字应该比其它数字高得多,等等。我们将其表述为损失函数,并训练我们的模型做出与所有这些承包商比较得出的基本事实一致的奖励预测。
这就是我们训练奖励模型的方式,这使我们能够对提示的完成程度进行评分。
我们有了奖励模型,但无法部署它,因为它本身作为助手不是很有用,但它对于现在的强化学习阶段非常有用。因为我们有一个奖励模型,我们可以对任何给定提示的任何任意完成的质量进行评分。
Reinforcement Learning 强化学习
所以我们在强化学习中所做的是,我们基本上又得到了大量的提示,我们根据奖励模型进行强化学习。
这是它的样子。我们采用单个提示,将其按行布局,现在我们使用 SFT 模型。我们基本上使用我们想要训练的模型,初始化为 SFT 模型,以黄色创建一些完成。然后我们再次附加奖励标记,并根据奖励模型读取奖励,该模型现在保持固定。它不再改变。
奖励模型告诉我们这些提示的每次完成的质量。因此,我们能做的是,我们现在基本上可以应用相同的语言建模损失函数,但我们目前正在使用黄色标记进行训练。我们正在通过奖励模型指示的奖励来衡量语言建模目标。
例如,在第一行中,奖励模型表示这是一个相当高的得分完成。因此,我们碰巧在第一行采样的所有标记都将得到加强,并且它们将来将获得更高的概率。相反,在第二行,奖励模型确实不喜欢这个完成,-1.2。因此,我们在第二行中采样的每个标记在未来的概率都会略高。我们在许多提示上,在许多批次上一遍又一遍地这样做。基本上,我们得到一个策略,它在这里创建黄色标记,基本上是所有这些,根据我们在上一阶段训练的奖励模型,这里的所有完成都会得分很高。
这就是我们的训练方式。这就是RLHF管道。最后,你会得到一个可以部署的模型。因此,举个例子,ChatGPT 是一个 RLHF 模型,但您可能会遇到的其它一些模型,这些都是 SFT 模型。我们有基本模型,SFT模型和RLHF模型。
为什么要做RLHF?一个不太令人兴奋的答案是它只是工作得更好。这来自指导 GPT 论文。根据前段时间的这些实验,这些PPO模型是RLHF。我们看到,当我们把它们交给人类时,它们基本上只是在很多比较中的首选。与SFT模型相比,与提示成为助手的基本模型相比,人类只是更喜欢来自RLHF模型的标记。所以,它只是工作得更好。
但你可能会问为什么?为什么效果更好?我不认为有一个社区真正同意的惊人答案,但我只想提供一个潜在的原因,这与计算比较与生成的难易程度之间的不对称性有关。
让我们举一个生成俳句的例子。假设我让一个模特写一个关于回形针的俳句。如果你是一个试图提供训练数据的承包商,那么想象一下作为一个承包商,为SFT收集基本数据。你应该如何为回形针创造一个漂亮的俳句?你可能只是不太擅长,但如果我给你几个俳句的例子,你可能会比其它俳句更欣赏其中一些俳句。因此,判断其中哪一个是好的要容易得多。所以,基本上这种不对称性使得比较是一种更好的方式,可以潜在地利用你自己,作为一个人,以及你的判断来创建一个稍微好一点的模型。
在某些情况下,RLHF模型并不是对基本模型的严格改进。特别是,我们已经注意到,例如,它们失去了一些熵。这意味着它们给出了更多的(PT?)结果。它们可以输出较低的变化。它们可以输出变异小于基本模型的样本。基本模型有很多熵,会给出很多不同的输出。
例如,我仍然更喜欢使用基本模型的一种地方是在设置中,基本上有 n 个东西,并且希望生成更多类似的东西。所以,这是我刚刚准备的一个例子。我想生成很酷的神奇宝贝名称。我给它起了七个神奇宝贝的名字,我要求基本模型完成文档。它给了我更多的神奇宝贝名字。这些都是虚构的。我试着查一下。我不相信有真正的神奇宝贝。这是我认为基础模型擅长的任务,因为它仍然有很多熵,会给你很多多样化、很酷的东西,看起来像你以前给它的东西。
话虽如此,这些有点像此时您可能可以使用的助手模型。伯克利有一个团队对很多可用的助理模型进行了排名,并给了它们基本上ELO评级。目前,一些最好的模型当然是 GPT-4,到目前为止,我会说,其次是Claude、GPT 3.5,然后是一些模型。其中一些可能作为重量提供,如Kuna、Koala等。这里的前三行,它们都是RLHF模型,据我所知,所有其它模型都是SFT模型。
这就是我们如何在高层次上训练这些模型。
现在,我将换个角度,让我们看看如何最好地将 GPT 助手模型应用于您的问题。
我想举一个具体的例子。让我们在这里使用具体示例。假设你正在写一篇文章或一篇博客文章,你要在最后写这句话。“加州的人口是阿拉斯加的53倍。”出于某种原因,您希望比较这两个州的人口。
想想丰富的内心独白和工具使用,以及你的大脑中实际计算了多少工作来生成这最后一句话。这也许是你大脑中的样子。
对于下一步,让我写博客。让我比较一下这两个人群。首先,很明显,我需要得到这两个人口。我知道我可能不知道这些人群,所以我有点像知道我知道或不知道我的自我认识,对吧?我做了一些工具使用,去维基百科,查找加利福尼亚的人口和阿拉斯加的人口。
现在我知道我应该将两者除以,但同样,我知道将 39.2 除以 0.74 不太可能成功。这不是我脑子里能做的那种事情。因此,我将依靠计算器。我将使用一个计算器,打入它,看到输出大约是 53。然后也许我会在我的大脑中进行一些反思和理智检查,这样 53 是有意义的。这是相当大的比例,但加州是人口最多的州,所以也许看起来还可以。
然后我有了我可能需要的所有信息,现在我进入了写作的创造性部分。我可能会开始写这样的话,“加州有53倍。”然后我对自己说,这实际上是非常尴尬的措辞。让我实际删除它,让我再试一次。所以,当我写作时,我有一个单独的过程,几乎是检查我正在写的东西并判断它是否好看。然后也许我删除了它,也许我重新构建了它,然后也许我对结果感到满意。
基本上,长话短说,当你创建这样的句子时,你的内心独白会发生很多事情。
但是,当我们在上面训练 GPT 时,这样的句子是什么样子的?
从 GPT 的角度来看,这只是一系列标记。GPT,当它读取或生成这些标记时,它只是去块、块、块、块,每个块对每个标记的计算工作量大致相同。而且这些Transformer不是很浅的网络。它们有大约80层推理,但80层仍然不算太多。所以,这个Transformer将尽最大努力模仿,但是当然,这里的过程看起来与你采取的过程非常非常不同。
特别是,在我们的最终工件中,在我们创建然后最终提供给LLM的数据集中,所有这些内部对话都被完全剥离。与您不同的是,GPT 将查看每个标记,并在每个标记上花费相同数量的计算。因此,你不能指望它真的喜欢——你不能指望它为每个标记做太多的工作。
而且,特别是,基本上这些Transformer就像标记模拟器一样。它们不知道它们不知道什么。它们只是模仿下一个标记。它们不知道自己擅长或不擅长什么。它们只是尽力模仿下一个标记。它们不会在循环中反思。它们不理智检查任何东西。默认情况下,它们不会在此过程中纠正错误。它们只是对标记序列进行采样。它们的脑海中没有单独的内心独白流,对吧?它们正在评估正在发生的事情。
它们确实有某种认知优势,那就是它们实际上在很多领域都有非常多的基于事实的知识,因为它们有,比如说,几个100亿个参数。这是很多事实的大量存储空间,我认为它们也具有相对大而完美的工作记忆。任何适合上下文窗口的内容都可以通过其内部自我注意机制立即提供给Transformer。所以,它有点像完美的记忆,但它的大小是有限的。但是Transformer可以非常直接地访问它。因此,它可以无损地记住其上下文窗口中的任何内容。
这就是我比较这两者的方式。我提出所有这些的原因是,我认为在很大程度上,提示只是弥补了这两种架构之间的认知差异,就像我们的大脑和LLM的大脑一样。你几乎可以这样看。
例如,人们发现的一件事在实践中效果很好。特别是如果你的任务需要推理,你不能指望Transformer对每个标记做太多的推理。因此,您必须真正将推理分散到越来越多的标记中。例如,你不能给Transformer一个非常复杂的问题,并期望它在单个标记中得到答案。只是没有足够的时间。这些Transformer需要标记来思考,引用/取消引用,我有时喜欢说。
所以,这是一些运作良好的事情。例如,您可能有一些简短的提示,向Transformer显示它在回答问题时应显示其工作。如果你举几个例子,Transformer会模仿那个模板,它最终会在评估方面做得更好。
此外,你可以从Transformer中引出这种行为,让我们一步一步地思考,因为这会让Transformer展示它的工作。而且因为它有点卡入一种显示其工作的模式,所以每个标记的计算工作会更少。因此,它更有可能因此而成功,因为它随着时间的推移进行较慢的推理。
这是另一个例子。这称为自洽。我们看到我们有能力开始写作,然后它没有成功。我可以再试一次,我可以尝试多次,也许选择效果最好的一种。在这类方法中,你可能不只是采样一次,但你可以多次采样,然后有一些过程来找到好的样本,然后只保留这些样本或进行多数投票,或类似的事情。基本上,这些Transformer在这个过程中预测下一个标记,就像你一样,它们可能会倒霉。而且它们可能采样的不是很好的标记,在推理方面,爱他们可以走得有点像一条死胡同。
与您不同,它们无法从中恢复过来。它们被它们采样的每一个标记所困。因此,它们会继续这个序列,即使它们甚至知道这个序列不会奏效。让它们有能力回头看,检查或试图找到,尝试基本上在它周围取样。
这也是一种技术。事实证明,实际上,LLM,它们知道自己什么时候搞砸了。
举个例子,假设你让模型生成一首不押韵的诗,它可能会给你一首诗,但它实际上是押韵的。但事实证明,特别是对于较大的型号,例如 GPT-4,您可以问它,您是否完成了任务?实际上,GPT-4 非常清楚它没有完成任务。它只是在采样中有点不走运。所以,它会告诉你,不,我实际上没有完成任务。让我再试一次。
但是没有你的提示,它甚至不知道。它不知道重新检查,等等。你必须在提示中弥补这一点。你必须让它检查。如果你不要求它检查,它就不会自己检查。它只是一个标记模拟器。
我认为更一般地说,这些技术中的很多都属于我所说的重建我们的系统2的范畴。你可能熟悉系统1,系统2对人类的思考。系统1是一个快速,自动的过程,我认为有点对应于LLM只是采样标记。系统2是你大脑中较慢、深思熟虑的计划部分。
这是一篇上周的论文,因为这个领域正在迅速发展。它被称为思考之树(Tree of Thought),在思考之树中,本文的作者建议为任何给定的提示保持多次完成。然后它们也一路上得分,并保持那些进展顺利的,如果这有意义的话。所以,很多人真的在玩弄某种快速的工程,基本上带回了我们大脑中LLM的一些能力。
我想在这里指出的一件事是,这不仅仅是一个提示。这实际上是与一些 Python Glue 代码一起使用的提示,因为你实际上必须维护多个提示,并且您还必须在这里做一些树搜索算法来找出哪些提示要扩展,等等。它是Python Glue 代码和单个提示的共生体,这些提示在(野生?)循环或更大的算法中调用。
我也认为这里与AlphaGo有一个非常酷的相似之处。AlphaGo下围棋有一个放下一块棋子的策略,这个策略最初是通过模仿人类来训练的。但除了这个策略,它还做蒙特卡洛树搜索。基本上,它会在脑海中发挥出许多可能性并评估所有这些可能性,并且只保留那些运行良好的可能性。所以,我认为这有点等同于AlphaGo,但对于文本来说,如果这有意义的话。
就像思考之树一样,我认为更普遍的是,人们开始真正探索更通用的技术,不仅仅是一个简单的问题/答案提示,而是看起来更像Python Glue 代码的东西,将许多提示串在一起。
在右边,我有一篇名为 React 的论文示例,它们将提示的答案构建为一系列思想、行动、观察、思想、行动、观察。这是一个完整的展开,一种回答查询的思考过程。在这些动作中,模型也被允许工具使用。
在左侧,我有一个自动 GPT 的示例。顺便说一下,AutoGPT是一个我认为最近被炒作的项目,但我认为我仍然觉得它有点鼓舞人心的有趣。这是一个允许LLM保留任务列表并继续递归分解任务的项目。而且我认为这目前效果不佳,我不建议人们在实际应用中使用它。我只是认为,随着时间的推移,这通常是从中汲取灵感的东西。
这有点像给我们的模型系统2思考。
接下来我觉得有点有趣的事情是,我想说,LLM的心理怪癖(psychological quirk)是LLM不想成功。它们想模仿。你想成功,你应该要求它。我的意思是,当Transformer接受训练时,它们有训练集。它们的训练数据中可以有一整套性能质量。
例如,可能会有某种物理问题的提示或类似的东西,并且可能有一个完全错误的学生解决方案,但也可能存在非常正确的专家答案。Transformer无法区分低质量——我的意思是,它们知道低质量的解决方案和高质量的解决方案,但默认情况下,它们想模仿所有这些,因为它们只是接受过语言建模的训练。因此,在测试时,您实际上必须要求良好的输出。
在这个例子中,在本文中,它们尝试了各种提示,让我们一步一步地思考是非常强大的,因为它有点像将推理分散到许多标记上。但更好的是,让我们一步一步地解决这个问题,以确保我们有正确的答案。所以,这有点像得到正确答案的条件。这实际上使Transformer工作得更好,因为Transformer现在不必在低质量的解决方案上对冲其概率质量,尽管这听起来很荒谬。
因此,基本上,请随时要求一个强大的解决方案。比如说,你是这个话题的领先专家,假装你有 IQ 120,等等。但不要试图要求太多的智商,因为如果你要求智商像400,你可能会失去数据分发,或者更糟糕的是,你可能在一些科幻内容的数据分发中,它会开始承担一些科幻角色扮演或类似的东西。我认为,你必须找到合适的智商。它有一些U形曲线。
接下来,正如我们所看到的,当我们试图解决问题时,我们知道我们擅长什么、不擅长什么,并且我们依靠计算工具。想对你的LLM做同样的事情。特别是,我们可能希望为它们提供计算器,代码解释器等,进行搜索的能力,并且有很多技术可以做到这一点。
再次要记住的一件事是,默认情况下,这些Transformer可能不知道它们不知道什么。你甚至可能想在提示中告诉Transformer,你不太擅长心算。每当您需要进行非常大的数字加法、乘法或其它任何操作时,请使用此计算器。以下是您使用计算器的方式。使用此标记组合,等等,等等。你必须把它说出来,因为默认情况下,模型不知道它擅长或不擅长什么,就像你和我一样。
接下来,我认为非常有趣的是,我们从一个只有检索的世界出发。一路走来,钟摆已经摆动到了另一个极端,它只在LLM中是记忆。但实际上,在这些检索增强模型之间有整个空间,这在实践中非常有效。
正如我所提到的,Transformer的上下文窗口是它的工作内存。如果您可以使用与任务相关的任何信息加载工作内存,则该模型将运行得非常好,因为它可以立即访问所有内存。所以,我认为很多人真的对检索增强生成感兴趣。在底部,有一个LAMA索引的例子,它有一种数据连接器可以连接到许多不同类型的数据。可以索引所有这些数据,可以让它被LLM访问。
新兴的方法是,你获取相关文档,将它们分成块,嵌入所有块,然后基本上得到表示该数据的嵌入向量。您将其存储在向量存储中,然后在测试时,对向量存储进行某种查询。然后,获取可能与您的任务相关的块,并将它们填充到提示符中,然后生成。这在实践中可以很好地工作。
这类似于你我解决问题的时候,你可以凭记忆做任何事情,Transformer的记忆力非常大,而且,引用一些主要文档确实有帮助。每当你发现自己回到教科书上寻找一些东西,或者当你发现自己回到图书馆的文档去查找一些东西时,Transformer肯定也想这样做。您对库的某些文档的工作方式有一些记忆,但最好查找它。这同样适用于这里。
接下来,我想简要谈谈约束提示(Constraint prompting)。我也觉得这很有趣。这基本上是在LLM的输出中强制执行某个模板的技术。实际上,指导是微软的一个例子。在这里,我们强制LLM的输出将是JSON。这实际上可以保证输出将采用这种形式,因为它们进入并弄乱了从Transformer中产生的所有不同标记的概率,并且它们夹紧了这些标记。然后Transformer只是在这里填补空白。然后,您可以对可能进入这些空白的内容实施其它限制。
这可能真的很有帮助,我认为这种约束抽样也非常有趣。
我还想就微调(Finetuning)说几句话。在这种情况下,通过快速工程可以走得很远,但也可以考虑微调模型。
微调模型意味着您实际上要更改模型的权重。在实践中,这样做变得越来越容易,这是因为最近已经开发了许多技术并拥有库。
例如,像 LoRA 这样的参数高效微调技术,确保只训练模型的小而稀疏的部分。大部分模型都固定在基本模型上,并且允许更改其中的某些部分。从经验上讲,它仍然运行良好,并且使得仅调整模型的一小部分要便宜得多。这也意味着,由于您的大部分模型都是固定的,因此您可以使用非常低精度的推理来计算这些部分,因为它们不会通过梯度下降进行更新。因此,这也使一切变得更加高效。
此外,正如我所提到的,我们目前有许多开源的、高质量的模型。我认为LAMA相当不错,尽管我相信它现在没有商业许可。
要记住的是,基本上,微调在技术上要复杂得多。我认为,这需要更多的技术专长才能做对。它需要人工数据承包商来处理数据集和/或合成数据管道,这可能非常复杂。这肯定会大大减慢您的迭代周期。
从高层次上来说,SFT(有监督微调)是可行的,因为它延续了语言建模的任务,相对来说比较直接。但是RLHF(强化学习高级微调)我会说,它属于研究领域,更难以实现。所以,我不建议有人尝试自行开发RLHF的实现。这些方法相当不稳定,非常难以训练,对于初学者来说并不友好。而且,它也有可能会迅速发生变化。
我认为这些是我现在的默认建议。我会把你的任务分成两个主要部分。第一,实现您的最佳表现,第二,按该顺序优化费用。
首先,目前最好的性能将来自 GPT-4 模型。它是迄今为止最有能力的。使用非常详细的提示。它们有很多任务上下文,相关信息和说明。想想如果任务承包商不能给你发电子邮件,你会告诉它们什么?但也要记住,任务承包商是人,它们有内心独白,它们非常聪明,等等。LLM不具备这些品质,所以一定要仔细考虑LLM的心理学,并迎合提示。
检索并添加任何相关的上下文和信息到这些提示中,基本上参考了很多提示工程技术。其中一些在上面的幻灯片中突出显示,但这是一个非常大的空间,我只是建议您在线寻找及时的工程技术。那里有很多内容要介绍。
尝试几个简短的例子。这指的是你不只是想讲述,你想尽可能展示。如果可以的话,给它一些有助于它真正理解你的意思的例子。
尝试使用工具和插件来卸载LLM本身难以完成的任务,然后考虑的不仅仅是一个提示和答案。想想潜在的变化和反射,你如何将它们粘合在一起,以及你如何可能制作多个样本,等等。
最后,如果你认为你已经最大化了提示工程的效果,我认为你应该坚持一段时间,看看一些可能针对你的应用程序微调模型,但预计这会更慢和更复杂。然后这里有一个专家脆弱的研究区,我想说的是RLHF,如果你能让它工作的话,它目前确实比SFT好一点。但同样,这很复杂。为了优化成本,请尝试探索容量较低的型号或较短的提示等。
我还想就我认为LLM目前非常适合的用例说几句话。特别是,请注意,当前的LLM有很多限制。因此,对于您的所有应用程序,我绝对会牢记这一点。顺便说一下,这可能是一个完整的演讲,所以我没有时间详细介绍它。
模型可能有偏见,它们可能会捏造、制造幻觉信息。它们可能有推理错误。它们可能会为整个应用程序类别而苦苦挣扎。它们有知识截断,所以它们可能不知道任何关于 2021 年 9 月的信息。它们容易受到大范围的攻击,这有点像每天在Twitter上出现,包括即时注入,越狱攻击,数据中毒攻击等。
我现在的建议是在低风险应用中使用LLM,始终将它们与人类监督相结合,将它们用作灵感和建议的来源,并考虑副驾驶而不是只是在某处执行任务的完全自主代理。只是不清楚这些模型现在是否存在。
最后我想说 GPT-4 是一个了不起的神器。我非常感谢它的存在,而且它很优秀。它在可以进行数学、代码等的许多领域拥有大量知识。
此外,还有一个蓬勃发展的生态系统,其它所有正在建立并融入生态系统的东西,其中一些我谈到了。所有这些功能都触手可及。
以下是向 GPT-4 提问、提示问题并获得响应所需的所有代码。在这种情况下,我说,“你能说点什么来激励微软Build 2023的观众吗?”
我刚刚把它打进了 Python 中,逐字逐句地,GPT-4 说了以下内容。
顺便说一句,我不知道他们在主题演讲中使用了这个技巧,所以我认为我很聪明。但它真的很擅长这个。
它说:“女士们,先生们,Microsoft Build 2023的创新者和开拓者,欢迎来到与众不同的杰出思想的聚会。你们是未来的架构师,是塑造人类蓬勃发展的数字领域的远见卓识者。拥抱技术的无限可能性,让您的想法与您的想象力一样翱翔。让我们一起为子孙后代创造一个更加互联、卓越和包容的世界。准备好释放您的创造力,探索未知,将梦想变为现实。你的旅程从今天开始。”
谢谢。
结束
------+------+------[分割线]------+------+------
下面是 Tony Tong 利用 Conversation1st.ai 自动生成的演讲总结
Source: https://medium.com/@tonytong.ai/andrej-karpathys-keynote-at-microsoft-build-2023-8b45a2bbf22e
关键主题列表
GPT 和大型语言模型 (LLM) 生态系统的现状
LLM的快速增长和发展
增加功能和潜在应用
训练LLM的秘诀
预训练阶段(大部分计算工作)
有监督微调阶段
奖励建模阶段
强化学习阶段
GPT-1、GPT-2 和 GPT-3 的演变
模型大小和功能的进展
新技术和应用介绍
基础模型和辅助模型的区别
基础模型:在大规模数据集上预训练
辅助模型:针对特定应用进行微调
从人类反馈中有监督微调和强化学习
提升LLM表现的技术
平衡人工输入和模型自主性
提示工程和少量提示
使LLM做出更好回应的策略
提供上下文和示例以提高理解
GPT 助手的奖励建模和强化学习
优化LLM表现的方法
平衡探索和利用
SFT(监督微调)与 RLHF(人类反馈强化学习)
比较不同的微调技术
RLHF的挑战和复杂性
人脑与语言模型的认知差异
LLM与人类认知相比的局限性
克服这些限制的战略
提示语言模型的技术
包含任务内容和说明的详细提示
鼓励自洽和循序渐进的推理
优化语言模型(例如transformer)的表现
探索低容量模型和更短的提示
微调和快速工程设计
快速工程对LLM性能的重要性
通过有效的提示最大化 LLM 能力
利用 Python Glue 代码和多个提示等技术
LLM的局限性和潜在偏见
偏见、幻觉、推理错误和知识截断
易受攻击和操纵
GPT-4 功能和蓬勃发展的生态系统
迄今为止功能最强大的模型
不断增长的工具、插件和应用程序生态系统
使用GPT-4在Microsoft Build 2023中进行提示的示例
展示 GPT-4 的强大功能和多功能性
为会议观众生成鼓舞人心的信息
GPT 和LLM生态系统的现状
LLM的快速增长和发展:
在过去几年中,LLM 的规模和复杂性显着增加,例如 GPT-1、GPT-2、GPT-3 和 GPT-4。
LLM的增长受到机器学习,自然语言处理以及大规模数据集和计算资源的可用性的推动。
研究人员和开发人员不断突破LLM的界限,从而提高其能力,性能和可以处理的任务范围。
增加功能和潜在应用:
LLM 在各种任务中表现出令人印象深刻的性能,例如文本生成、问答、摘要、翻译和代码生成。
随着LLM的不断发展,它们的能力正在扩展,包括更复杂和微妙的任务,例如推理,解决问题和创意写作。
LLM 不断增长的生态系统导致了许多利用其功能的应用程序、工具和插件的开发,使开发人员和用户更容易访问和利用这些强大的模型。
尽管它们的能力令人印象深刻,但 LLM 仍然存在局限性,例如偏见、幻觉和推理错误。然而,正在进行的研究和开发有望解决这些问题,并进一步提高其性能和适用性。
GPT 助手训练管道
训练LLM的秘诀
预训练阶段(大部分计算工作)
大规模数据集是从CommonCrawl,Wikipedia,GitHub等来源收集的。
文本被标记化为整数序列,这些整数序列用作transformer模型的输入。
使用语言建模对模型进行预训练,在给定上下文的情况下预测序列中的下一个标记。
预训练需要大量的计算资源,例如数千个 GPU 和数月的训练时间。
有监督微调阶段
收集小型、高质量的数据集,由人类承包商创建的及时和理想的响应对组成。
仍然使用语言建模,但训练集被交换为高质量的提示响应数据。
训练后,生成的模型(SFT模型)可以部署为在一定程度上工作的助手。
奖励建模阶段
数据收集转向比较,其中来自SFT模型的多个完成由人类承包商排名。
训练transformer模型,根据人类排名的基本事实预测每次完成的奖励。
奖励模型允许对给定提示的任何任意完成的质量进行评分。
强化学习阶段
相对于固定奖励模型执行强化学习。
模型生成的完成由奖励模型指示的奖励进行权衡。
经过多次迭代后,模型学习根据奖励模型生成得分较高的完成。
基础模型与辅助模型
关于基础模型和辅助模型之间的差异:
基础模型:
在大规模数据集上预训练:基本模型在海量数据集上进行训练,这些数据集包括来自 CommonCrawl、Wikipedia、GitHub 等来源的文本。它们通过预测序列中的下一个标记来学习一般语言表示。
文档完成重点:基本模型旨在完成文档,而不是回答问题或执行特定任务。它们更专注于生成遵循输入结构和上下文的连贯文本。
不太特定于任务:基本模型没有针对特定任务或应用程序进行微调,这意味着它们在没有进一步微调或提示的情况下直接用于解决问题或问答任务时可能无法提供最佳性能。
辅助模型:
针对特定应用程序进行微调:通过在更小、高质量的数据集上进一步微调基础模型来创建助理模型,这些数据集由及时和理想的响应对组成。这些数据集是为特定任务或应用程序量身定制的,使助手模型更擅长处理这些任务。
面向任务:助手模型旨在执行特定任务,例如回答问题、提供建议或生成代码。它们更专注于为用户提示提供有用、真实和无害的响应。
更好的任务性能:与基本模型相比,助手模型通常在特定于任务的应用程序中提供更好的性能,因为它们已经过微调,可以更有效地理解和响应用户提示。
总之,基础模型在大规模数据集上预先训练并专注于完成文档,而助理模型则在较小的、特定于任务的数据集上进行微调以执行特定的应用程序。与基本模型相比,助手模型通常为任务提供更好的性能,因为它们已经过优化,可以更有效地理解和响应用户提示。
SFT模型和RLHF模型之间的差异
关于SFT(有监督微调)和RLHF(人类反馈强化学习)之间的区别:
有监督微调 (SFT):
特定于任务的数据:SFT 涉及在包含及时和理想响应对的较小、高质量数据集上训练模型。这些数据集是为特定任务或应用程序量身定制的,使模型更擅长处理这些任务。
语言建模目标:SFT 继续使用语言建模目标,但训练集被替换为特定于任务的数据集。重点是生成与数据集中提供的理想响应最匹配的响应。
可访问且相对简单:与 RLHF 相比,SFT 更易于访问和实现,因为它建立在语言建模目标之上,并且需要对训练过程进行较少的更改。
人类反馈强化学习 (RLHF):
奖励建模:在 RLHF 中,训练奖励模型以根据人类排名预测模型生成的完成的质量。要求人工承包商对SFT模型生成的多个完成进行排名,奖励模型学习预测这些排名。
策略优化:奖励模型训练完成后,通过强化学习来指导模型的训练。该模型经过优化,可生成从奖励模型获得更高奖励的完成。
改进的性能:RLHF 模型通常比 SFT 模型表现更好,因为它们以计算效率更高的方式利用人类判断。人类更擅长比较和排名完成,而不是生成完成,这有助于提高模型的性能。
更具挑战性和复杂性:RLHF 比 SFT 更具挑战性,因为它涉及多个阶段的训练,包括奖励建模和强化学习。它需要更多的技术专长,与SFT相比,它可能不太稳定,更难训练。
总之,SFT 是一种更易于访问和直接的方法,用于使用语言建模目标在特定于任务的数据集上微调大型语言模型。它更易于实现,并且可以为特定任务提供良好的性能改进。但是,当任务需要更细致的理解或模型需要更好地适应人类偏好时,它可能并不总是最佳选择。
另一方面,RLHF是一种更复杂和更具挑战性的技术,它利用人类反馈来训练奖励模型并使用强化学习优化模型的性能。虽然在训练期间可能更难实现且不太稳定,但 RLHF 可以显着提高性能并更好地符合人类偏好。这使得RLHF对于需要更高理解水平的任务或模型需要生成更符合上下文的响应时特别有用。
最终,SFT 和 RLHF 之间的选择取决于应用程序的特定要求、可用资源和所需的性能级别。这两种技术都有其优点,了解它们的差异有助于在为各种任务微调大型语言模型时指导决策过程。
使用思考链/思考之树解决复杂问题
在Andrej Karpathy的演讲中,他提到“思考之树”是GPT-4等大型语言模型(LLM)提示技术的最新进展。“思考链”可以被认为是这个想法的更简单版本,您可以在其中按顺序将多个提示链接在一起。让我们更详细地探讨这些概念:
思考链:这种方法涉及将复杂的任务分解为一系列更小,更易于管理的步骤,并按顺序指导LLM完成每个步骤。通过这样做,可以帮助模型更有效地理解和解决问题。这可能涉及使用多个提示,可能与 Python 代码结合使用,以创建更结构化的问题解决方法。
思考之树:这个概念在最近的一篇论文中被引入,并通过对任何给定提示保持多次完成并在此过程中对其进行评分来进一步推进“思考链”思想。在这种技术中,LLM对提示生成多个可能的响应,然后模型评估每个响应以选择最佳响应或继续扩展最有希望的选项。这类似于 AlphaGo 算法如何使用蒙特卡洛树搜索在选择最佳走法之前探索围棋游戏中的多种可能走法。
“思考之树”方法允许LLM探索不同的推理路径,并可能纠正其错误或避免推理过程中的死胡同。在处理需要LLM在达成解决方案之前更深入地思考并考虑多种可能性的复杂任务时,这种技术特别有用。
通过利用这些先进的提示技术,例如“思考链”和“思考之树”,您可以与 GPT-4 等 LLM 创建更有效的交互,使您能够充分利用它们的潜力并提高它们在解决复杂问题方面的表现。
在Andrej Karpathy的演讲中,“链、代理、管道、状态机”指的是有效使用GPT-4等大型语言模型(LLM)来解决问题的各种技术和方法。这些技术涉及将任务分解为更小的步骤,将提示链接在一起,并利用外部工具来提高LLM的性能。让我们深入了解这些概念中的每一个:
链(Chains):链是指将复杂的任务分解为一系列更小、更易于管理的步骤的想法。通过这样做,您可以指导LLM完成每个步骤,使模型更容易理解和解决问题。这可能涉及使用多个提示,甚至将提示与 Python 代码结合使用,以创建更结构化的问题解决方法。
代理(Agents):在这种情况下,代理指的是LLM本身,它们充当可以提示执行任务的智能助手。通过将LLM视为代理,您可以设计提示和交互,以帮助模型了解其在解决特定问题中的作用。这可能涉及要求模型逐步思考,认为自己是专家,甚至承认其在某些领域的局限性。
管道(Pipelines):管道是指使用多个提示或工具解决问题的顺序过程。在管道中,一个提示或工具的输出用作下一个提示或工具的输入,从而允许您创建更具指导性和结构化的问题解决方法。这可能涉及使用计算器或代码解释器等外部工具以及LLM来卸载困难的任务,并结合其结果以得出解决方案。
状态机(State Machines):状态机是一个更高级的概念,涉及使用结构化方法来管理信息流并控制LLM的行为。在状态机中,模型根据它收到的输入和为每个状态定义的规则在不同状态之间转换。这有助于与LLM创建更可控和可预测的交互,从而更轻松地管理复杂任务并在整个解决问题过程中维护上下文。
这些技术可以组合和调整,以与 GPT-4 等 LLM 创建更有效的交互,使您能够充分利用它们的潜力并提高它们在解决复杂问题方面的表现。
工具和插件
在Andrej Karpathy的演讲中,他讨论了使用工具和插件来卸载像GPT-4这样的大型语言模型(LLM)难以本地处理的任务的重要性。这些工具和插件可以通过为LLM提供额外的功能或资源来帮助提高LLM的性能。让我们探索一下演讲中提到的一些工具和插件:
计算器:由于LLM可能不太擅长心算,因此您可以为它们提供计算器来执行复杂的计算。在提示中,您可以指示模型在需要执行算术任务时使用计算器。这可以帮助LLM产生更准确和可靠的结果。
代码解释器:LLM可以生成代码,但它们可能无法自己解释或运行代码。通过提供代码解释器作为工具,LLM可以使用它来执行生成的代码并提供结果。这在处理需要执行代码的任务(如编程分配或调试)时特别有用。
搜索工具:虽然LLM在其参数中存储了大量知识,但它们可能并不总是具有最新或特定的信息。通过提供搜索工具或对外部数据库的访问,您可以帮助LLM检索其预先训练的知识中可能不存在的相关信息。这可以提高生成的响应的质量,并使它们更准确,与手头的任务更相关。
检索增强模型:这些模型将LLM与外部信息检索系统相结合,以提供更准确和相关的响应。在这种方法中,相关文档被索引并作为载体嵌入到载体存储中。在测试时,对向量存储进行查询以获取相关的信息块,然后将其合并到 LLM 的提示中。这可以通过为模型提供来自外部源的其他上下文和信息来帮助提高模型的性能。
约束提示:Microsoft 的指导等技术允许您为 LLM 的响应强制实施特定的输出模板。通过将模型的输出限制为特定格式(如 JSON),可以确保生成的响应更具结构化且更易于处理。
通过将这些工具和插件整合到您与 GPT-4 等 LLM 的交互中,您可以提高它们的性能并使它们更有效地解决复杂任务。这些额外的资源帮助LLM克服其局限性,并提供更准确,可靠和相关的结果。
总结与展望
Andrej Karpathy对LLM领域的展望是乐观的,承认像GPT-4这样的大型语言模型的快速增长和发展。他强调了这些模型令人印象深刻的功能以及围绕它们构建的工具和技术的蓬勃发展生态系统。然而,他也强调了LLM目前面临的局限性和挑战,例如偏见、幻觉、推理错误以及对各种攻击的易感性。
从研发的角度来看,他指出了提示工程、奖励建模、强化学习和微调技术的持续进步。他还提到了对更通用技术的探索,例如使用Python Glue代码和将多个提示串在一起,以及检索增强模型和约束提示的开发。
在应用程序方面,Andrej建议在低风险的情况下使用LLM,并将其与人工监督相结合。他建议将LLM视为灵感来源和副驾驶,而不是完全自主的代理。这种方法承认LLM目前的局限性,并确保其产出由人类专家仔细审查和策划。
总之,Andrej Karpathy对LLM领域的展望是对这些模型的持续增长和发展的兴奋和期待之一。但是,他也强调了意识到它们的局限性并在实际应用中负责任地使用它们的重要性。