大型语言模型(LLM)深度解析

大型语言模型(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论文)描述了一种改进方法:

  1. 提取一段训练数据。
  2. 使用Llama3生成一个关于它的事实性问题。
  3. 让Llama3生成一个答案。
  4. 根据原始数据对响应进行评分
  5. 如果错误,训练模型识别并拒绝错误的响应。

本质上,这个过程教会模型识别它们自己的知识限制。

使用工具减少幻觉

解决幻觉的一种方法是训练模型在不知道答案时使用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" )。
  • 这被称为对抗性机器学习。由于有无数种方法可以操纵系统,过滤掉不良响应并不简单。

  • 为了防止这种情况,奖励模型的训练被限制在几百次迭代内-一超过这个次数,模型会开始过度优 化,性能下降。

附录

  1. Excalidraw 文稿
  2. 用Chrome 插件:YOUTUBE TRANSCRIPT 输入完整字母,让Deepseek做一下总结
  3. ChatGPT chatgpt.com/
  4. FineWeb (pretraining dataset): huggingface.co/spaces/Hugg...
  5. Tiktokenizer: tiktokenizer.vercel.app/
  6. Transformer Neural Net 3D visualizer: bbycroft.net/llm
  7. llm.c Let's Reproduce GPT-2 github.com/karpathy/ll...
  8. Llama 3 paper from Meta: arxiv.org/abs/2407.21...
  9. Hyperbolic, for inference of base model: app.hyperbolic.xyz/
  10. InstructGPT paper on SFT: arxiv.org/abs/2203.02...
  11. HuggingFace inference playground: huggingface.co/spaces/hugg...
  12. DeepSeek-R1 paper: arxiv.org/abs/2501.12...
  13. TogetherAI Playground for open model inference: api.together.xyz/playground
  14. AlphaGo paper (PDF): discovery.ucl.ac.uk/id/eprint.....
  15. AlphaGo Move 37 video: • Lee Sedol vs AlphaGo Move 37 reactio...
  16. LM Arena for model rankings: lmarena.ai/
  17. AI News Newsletter: buttondown.com/ainews
  18. LMStudio for local inference lmstudio.ai/
相关推荐
崔庆才丨静觅5 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60616 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了6 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅6 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅7 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment7 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅7 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊7 小时前
jwt介绍
前端