在刚刚过去的微软 Build 2023 开发者大会上,OpenAI的创始成员、前特斯拉高级 AI 总监 Andrej Karpthy 做了一个专题演讲:State of GPT(GPT 的现状)。
该演讲总共可分为两个部分:
- 第一部分:如何训练一个 GPT 助手;
- 第二部分:如何有效应用 GPT 助手。
作为一篇图文笔记,本文撰写的主要目的是:
- 对该演讲内容的精华部分进行提炼和组织,方便读者学习;
- 对有一定理解难度的知识点做了补充(※标记),方便读者理解。
通过阅读本文,你将:
- 了解一个GPT模型是如何被训练出来的;
- 理解GPT与人脑的认知差异,以及如何弥补这种差异;
- 获知采取哪些措施可以提高GPT的成功率;
- 知晓如何微调GPT以更好地适应我们的任务。
先奉上思维导图一张,方便复习:
(本演讲的在线观看地址以及演讲PPT地址均在文末,可自取。)
如何训练 GPT 助手
要训练一个 GPT 助手,大致需要经历以下四个阶段:
- 预训练
- 监督微调
- 奖励建模
- 强化学习
其中,预训练阶段是计算工作主要发生的地方,约占所有计算时间的99%。
这个阶段我们会在超级计算机中、使用数千个 GPU 、经历数月的训练,来处理海量的互联网数据集。
另外三个阶段则属于微调阶段,更多遵循少量 GPU 、数小时或数天的路线。
预训练
预训练的目标是实现一个「基础模型」,步骤如下:
数据收集
数据收集是一个从公开可用的数据源下载大量的数据的过程。
以 Meta 发布的 Llama 模型为例,其采用的数据源除了主要的网络爬取数据(common crawl、C4)外,还包含一些高质量的数据集(如GitHub、维基百科等)。
这些数据会混合在一起,然后按比例进行采样,就形成了 GPT 神经网络的训练数据集。
而在实际训练这些数据之前,我们还需要再经过一个预处理步骤,即——
标记化(tokenization)
标记化是一个将互联网原始文本翻译成整数序列的过程。
之所以要标记化,是因为整数序列才是 GPT 运行的原生表示。我们通常会使用字节编码之类的手段,迭代地合并小文本块,并把它们分组为标记(Token)。
※ 可以简单理解为整数序列就是 GPT 世界的语言,因为机器学习算法通常只能接受数值型的输入和输出,将文本数据编码成有意义且易于计算的数值,才能让神经网络理解和处理。
训练出的标记数量常作为衡量模型能力的标准之一。
以下就展现了两个示例模型的对比:
其中涉及的几项超参数分别是:
- 词汇量(Vocabulary size)
- 上下文长度(Context length):决定了 GPT 在尝试预测序列中的下一个整数时将查看的最大整数数
- 参数(Parameters)
- 标记(Token)
尽管 Llama 在参数数量上少于 GPT3 ,但 Llama 实际是一个更强大的模型,因为该模型的训练时间更长,训练出的标记数量更多。
※ 参数是机器学习模型的内部变量,通常是一些数值,比如权重、系数等。参数的数量反映了模型的复杂度和灵活度,通常越多的参数意味着越强大的模型,但也可能导致过拟合或计算开销过大的问题。
※ 标记的数量和类型取决于模型采用的标记化算法以及词汇量的大小,一般来讲,能训练出的标记越多,意味着其用于训练的文本数据也就越多,也就意味着其学习到了更多的知识和模式,从而提高了其预测和生成的能力。
标记化完成之后,就进入了实际的预训练,而预训练过程的第一步操作就是,把标记化过程产生的原始整数序列——
输入Transformer
将数据输入到 Transformer 神经网络的过程是分批次进行的,每个训练批次都被打包成了一个大小为B,长度为T的形状数组,其中:
-
B是批次大小,表示每个批次中独立示例的行数;
-
T是最大上下文长度,表示 Transformer 可以查看的最大标记数。
在这之后,就是预训练过程的第二步操作——
预测序列中的下一个标记
以图中随机高亮的绿色单元格为例。
绿色单元格会查看在它前面的所有标记,以作为它的上下文,即图中的黄色单元格。
而它的目标,则是预测序列中的下一个标记,即图中的红色单元格。
※ 本质上,这就是语言建模所做的事情,也就是预测下一个最有可能出现的单词。
在这个特定的例子中,513 将是下一个标记,因此我们可以将其用作监督源来更新Transformer的权重。
※ 这句话的意思是说,提升513标记所对应的原始单词,在下一个最有可能出现的单词中的概率。
我们将同样的做法应用于每个单元格,并且不断交换批次,试图让Transformer对序列中标记都能做出正确的预测,也即——
重复以上预训练过程
我们以在莎士比亚上训练一个小型 GPT 为例,你将看到以下演变过程:
- 完全随机的输出
在初始化时,GPT 将以完全随机的权重开始,因此也将获得完全随机的输出。
- 愈发连贯与一致
随着训练 GPT 的时间越来越长,我们会从模型中获得越来越连贯与一致的样本。
- 已学会遣词造句
到最后,你会发现Transformer已学会了单词,以及在哪里放置标点符号了。
这个过程,用一张可视化的图来表示就是:
这张图实际描述的是训练时随着时间变化的损失函数曲线,可以看到,两个示例模型的曲线趋势都在逐渐趋于平稳。
低损失意味着Transformer的预测正趋于正确,也即为正确预测序列中的下一个整数提供了更高的概率。
这样训练了一个月后,我们会注意到,这些基础模型基本上都学习了非常强大的通用表示,可以有效地微调它们以适用于任何我们感兴趣的下游任务,也就是——
在小型监督数据集上微调模型
以情感分类为例。过去的方法是收集一堆正面和负面的情感信息,然后以此训练某种 NLP 模型。
但新方法则是忽略情感分类这一步,直接进行大型语言模型的预训练,训练出大型Transformer,然后利用几个例子有效地微调我们的模型。
这样做的原因,是因为Transformer 被迫在语言建模过程中同时处理大量任务,仅仅为了预测下一个标记,它就得被迫去了解很多关于文本的结构和其中的不同概念。
这其实就是 GPT-1 。
※ 旧方法就像是你给你的孩子灌输罗密欧与朱丽叶之类的爱情故事,具象化地告诉他爱情是什么;
而新方法就像你先让你的孩子自己去经历各种爱情,从而提升其对于爱情的认知,然后再根据他遇到的具体问题,给他一些针对性的建议和指导。
旧方法可以让孩子对某个故事有自己深刻的理解,但可能无法适应其他情况;
而新方法可以让孩子有更广泛和灵活的视野,但需要更多的时间和资源。
而到了 GPT-2 ,人们发现,相较于微调模型,更好的方式应该是——
提示模型以引导其完成任务
简单讲,就是通过提示工程,让模型误以为它其实是在完善文档,从而让它执行特定的任务。
比如以下这个例子。
我们提供一些段落,然后以问答形式注入提示,当 Transformer 试图完善文档时,它实际上是在回答我们的问题,于是我们就得到了类似ChatGPT的问答助手。
我们可以用这种“欺骗”的手段,使基础模型自我调整为一个有用的助手,具体方法如下:
- 让模型看起来像是在完善文档
- 提供少量样本的提示
- 将要查询的问题放在最后
- 模型将完成任务,生成某种答案
监督微调
监督微调的目标是实现一个「SFT(Supervised Finetuning 监督微调)模型」。
相较于预训练阶段量多但低质的数据集,在这个阶段,我们将收集量少但优质的数据集,比如问答数据。
然后仍对这些数据进行语言建模的步骤,训练之后,我们就得到了一个SFT模型,我们可以实际部署这些模型,它们是真正的“助手”。
奖励建模
奖励建模的目标是实现一个「RM(Reward Modeling 奖励建模)模型」。
在这个步骤中,我们要做的,就是将数据收集转变为比较形式。
具体来说,就是采用已经训练过的 SFT 模型,创建多个补全,然后要求人们对这些补全选项进行排名。
以类似二元分类的形式来解释也许会更清晰一点。
在这个图中:
- 蓝色是提示标记,各行之间都相同;
- 黄色是补全标记,都来自于 SFT 模型,但每一行都不同;
- 绿色是在最后附加的特殊的奖励读出标记,为Transformer对每个补全的质量进行猜测提供了依据,从而进行排名。
我们可以强制指定其中一些数字比其他数字高得多,将这些规则制定为损失函数,并训练我们的模型,使得模型做出与人类比较事实数据的过程相一致的奖励预测。
现在我们有了一个奖励模型,就可以对任意提示给出的补全质量进行评分了。
强化学习
强化学习的目标是实现一个「RL(Reinforcement Learning
)模型」。
在这个阶段所做的,基本上就是再次获得大量提示,然后利用奖励模型给出提示每一次补全的质量,从而权衡语言建模的目标。
例如在以下这个例子中:
- 行#1的补全质量很棒,将使他们往后的出现概率有所提升。
- 行#2的补全质量很差,将使他们往后的出现概率有所减少。
- 行#3的补全质量还行,将使他们往后的出现概率略有提高。
我们会在很多提示、很多批次上一遍又一遍地这样做,从而得到一个创建补全标记的策略,让所有补全标记都能在前一阶段训练的奖励模型下获得高分。
这种训练方式就是——RLHF(基于人类反馈的强化学习)。
与基础模型和 SFT 模型相比,人们更青睐于 RLHF 模型,因为它工作得更好。
这是因为,相较于生成内容,评判好坏显然是一项更容易的工作,可以潜在地利用人的判断力来构建一个更好的模型。
但是,RLHF 模型并不是在各方面都比基础模型要好。最显著的一点就是,RLHF模型失去了一些熵,输出的样本比基础模型变化更少。
而基础模型有更多熵,可以给出很多不同的输出,适用于需要生成更多类似东西的场景中。
比如生成许多酷炫的宝可梦名字:
伯克利有一个团队就对许多可用的助手模型进行了排名,其中,排名前三的都是 RLHF 模型:
※ 可以用一个游戏的例子来类比这四个阶段之间的关系:
- 预训练就像是让 Transformer 模型在一个没有固定规则和目标的开放世界游戏里自由探索,让它自己去认识游戏里的环境和元素。
- 监督微调就像是让 Transformer 模型设定了一个主线任务,从而学习到游戏里的基本规则和技能。
- 奖励建模就像是用一个额外的模型来给 Transformer 模型玩游戏的表现打分,比如根据完成时间或错误次数来评价。
- 强化学习就像是用奖励建模得到的分数来指导 Transformer 模型玩游戏的策略,让它能够玩得更好。
如何有效应用 GPT 助手
认知差异
人脑和GPT这两种架构是存在认知差异的。
比如当我们要写一篇文章来论证“加州的人口是阿拉斯加的 53 倍”时,人脑采用的方式常常是结合了内心独白和参考资料的反复验证、反复纠错。
而从 GPT 的角度来看,这些内容都只是一个标记序列,并且它只会拿最后的推理结果作为训练数据。
※ 这句话的意思是,在训练 LLM 的时候,只使用了最后的结果作为数据,而没有使用中间的思考过程或推理过程。这就意味着 LLM 只能模仿结果,而不能模仿过程。
这是因为,GPT 本质就是一个“标记模拟器”,它的缺点很明显,就是——
- 不清楚自己的知识边界
- 不知道自己擅长什么
- 不会反复检查任何东西
- 不会纠正自身错误
它所做的,就只是尽力预测下一个标记。
但它也确实存在某部分优势,比如:
- 知识广度:拥有大量基于事实的知识,涵盖了大量领域
- 自注意力机制:拥有工作记忆,可以结合上下文内容,并分清楚内容的不同权重
要弥补这种认知诧异,有两种方式很有效,第一种是——
善用提示
我们不能要求Transformer在很少标记的情况下,回答一个非常复杂的问题,它需要更多标记来辅助思考。
这段话的意思是,如果你想让 Transformer 做一些需要逻辑判断的任务,那么你就必须要用更多的单词来表达你的意思,让 Transformer 更容易理解。
为此,我们可以向Transformer提供一个“few-shot prompt(少量样本提示)”,也即给出几个示例模板,Transformer将仿照这些模板,从而产出更好的结果。
此外,还可以通过说“let’s think step by step(让我们一步步思考)”,使Transformer降低它的推理速度,投入更多的计算时间。
※ 提示本质上是一些额外的信息,可以让 LLM 更好地理解我们的问题和需求。正因为人类的大脑和 LLM 有很大的不同,所以需要提示来弥合这种差异。
此外,还有第二种方式——
自我一致性
Transformer 可能会采样到一个不太好的标记,从而使推理像陷入死胡同一样走下坡路,并且无法从中恢复过来。
我们的目的,就是让它们有某种能力能够回顾、检查或尝试。
我们采用的方式,就是提示GPT并未完成任务,推动其进行检查。如果我们不要求它检查,它就不会自己检查。
这个过程可以用人类思考的系统一和系统二模式来类比。
- 系统一:快速且自动的过程,对应于 LLM只是对标记进行抽样。
- 系统二:大脑中较慢的、经过深思熟虑的计划部分,对应自我一致性。
这个说法其实来源于一篇论文,讨论一个被称为思想树(Tree of Thought)的领域。
简单讲,就是利用Python 胶水代码将许多提示词串在一起,整个过程如下:
- 遇到需要维护多个提示的情况
- 利用Python 胶水代码提供算法
- 使用算法找出什么时候使用哪个提示
这有点类似于AlphaGo,它会在围棋中打出多种可能性并评估这些可能性,不同之处在于这里我们针对的是文本。
另外,还有一个最近很火的 AutoGPT 的例子,它是一个允许 LLM 保留任务列表并继续递归分解任务的项目,有点像让我们的模型系统进行思考。
LLM怪癖:不保证成功
LLM 有种不想成功的心理怪癖。
原因正如前面讲的,LLM只是想模仿和预测,而无法区分解决方案的质量。
例如在一些物理问题上,可能有一个完全错误的学生方案,也有一个非常正确的专家答案。
Transformer无法分辨它们之间的区别——它们知道低质量解决方案和高质量解决方案,但默认情况下,无论对错它们都意图模仿,因为它们只是接受过语言建模方面的训练。
这种情况下,有以下几个解决方案:
确保能获得正确答案
也即在“让我们一步一步地解决这个问题”的基础上,进一步在提示中要求——“,确保能获得正确答案”。
尽管听起来很荒谬,但这确实可以让 Transformer 不必在低质量的解决方案上浪费时间。
合理的智商设定
设定 Transformer 是该主题下的领先专家,或者“假装你有IQ 120”之类的等等。
但不要试图要求太多的智商,比如要求400的智商,否则可能就游离在数据分布之外,进入科幻领域了(笑)。
在计算上依赖工具
也即把明确LLM不擅长的任务交给工具或插件完成。
明确模型的知识边界
默认情况下,Transformer 是不清楚自己的知识边界的,为此,我们可以明确告诉它,比如“你的心算不太好,每当你需要进行大数加法、乘法或其他操作时,请使用计算器。”
检索增强模型
在纯检索(如Google)和纯LLM记忆中间,存在一种检索增强模型,可以结合两者的优点(如New Bing),其原理在于其可以:
将任务相关信息加载到工作内存
Transformer的上下文窗口就是它的工作内存。如果我们可以将与任务相关的任何信息加载到其工作内存中,那么该模型将运行得非常好,因为它可以立即访问所有内存。
获取相关文档,进行向量转换并查询
简单讲,就是相关文档分隔成块,然后转换为嵌入向量并存储在向量数据库中;
随后在执行某种查询时,获取与您的任务相关的块,然后填充到提示中,用以生成内容。
这就类似于,你对书上的某个知识点有个残存的记忆但不完整,这个记忆就是向量,你需要根据这个记忆,重新回到书上找到完整的知识点内容一样。
约束提示
简单讲,就是强制LLM输出形式,比如JSON格式等,可以保证 LLM 的输出是我们想要的样子,而不是乱七八糟的。
微调
简单讲,就是通过改变 LLM 的一些参数,让 LLM 更适应我们的任务,也可以节省计算资源和成本。
一些开源的 LLM如 Llama ,可以作为微调的基础。
此外,微调需要更多的技术知识和数据,而且有些任务比较复杂,SFT 相比与 RLHF 更简单更好实现。
对此,演讲者提供了一些默认建议:
-
使用 GPT-4,它是迄今为止功能最强大的模型。
-
让提示里包含详细的任务内容、相关信息和说明;
-
多参考大量其他的提示工程技术;
-
尝试提供少量样本示例提示;
-
尝试使用工具和插件来分担 LLM 本身难以完成的任务;
-
不仅要考虑单个提示和答案,还要考虑潜在的逻辑链条,以及如何将它们粘合在一起;
-
不要认为你已经最大化了提示工程能发挥的效果,而是应该持续微调;
-
RLHF 比 SFT 效果更好,但也更复杂;
-
为了优化成本,请尝试探索容量较低的模型或更短的提示等。
模型的限制
现今的 LLM 存在很多限制,比如偏见、捏造、推理错误、有知识截止日期等。
每天也发生着大量对LLM的攻击,比如即时注入、越狱攻击、数据中毒攻击等。
演讲者给出的建议是:
- 在低风险应用程序中使用 LLM;
- 将它们与始终与人工监督结合起来;
- 仅将它们用作灵感和建议的来源;
- 考虑将其作为辅助,而不是在某处执行任务的完全自主的代理。
最后,演讲者问GPT-4,“你能说些什么来激励Microsoft Build 2023的观众吗?
它的回答如下:
“女士们,先生们,微软 Build 2023 的创新者和开拓者,欢迎来到与众不同的聪明才智的聚会。
你们是未来的建筑师,是塑造人类蓬勃发展的数字领域的远见者。
拥抱技术的无限可能性,让您的想法像您的想象一样飞翔。
让我们一起为子孙后代创造一个联系更紧密、更卓越、更具包容性的世界。准备好释放您的创造力,探索未知,将梦想变为现实。
你的旅程从今天开始。”。
在线观看地址:www.bilibili.com/video/BV1ts…
演讲PPT地址:karpathy.ai/stateofgpt.…