Andrej Karpathy 深入探讨类 ChatGPT 的 LLM (TL;DR)
本次深入探讨的目标读者
几天前,Andrej Karpathy 发布了一个名为 “深入探讨类 ChatGPT 的 LLM” 的 视频。这是一个信息金矿,但时长也达到了 3 小时 31 分钟。我观看了完整视频并做了大量笔记,所以我想为什么不为那些想要获取要点而又不想投入大量时间的人整理一个 TL;DR(太长不看)版本呢。
如果以下任何一点听起来像你,那么这篇文章(和原始视频)都值得一看:
- 你想要理解 LLM 实际是如何工作的,而不仅仅停留在表面层面。
- 你想要理解令人困惑的微调术语,如
chat_template
和ChatML
(特别是如果你正在使用 Axolotl)。 - 你想要通过理解为什么有些提示词比其他提示词效果更好来改进提示词工程。
- 你正在努力减少幻觉,并想知道如何防止 LLM 编造内容。
- 你想要理解为什么 DeepSeek-R1 现在如此重要。
我不会涵盖视频中的_所有内容_,所以如果你有时间,绝对要观看完整视频。但如果你没有,这篇文章将为你提供关键要点。
注意:如果你正在寻找 Andrej 为视频制作的 excalidraw 图表,你可以从这里下载。他通过 Google Drive 分享了它,并且链接在一段时间后会失效。这就是为什么我决定将其托管在我的 CDN 上。
预训练数据
互联网
LLM 首先抓取互联网以构建庞大的文本数据集。问题是?原始数据是嘈杂的,并且充满了重复内容、低质量文本和不相关的信息。在训练之前,它需要进行大量的过滤。
- 如果你正在构建一个仅限英语的模型,你需要一种启发式方法来过滤掉非英语文本(例如,仅保留具有高概率为英语的文本)。
- 一个示例数据集是 FineWeb,它包含超过 12 亿个网页。
一旦清理完毕,数据仍然需要被压缩成可用的东西。模型不会将原始文本直接输入,而是将其转换为 tokens:一种结构化的数值表示。
Tokenization (分词)
Tokenization 是模型在处理文本之前将其分解为更小片段(tokens)的方式。模型不会存储原始单词,而是将它们转换为代表重复模式的 ID。
- 一种流行的技术是 Byte Pair Encoding (BPE)(字节对编码)。
- 对于压缩来说,存在一个最佳的符号(tokens)数量。例如,GPT-4 使用 100,277 个 tokens。这完全取决于模型创建者的决定。
- 你可以使用 Tiktokenizer 等工具可视化其工作原理。
神经网络输入/输出
一旦数据被 token 化,它就被输入到神经网络中。以下是该过程的工作原理:
- 模型接收一个上下文窗口,即一组 tokens 数量(例如,某些模型为 8,000,GPT-4 最多可达 128k)。
- 它根据已学习的模式预测下一个 token。
- 模型中的权重使用反向传播进行调整以减少误差。
- 随着时间的推移,模型学会做出更好的预测。
更长的上下文窗口意味着模型可以“记住”更多来自输入的信息,但它也会增加计算成本。
神经网络内部机制
在模型内部,数十亿个参数与输入 tokens 交互,为下一个 token 生成概率分布。
- 此过程由复杂的数学方程式定义,这些方程式针对效率进行了优化。
- 模型架构旨在平衡速度、准确性和并行化。
- 你可以在这里看到生产级 LLM 架构的示例。
推理
LLM 不会生成确定性的输出,它们是随机的。这意味着每次运行模型时,输出都会略有不同。
- 模型不仅仅重复它训练的内容,它还会根据概率生成响应。
- 在某些情况下,响应将与训练数据中的内容完全匹配,但在大多数情况下,它将生成符合类似模式的新内容。
这种随机性是 LLM 可以具有创造性的原因,但也是它们有时会幻觉不正确信息的原因。
GPT-2
GPT-2 由 OpenAI 于 2019 年发布,是基于 transformer 的 LLM 的早期示例。 以下是它的样子:
- 16 亿参数
- 1024-token 上下文长度
- 在约 1000 亿 tokens 上训练
- 最初的 GPT-2 训练成本为 $40,000 美元。
从那时起,效率得到了显著提高。Andrej Karpathy 成功地使用 llm.c 复现了 GPT-2,仅花费了 $672 美元。通过优化的管道,训练成本甚至可以降至 约 $100 美元。
为什么现在便宜这么多?
- 更好的预训练数据提取技术 → 更干净的数据集意味着模型学习速度更快。
- 更强大的硬件和优化的软件 → 相同的结果所需计算量更少。
开源基础模型
一些公司训练了大规模的 LLM,并免费发布基础模型。基础模型本质上是原始的、未经提炼的 LLM,它仍然需要调整才能变得有用。
- 基础模型在原始互联网文本上训练,这意味着它们生成补全内容,但不理解人类意图。
- OpenAI 开源了 GPT-2。
- Meta 开源了 Llama 3.1 (405B 参数),与 GPT-2 相比,这是一个相当新的 LLM 基础模型。
为了完全开源一个基础模型,需要两件事:
基础模型如何工作
- 它们生成 token 级别 的互联网风格文本。
- 每次运行都会产生 略有不同的输出(随机行为)。
- 它们可以 反刍 训练数据的一部分。
- 参数就像互联网知识的 有损压缩文件。
- 你已经可以将它们用于以下应用:
- 翻译 → 使用上下文示例。
- 基本助手 → 以结构化的方式提示它们。
想体验一下吗?试试 Llama 3 (405B 基础模型) 这里。
在其核心,基础模型只是一个昂贵的自动完成工具。它仍然需要微调。
从预训练到后训练
到目前为止,我们已经了解了基础模型,它们只是预训练的文本生成器。但是要创建一个真正的助手,你需要后训练。
- 基础模型会产生很多幻觉 → 它们生成文本,但并非总是可用。
- 后训练通过微调模型以更好地响应来解决这个问题。
- 好消息是?后训练比预训练便宜得多(例如,数月 vs. 数小时)。
Supervised Fine-Tuning (SFT) (监督微调)
数据对话
一旦基础模型在互联网数据上训练完成,下一步就是后训练。在这里,我们将互联网数据集替换为人类/助手对话,以使模型更具对话性和实用性。
- 预训练需要数月,但后训练要快得多。它可能只需要几个小时。
- 模型的算法保持不变,我们只是微调现有的参数。
为了教模型如何处理来回对话,我们使用聊天模板。这些模板定义了对话的结构,并让模型知道哪个部分是用户输入,哪个部分是助手响应。你可以在这里阅读更多相关信息。
Example template (示例模板):
<|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|>
是特殊 tokens,有助于构建对话结构。- 模型在预训练期间没有看到这些新 tokens,它们是在后训练期间引入的。
- OpenAI 在 InstructGPT 论文 中讨论了为对话微调 LLM。
为了可视化这一点,请转到 tiktokenizer。
一个这样的后训练数据集是 OASST1。早期的后训练数据集是由人类手动策划的。现在,像 UltraChat 这样的模型可以生成合成对话,使模型能够在没有太多人工输入的情况下进行改进。你可以在这里可视化这些主要是合成的数据集。
幻觉、工具使用和记忆
LLM 的一个主要问题是幻觉,即模型自信地生成不正确或编造的信息。
为什么会发生这种情况?
- 在后训练期间,模型学习到它们必须总是给出答案。
- 即使问题没有意义,模型也会尝试生成响应,而不是说“我不知道”。
Meta 如何处理幻觉
Meta 对事实性的研究(来自他们的 Llama 3 论文)描述了一种改进此问题的方法:
- 提取训练数据片段。
- 使用 Llama 3 生成关于它的事实性问题。
- 让 Llama 3 生成答案。
- 根据原始数据对响应进行评分。
- 如果答案不正确,则训练模型以识别并拒绝不正确的响应。
本质上,这个过程教会模型识别自己的知识局限性。
使用工具减少幻觉
解决幻觉的一种方法是训练模型在使用工具 当它们不知道答案时。这种方法遵循以下模式:
<|im_start|>user<|im_sep|>Who is Orson Kovacs?<|im_end|>
<|im_start|>assistant<|im_sep|><SEARCH_START>Who is Orson Kovacs?<SEARCH_END><|im_end|>
[...search results...]
<|im_start|>assistant<|im_sep|>Orson Kovacs is ....<|im_end|>
通过重复训练,模型学会如果它们不知道某事,它们应该查找它,而不是编造内容。
“模糊回忆” vs. “工作记忆”
- 模型参数存储模糊的回忆(就像记住一个月前的事情一样)。
- 上下文 tokens 充当工作记忆,使模型能够访问 新鲜信息。
这就是为什么 检索增强生成 (RAG) 如此有效的原因:如果模型可以直接访问相关文档,它就不需要猜测。
自我认知
如果你提示一个关于它是谁的未经调整的基础模型,它很可能会产生幻觉。例如,非 OpenAI 模型可能仍然会说它是 OpenAI 创建的,仅仅因为大多数互联网数据将 AI 模型与 OpenAI 联系起来。
如何解决这个问题
- 将自我身份硬编码到训练数据中 → 示例:Olmo-2 数据集。
- 使用系统消息 → 在每次对话开始时,包含对其身份的提醒。
默认情况下,LLM 没有真正的自我认知。 如果没有特定的训练,它们会默认使用通用的 AI 响应。
模型需要 Tokens 来思考
LLM 不像人类那样推理。它们顺序生成 tokens,这意味着它们需要结构化的生成才能正确思考。
示例:模型输出好坏对比
糟糕的模型输出:
Human: Emily buys 3 apples and 2 oranges. Each orange costs $2. The total cost of all the fruit is $13. What is the cost of apples?
Assistant: The answer is $3.
模型直接跳到答案,没有进行分解。
好的模型输出:
Human: Emily buys 3 apples and 2 oranges. Each orange costs $2. The total cost of all the fruit is $13. What is the cost of apples?
Assistant: The total cost of the oranges is $4. 13 - 4 = 9, so the cost of the 3 apples is $9. 9/3 = 3, so each apple costs $3.
在这里,模型逐步进行推理。
为什么这很重要
- 如果模型直接跳到答案,它可能只是在猜测。
- 如果它逐步解决问题,则更可靠。
- 模型将问题分解为更小的步骤。由于模型中存在有限的层,因此一个 token 输出无法无限期地处理。将问题分解为更小的步骤,模型可以以更可能产生正确答案的方式处理问题。
对于 数学和逻辑任务,最好要求模型使用外部工具,而不是依赖其自身的推理。
Reinforcement Learning (强化学习)
一旦模型在互联网数据上训练完成,它仍然不知道如何有效地使用其知识。
- 监督微调 教会它模仿人类的反应。
- 强化学习 (RL) 通过试错帮助它改进。
RL 如何工作
RL 不是依赖于人类创建的数据集,而是让模型尝试不同的解决方案,并找出最佳方案。
Example Process (示例流程):
We generated 15 solutions. // 我们生成了 15 个解决方案。
Only 4 of them got the right answer. // 其中只有 4 个得到了正确的答案。
Take the top solution (each right and short). // 选择最佳解决方案(每个都正确且简短)。
Train on it. // 在此基础上进行训练。
Repeat many, many times. // 重复多次。
此过程中没有人为参与。模型为同一问题生成不同的解决方案,有时达到数百万个。然后,它比较它们以选择那些获得正确答案的解决方案,然后在获胜的解决方案上进行训练。
预训练和后训练过程定义得非常明确,但 RL 过程仍在大量活跃研究中。Andrej 在 这里 也谈到了这一点。像 OpenAI 这样的公司对此进行了大量研究,但这是不公开的。这就是为什么 DeepSeek 的发布如此重要的原因。他们的 论文 对此进行了更多讨论。它非常公开地讨论了 LLM 的 RL 和 FT,以及它如何激发它们的大量推理能力。
来自 Deepseek 论文的一个例子向我们展示,随着时间的推移,模型能够使用更多 tokens 来更好地进行推理。
你可以看到模型在这里有一个“顿悟”时刻,这并不是你可以通过仅仅在数据集上训练来明确教给模型的东西。这是模型必须通过强化学习自行弄清楚的东西。这种技术的优点是,模型在推理方面变得更好,但缺点是它消耗越来越多的 tokens 来做到这一点。
我们可以从关于 掌握围棋游戏 的研究论文中学到的一件事是,RL 实际上有助于模型在推理方面比人类同行更优秀。模型不仅仅是试图模仿人类,而是通过试错来提出自己的策略来赢得比赛。
在 AlphaGo 的比赛中,一个非常独特的发现是一个名为 Move 37 的招数。这是一个不属于训练数据的招数,但模型提出了自己的策略来赢得比赛。研究人员预测,人类下出这一步的几率是万分之一。因此,你可以看到模型有能力提出自己的策略。
RL 仍然在很大程度上未被探索,并且在该领域正在进行大量研究。完全有可能,如果给予机会,LLM 可能会提出自己的语言来表达其思想和想法,因为它发现这是表达其思想和想法的最佳方式。
在不可验证领域中的学习,又名基于人类反馈的强化学习 (RLHF)
在可验证的领域中,将人类排除在 RL 过程之外非常容易。LLM 可以充当自己表现的评判者。
但是,在不可验证的领域中,我们需要将人类纳入循环。
例如,对于提示词 Write a joke about pelicans
(写一个关于鹈鹕的笑话),很难找到一种自动判断笑话质量的方法。LLM 将毫无问题地生成笑话,但在大规模上判断其质量是不可能的。
此外,在大规模上将人类纳入此过程是不可行的。这就是 RLHF 的用武之地。你可以在 这篇论文 中阅读更多相关信息。
为了大规模地进行 RLHF,你基本上训练一个单独的奖励模型,它可以是一个没有额外周围层的 transformer。你使用人类来判断它给出的响应的排名,然后你使用它来训练奖励模型,直到你对结果感到满意为止。一旦完成,你就可以使用奖励模型来大规模地判断 LLM 生成的响应的质量。
RLHF 的优点
- 在 不可验证的领域(如笑话写作或摘要)中启用 RL。
- 通常通过 减少幻觉 并使响应更像人类来改进模型。
- 利用 "判别器-生成器差距”——人类发现评估答案比生成答案更容易。
- 示例:“写一首诗” vs. “这 5 首诗中哪首最好?”
RLHF 的缺点
- 奖励模型只是人类偏好的模拟,而不是真实的人类。这可能会产生误导。
- RL 可以 玩弄系统,产生对抗性示例,利用奖励模型中的弱点。
- 示例:经过 1,000 次更新后,模型“关于鹈鹕的最佳笑话”可能完全是胡说八道(例如,“the the the the the the the the”)。
- 这被称为 对抗性机器学习。由于有无数种方法可以玩弄系统,因此过滤掉不良响应并非易事。
- 为了防止这种情况,奖励模型训练被限制在数百次迭代之内——超过这个范围,模型开始过度优化,性能下降。
未来展望
未来的 LLM 将在几个关键领域扩展:
- 多模态能力 → 不仅仅是文本,还包括理解和生成图像、音频和视频。
- 基于 Agent 的模型 → 从单任务转向长期记忆、推理和错误纠正。
- 无处不在且无形的 AI → AI 将以一种成为第二天性的方式集成到工作流程中。
- 使用计算机的 AI → 与软件交互并采取超出文本生成的行动的 AI 模型。
- 测试时训练 → AI 实时自我调整以提高即时准确性。
追踪 LLM 的发展
如果你有兴趣关注这个领域的发展,这里有一些很棒的资源:
- LM Arena → 基准测试新的语言模型。
- AI News → 涵盖 AI 研究的 Newsletter。
- X (Twitter) → 许多研究人员在这里分享最新进展。
在哪里找到 LLM
想尝试不同的 LLM 吗?以下是找到它们的地方:
- 专有模型 → OpenAI (GPT-4)、Google (Gemini)、Anthropic (Claude) 等。
- 开源权重模型 → DeepSeek、Meta (Llama) 等。通过 Together.ai 尝试它们。
- 本地运行 → 使用 Ollama 或 LM Studio。
- 基础模型 → 探索 Hyperbolic。