这篇文章是 Andrej Karpathy 关于“深入研究像 ChatGPT 这样的 LLM”视频的浓缩版。它旨在帮助那些想了解 LLM 实际工作原理、理解微调术语、提高提示工程技能、减少幻觉以及理解 DeepSeek-R1 重要性的人。
目标读者:
• 想深入了解 LLM 工作原理的人。
• 对 chat_template 和 ChatML 等微调术语感到困惑的人。
• 希望通过理解提示背后的原理来改进提示工程的人。
• 试图减少幻觉并想知道如何防止 LLM 捏造信息的人。
• 想了解 DeepSeek-R1 为何如此重要的人。
注意: 建议在时间允许的情况下观看完整的视频。这篇文章仅提供关键要点。
预训练数据
Internet
LLM 首先通过爬取互联网来构建一个庞大的文本数据集。然而,原始数据嘈杂且包含重复内容、低质量文本和无关信息,因此需要进行大量过滤。例如,对于仅英语的模型,需要一种启发式方法来过滤非英语文本。FineWeb 是一个包含超过 12 亿个网页的示例数据集。清理后的数据需要压缩成可用的形式,而不是将原始文本输入模型,而是将其转换为标记(tokens):一种结构化的数字表示。
标记化 (Tokenization)
标记化是指模型在处理文本之前将其分解成更小的单元(标记)的过程。模型不是存储原始单词,而是将它们转换为代表重复模式的 ID。一种流行的技术是字节对编码 (BPE)。标记的最佳数量取决于模型创建者的决定。可以使用 Tiktokenizer 等工具来可视化其工作方式。
神经网络输入/输出
数据标记化后,将其输入到神经网络中。过程如下:
• 模型接收一个上下文窗口,即一组数量有限的标记(例如,某些模型为 8,000,GPT-4 高达 128k)。
• 它根据学习到的模式预测下一个标记。
• 使用反向传播调整模型中的权重以减少错误。
• 随着时间的推移,模型学会做出更好的预测。
• 更长的上下文窗口意味着模型可以“记住”输入中更多的内容,但也增加了计算成本。
神经网络内部
在模型内部,数十亿个参数与输入标记交互,以生成下一个标记的概率分布。此过程由复杂的数学方程式定义,并针对效率进行了优化。模型架构旨在平衡速度、准确性和并行化。
推理 (Inference)
LLM 不会生成确定性输出,它们是随机的。这意味着每次运行模型时,输出都会略有不同。模型不会重复它所训练的内容,而是根据概率生成响应。在某些情况下,响应会与训练数据中的内容完全匹配,但大多数时候,它会生成一些新的、遵循类似模式的东西。这种随机性是 LLM 能够发挥创造力的原因,但也是它们有时会产生幻觉(捏造不正确信息)的原因。
GPT-2
GPT-2 是 OpenAI 在 2019 年发布的,是基于 Transformer 的 LLM 的早期示例。它拥有 16 亿个参数、1024 个标记的上下文长度,并在约 1000 亿个标记上进行训练。最初的 GPT-2 训练成本为 4 万美元。现在,效率得到了显著提高。Andrej Karpathy 成功使用 llm.c 以仅 672 美元的价格复制了 GPT-2。通过优化的流程,训练成本甚至可以降至 100 美元左右。现在成本如此之低的原因包括:更好的预训练数据提取技术、更强大的硬件和优化的软件。
开源基础模型
一些公司训练大型 LLM 并免费发布基础模型。基础模型本质上是原始的、未经提炼的 LLM,仍然需要调整才能有用。基础模型在原始互联网文本上进行训练,这意味着它们生成补全,但不理解人类意图。OpenAI 开源了 GPT-2。Meta 开源了 Llama 3.1(405B 参数)。要完全开源一个基础模型,需要两个条件:代码和参数。
基础模型如何工作
它们生成标记级的互联网风格文本。每次运行都会产生略有不同的输出(随机行为)。它们可以** regurgitate(复制)其训练数据的一部分。参数就像互联网知识的有损压缩文件**。它们可以用于翻译、基本助手等应用程序。基础模型的核心只是一个昂贵的自动完成功能,仍然需要微调。
从预训练到后训练
到目前为止,我们已经了解了基础模型,它们只是预训练的文本生成器。但是,要制作一个真正有用的助手,你需要后训练。基础模型会产生很多幻觉,后训练通过微调模型来更好地响应来解决这个问题。好消息是,后训练比预训练便宜得多。
监督微调 (SFT)
基础模型在互联网数据上训练后,下一步是后训练。在这里,我们将互联网数据集替换为人类/助手对话,以使模型更具对话性和实用性。预训练需要数月,但后训练要快得多,只需几个小时。模型的算法保持不变,我们只是微调现有的参数。为了教导模型如何处理来回对话,我们使用聊天模板。这些模板定义了对话的结构,并让模型知道哪个部分是用户输入,哪个部分是助手响应。例如:
<|im_start|>system<|im_sep|>You are a helpful assistant<|im_end|>
<|im_start|>user<|im_sep|>What is 4 + 4?<|im_end|>
<|im_start|>assistant<|im_sep|>4 + 4 = 8<|im_end|>
<|im_start|>
和 <|im_end|>
是特殊标记,用于构建对话。模型在预训练期间没有看到这些新标记,它们是在后训练期间引入的。OpenAI 在 InstructGPT 论文中讨论了用于对话的 LLM 微调。一个这样的后训练数据集是 OASST1。早期的后训练数据集由人类手动策划。现在,像 UltraChat 这样的模型可以生成合成对话,允许模型在没有太多人工输入的情况下进行改进。
幻觉、工具使用和记忆
LLM 的一个主要问题是幻觉,即模型自信地生成不正确或捏造的信息。发生这种情况的原因是,在后训练期间,模型了解到它们必须始终给出答案。即使问题没有意义,模型也会尝试生成响应,而不是说“我不知道”。Meta 在其 Llama 3 论文中描述了一种改进方法:提取一段训练数据,使用 Llama 3 生成关于它的事实问题,让 Llama 3 生成答案,然后根据原始数据对响应进行评分。如果错误,则训练模型识别并拒绝不正确的响应。本质上,此过程教导模型识别其自身的知识限制。
一种解决幻觉的方法是训练模型在使用工具当它们不知道答案时。通过重复训练,模型了解到,如果它们不知道某些东西,它们应该查找它,而不是捏造东西。
“模糊回忆”与“工作记忆”
模型参数存储模糊的回忆(就像记住一个月前的事情一样)。上下文标记充当工作记忆,让模型可以访问新鲜信息。这就是检索增强生成 (RAG) 如此有效的原因:如果模型可以直接访问相关文档,它就不需要猜测。
自我认知
如果你提示一个未经调整的基础模型关于它是谁,它很可能会产生幻觉。例如,一个非 OpenAI 模型可能仍然会说它是由 OpenAI 创建的,仅仅因为大多数互联网数据将 AI 模型与 OpenAI 联系起来。
如何解决这个问题
• 将自我身份硬编码到训练数据中 → 例如:Olmo-2 数据集。
• 使用系统消息 → 在每次对话开始时,包含一个提醒其身份的消息。
默认情况下,LLM 对自身没有真正的了解。没有特定的训练,它们会默认为通用的 AI 响应。
模型需要标记来思考
LLM 不像人类那样推理。它们按顺序生成标记,这意味着它们需要结构化的生成才能正确思考。
示例:不良与良好模型输出
不良模型输出:
人类:艾米丽买了 3 个苹果和 2 个橙子。每个橙子 2 美元。所有水果的总成本是 13 美元。苹果的成本是多少?
助手:答案是 3 美元。
模型直接跳到答案,而没有进行分解。
良好模型输出:
人类:艾米丽买了 3 个苹果和 2 个橙子。每个橙子 2 美元。所有水果的总成本是 13 美元。苹果的成本是多少?
助手:橙子的总成本是 4 美元。13 - 4 = 9,所以 3 个苹果的成本是 9 美元。9/3 = 3,所以每个苹果的成本是 3 美元。
在这里,模型逐步进行推理。
为什么这很重要
• 如果模型直接跳到答案,它可能只是在猜测。
• 如果它逐步完成解决方案,则更可靠。
• 模型将问题分解成更小的步骤。由于模型中存在有限的层,因此一个标记输出无法无限期地处理。将问题分解成更小的步骤,允许模型以一种更有可能产生正确答案的方式处理问题。
对于数学和逻辑任务,最好要求模型使用外部工具,而不是依赖其自身的推理能力。
强化学习
模型在互联网数据上训练后,仍然不知道如何有效地利用其知识。监督微调教导它模仿人类的反应。强化学习 (RL) 通过试错来帮助它改进。
RL 如何工作
RL 不依赖于人类创建的数据集,而是让模型尝试不同的解决方案,并找出最有效的方法。例如,模型生成许多不同的解决方案,然后选择那些达到正确答案的解决方案进行训练。预训练和后训练过程定义得很好,但 RL 过程仍在大量积极研究中。DeepSeek 的发布之所以如此重要,是因为他们的论文公开讨论了 LLM 的 RL 和微调,以及它如何带来大量的推理能力。
DeepSeek 论文中的一个例子表明,随着时间的推移,模型能够使用更多的标记来更好地进行推理。模型在这里拥有了一个“顿悟”时刻,这不是你可以通过仅在数据集上训练来明确教导模型的东西。这是模型必须通过强化学习自行弄清楚的东西。这种技术的优点是,模型在推理方面变得更好,但缺点是它消耗了越来越多的标记来做到这一点。
我们可以从关于掌握围棋游戏的研究论文中了解到,RL 实际上帮助模型在推理方面比人类同行做得更好。模型不仅仅是试图模仿人类,而是通过试错来提出自己的策略来赢得比赛。AlphaGo 比赛中一个非常独特的例子是被称为“Move 37”的一步。这是训练数据中没有的一步,但模型提出了自己的策略来赢得比赛。研究人员预测,人类下这一步的几率是 1/10000。因此,你可以看到模型有能力提出自己的策略。
RL 仍然是很大程度上未被探索的,并且在这个领域有很多研究正在进行。完全有可能的是,如果给予机会,LLM 可能会创造出它自己的语言来表达它的想法,因为它发现这是表达其想法的最佳方式。
在不可验证领域学习,又称基于人类反馈的强化学习 (RLHF)
在可验证的领域中,将人类排除在 RL 过程之外非常容易。LLM 可以充当其自身表现的评判者。然而,在不可验证的领域中,我们需要将人类纳入其中。
例如,对于提示“写一个关于鹈鹕的笑话”,很难找到一种自动判断笑话质量的方法。LLM 会毫无问题地生成笑话,但大规模判断其质量是不可能的。此外,大规模地将人类纳入此过程是不可行的。这就是 RLHF 的用武之地。
为了大规模地进行 RLHF,你基本上需要训练一个单独的奖励模型,它可以是一个没有额外层围绕它的 transformer。你使用人类来评判它给出的响应的排名,然后你用它来训练奖励模型,直到你对结果满意为止。一旦完成,你就可以使用奖励模型来大规模地判断 LLM 生成的响应的质量。
RLHF 的优点
• 在不可验证的领域(如笑话写作或摘要)中启用 RL。
• 通常通过减少幻觉并使响应更像人类来改进模型。
• 利用“判别器-生成器差距”——人类发现评估答案比生成答案更容易。例如:“写一首诗”与“这 5 首诗中哪一首最好?”
RLHF 的缺点
• 奖励模型只是人类偏好的模拟,而不是真正的人类。这可能会产生误导。
• RL 可以“玩弄系统”,产生利用奖励模型弱点的对抗性示例。例如:经过 1000 次更新后,模型“关于鹈鹕的最佳笑话”可能完全是胡说八道(例如,“the the the the the the the the”)。
• 这被称为对抗性机器学习。由于有无数种方法可以玩弄系统,因此过滤掉不良响应并非易事。
• 为了防止这种情况发生,奖励模型训练被限制在几百次迭代——超过这个限制,模型开始过度优化,性能下降。