大型语言模型(LLM)深度解析
说明
本文是对【必看珍藏】2月6日,安德烈·卡帕西最新AI普及课:深入探索像ChatGPT这样的大语言模型|Andrej Karpathy 的一份视频笔记
预训练阶段(pre-training)
step1:下载和处理互联网数据
Hugging Face的公司收集并创建了一个名为FineWeb的数据集,他们在博客文章中详细介绍了如何构建这个数据集。像OpenAI、Anthropic、Google等主要的LLM(大型语言模型)提供商内部都会有类似FineWeb的数据集。
很多这类工作的起点是Common Crawl的数据。Common Crawl是一个自2007年以来一直在抓取互联网数据的组织。截至2024年,Common Crawl已经索引了27亿个网页
接下来是文本提取。所有这些网页都是爬虫保存的原始HTML。当你查看网页的源代码时,你会看到所有的标记,比如列表、CSS等。这些几乎就像是网页的计算机代码,但我们真正想要的只是网页的文本内容,而不是导航栏等内容。因此,有很多过滤和处理步骤,以确保我们只提取出网页中的优质内容。
接下来的阶段是语言过滤。例如,FineWeb使用语言分类器来猜测每个网页的语言,然后只保留英语占比超过65%的网页。
Step2:标记化(TickTokenizer)
在将文本输入神经网络之前,我们必须决定如何表示这些文本,当我们把所有这些文本拼接在一起,最终得到了这样一大段原始的互联网文本。即使只是这200个网页,文本量也非常大。
实际上,这个序列长度在我们的神经网络中是一个非常有限且宝贵的资源。我们实际上不希望有非常长的符号序列,而是希望用更多的符号来缩短序列长度。因此,我们不想只有两个符号和极长的序列,而是希望有更多的符号和更短的序列。
在实际生产中,最先进的语言模型实际上希望进一步缩短序列长度,因为序列长度是一个非常宝贵的资源。为了缩短序列长度,我们运行一种称为字节对编码(Byte Pair Encoding, BPE) 的算法。这个算法的基本思想是寻找非常常见的连续字节或符号对。例如,116和32这个序列非常常见,出现频率很高。因此,我们会将这个符号对组合成一个新的符号,赋予它一个新的ID,比如256
GPT-4是如何进行分词的呢?可以在这个网站上看到
Step3:神经网络训练(network training)
神经网络的训练
神经网络的训练 是训练这些神经网络时计算量最大的部分。在这一步中,我们希望建模这些token在序列中如何相互跟随的统计关系。我们进入数据中,随机取一些token窗口。窗口的长度可以从0到某个最大长度,比如8,000个token。原则上,我们可以使用任意长度的窗口,但处理非常长的窗口序列会非常耗费计算资源,所以我们通常会选择一个合适的长度,比如8,000或4,000个token。
现在我们选取四个token,这样一切都比较清晰。这些token是"bar"、"view"、"in"和"space",他们的token是这样的(如下图)。我们试图预测序列中的下一个token,即3962。我们将这四个token作为上下文输入到神经网络中,神经网络会输出一个预测,即下一个token的概率分布。
因为我们的词汇表有100,277个可能的token,神经网络会输出100,277个数字,每个数字对应下一个token的概率。在训练初期,神经网络是随机初始化的,所以这些概率也是随机的。例如,这里我展示了三个示例,但实际上有100,000个数字。神经网络可能会说,token"space"的概率是4%,token"Direction"的概率是2%,而正确的token"post"的概率是3%。
由于我们是从数据集中采样的这个窗口,我们知道下一个token是什么,这就是我们的标签。我们知道正确的答案是3962。现在,我们有一个数学过程来更新神经网络,调整它的参数,使得正确token的概率稍微提高。如果我们对神经网络进行一次更新,下次我们输入这四个token时,神经网络会稍微调整,可能会说"post"的概率现在是4%,而其他token的概率可能会降低。
这个过程不仅发生在这个token上,而是发生在整个数据集的所有token上。在实践中,我们会同时采样许多小窗口,每个窗口中的每个token都会调整神经网络,使得正确token的概率稍微提高。这就是训练神经网络的过程,通过不断更新网络,使其预测与训练集中的统计模式一致。
神经网络的内部结构
我们有一些输入,这些输入是token序列。在这个例子中,我们有四个输入token,但实际上这个长度可以从0到8,000个token。原则上,这个长度可以是无限的,但处理无限长度的token序列会非常耗费计算资源,所以我们通常会将其截断到一个固定的长度,这就是模型的最大上下文长度。
这些输入X与神经网络的参数(或权重)混合在一起。这里我展示了六个示例参数及其设置,但实际上,现代神经网络会有数十亿个参数。在训练初期,这些参数是随机设置的。由于参数是随机设置的,你可能会认为神经网络会做出随机的预测,事实也确实如此。在训练初期,它的预测是完全随机的,但通过不断更新网络(我们称之为训练神经网络),这些参数的设置会逐渐调整,使得神经网络的输出与训练集中的模式一致。
Step4:推理 (Inference)
推理阶段。在推理阶段,我们从模型中生成新的数据。我们想看看模型在其网络参数中内化了哪些模式。生成数据的过程相对简单,我们从一些token开始,这些token是你的前缀,比如你想从token 91开始。我们将它输入到网络中,网络会输出一个概率分布。我们可以根据这个概率分布进行采样,生成下一个token。
例如,token 860可能是下一个token。860是一个相对可能的token,但它可能不是唯一的可能token。在这个例子中,860确实跟随了91。现在,我们继续这个过程,生成了第三个token 287,然后是第四个token,最后生成了token 13659,这个token是"article",而不是我们之前看到的3962。因此,在这个例子中,我们没有完全重现训练数据中的序列。
记住,这些系统是随机的,我们是在采样,有时我们会生成与训练数据中完全相同的文本片段,但有时我们会生成一些训练数据中没有的token。因此,我们生成的token流可能与训练文档中的token流非常不同,但它们在统计上具有相似的属性。
pre-training 小结
我们讨论了第一阶段,即预训练阶段。我们看到,这实际上就是我们将互联网文档分解成这些标记(这些小文本块的原子),然后使用神经网络预测标记序列。整个阶段的输出是这个基础模型,它是网络参数的设置。这个基础模型基本上是一个在标记级别上的互联网文档模拟器。它可以生成具有与互联网文档相同统计数据的标记序列。我们看到我们可以将其用于某些应用,但实际上我们需要做得更好。我们想要一个助手,我们希望能够提问,并希望模型给出答案。因此,我们现在需要进入第二阶段,称为后训练阶段。
后训练阶段 - 监督学习(SFT)
后训练阶段在计算上将更加便宜。大部分计算工作(所有大规模数据中心、重型计算和数百万美元)都在预训练阶段。但现在我们进入稍微便宜但仍然非常重要的后训练阶段,我们将这个LLM模型变成一个助手。让我们看看如何让我们的模型不再采样互联网文档,而是给出问题的答案。
我们将通过创建对话数据集来隐式编程助手。
创建对话数据集
我们通过创建对话数据集来"隐式编程"助手。这些数据集由人类标注者生成,标注者会根据给定的对话上下文,编写理想的助手响应。然后,模型通过训练这些对话数据集,学习如何模仿这些响应。最终,模型能够在推理阶段生成类似的对话响应。
- 预训练需要数月时间,但后训练要快得多。它可能只需要几个小时。
- 模型的算法保持不变,我们只是在微调现有参数。
为了教模型如何处理来回对话,我们使用聊天模板。这些模板定义了对话的结构,并让模型知道哪部,分是用户输入,哪部分是助手响应。你可以在这里了解更多关干它们的信息。
sql
<|im_start|>system<|im_sep|>You are a helpful assistanit<|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|>
是用于构建对话结构的特殊标记。模型在预训练期间没有见过这些新标记,它们是在后训练期间引入的。 OpenAl在InstructGPT论文中讨论了微调LLMs以用于对话。
幻觉、工具使用和记忆
LLMS的一个主要问题是幻觉,即模型自信地生成错误或虚构的信息
为什么会发生这种情况?
- 在后训练过程中,模型学会了它们必须始终给出答案。
- 即使问题没有意义,模型也会尝试生成回应,而不是说"我不知道"
Meta如何处理幻觉问题
Meta关于事实性的研究(来自他们的Llama3论文)描述了一种改进方法:
- 提取一段训练数据。
- 使用Llama3生成一个关于它的事实性问题。
- 让Llama3生成一个答案。
- 根据原始数据对响应进行评分
- 如果错误,训练模型识别并拒绝错误的响应。
本质上,这个过程教会模型识别它们自己的知识限制。
使用工具减少幻觉
解决幻觉的一种方法是训练模型在不知道答案时使用I二具。这种方法遵循以下模式:
swift
<|im_start|>user<|im_sep|>Who is Orson Kovacs?<|im_end>
<|im_start|>assistant<|im_sep|><SEARCH_START>Who is Orson KKovacs?<SEARCH_END
<|im_end|>
[...search results...]
<|im_start|>assistant<|im_sep|>Orson Kovacs is ....<|im_end|>
通过反复训练,模型学会了如果不知道某件事,就应该去查找而不是凭空编造。
"模糊回忆"vs."工作记忆"
模型参数存储模糊的回忆(比如记住一个月前的事情)。上下文标记充当工作记忆,使模型能够访问最新信息。 这就是为什么检索增强生成(RAG)效果如此出色:如果模型能直接访问相关文档,它就不需要猜测。
强化学习(RL)
强化学习(RL)
一旦模型在互联网数据上完成训练,它仍然不知道如何有效运用其知识
- 监督微调教(SFT)会它模仿人类回应。
- 强化学习(RL)通过试错帮助其改进。 (很强!!!)
与其依赖人类创建的数据集,RL让模型尝试不同的解决力方案,并找出最佳方案 示例流程:
erlang
We generated 15 solutions.
Only4ofthemgottherightanswer.
Take the top solution (each right and short).
Train on it.
Repeat many,many times.
此过程无需人类参与。模型生成针对同一问题的不同解决方案,有时数量可达数百万。然后,它对这些方案进行比较,选出那些得出正确答案的方案,并基于这些获胜方案进行训练。预训练和后训练过程定义得非常明确,但强化学习(RL)过程仍在大量积极研究中。Andrej也在这里 提到了这一点。像OpenAl这样的公司在这方面做了大量研究,但这些研究并不公开。这就是为什么DeepSeek的发布如此重要。他们的论文对此进行了更多讨论,公开探讨了RL和微调(FT)对LLMS的影响,以及它们如何激发其大量的推理能力。Deepseek论文中的一个例子向我们展示了,随着时间的推移,模型能够使用更多的token来提高推理能力。
可以看下,下面这个例子:
你可以看到模型在这里有了"顿悟"时刻,这不是仅通过在数据集上训练就能明确教会模型的。这是模型必须通过强化学习自行领悟的东西。这种技术的优点是,模型的推理能力在提升,但缺点是它消耗的标记越来越多。 从关于掌握围棋游戏的研究论文中,我们可以学到的一点是,强化学习(RL)实际上有助于模型在推理能力上超越人类。该模型不仅仅是在模仿人类,而是通过试错来制定自己的策略以赢得比赛。
在AlphaGo的比赛中,一个非常独特的现象是被称为"第37手"的一步棋。这步棋并未包含在训练数据中,但模型自行制定策略以赢得比赛。研究人员预测,,人类下出这一步的概率仅为万分之一。由此可见,模型具备自主制定策略的能力。RL领域仍然存在大量未解之谜,该领域的研究正蓬勃开展。如果给予机会,LLM完全有可能发展出一套自己的语言来表达其思想和观点,因为它发现这是表达其想法的最佳方式。
在不可验证的领域学习,即从人类反馈中进行强化学习(RLHF)
在可验证的领域中,很容易将人类排除在强化学习过程之外。LLMS可以充当其自身表现的评判者。 然而,在不可验证的领域中,我们需要将人类纳入循环中。。。 例如,对于提示Writeajoke about pelicans,要找到一种自动判断笑话质量的方法并不 容易。LLM会毫无问题地生成笑话,但要大规模判断其质量是不可能的。 此外,大规模地将人类纳入这一过程是不可行的。这就是RLHF的用武之地。你可以在这篇论文中了 解更多相关信息。
RLHF优势
在笑话创作或摘要等不可验证的领域中启用RL。通常通过减少幻觉并使回答更加人性化来改进模型。 利用"判别器-生成器差距"--人类更容易评估答案而不是生主成答案。 示例:
"写一首诗"Vs."这五首诗哪首最好?"
RLHF缺点
-
奖励模型只是对人类偏好的模拟,而不是真正的人类。这可能能会产生误导。强化学习可能会玩弄系统,产生对抗性示例,利用奖励模型中中的弱点。
- 示例:经过1000次更新后,模型的"关于鹈鹕的最佳笑话"可能完全是无意义的(例) 如,"thethe the the the the the the the" )。
-
这被称为对抗性机器学习。由于有无数种方法可以操纵系统,过滤掉不良响应并不简单。
-
为了防止这种情况,奖励模型的训练被限制在几百次迭代内-一超过这个次数,模型会开始过度优 化,性能下降。
附录
- Excalidraw 文稿
- 用Chrome 插件:YOUTUBE TRANSCRIPT 输入完整字母,让Deepseek做一下总结
- ChatGPT chatgpt.com/
- FineWeb (pretraining dataset): huggingface.co/spaces/Hugg...
- Tiktokenizer: tiktokenizer.vercel.app/
- Transformer Neural Net 3D visualizer: bbycroft.net/llm
- llm.c Let's Reproduce GPT-2 github.com/karpathy/ll...
- Llama 3 paper from Meta: arxiv.org/abs/2407.21...
- Hyperbolic, for inference of base model: app.hyperbolic.xyz/
- InstructGPT paper on SFT: arxiv.org/abs/2203.02...
- HuggingFace inference playground: huggingface.co/spaces/hugg...
- DeepSeek-R1 paper: arxiv.org/abs/2501.12...
- TogetherAI Playground for open model inference: api.together.xyz/playground
- AlphaGo paper (PDF): discovery.ucl.ac.uk/id/eprint.....
- AlphaGo Move 37 video:
• Lee Sedol vs AlphaGo Move 37 reactio...
- LM Arena for model rankings: lmarena.ai/
- AI News Newsletter: buttondown.com/ainews
- LMStudio for local inference lmstudio.ai/