第一章 LLM 简介
聊天机器人看起来会写文章。拆开看,它每次只干一件很小的事。这一章把那件小事讲清楚:猜下一个、怎么练、数据从哪来、结构长什么样、对错怎么算。
- 一模型每次只猜下一个 token,猜完接上去,再猜。这叫自回归。
- 二训练要回答四件事:数据、结构、损失、怎么下山。
- 三训练答案不是老师批的,是程序把文本自己切开的。
- 四谁来猜?Decoder-Only Transformer。图 1.3 里每一层都可以点开看人话。
- 五猜字就是在词表里做分类。交叉熵 = 把「正确答案的概率」取 −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 只需要知道「错了就改参数」。
真实训练里,山是几亿维的。人画不出来,计算机用梯度摸方向。本章记住即可:损失变小 = 参数被拧过。
接下节。四问的第一问:输入–目标对长什么样?答案藏在文本自己里面。
1.3 训练数据(输入–目标对)长什么样子?
是什么。还是那句「君不见黄河之水天上来」。没有人给每个字打标签。程序把句子切开:前面当题目,紧跟着的那个字当答案。
为什么叫自监督。监督学习要人给标签(这张图是猫还是狗)。这里的监督信号是文本自己长出来的:后一个字就是前一截的答案。所以叫自监督学习——不是没有监督,是监督不用人工标。
书里给了两种看法。表 1.1 从句首越写越长:看见「君不见黄河」猜「之」,看见「君不见黄河之」猜「水」。图 1.2 用固定长度的滑动窗口,输入和「错开一位」的目标叠成两行,一次喂给 GPU 算许多位置。本质相同:看见前面,猜后面。
书 §1.3 · 表 1.1、图 1.2 · p.18
两种切法:表 1.1 和 图 1.2
先看越写越长的表;再换成固定窗口。窗口模式可以拖上下文长度 L。
| 输入(看见这些) | 预测目标 |
|---|
图 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。
GPT-2 small:词表 50257,嵌入 768 维,12 层,12 个头。层数可以更多,形状不变:嵌入 → 积木 × N → 输出层。注意力怎么算、代码怎么写,是第二章的事。
接下节。函数会吐概率了。怎么衡量「这个概率够不够好」?交叉熵。
1.5 损失函数的设计
是什么。LLM 本质上是一个分类模型。词表里每一个字都是一个类别。看见前面的字,模型给每个类别打一个概率,希望正确答案那个类的概率尽量大。
为什么用 −log。从极大似然看:希望整段按从左到右写出来的概率尽量大。连乘容易变得极小,取对数变成加法;再取负,最大化概率就变成最小化损失。这个式子就是交叉熵。
书里用短序列「abcd」。希望下面越大越好:
取对数,连乘变加法:
再取负,最大化变成最小化:
书 §1.5 · 式 (1.1)–(1.3)、图 1.4 · p.20
连乘 → 加和 → 取负
三个正确类概率。拖滑块,看乘积怎么塌、取 log 怎么变成加法、取负之后要最小化什么。
| 步骤 | 算出来 | 含义 |
|---|---|---|
| 连乘 (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)。
损失 = −log(p)
本质是分类:下一个字就是一个类别。
图 1.4 里模型把 0.8 错给了「a」,正确的「c」只有 0.1,所以 −log(0.1) 很大。把滑块拖到右边,损失会掉下去。p 靠近 1,−log(p) 靠近 0。
接下章。五个直觉齐了。下一章把积木拆开:tiktoken 怎么切、Dataset 怎么滑、注意力 QKV 怎么看、训练循环四步怎么走。
合上这一章
对照刚才玩过的控件:
- NTP / 自回归。生成 = 反复猜下一个 token。稿纸上每点一次,只多一格朱砂;这格下一拍变成输入。
- 训练四问。数据、结构、损失、下山。SGD / Adam 是下山的走法,backward() 负责问路。
- 自监督。表 1.1 越写越长,图 1.2 固定窗口错开一位。答案是切开的文本,不是人工批改。
- Decoder-Only。Token 嵌入、位置嵌入、Dropout、LN、注意力、前馈、残差、堆叠、Final LN、Linear。
- 交叉熵 = 分类。极大似然 → log 加和 → 取负。独热是试卷,模型分布是答题卡,损失只看正确那一格的 −log(p)。
token 在这一章被说成「字」。真正的分词、注意力公式、训练循环的代码,翻到第二章。
章末自测
讲完了。下面几题核对本讲刚说过的概念。点选立刻看对错;做错也不会锁下一章。