GPT现状终于有人讲清楚了!OpenAI大牛最新演讲爆火,还得是马斯克钦点的天才
来源:量子位(公众号 QbitAI) 西风 发自 凹非寺
继Windows Copilot发布后,微软Build大会热度又被一场演讲引爆。
前特斯拉AI总监Andrej Karpathy在演讲中认为思维树(tree of thoughts)与AlphaGo的蒙特卡洛树搜索(MCTS)有异曲同工之妙!
网友高呼:这是关于如何使用大语言模型和GPT-4模型的最详尽有趣的指南!
此外Karpathy透露,由于训练和数据的扩展,LLAMA 65B“明显比GPT-3 175B更强大”,并介绍了大模型匿名竞技场ChatBot Arena:
Claude得分介于ChatGPT 3.5和ChatGPT 4之间。
网友表示,Karpathy的演讲一向很棒,而这次的内容也一如既往没有令大家失望。
随着演讲而爆火的,还有推特网友根据演讲整理的一份笔记,足足有31条,目前转赞量已超过3000+:
所以,这段备受关注的演讲,具体提到了哪些内容呢?
如何训练GPT助手?
Karpathy这次的演讲主要分为两个部分。
第一部分,他讲了如何训练一个“GPT助手”。
Karpathy主要讲述了AI助手的四个训练阶段:预训练(pre-training)、监督微调(supervised fine tuning)、奖励建模(reward modeling)和强化学习(reinforcement learning)。
每一个阶段都需要一个数据集。
在预训练阶段,需要动用大量的计算资源,收集大量的数据集。在大量无监督的数据集上训练出一个基础模型。
Karpathy用了更多例子作补充:
接下来进入微调阶段。
使用较小的有监督数据集,通过监督学习对这个基础模型进行微调,就能创建一个能够回答问题的助手模型。
他还展示了一些模型的进化过程,相信很多人之前已经看过上面这张“进化树”的图了。
Karpathy认为目前最好的开源模型是meta的LLaMA系列(因为OpenAI没有开源任何关于GPT-4的内容)。
在这里需要明确指出的是,基础模型不是助手模型。
虽然基础模型可以回答问题,但它所给出的回答并不可靠,可用于回答问题的是助手模型。在基础模型上进行训练的助手模型,通过监督微调,在生成回复和理解文本结构方面的表现将优于基础模型。
在训练语言模型时,强化学习是另一个关键的过程。
通过用人工标记的高质量的数据进行训练,可以使用奖励建模来创建一个损失函数,以改善其性能。然后,通过增加正向的标记,并降低负面标记的概率,来进行强化训练。
而在具有创造性的任务中,利用人类的判断力对于改进AI模型至关重要,加入人类的反馈可以更有效地训练模型。
经过人类反馈的强化学习后,就可以得到一个RLHF模型了。
模型训练好了,接下来就是如何有效利用这些模型解决问题了。
如何更好地使用模型?
在第二部分,Karpathy主要讨论了提示策略、微调、快速发展的工具生态系统以及未来的扩展等问题。
Karpathy又给出了具体示例来说明:
当我们在写文章时候,我们会进行很多的心理活动,需要考虑自己的表述是否正确。而对于GPT来说,这只是一个序列标记(a sequence of tokens)。
而提示(prompt)可以弥补这种认知差异。
Karpathy进一步解释了思维链提示的工作方式。
对于推理问题,要想让自然语言处理中Transformer的表现更好,需要让它一步一步地处理信息,而不能直接抛给它一个非常复杂的问题。
如果你给它几个例子,它会模仿这个例子的模版,最终生成的结果会更好。
模型只能按照它的序列来回答问题,如果它生成的内容是错误的,你可以进行提示,让它重新生成。
如果你不要求它检查,它自己是不会检查的。
这就涉及到了System1和System2的问题。
诺贝尔经济学奖得主丹尼尔卡尼曼在《思考快与慢》中提出,人的认知系统包含System1和System2两个子系统。System1主要靠直觉,而System2是逻辑分析系统。
通俗来说,System1是一个快速自动生成的过程,而System2是经过深思熟虑的部分。
这在最近一篇挺火的论文“Tree of thought”(思维树)中也有被提及。
深思熟虑指的是,不是简单的给出问题的答案,而更像是与Python胶水代码一起使用的prompt,将许多prompt串联在一起。模型必须要维护多个提示,还必须要执行一些树搜索算法,来找出要扩展的提示。
Karpathy认为这种思路与AlphaGo非常相似:
AlphaGo在下围棋时,需要考虑下一枚棋子下在哪里。最初它是靠模仿人类来学习的。 但除此之外,它还进行了蒙特卡洛树搜索,可以得到具有多种可能性的策略。它可以对多种可能的下法进行评估,仅保留那些较好的策略。我认为这在某种程度上相当于AlphaGo。
对此,Karpathy还提到了AutoGPT:
我认为目前它的效果还不是很好,我不建议大家进行实际应用。我只是认为,随着时间的推移,我们或许可以从它的发展思路中汲取灵感。
其次,还有一个小妙招是检索增强生成(retrieval agumented generation)和有效提示。
窗口上下文的内容就是transformers在运行时的记忆(working memory),如果你可以将与任务相关的信息加入到上下文中,那么它的表现就会非常好,因为它可以立即访问这些信息。
简而言之,就是可以为相关数据建立索引让模型可以高效访问。
如果Transformers也有可参考的主要文件,它的表现会更好。
最后,Karpathy简单讲了一下在大语言模型中的约束提示(Constraint prompting)和微调。可以通过约束提示和微调来改进大语言模型。约束提示在大语言模型的输出中强制执行模板,而微调则调整模型的权重以提高性能。
我建议在低风险的应用中使用大语言模型,始终将它们与人工监督相结合,将它们看作是灵感和建议的来源,考虑copilots而不是让它们完全自主代理。关于Andrej Karpathy
Andrej Karpathy博士毕业后的第一份工作,是在OpenAI研究计算机视觉。
后来OpenAI联合创始人之一的马斯克看上了Karpathy,把人挖到了特斯拉。但也因为这件事,马斯克和OpenAI彻底闹翻,最后还被踢出局。在特斯拉,Karpathy是Autopilot、FSD等项目的负责人。
今年二月份,在离开特斯拉7个月后,Karpathy再次加入了OpenAI。
最近他发推特表示,目前对开源大语言模型生态系统的发展饶有兴趣,有点像早期寒武纪爆发的迹象。
传送门:[1]https://www.youtube.com/watch?v=xO73EUwSegU(演讲视频)[2]https://arxiv.org/pdf/2305.10601.pdf(“Tree of thought”论文)
参考链接:[1]https://twitter.com/altryne/status/1661236778458832896[2]https://www.reddit.com/r/MachineLearning/comments/13qrtek/n_state_of_gpt_by_andrej_karpathy_in_msbuild_2023/[3]https://www.wisdominanutshell.academy/state-of-gpt/
Andrej Karpathy :
《State of GPT》演讲
来源:机器之心(微信号almosthuman2014)
视频地址:https://youtu.be/bZQun8Y4L2A
如何训练 GPT?
首先,我们概括性地看看 GPT 大模型的训练流程。要记住,这是个新领域,变化很快。现在的流程是这样,以后新技术出现时可能会不一样。
可以看到,GPT 的训练流程可粗略分为四个阶段:预训练、监督式微调、奖励建模、强化学习。
这四个阶段按顺序进行。每个阶段都有各自的数据集,每个阶段也有各自用于训练神经网络的算法。第三行是所得到的模型。最后底部有一些备注信息。
在所有阶段中,预训练阶段所需的计算量是最大的,可以说 99% 的训练计算时间和浮点运算量都集中在这个阶段。因为这一阶段需要处理超大规模的互联网数据集,可能需要数千 GPU 构成的超级计算机工作几个月时间。其它三个阶段都算是微调(fine tuning)阶段,所需的 GPU 数量和训练时间都少得多。
下面我们将分阶段详解 GPT 的整个训练流程。
预训练阶段
预训练阶段的目标是得到一个基础模型。
首先第一步:数据收集。这一阶段需要海量的数据,下面给出了一个例子,这是来自 meta 的 LLaMA 模型的数据混合(data mixture)方法:
可以看到,LLaMA 的预训练数据按不同比例混用了多个不同类型的数据集,其中比例最大的是爬取自互联网的 CommonCrawl 以及基于 CommonCrawl 构建的 C4,此外还有 GitHub、维基百科等数据集。
收集到这些数据之后,还需要对它们进行预处理,这一步也被称为「token 化」。简单来说,这就是一个转译过程,即把原始文本转译成某种整数序列,因为这种整数序列就是 GPT 实际工作时所操作的本地表征。
这种从文本到 token 和整数的转译过程是无损的,而具体执行这一过程的算法有好几种。举个例子,如上图所示,我们可以使用一种名为字节对编码(byte pair encoding)的技术,其工作方式是迭代式地合并短文本块并将它们分组成 token。最后实际输入 Transformer 的就是那些整数序列。
下面来看两个示例模型 GPT-3 和 LLaMA 在预训练阶段需要考虑的一些主要的超参数。Karpathy 表示由于他们还没有发布有关 GPT-4 的相关信息,因此在演讲中使用了 GPT-3 的数据。
可以看到,词汇库的大小通常是 10000 数量级的;上下文长度通常为 2000 或 4000 左右,而现在更是有长达 10 万的。上下文长度决定着 GPT 在预测序列的下一个整数时所查看的最大整数数量。
对于参数数量,可以看到 GPT-3 的为 1750 亿,而 LLaMA 的为 650 亿,但实际上 LLaMA 的性能表现远胜于 GPT-3。原因何在?因为 LLaMA 训练的 token 要长得多,达到了 1.4 万亿,而 GPT-3 仅有大约 3000 亿。因此,评价一个模型时,光看参数数量是不够的。
上图中部的表格中给出了 Transformer 神经网络中一些需要设定的超参数,比如头的数量、维度大小、学习率、层数等等。
下方则是一些训练超参数;比如为了训练 650 亿参数的 LLaMA 模型,meta 使用 2000 个 GPU 训练了大约 21 天,资金成本大约为 500 万美元。这大概能体现出预训练阶段各项成本的数量级。
接下来看实际的预训练过程究竟会发生什么。大致来说,首先会把 token 分批组成 data batch。这些分配数据构成数组,再被输入到 Transformer 中。这些数组的大小为 B×T;其中 B 是分批大小,即堆叠的独立样本的行数;T 是最大上下文长度。下图给出了一个示例。
在图中示例中,上下文长度 T 仅为 10,但实际模型的 T 可达到 2000 或 4000 乃至更长。也就是说,实际模型的一行数据可以非常长,比如一整个文档。我们可以将许多文档打包到各行中,并用这些特殊的文本结束 token <|endoftext|> 来分隔它们。简单来说,这些 token 是告诉 Transformer 新文档开始的位置。比如图中的 4 行文档就转换成了底部的 4×10 的数组。
现在,需要将这些数字输入到 Transformer。这里我们仅看其中一个单元格(绿色),而实际上每个单元格都会经历同样的处理流程。
这个绿色单元格会查看其之前的所有 token,即所有黄色单元格的 token。我们要将这里的全部上文输入到 Transformer 神经网络,Transformer 则需要预测出该序列的下一个 token,即图中的红色 token。
为了给出准确的预测,神经网络需要调整其上百亿个参数。每次调整后,神经网络对每个单元格 token 的预测分布就会不同。举个例子,如果词汇库的大小为 50257 个 token,那么我们就需要同样多的数字,以便得到下一个 token 的概率分布,其预测了下一个 token 的可能值及相应概率。
在图中的示例中,下一个单元格应该是 513,因此就可以将其用作监督源来更新 Transformer 的权重。我们可以并行地对每个单元格采取同样的操作。我们不断更换数据批,努力让 Transformer 有能力正确地预测序列的下一个 token。
下面再看一个更具体的示例。这是《纽约时报》用莎士比亚作品训练的一个小型 GPT。这里给出了莎士比亚作品中的一小段以及在其上训练 GPT 的情况。
首先,在 GPT 初始化时,权重是完全随机的,所以其输出结果也是完全随机的。随着时间推移,训练时间越来越长,GPT 不断迭代,模型给出的结果样本也就越来越连贯通顺了。最后,可以看到 Transformer 学到了一些有关词的东西,也知道应该在哪些地方放置空格了。
在实际预训练过程中,要通过一些量化指标来确定模型迭代中的表现变化。一般来说,研究者监测是损失函数。损失低说明 Transformer 更可能给出正确预测,即序列中下一个整数是正确值的概率更高。
预训练其实就是一个语言建模过程,这个过程的训练时间可长达一个月。之后,GPT 学到了一个非常强大的通用型语言表征。然后我们可以针对具体的下游任务高效地对其进行微调。
举个例子,如果下游任务是情绪分类。过去,你采用的方法可能是收集大量标注好「正面」或「负面」情绪的样本,然后训练一个 NLP 模型。但现在的新方法不需要预先做情绪分类了,你只需要拿一个预训练过的大型语言模型,然后只需要少量示例样本,就能非常高效地针对你的具体任务对模型进行微调。
这对实际应用来说非常有用。那么为什么预训练后的大型语言模型(LLM)只需要简单微调就能用呢?这是因为语言建模过程本身就已经涵盖了大量任务 —— 模型为了预测下一个 token,必须理解文本的结构以及其中内含的各种不同概念。
这就是 GPT-1。
现在来看 GPT-2。人们注意到 GPT-2 甚至可以不用微调就能非常有效地让这些模型执行 prompt。这些语言模型的训练目标是完成文档,因此用户实际上只需通过编排适当的虚假文档,就可以诱导模型执行具体任务。下面给出了一个例子。
其中给出了一篇文章,用户想完成的任务是做相关的问答。因此,只需要在文章后面加几个有答案的问答(这被称为 few-shot prompt),然后再提问,那么由于 Transformer 的目标是完成这个文档,也就相当于回答了问题。这个例子是用 prompt 来调教基础模型,使其相信它在模仿一个文档,结果却完成了问答任务。
Karpathy 认为,以提供 prompt 替代微调的方式昭示着大型语言模型的新时代。这让基础模型本身就足以应对许多不同类型的任务。
也因此,相关领域的研究前沿就转向了基础模型的进化。各大研究机构和企业都在打造自己的基础大模型。不过这些模型并不都是公开可用的,比如 OpenAI 一直没有发布 GPT-4 基础模型。我们通过 API 调用的 GPT-4 模型其实并不是基础模型,而是一个助理模型(assistant model)。
GPT-3 基础模型可通过 DaVinci API 使用,GPT-2 基础模型也是公开的,用户甚至可以在 GitHub 上找到其参数权重配置:https://github.com/openai/gpt-2 。不过总体而言,目前最开放的基础模型还是 meta 的 LLaMA 系列模型,但该系列也没有授权给商业使用。
现在需要指出一点:基础模型不等于助理模型。基础模型不会回答用户提问,它们只会完成文档。所以如果你对基础模型说:「写一首关于面包和奶酪的诗」,你可能不会如愿 —— 它只会把你的要求看成一个文档,然后试图完成它。
但是,你可以通过适当的 prompt 诱导基础模型写诗,如上图右侧所示。
当然,你也可以诱导模型变成助理。为此,你需要创建一些特定的少样本 prompt,使其看起来像是人类与助理交换信息的交互过程的文档。如下图所示,然后你只需要在文档结尾处附上你的提问,基础模型就能在一定程度上化身为一个有用的助理,给出某个答案。但这个过程并不非常可靠,实践效果也不好。
因此,为了打造出真正的 GPT 助理,需要另外的方法,即监督式微调(supervised fine tuning,即 SFT)。
监督式微调阶段
在监督式微调阶段,需要收集少量但高质量的数据集。OpenAI 的方法是以人工方式收集由 prompt 和理想响应构成的数据。这些数据需要不少,一般需要几万个。
然后,继续在这些数据上执行语言建模。算法不变,只是换了训练数据集:从大量低质量的互联网文档换成了少量高质量的问答式「prompt - 响应」数据。
这个训练过程完成后,就得到了一个 SFT 模型。部署这些模型就能得到助理,它们已经能完成一定程度的工作。
依然来看个例子。这是人类合同工写出的数据,其中有一个 prompt,然后人类再写出理想的响应。
理想的响应自然不能让人随意发挥,而是需要遵循许多规则(如上右图),其中有格式上的要求并且要保证给出的答案有用、真实可信且无害。
接下来还需要基于人类反馈的强化学习(RLHF),其中包含奖励建模阶段和强化学习阶段。
奖励建模阶段
在这一阶段,需要将数据收集转变成比较的形式。这里给出了一个示例。对于同样的 prompt,即要求助理写一个能检查给定字符串是否为回文的程序或函数。再使用已经训练好的 SFT 模型生成多个结果,这里给出了三个。然后再让人类给这些结果排名。
这件事做起来可并不简单,毕竟要是让人类来完成一个 prompt,可能需要耗费几个小时时间。现在假设排名完成了,然后就需要在这些结果的所有可能配对上执行类似二元分类的操作。
如下图所示,具体的做法是这样的:将 prompt 按行排列;这里的三行 prompt 是一样的,但完成的结果不同,即图中黄色 token(来自 SFT 模型)。然后在其后添加一个特殊的奖励读出 token。这样,只需要在绿色 token 位置对 Transformer 执行监督,就能使 Transformer 预测出某个奖励,从而判断 prompt 的完成结果是否优良。
这基本上就是让 Transformer 猜测每个完成结果的质量。当其猜测完每个不同结果的质量后,开发者就可以动用已有的基本真值(ground truth)强行让某些结果的质量分数高于其它结果,从而使模型的奖励预测结果与人工给出的基本真值保持一致。这个过程可以通过一个损失函数完成。
有了奖励模型之后,GPT 依然还不能成为一个有用的助理,但奖励模型却对后面的强化学习阶段很有用,因为奖励模型可以评估任意给定 prompt 的任意完成结果的质量。
强化学习阶段
强化学习阶段做的事情就是基于奖励模型,使用强化学习算法对大量 prompt 对应的结果进行评分。
这里以一个 prompt 为例,将 SFT 模型完成的结果(黄色)排列成行,然后在后面加上奖励 token(绿色)。这些奖励来自奖励模型,并且已经固定不变。
现在使用同样的语言建模损失函数,只是现在是在黄色 token 上训练,并根据奖励模型指示的奖励来重新权衡语言建模目标。
比如在第一行,奖励模型认为这个完成结果的评分相当高。因此,模型在第一行采样的所有 token 都会得到强化,也就是在未来会有更高的概率被采用。对比之下,奖励模型不喜欢第二个完成结果,给出了负分评价,因此该行的所有 token 在未来出现的概率就会降低。
如此这般在许多 prompt 上操作一遍又一遍,经过许多数据批次,就能得到一个创建黄色 token 的策略。依照这个策略,所有完成结果都能被奖励模型给予高分。
这就是 RLHF 的训练流程。最后得到的模型就可以部署成应用了。
ChatGPT 就是一个 RLHF 模型,而其它一些模型则可能是 SFT 模型,比如 Claude 等。
那么 OpenAI 为什么要使用 RLHF 呢?Karpathy 表示,原因很简单,使用 RLHF 能让模型表现更好。根据 OpenAI 之前做的一些实验,可以看到使用了 PPO(近端策略优化)算法的 RLHF 模型整体上都更好一些。当把结果提供给人类时,相比于 SFT 模型和通过 prompt 化身为助理的基础模型,人类也基本更喜欢来自 RLHF 模型的 token。
那 RLHF 为什么能让模型更好呢?目前 AI 研究界还没有找到一个得到大家认可的理论,但 Karpathy 还是给出了自己的见解。他认为这可能与比较和生成的计算难度之间的不对称性有关。
举个例子说明一下:假设我们要让一个模型写一首关于回形针的俳句。如果你是一位正努力创建训练数据的合同工,正在为 SFT 模型收集数据。那么你该怎样写出一首关于回形针的好俳句呢?而你可能并不是一位优秀的俳句诗人。但是,如果给你几首俳句,你却有能力辨别它们中哪首更好一些。也就是说,比起创建一个好样本,判断哪个样本更好是简单得多的任务。因此,这种不对称性可能使得比较是一种更好的方法 —— 能更好地利用人类的判断来创造出好一些的模型。
现在来看另一个方面:RLHF 并不总是会为基础模型带来提升。在某些情况下,RLHF 模型会失去一些熵,也就是说它们会输出更加单调、变化更少的结果。而基础模型的熵更高,可以输出更加多样化的结果。
比如下面的任务可能就更适合使用基础模型,即生成与已有的 n 个示例相似的东西。这里的示例任务是生成更多宝可梦名字。首先,用户向模型提供了 7 个宝可梦名字,然后让基础模型完成文档。基础模型生成了大量宝可梦名字。这些名字都是虚构的,毕竟宝可梦并不真实存在。Karpathy 认为这类任务使用基础模型会得到更好的结果,因为基础模型的熵更高,给出的结果既与之前的示例相似,又更加多样化和炫酷。
现在,用户可以使用的助理模型已有不少了。伯克利有个团队正对许多助理模型进行排名并给出了基本的 ELO 评分。当然,现目前最好的模型是 GPT-4;Claude 和 GPT-3.5 紧随其后。有些模型公开提供模型权重,比如 Vicuna、Koala 等。在这个榜单中,前三名都是 RLHF 模型,其它模型基本都是 SFT 模型。
上面就是训练模型的方式。下面调转方向,看看我们可以怎么将 GPT 助理模型应用于实际问题。
如何使用 GPT?
下面会通过实际示例来展示如何最好地使用 GPT。假设你在写一篇文章,需要在结尾加上这样一句:「California’s population is 53 times that of Alaska.」(加州的人口是阿拉斯加州的 53 倍)。但现在你不知道这两个州的人口数据,你需要智能助理来帮你。
人类会怎样完成这个任务呢?大致推想,人类很可能会经历一连串的思考过程,如下图所示:首先会想到为了得到结果,需要比较人口数量,那么就需要查询人口数据;然后使用查询工具查一下 —— 在维基百科上找到了加州和阿拉斯加的人口数据;接下来很显然需要做个除法运算,可能会需要计算器;然后得到倍数结果 53;然后我们的大脑可能会用经验理智快速检验一下 ——53 倍感觉挺合理的,毕竟加州是美国人口最多的州。
信息有了之后,就进入了创造性写作的部分。你可能首先会写下:「California has 53x times greater」,然后你想一下感觉又不太合适,又删了重新想哪种表达更合适一点,最终得到你满意的句子表达。
简单来说,为了写这样一句话,你的内心会经历大量独白式的思考。那么 GPT 在生成这样一句话时又会经历什么呢?
GPT 处理的都是 token 序列。不管是阅读还是生成,它都是按部就班地一块块地进行,其中每一块都是针对一个 token,计算工作量也都一样。这些 Transformer 的层数不少,足有 80 个推理层,但话说回来 80 也不是非常多。Transformer 会通过这些来尽力模仿写作,但其思考过程和人类的大不相同。
也就是说与人类不同,GPT 没有什么内心独白,它只会检视每一个 token 并在每个 token 上投入同等的计算量,仅此而已。它们就像是 token 模拟器 —— 它们不知道自己知道什么或不知道什么,只是模仿地写出下一个 token;它们也不会反思,内心不会思考结果是否合理;它们写错了也不会反过来修改。它们只是按序列采样 token。
但即便如此,Karpathy 认为 GPT 依然具有某种形式的认知能力优势,比如它们具备非常广博的事实知识,涵盖许多不同领域,因为它们数以百亿计的参数,足以储存大量事实。同时它们还有相对来说很大且完美的工作记忆。只要能填入 Transformer 的上下文窗口,它就能通过其内部自注意机制来加以利用。也就是说 GPT 能以无损的方式记住能嵌入其上下文窗口的任何内容。
Karpathy 表示:人类通过 prompt 使用 GPT 的过程本质上是大脑和 LLM 这两种不同的认知架构互相配合的过程。
用 GPT 执行推理
再来看 Transformer 在实践中表现相当好的一种用例:推理。
如果只有单个 token,当然不能指望 Transformer 推理出什么。推理的执行需要涉及更多 token。比如,你不能向 Transformer 提一个非常复杂的问题,然后指望它通过单个 token 就找到答案。Transformer 需要通过 token 来「思考」。
上图右侧给出了一个例子。可以在输出结果中看到 Transformer 为了解答问题而进行的「思考」。如果你提供了一些示例(上方) ,那么 Transformer 就会模仿那个模板,结果看起来相当不错。当然,你也可以通过说「Let’s think step by step」(请按步骤解答)引导 Transformer 给出类似的输出 —— 这在某种程度上展示了其工作过程。而且由于它有点像是进入了工作过程展示模式,那么其在每个单独 token 上投入的计算量就会少一点。这样一来,它执行的就是一个速度更慢的推理过程,也就更可能成功得到正确答案。
再看一例。如下图所示,人类写作时会写不好,类似地,Transformer 在选择下一个 token 时可能会出错,但不同于人类可以及时停下进行修改,Transformer 会继续生成,一错到底,最终得到错误答案。
但类似于人类写作时没写好可以重来一样,Transformer 也可以多次采样,然后我们可以使用某个过程找到其中较好的。这被称为自我一致性(self-consistency)。
有趣的是,通过让模型反思(reflection),可以发现模型其实能知道自己出错了。举个例子,如果让 GPT-4 生成一首不押韵的诗然后它生成的诗却押韵了。然后你只需要问它「你完成任务了吗?」它就会知道自己没有完成任务,然后为你重新完成任务。
但如果你不给出那样的 prompt,它就不知道自己错了。它并不会自己去回顾,毕竟它只是一个 token 模拟器。你必须通过 prompt 让它回顾。
Karpathy 表示可以按照目的将 AI 模型分为两种:一类系统(System 1)和二类系统(System 2)。一类系统的处理过程速度快并且是自动化的,对应于只是采样 token 的大型语言模型。而二类系统的速度慢一些,会反复思考进行规划。
现在有很多人在通过设计 prompt 来让 LLM 表现出类似人类大脑的思维过程。如上左图 (d) 所示,这是近期一篇论文提出的 Tree of Thought(思维树)。该论文提出为任意给定 prompt 维持多个完成结果,然后对这些结果进行评分,保留得分较好的结果。
要做到这一点,不只要用一个 prompt,而是需要用 Python Glue 代码将多个 prompt 组合到一起。这实质上是维持多个 prompt,还需要执行某个树搜索算法来找到可扩展的 prompt。可以说这是 Python Glue 代码与各个 prompt 组成的共生体。
Karpathy 在这里类比了 AlphaGo。AlphaGo 的每一步都是下接下来的一步棋,其策略的训练方式最初是模仿人类。但除了这个策略之外,它还会执行蒙特卡洛树搜索。由此造成的结果是,AlphaGo 会在头脑里尝试大量不同的可能性然后对它们进行评估,最后仅保留其中效果好的。思维树就有点像是 AlphaGo 下围棋时的思维过程,只不过处理的是文本。
不只是思维树,现在也有更多人在实验让 LLM 完成比简单问答更加复杂的任务,但很多都像是 Python Glue 代码,将许多 prompt 连接起来。
上图给出了两个例子。其中右图的论文提出了 ReAct,研究者是将 prompt 的答案构造成一个思维、动作、观察构成的序列,其中在动作部分,模型还能使用工具。这就像是某种回答查询的思维过程。
左图则是 AutoGPT。这个项目最近有些炒作,但也确实是很有趣的研究。AutoGPT 能够保存一个任务清单并递归式地分解这些任务。目前来说这种做法的效果并不很好,Karpathy 也不建议人们将其用于实际应用,但他表示从研究角度看,这种方法还是很有启发性。
以上就是创造二类系统思维方式的一些研究成果。
Karpathy 接下来谈到了 LLM 的另一个有趣现象,他说:「LLM 就好像有种心理怪癖。它们不想成功,只想模仿。」你想要它给出正确答案,你就要明确要求它。这是因为 Transformer 的训练数据集中数据并不总是正确的,也存在低质量的数据。
举个例子,假如有某个物理问题,数据集中可能有某个学生给出的错误答案,同时也会有某个专家给出的正确答案。而 Transformer 不知道该模仿哪个或者说它都想模仿,毕竟它们的训练目标是语言建模,不是分辨对错。因此在使用和测试时,如果你想要正确答案,你就要明确提出要求。
比如在上图的论文中,研究者尝试了多种不同的 prompt,发现对于同一问题,不同 prompt 得到的输出结果准确度竟然不一样!可以看到,如果在 prompt 中明确要求模型一步步推理并给出正确结果,其准确度会高一些,因为这样 Transformer 就不必再为低质量解答分配概率了。
因此,如果你想要正确答案,就大声说出来!像是在 prompt 中添加「你是某领域的专家」或「假设你的 IQ 为 120」。但是也不要太过了,比如要求模型假设自己的 IQ 为 400,这样的话你的问题可能会超出数据的分布或者虽在分布中但结果却很科幻 —— 这样模型可能就会开始扮演什么科幻角色了。
让 LLM 使用工具 / 插件
针对具体问题,使用合适的工具往往能事半功倍。对 LLM 来说也是如此。根据具体任务的不同,我们可能希望 LLM 能使用计算器、代码解释器、搜索引擎等工具。
但首先我们需要记住一点:Transformer 默认情况下可能并不知道它们无法做到某些事情。用户甚至可能需要在 prompt 中明确告知 Transformer:「你不擅长心算,如果要做大数运算,请使用这个计算器,这是使用这个计算器的方法。」你必须明确要求它使用某个工具,因为模型自身不知道自己擅长或不擅长什么。
检索是能极大提升 LLM 性能的重要工具。因为 LLM 是专精于记忆的(memory only),因此专精于检索的搜索引擎能为 LLM 提供极大补充。实践也证明,能使用检索工具的 LLM 的实用性会大大提升。
之前已经提到,Transformer 的上下文窗口就是其工作记忆范围。如果能在其工作记忆中载入与当前任务相关的信息,那么模型的表现就会更好,因为模型能够立即读取所有记忆。实际上用检索增强生成也是很多人感兴趣的课题。上图下方展示了 LlamaIndex,其中有一个连接大量不同类型数据的数据连接器。这个工具可以索引各种数据并将它们提供给 LLM 使用。
现在时兴的做法是:选取相关文档,然后将其分成文本块,再执行嵌入操作,得到表示那些数据的嵌入向量。这些嵌入向量会被保存起来。当使用模型时,我们可以向存储的向量发出查询,从中取用与当前任务相关的文本块。然后将这些文本块加入到 prompt,再让 LLM 生成。这种做法在实践中的效果很好。
这其实与人类完成任务的方法类似。人也可以仅靠自己的记忆做事,但如果能检索到与任务相关的资料,做起事来也自然会更容易。Transformer 虽然记忆广博,但也能从检索中受益。
在 prompt 中添加约束条件
在 prompt 中设定约束条件能迫使 LLM 按特定模板输出结果。下图给出了微软帮助用户更好使用 LLM 的 Guidance 工具,具体可访问 https://github.com/microsoft/guidance 。在这里给出的例子中,LLM 输出的结果会是 JSON 格式。这是可以得到保证的,因为 prompt 会调整 Transformer 输出不同 token 的概率,而这些 token 的输出位置受限了,即只能填补文本中的空缺位置。这样就实现了对文本留空处的严格限制。带约束条件的采样对某些任务来说非常有用。
微调
通过设计 prompt 能让 LLM 模型完成更多不同任务,但我们其实也能通过微调来做到这一点。
对模型进行微调是指改变模型的权重分布。这种事情做起来不难,因为现在已经有 LLaMA 等开源的大模型以及一些用于微调的软件库。
比如 LoRA 等参数高效型微调技术让用户可以仅训练模型中少量稀疏的部分。使用该技术时,基础模型的大部分都保持不变,而某些部分可以变化。在实践中,这种技术用起来很不错,能让人以很低的成本对模型做少量调整。同时,因为模型大部分都是固定不变的,所以可以使用非常低精度的推理来计算那些部分,因为梯度下降不会更新它们。由此,整体的微调效率就能非常高。
不过需要记住,微调需要专业技术,而且多半还需要相应的专业领域知识,毕竟不管是雇佣人类专家来编写数据集还是通过自动方法合成数据都非常复杂,而这也会拉长迭代周期。
另外,Karpathy 还指出,对用户来说,监督式微调(SFT)还是可以做到的,因为这其实就是继续执行语言建模任务;但 RLHF 是还需进一步研究的课题,实现难度就大多了,因此不建议初学者来做。
Karpathy 的 GPT 使用建议
为了帮助人们更好使用 GPT,Karpathy 给出了一些建议。在使用 GPT 来完成任务时,可以将任务分成两个部分:一,取得最佳结果;二,依照指定顺序优化结果。
对于第一部分,首先是选模型,目前最强的模型是 GPT-4。有了模型后,当执行具体任务时,你需要把 prompt 设计得足够详细,其中要包含任务的背景、相关信息和说明。你要想一想人类会怎么完成这一任务,但你同时也要明白人类有内心独白、能够自省,LLM 却不行。了解 LLM 的工作方式对设计 prompt 大有裨益。你可以检索一些相关背景和信息并将其添加到 prompt 中。网上已有不少人分享过相关经验和技术。
你不用急于让 LLM 一步到位完成你的任务。可以多做几次实验,测试一下各种可能性。你可以向 LLM 提供一些例子,让它真正理解你的意图。
对于原生 LLM 难以解决的问题,可以将其交给工具和插件处理。你要想想如何将工具整合进来,这当然无法通过单个 prompt 问答就可以解决。你需要多做几次实验,实践出真知。
最后,如果你成功搞出了适合自己的 prompt 设计方案,你可以再继续坚持一下,看看可以如何对模型进行微调以更好地服务你的应用;但要明白微调模型的速度会更慢,也需要投入更多。对于想要使用 RLHF 的研究型专家来说,虽然如果真能用起来,RLHF 目前是会比 SFT 好一些,但成本也会更高。为了节省成本,探索性研究可以使用性能更低的模型或更短的 prompt。
Karpathy 强调用 LLM 解决用例时可能会出现一些问题,比如结果可能有偏见、编造出幻觉信息、推理错误、无法理解应用类型(比如拼写相关任务)、知识隔断(GPT-4 的训练数据截止于 2021 年 9 月)、可能会被攻击(比如 prompt 注入攻击、越狱攻击、数据毒化攻击)……
Karpathy 建议用户目前仅在低风险程度的应用中使用 LLM 并且要搭配人工监督一起使用。LLM 可以作为灵感和建议来源,让它们辅助我们而不是完全自主地替代我们工作。
结语
Karpathy 在总结时说:「GPT-4 是了不起的造物。我很感激它存在于世而且它很美丽。」它具有非凡的能力,能帮助用户解答疑问、编写代码等等。围绕它的生态系统也正在蓬勃发展。
最后,Karpathy 向 GPT-4 提了一个问题:「如果要激励 Microsoft Build 2023 的观众,你会说点什么?」
GPT-4 给出了如下回答:
笔者也在这里取巧,请 ChatGPT 将这段话翻译成了汉语:
为伟大思想而生!
AI+时代,互联网思想(wanging0123),