教材讲解 第一章

第一章 LLM 简介

聊天机器人看起来会写文章。拆开看,它每次只干一件很小的事。这一章把那件小事讲清楚:猜下一个、怎么练、数据从哪来、结构长什么样、对错怎么算。

  1. 模型每次只猜下一个 token,猜完接上去,再猜。这叫自回归。
  2. 训练要回答四件事:数据、结构、损失、怎么下山。
  3. 训练答案不是老师批的,是程序把文本自己切开的。
  4. 谁来猜?Decoder-Only Transformer。图 1.3 里每一层都可以点开看人话。
  5. 猜字就是在词表里做分类。交叉熵 = 把「正确答案的概率」取 −log。

书 §1.1–1.5 · p.17–20

1.1 大语言模型要解决的问题是什么?

是什么。一句话:预测下一个 token。英文 next token prediction,简称 NTP。

token 这一章先当成「一个字」。真正的分词可能把英文切成词片段,中文也不一定一字一 token,第二章用 tiktoken 看。直觉先抓住:已经写了前面一截,模型只负责补后面那一个

为什么是「下一个」,不是整段?一次猜完整段,可能性是词表的长度次方。词表大约一万、句子十个位置,就是 1000010 种全文——数不过来。每次只在词表里挑一个,任务就变成分类。人写字也是一个接一个;模型把「写全文」拆成「反复写下一个」,就能用同一个分类器。

吐出来的字马上接到输入后面,再送进模型。自己的输出变成下一步的输入,这叫自回归(autoregressive)。图 1.1 就是这个循环:提示词「君不见黄河」→ 吐「之」→ 变成「君不见黄河之」→ 再吐「水」。

书 §1.1 · 图 1.1 · p.17

逐步吐字:看自回归

点「下一步」。每次只多一个朱砂字;这个字下一拍就搬进左边的提示词。

已经看见的(提示词)
下一个字
?

点五次写完整句。模型没有一次构思全文,只是把「下一个字」重复做。这就是生成。

token ≈ 字,只是这一章的近似

英文一个单词常常就是一个 token,也可能被切成词根加词缀;中文一个汉字常常是一个 token,但不保证。模型真正吃进去的是整数编号,不是字形。下面两行对照一下:同一句话,按字数格子和按 token 切开,格数可以不一样。

字数格子 vs token 切开

点例句。上面按字排,下面按教学用的 token 切开。真正的分词器在第二章。

按字

按 token(教学近似)

GPT-2 的词表大约 50257 项。一个 token 对应表里的一个编号。本章把 token 说成「字」,是为了先把 NTP 讲明白。

接下节。知道要猜下一个字,还得会练。训练拆成四个问题:数据从哪来、函数长什么样、对错怎么量、参数怎么改。

1.2 如何训练一个能预测下一个 token 的模型?

是什么。神经网络就是一堆可调的数字组成的函数。输入前面的字,输出「下一个字是谁」的概率。训练 = 把这些数字拧到:看见「君不见黄河」,会把最大的概率分给「之」。

为什么是四问。任何监督学习都可以按这个清单走:先有成对的输入和答案,再定函数形状,再定「差多远」的尺子,最后用尺子去改参数。书 1.2 把 LLM 的训练也写成这四条。点开每一问,看它在后面哪一节兑现。

书 §1.2 · p.17–18

数据输入和答案长什么样?

下一节:程序把原文切开,前面当题目,紧跟的那个字当答案。没有人工标注。

结构这个函数长什么样?参数有多少?

1.4 节:Decoder-Only Transformer。字变成数字,数字在积木里处理,最后变成词表上的概率。GPT-2 small 大约 1.24 亿个参数,细节到第二章再拆。

损失猜得对不对怎么算?

1.5 节:交叉熵。正确答案那个类的概率越大,损失越小。本质上是分类。

优化如何让损失变小?

把损失看成山的高度。梯度是最陡的下坡方向。SGD 顺着方向走一小步;Adam、AdamW 是带记忆的走法,步子更稳。书里还点到 Muon,本章不必会。反向传播 loss.backward() 是求梯度的那一步:告诉你每个参数该往哪拧。

下山:损失变小的那一步

点「走一步」。球往谷底挪,高度就是损失。SGD 步子固定;Adam 只需要知道「错了就改参数」。

损失 步数 0

真实训练里,山是几亿维的。人画不出来,计算机用梯度摸方向。本章记住即可:损失变小 = 参数被拧过。

接下节。四问的第一问:输入–目标对长什么样?答案藏在文本自己里面。

1.3 训练数据(输入–目标对)长什么样子?

是什么。还是那句「君不见黄河之水天上来」。没有人给每个字打标签。程序把句子切开:前面当题目,紧跟着的那个字当答案。

为什么叫自监督。监督学习要人给标签(这张图是猫还是狗)。这里的监督信号是文本自己长出来的:后一个字就是前一截的答案。所以叫自监督学习——不是没有监督,是监督不用人工标。

书里给了两种看法。表 1.1 从句首越写越长:看见「君不见黄河」猜「之」,看见「君不见黄河之」猜「水」。图 1.2 用固定长度的滑动窗口,输入和「错开一位」的目标叠成两行,一次喂给 GPU 算许多位置。本质相同:看见前面,猜后面。

书 §1.3 · 表 1.1、图 1.2 · p.18

两种切法:表 1.1 和 图 1.2

先看越写越长的表;再换成固定窗口。窗口模式可以拖上下文长度 L。

5
输入
错一位
输入(看见这些)预测目标

图 1.2 把输入和错开一位的目标叠成两行,是为了一次算许多位置:第一个位置猜「不」,第二个猜「见」,……最后一个猜窗口后面那个字。GPU 喜欢这种齐刷刷的矩阵。第二章的 Dataset 会把这个窗口再做成可重叠的滑动,并一次取出一个 batch。

接下节。题目和答案有了。谁来猜?把图 1.3 从上到下点一遍。

1.4 模型结构的设计

是什么。谁来猜下一个字?现在主流是 Decoder-Only Transformer:只有解码器的 Transformer。从左往右写,不能偷看还没写出来的字。

为什么长这样。先把字变成数字,数字才能加减乘。位置也要变成数字,不然「黄河」和「河黄」分不清。中间的积木做两件事:字和字互相看(注意力),每个位置自己想(前馈)。残差把原路加回来,免得走丢。最后再变回「词表上每个字的可能性」。

书里画的是 GPT-2。先不要背公式。点每一层,右边用两到四句人话说明它干什么。

书 §1.4 · 图 1.3 · p.18–19

图 1.3 每层说人话

从下往上走,和书上的图一致。点 Token 嵌入、位置嵌入、Dropout、LN、注意力、前馈、残差、堆叠、Final LN、Linear。

Block ×12

GPT-2 small:词表 50257,嵌入 768 维,12 层,12 个头。层数可以更多,形状不变:嵌入 → 积木 × N → 输出层。注意力怎么算、代码怎么写,是第二章的事。

接下节。函数会吐概率了。怎么衡量「这个概率够不够好」?交叉熵。

1.5 损失函数的设计

是什么。LLM 本质上是一个分类模型。词表里每一个字都是一个类别。看见前面的字,模型给每个类别打一个概率,希望正确答案那个类的概率尽量大。

为什么用 −log。从极大似然看:希望整段按从左到右写出来的概率尽量大。连乘容易变得极小,取对数变成加法;再取负,最大化概率就变成最小化损失。这个式子就是交叉熵。

书里用短序列「abcd」。希望下面越大越好:

Pθ(d|abc) · Pθ(c|ab) · Pθ(b|a) 式 (1.1) 三个「下一个字」的概率连乘。θ 是网络参数。

取对数,连乘变加法:

log Pθ(d|abc) + log Pθ(c|ab) + log Pθ(b|a) 式 (1.2) log 是单调的,最大连乘和最大加和是同一件事。

再取负,最大化变成最小化:

−log Pθ(d|abc) − log Pθ(c|ab) − log Pθ(b|a) 式 (1.3) 这就是交叉熵损失。PyTorch 的 cross_entropy 算的就是这个。

书 §1.5 · 式 (1.1)–(1.3)、图 1.4 · p.20

连乘 → 加和 → 取负

三个正确类概率。拖滑块,看乘积怎么塌、取 log 怎么变成加法、取负之后要最小化什么。

0.40
0.30
0.20
步骤算出来含义
连乘 (1.1) 整段从左到右写出来的概率。有一项很小,乘积就塌。
log 加和 (1.2) 三项 log 相加。不再连乘,数值稳定。
取负 (1.3) 交叉熵。这项越小,模型越好。

独热 vs 模型分布

给定输入「ab」,正确答案是「c」。试卷上的标准答案写成独热:c 那一格是 1,别的格是 0。模型交出一张答题卡:a 0.8、b 0.1、c 0.1。交叉熵只盯着「标准答案为 1 的那一格」:−log(0.1)。图 1.4 就是这件事。

正确类的概率 ↔ 交叉熵

设定:输入「ab」,正确答案「c」。拖 p,同时看独热、模型分布和 −log(p)。

0.10
独热(标准答案)
模型分布(答题卡)

损失 = −log(p)

2.30

本质是分类:下一个字就是一个类别。

图 1.4 里模型把 0.8 错给了「a」,正确的「c」只有 0.1,所以 −log(0.1) 很大。把滑块拖到右边,损失会掉下去。p 靠近 1,−log(p) 靠近 0。

接下章。五个直觉齐了。下一章把积木拆开:tiktoken 怎么切、Dataset 怎么滑、注意力 QKV 怎么看、训练循环四步怎么走。

合上这一章

对照刚才玩过的控件:

  1. NTP / 自回归。生成 = 反复猜下一个 token。稿纸上每点一次,只多一格朱砂;这格下一拍变成输入。
  2. 训练四问。数据、结构、损失、下山。SGD / Adam 是下山的走法,backward() 负责问路。
  3. 自监督。表 1.1 越写越长,图 1.2 固定窗口错开一位。答案是切开的文本,不是人工批改。
  4. Decoder-Only。Token 嵌入、位置嵌入、Dropout、LN、注意力、前馈、残差、堆叠、Final LN、Linear。
  5. 交叉熵 = 分类。极大似然 → log 加和 → 取负。独热是试卷,模型分布是答题卡,损失只看正确那一格的 −log(p)。

token 在这一章被说成「字」。真正的分词、注意力公式、训练循环的代码,翻到第二章。

章末自测

讲完了。下面几题核对本讲刚说过的概念。点选立刻看对错;做错也不会锁下一章。

第二章 GPT-2 · 原书 p.21–43 · 把图 1.3 里的积木拆开写。

打开第二章 回到目录