第 20 章 · 通往大模型
通往大模型:原理与训练
你已经亲手把一个完整的语言模型从一个神经元拆到了底。现在我们站远一点,看看把第 19 章那个小模型 放大上千万到上亿倍会发生什么。这一章讲清楚三件事:大模型怎么读懂文字(分词与词嵌入)、 为什么越大越强(规模定律与涌现)、以及是怎么“炼”出来的(预训练 → 微调 → 对齐 → 蒸馏)。 讲完训练链路后,我们还会把“为什么偏偏是这几年爆发”拆成数据、算法、算力、工程四个卡点来看。 至于它靠什么硬件跑起来、你又该怎么用好它,留给第 21、22 章。
上一站(第 19 章)你已亲手搭出迷你语言模型;本站把它放大上千万到上亿倍——分词 / 词嵌入、规模定律与涌现、预训练 → SFT → RLHF → 蒸馏(全景图「放大成大模型」那一站);下一站(第 21 章)讲它靠什么硬件才跑得起来。
读完这一章,你会明白
- 真实大模型怎么分词(BPE / 子词),词表大小意味着什么;
- 1750 亿参数装在哪些层、每层约多少权重(GPT-3 举例);
- “词嵌入”把词变成语义坐标,为什么向量夹角能表示“意思相近”;
- 规模定律(Scaling Law)和涌现能力,到底在说什么;
- 训练数据从哪里来、怎样清洗成可用语料,为什么高质量数据会越来越稀缺,以及它为何是当前大模型竞争的核心资源;
- 预训练与后训练(SFT、RLHF、蒸馏)的分工,以及“底座模型”和“对话模型”的区别;
- 大模型测评在预训练、后训练、上线门禁和线上监控里分别测什么;
- 为什么大模型不是单点奇迹,而是数据、算法、算力、工程四个卡点同时解开后的结果;
- 模型是怎么一代代迭代升级的——GPT-4 到 GPT-5 是不是“重新训一个”,大版本和小更新差在哪;
- 推理模型、多模态(图像/语音怎么进 Transformer)、长上下文(窗口大小由什么决定、为何标称≠有效)等最近的新方向,大致是怎么回事;
- 常见“体感”问题:模型降智、对齐税、灾难性遗忘各自发生在训练链路的哪一环;
- 一串训练“黑话”:自监督、泛化、过拟合、epoch/batch/step、超参数;
- 大模型的本质与局限——它为什么会“一本正经地胡说八道”。
1. 先看一个惊人的事实:内核没变
GPT、DeepSeek 这类模型,做的事和你第 19 章那个 mini LM 一模一样: 看着前文,预测下一个 token,然后自回归地一个个往下写。区别只在量级:
同一套机制(Embedding + Transformer + 预测下一个 token),规模相差上亿倍。
大模型不是用了什么你没学过的“黑魔法”。它就是把你已经理解的 注意力、Transformer Block、预测下一个 token 堆得更深、喂得更多、训得更久。 这一章新增的每个概念,都只是围绕这个内核的“外围工程”。
那么,“大”到底大在哪几个方面?
既然内核没变,“大模型”的大就不是某一处,而是同一套机制在好几个维度上同时被放大。 把它们拆开看,后面每一节其实都在讲“其中一个维度怎么被放大、放大后带来什么新问题”:
| 放大的维度 | 具体指什么 | 本书 mini LM | GPT-3 量级 | 细讲小节 |
|---|---|---|---|---|
| ① 参数量 | 可学习权重的总个数(旋钮数) | 几千 ~ 几万 | 1750 亿 | §2 参数地图 |
| ② 深度与宽度 | 堆多少层 Block(L)、每个 token 向量多宽(d) | L≈1~2 · d≈64 | L=96 · d=12 288 | §2 参数地图 |
| ③ 训练数据 | 喂进去的 token 总量 | 几句话 | 数千亿 token | §5 规模化 |
| ④ 词表 | 能区分多少个 token(V) | 几十个字符 | 约 5 万 BPE 子词 | §3 分词与 BPE |
| ⑤ 上下文长度 | 一次能看多长的前文 | 几十个 token | 约 2k(GPT-3);现代可达上百万 | §9 更长的上下文 |
| ⑥ 算力与训练时长 | 用多少 GPU、训多久 | CPU 几秒 | 上千 GPU 训数周 | 第 21 章 工程与基础设施 |
六个维度不是各自独立地随便加——规模定律(§5)告诉我们参数、数据、算力要按比例一起放大才划算;放大到一定程度还会冒出小模型没有的涌现能力(§6)。
“大”= 更多参数 · 更深更宽 · 更多数据 · 更大词表 · 更长上下文 · 更多算力,六者协同放大。 但“大”只是量,不是新原理——下面先把最直观的“参数量”拆开,看这 1750 亿个旋钮到底装在哪。
2. 参数地图:1750 亿个“旋钮”装在哪儿(GPT 举例)
上一节说 GPT-3 有 1750 亿参数。参数就是训练后要存进模型文件、推理时要加载进内存/显存的那些可学习权重 (以及少量偏置、LayerNorm 的缩放/平移系数)。它们和“层数、头数”这类结构超参不是一回事: 超参决定网络长什么样;参数是这张网里每一根“连线”上的具体数字。
以最常见的 GPT 系 decoder-only 为例——结构和你在 第 19 章搭的 mini LM、 第 18 章的 Transformer Block 是同一套,只是更深更宽。 从外到内,可训练的参数大致分这几块:
GPT 类模型的参数主体 = 嵌入 + 很多层 Transformer Block + 输出头。下面用几个字母记形状——先别慌,含义见紧挨着的说明框。
- d — 模型宽度:每个 token 在模型里用多宽的一条向量表示(一串有多少个数)。从嵌入层出来是 d 维,进每一层 Block、层与层之间传递,宽度始终是 d。GPT-3 的 d=12 288;本书 mini LM 常见 d=64。
- L — 层数:Transformer Block 纵向堆了几层。每层各自有一套 attention + FFN 权重,参数量大致随 L 线性涨。GPT-3 的 L=96。
- V — 词表大小:分词后模型认识多少个不同的 token(每个 token 一个 id)。嵌入表有 V 行,LM Head 要给词表里每个 token 打一个分,所以这两块都是
[V×d]的矩阵。GPT-3 的 V≈50 257。 - f — FFN 中间层有多宽:每个 Block 里的前馈网络先把 d 维向量临时扩到 f 维,再压回 d 维。GPT 系惯例 f≈4d。对应两个矩阵
[d×f]和[f×d]。GPT-3 的 f=49 152。 - h — 注意力头数:把 d 维切成 h 份并行算注意力,每头 d/h 维。只改变怎么切分计算,不改变四个投影矩阵的总参数量(仍是 4d²)。GPT-3 的 h=96,每头 128 维。
2.1 先分清:结构数字 vs 要存的权重
读模型卡时你会同时看到两类数字,别混:
- 结构超参(决定形状,本身不占多少存储):层数 L、宽度 d、注意力头数 h(每头维度 d/h)、FFN 宽度 f、词表 V、上下文长度上限等;
- 参数量(要落盘的权重个数):上面每一块矩阵/向量里所有元素的总和。
前向时算出来的注意力分数 / 注意力矩阵(谁该多看谁)是临时中间结果,随输入变、算完就丢,不算进 1750 亿。
参数量只统计 W_Q, W_K, W_V, W_O 这类固定矩阵。
2.2 每一层 Block 里有哪些矩阵
一层 Transformer Block 里,和参数量相关的主要权重如下(偏置、LayerNorm 的 γ/β 也有,但相对很小,先略):
【自注意力】四个投影矩阵,每个都是 [d × d] W_Q, W_K, W_V, W_O → 小计 4d² 【前馈 FFN】两层全连接(中间维 f, GPT 系通常 f ≈ 4d) W1: [d × f] W2: [f × d] → 小计约 2df ≈ 8d²(当 f=4d) 【一层合计(主项)】≈ 4d² + 8d² = 12d²
头数 h 改变的是怎么切分计算(多头并行),那四个 [d×d] 矩阵的总元素数不变。
堆 L 层,Block 部分就是 L × 12d² 量级。
2.3 嵌入层与 LM Head
【词嵌入】把 token id 变成 d 维向量 Embedding 权重: [V × d] → Vd 个参数 【LM Head】把最后一层 d 维向量投影回词表,得到每个 token 的 logit 权重: [V × d] → 又是 Vd 个参数 【权重绑定(weight tying)】很多 GPT 实现让嵌入和 LM Head 共用同一张 [V×d] 表 → 只算一份 Vd,不重复存
词表 V 越大,嵌入和输出头就越大——这也是 BPE 词表不能无限膨胀的原因之一(见下一节)。
2.4 用 GPT-3(175B) 对一下账
OpenAI 公布的 GPT-3 规模(以 1750 亿参数那一档为例)大致是:
- L = 96 层, d = 12 288, h = 96 头(每头 128 维), f = 49 152 ≈ 4d, V ≈ 50 257
单层 Block(主项): 注意力 4d² = 4 × 12288² ≈ 6.0 × 10⁸ FFN 2df = 2 × 12288 × 49152 ≈ 1.2 × 10⁹ 单层合计 ≈ 1.8 × 10⁹(约 18 亿) 96 层 Block: 96 × 1.8×10⁹ ≈ 1.7 × 10¹¹(约 1700 亿) 嵌入(+ LM Head 若绑定则只算一份): Vd = 50257 × 12288 ≈ 6.2 × 10⁸(约 6 亿) 总计 ≈ 1.75 × 10¹¹ → 常说的 175B(1750 亿参数)
若 L=2、d=64、V=几十(字符级词表),Block 部分只有 L×12d² ≈ 几万到十万量级,再加嵌入/LM Head 也就十万级参数——和 GPT-3 差大约六到七个数量级,但矩阵名字、乘法形状完全一样。
想逐步看 [n×d]×[d×d] 怎么乘,可回
第 19 章 §4.4。
2.5 一眼估算总参数量
工程上常背一个近似式(FFN 取 f≈4d,嵌入与 LM Head 绑定):
参数量 ≈ L × 12d² + Vd
≈ 12Ld² + Vd (主导项是 L 和 d²)
所以 Scaling Law 里“把参数量做大”,本质上就是加层(增大 L)或加宽(增大 d,且每层按 d² 涨)。 只加词表 V 也会涨,但通常不如加层/加宽猛。 若换成 MoE 架构,FFN 部分会变成“多份专家权重 + 路由器”,总参数量可再上一个台阶(但每步只激活其中少数专家)。
3. 第一步:把文字切成 token(分词与 BPE)
第 19 章我们用的是最简单的字符级分词——一个字一个 token。真实大模型嫌它太浪费: 英文一个单词能拆成好几个字符,序列变得很长,而注意力的计算量随长度平方增长(第 17 章),很不划算。 于是它们用子词(subword)分词,最常见的算法叫 BPE(Byte Pair Encoding)。
BPE 的规则很朴素:谁和谁经常挨在一起出现,就把它俩合并成一个新 token,反复合并。 就像 “ing”“tion” 这种后缀在英文里到处出现,于是它们被合成一个整体;中文里“沙发”“葡萄”这种 高频组合也会被当成一个词。这样常用的东西用一个 token 就能表示,既短又高效。 (类比一下:晚自习后你和她三番五次被班主任“偶遇”,久了大家就默认你俩是“一对儿”——高频共现,合并成一个整体。)
切出来的这些 token,会预先登记在一张词表(vocabulary)里,每个 token 配一个唯一 id。
训练和推理都查这张表来分词,不能临时换算法(否则会切出词表里查不到的“陌生” token)。
词表大小(vocab_size)是个权衡:
- 太小:像拿着一年级生字本读专业书,啥都得拆成一堆碎片,表达力不足;
- 太大:每个词见得太少、学不充分,还白白撑大输出层。主流模型的词表通常在几万到十几万之间。
只有 5 万词表,怎么支撑几十种语言?
这里有个一算就露馅的疑问:全世界的文字加起来远不止 5 万——光常用汉字就好几千,再加上日文、韩文、阿拉伯文、印地文、各种 emoji……几十万都打不住。 GPT-3 的词表才 V≈50 257,凭什么能读写这么多语言?答案藏在两个字里:碎片。
① 词表里装的不是“词”,是“子词碎片”。 BPE 的规矩是高频的合成整体、低频的拆成碎片(见上文)。
所以词表不必囊括所有词,只要能把任意文本拼出来就行:常用词 the 占 1 个 token,生僻词
antidisestablishment 会被拆成 anti+dis+establish+ment 几块;实在没见过的,就一路拆到最小粒度兜底。
② 最小粒度是“字节”,所以永远拼得出、永不失败。 GPT-2/3 用的是 字节级 BPE(byte-level BPE): 它不在“字符”上合并,而在 UTF-8 字节上合并。任何语言的任何字符,在计算机里都是 1~4 个 UTF-8 字节,而字节只有 256 种。 于是词表最底层永远躺着这 256 个“单字节 token”做兜底——任何字符都能用字节序列拼出来,再也不会遇到“词表里查不到”(即 OOV(out-of-vocabulary))的字。 所以 5 万 ≈ 256 个字节 + 约 5 万个“高频字节组合”,靠拆分与拼接覆盖一切语言。
能支持,不等于高效。GPT-3 的训练语料以英文为主,合并出的高频 token 大多是英文片段,于是:一个英文词常常 1 个 token, 而一个汉字往往要 2~3 个 token(它的 UTF-8 是 3 字节,又没被并成整体)。这就是为什么同样的意思,中文调 API 更烧钱、也更快顶到上下文长度上限。 后来不少模型(如 GPT-4o)专门重做了 tokenizer、扩大词表,就是为了改善多语言的效率——而不是“能不能支持”,字节级早就保证了能支持。
OpenAI 提供了在线分词器 platform.openai.com/tokenizer,把一句中英文粘进去,
就能看到它被切成了哪些 token、各自的 id。你会直观感到:token 数 ≠ 字数,这也是 API 按 token 计费的原因。
4. 词嵌入:给每个词一个“语义坐标”
token 的 id 只是个编号(2 不比 1 “大”)。第 19 章讲过,词嵌入(embedding) 给每个 id 配一个可学习的多维向量。这里我们把这件事的“妙处”讲透,因为它是大模型能“懂语义”的地基。
怎么用几个数字表示一个复杂事物?你其实早就会了:屏幕上任何颜色都用 RGB 三个数表示, 比如橙色 ≈ (255, 165, 0)。相近的颜色,三个数也相近。词嵌入一模一样,只是维度更高 (几百到上万维),用一串数字表示一个词的“意思”。意思相近的词,向量也相近。
那怎么用数学衡量“两个向量意思有多近”?一个直觉是算它们的距离,但训练中向量会被整体拉伸缩放, 距离不稳。更稳的是看方向(夹角):两个向量夹角越小,就认为语义越接近。而衡量夹角的工具, 正是你在第 17 章反复用的点积——点积越大,夹角越小,语义越相近。
于是训练会把语义相近的词“挤”到相近的方向上。一个经典的神奇现象:在训练好的词向量里, 向量(“国王”) − 向量(“男人”) + 向量(“女人”) ≈ 向量(“女王”)——语义关系居然变成了可以做加减法的几何关系。
词向量一开始是随机的,要靠海量训练才长出语义。好消息是:别人训好的向量可以直接下载来用 (比如经典的 GloVe 词向量),这叫迁移学习——站在别人的肩膀上,省掉从零训练的巨大成本。 大模型时代更是如此:绝大多数人不会从头训一个,而是拿开源的“预训练模型”接着用。
更准确地说,许多被称为“开源”的大模型,核心是公开训练完成后的权重,也叫开放权重(open weights)。 把训练模型想成做菜:权重是已经做好的成品菜,下载后可以直接“端上桌”,也能继续微调加工; 训练方法、超参数和数据配比是菜谱与火候;训练数据则是食材。 拿到成品菜,不等于知道每样食材从哪来、放多少、按什么顺序烹饪,也就不一定能从头原样复刻。
所以,能下载权重和训练全过程可复现是两回事。有些项目还会公开训练代码、技术报告、部分数据来源或训练配方, 但开放程度各不相同。看到“开源模型”,最好继续问一句:开放的是权重、代码、训练配方,还是数据?
5. 规模化(Scaling Law):大力真的出奇迹
研究者发现一个惊人规律——Scaling Law(规模定律):当你同时放大三样东西—— 参数量、数据量、算力——模型的损失会沿着一条平滑、可预测的曲线持续下降。 也就是说,“做得更大”能可靠地换来“做得更好”。这条规律是过去几年“军备竞赛”的底气:既然变大几乎稳赚,那就拼命变大。
规模定律:横轴取对数后,测试损失沿一条近乎直线的曲线平滑下降,并逐渐逼近一个由数据本身决定的“下界”。正因为它可预测,才敢在真正砸钱训超大模型前,用几个小模型先把曲线画出来、外推投入产出。
很关键但常被忽略:光把参数堆大、数据却不够,模型会“吃不饱”,反而学不好(后面会讲的过拟合)。 研究(如 Chinchilla)发现:参数和数据要按比例一起增长才最划算。所以你会看到现代模型动辄用 十几万亿 token 训练——参数大,喂的数据也得跟上。
顺便建立一个数量级直觉:参数量 ≈ 网络里连线(权重)的总数(§2已按层拆开)。 1750 亿参数,就是 1750 亿个 第 2 章那样的“权重旋钮”。它们全部存成小数,这也是为什么模型文件动辄几十上百 GB。
那到底该配多少数据、多少算力?
“三样一起放大”不是拍脑袋,业界有能上手估算的经验法则。DeepMind 的 Chinchilla 研究给了个著名结论: 在算力预算固定时,参数量和训练 token 数最好按大约 1 : 20 搭配——每 1 个参数,大约要配 20 个训练 token 才“吃得饱”。
- 照这个比例,一个 70 亿参数的模型,大约需要 1400 亿 token 才算喂到位;
- 早期不少模型“参数堆得很大、数据却没跟上”,其实是没训透:同样的算力,匀一部分去多喂数据,效果反而更好。这就是前面那句“不能只堆参数”的量化版。
训练要烧多少算力(浮点运算次数 FLOPs),有个广为流传的估算:FLOPs ≈ 6 × 参数量 × 训练 token 数。 它告诉你一件扎心的事:参数和数据任意一个翻倍,算力就翻倍——两个都想涨,成本是相乘着往上冲的。 这也是为什么训一个前沿大模型动辄要上千张 GPU、烧数百万美元、跑好几周:不是钱多烧得慌,是这条曲线逼的 (硬件账细算见第 21 章)。
数据从哪来,又怎么洗干净?
既然 Scaling Law 要求“参数、数据、算力一起涨”,下一个问题就很自然: 这些训练数据到底从哪里来? 真实训练集不是“把互联网打包下载下来直接喂给模型”。 更准确地说,训练数据是一条很长的数据工程流水线:先从许多来源收集原始文本和多模态材料, 再经过抽取、去重、过滤、分类、配比,最后才变成一批批 token 送进训练。
互联网上当然还有海量页面。真正稀缺的不是“字符串”,而是 高质量、低重复、低污染、合法可用、能带来新增能力的训练 token。 垃圾页、广告导航、复制粘贴、SEO 灌水、机器翻译、重复镜像、泄漏的测试题、版权风险内容,看起来都是文本, 但喂进去未必让模型变强,还可能让它学坏。
① 数据来源:不是只有网页
大模型底座的预训练语料通常会混合多个域。公开报告很少披露精确比例,但大方向很清楚: 网页是基本盘,代码和数学是高价值补给,授权/私有数据补可靠性,合成数据和人类反馈数据补稀缺能力。
| 来源 | 典型内容 | 价值 | 主要风险 |
|---|---|---|---|
| 公开网页 | 百科、博客、论坛、新闻、教程、问答站、开源文档 | 覆盖面极广,是预训练的基本盘 | 重复、广告、SEO spam、低质转载、版权与隐私 |
| 代码数据 | 开源仓库、README、issue、PR、测试、编译报错、题解 | 结构化、逻辑密度高,还能用测试/编译验证 | 许可证、泄漏密钥、脆弱代码模式、重复模板 |
| 数学 / STEM | 教材、论文、题库、证明、实验报告、解题步骤 | 对推理、抽象和严谨表达很有价值 | 答案污染、题目重复、错误解析会被放大 |
| 授权与私有数据 | 图书、期刊、新闻档案、企业知识库、专业数据库 | 更新、更可靠、法律边界更清楚 | 成本高、覆盖窄、通常不公开 |
| 多语种 / 多模态 | 非英语网页、图文页面、OCR 文档、字幕、音频转写、视频描述 | 扩展世界知识和跨语言/跨模态能力 | 对齐难、噪声大、清洗和标注成本高 |
| 后训练数据 | 指令问答、偏好排序、红队样本、工具调用轨迹、Agent 任务记录 | 直接决定模型是否好用、听话、安全、会做任务 | 规模小但质量要求极高,标注标准容易漂移 |
| 合成数据 | 强模型生成题目/答案/解析,改写低质文本,模拟多轮对话 | 补自然数据里稀缺的推理、代码、工具和边界 case | 不验证会复制幻觉,循环自训可能越训越窄 |
真实训练集不是“某一种数据越多越好”,而是不同来源按任务目标和实验结果混合。
② 清洗:把原始网页变成训练 token
原始网页离“可训练文本”很远。你打开一个网页看到的是正文,爬虫拿到的却可能是 HTML、菜单、广告、 cookie 弹窗、推荐列表、评论区、脚本和一堆重复模板。清洗流水线要做的事,就是把这些东西一层层剥掉:
数据清洗流水线:从“原始材料”到“训练 token”,中间要丢掉大量噪声和重复内容。
| 步骤 | 在做什么 | 怎么判(方法) | 为什么必要 |
|---|---|---|---|
| 正文抽取 | 从 HTML / PDF / OCR 里抽正文,去掉导航栏、广告、版权页、相关推荐 | 用 readability / trafilatura 等工具,按标签密度、文本块长度找出正文主体,丢掉短小的模板碎块 | 否则模型会学到一堆“首页 / 登录 / 相关阅读”这类网页噪声 |
| 语言与格式识别 | 判断语言、编码、文档类型,修正乱码和异常字符 | 用 fastText / CLD3 语言分类器给每段打语种和置信度,低置信度或乱码率高的丢弃 | 方便按语言配比,也避免乱码 token 浪费训练预算 |
| 精确去重 | 删除完全一样的文档、段落、代码文件 | 对正文算哈希(MD5 / SHA),哈希撞了就是逐字相同,直接判重 | 重复内容会让模型背模板,还会浪费 token 预算 |
| 近似去重 | 删除轻微改写、镜像站、转载页、模板化问答 | MinHash / SimHash + LSH,按 n-gram 集合的 Jaccard 相似度超阈值(如 >0.8)判为近重 | 很多页面只换了标题或广告,本质仍是同一份内容 |
| 质量过滤 | 过滤低信息密度、SEO spam、机器翻译腔、自动生成垃圾 | ①启发式规则(长度、符号/数字占比、重复行比例、脏词表);②质量分类器或语言模型困惑度打分,低分丢弃 | 模型会模仿训练分布;低质文本多,输出也会变油、空、乱 |
| 安全与隐私过滤 | 处理个人信息、密钥、恶意代码、极端有害内容等 | 正则匹配邮箱/手机号/身份证/密钥 + NER 识别人名地址,命中就删或替换成占位符 | 降低隐私泄漏、安全风险和法律风险 |
| 污染检测 | 移除 benchmark 题目、测试答案、评测集泄漏内容 | 把评测集的 n-gram 与训练文本比对,重叠过高的样本剔除 | 否则模型可能只是“背过考题”,评测分数会虚高 |
| 领域分类与重加权 | 给文本打上 web / code / math / book / forum / language 等标签,再决定混合比例 | 训练一个领域分类器给文档打标签,再按实验结果调各域权重 | 训练不是平均吃;高价值领域通常要提高权重 |
| 分词与打包 | 用 tokenizer 切成 token,拼成固定长度训练样本,打成 shard | 用 BPE / BBPE tokenizer(§3)切分,再拼成定长序列 | 让 GPU 能高吞吐地一批批读取,减少空洞和随机 IO |
这就是为什么同样来自 Common Crawl,不同团队清洗出的语料效果会差很多。模型不是只看“吃了多少 token”, 还看这些 token 的信息密度、重复率、领域配比、语言覆盖、污染程度。训练前常常会先用小模型做 ablation: 换一版过滤器、调一版 web:code:math 比例,看验证集和下游任务到底变好还是变差,再决定大模型要不要跟进。
动手洗一段脏语料:8 条「刚爬下来」的原始文本,逐个打开过滤器,看噪声、重复、隐私被一层层剥掉,最后只剩下真正能训练的正文。
③ 为什么说 GPT-4 之后“数据更难了”?
网上常说“GPT-4 把互联网吃完了”,这句话不严谨。GPT-4 技术报告没有公开完整数据组成, 也不能证明它真的消耗完了互联网。更准确的说法是: 从 GPT-4 时代开始,继续靠更多公开高质量自然文本来暴力 scaling,边际收益变差了。
原始网页还很多,但新增的高质量唯一文本越来越难找。第一次看到一篇好教材,收益很大; 第二次看到转载版,收益就小;第十次看到换皮 SEO 文章,可能只是在浪费算力。 所以行业竞争点正在从“谁爬得多”转向“谁洗得干净、配得合理、验证得住、拿得到授权数据”。
这也解释了为什么现在的训练越来越依赖几类“高价值补给”:代码和数学因为可验证、逻辑密度高,价值很大; 多语种和多模态扩大了自然数据边界;授权/私有数据补可靠性和法律边界;合成数据负责补自然世界里很少出现的复杂题解、 工具调用轨迹和边界 case。它们不是替代网页,而是在公开网页边际收益下降后,继续给模型提供新的学习信号。
④ 合成数据:有用,但不是无限续命
合成数据(synthetic data)就是让已有强模型帮忙生产训练材料: 生成数学题和解析、把粗糙答案改写成高质量答案、模拟用户多轮追问、生成代码任务、产出工具调用轨迹。 这条路很重要,因为自然网页里“高质量多步推理 + 可执行验证 + 标准格式”的样本并不多。
但合成数据不能无脑循环。模型自己生成的内容里会有幻觉、重复套路和隐藏偏见;如果不筛就拿来训练, 等于把旧模型的错误再刻进新模型。靠谱做法通常是:
自然数据打底
→ 强模型生成 / 改写 / 补洞
→ verifier、单元测试、规则过滤、人工抽检
→ 只把通过验证的样本混回训练集
→ 用小规模实验确认真的提升,再扩大
所以“数据怎么来”这件事,已经从简单爬虫变成了完整的数据系统: 收集、清洗、分类、配比、验证、合成、再验证。Scaling Law 仍然告诉我们“更多高质量数据有用”, 但今天真正难的是把“更多”变成“更干净、更有信息量、更能提升能力”。
真正的竞争底座:有效数据 × 有效算力 × 转化效率
学到这里,很容易产生一种错觉:论文和新闻天天在讲新架构、新优化器、新注意力,算法似乎才是大模型竞争的主角。 但若把范围限定在今天主流的Transformer + 自回归预训练范式内,更接近现实的判断是: 高质量有效数据有多少、能投入多少有效算力,构成了能力竞争的资源底座;许多近期算法主要在提高这两种资源的转化效率。
| 要素 | 它真正决定什么 | 别用什么表面数字代替 |
|---|---|---|
| 有效数据 | 模型能看到哪些知识、技能、行为范式和纠错信号 | 不是硬盘里有多少 TB,也不是去重前爬了多少 token |
| 有效算力 | 这些训练信号能被多大模型、以多少 step 真正吸收 | 不是买了多少张 GPU,而是稳定训练实际完成了多少有用计算 |
| 转化效率 | 同样的数据和硬件,最终能沉淀出多少能力 | 不是算法名词越新越好,而是 loss、能力、吞吐和成本是否真的改善 |
这里的“有效数据”尤其不能只按数量算。一个 token 是否有效,取决于它是否正确、独特、信息密度高、覆盖当前能力缺口、配比合适,并且能被可靠验证。 一百万条换皮转载不等于一百万份新知识;一条带单元测试的代码任务、一份经过专家核对的推理轨迹, 可能比大量无法验证的流畅文本提供更强的训练信号。数据还决定模型不会什么:训练分布没有覆盖的语言、领域、边界 case 和行为规范, 很难靠多跑几轮优化器自动补出来。
可以把预训练想成备考:数据是教材、例题和答案,决定你究竟有机会学到什么; 算力是学习时间和脑力,决定能练多少遍、多大范围;算法与工程是学习方法,决定同样的教材和时间被浪费多少。 学习方法很重要,但没有教材学不到内容,没有时间也消化不完。
为什么说许多近期算法是在弥补“算不起、存不下、数据不够好”?
在主范式没有改变的前提下,近年来很多创新都可以还原成一个现实问题:理想做法太贵,怎样少算、少存、少通信,又尽量保住能力?
| 近期做法 | 它在弥补什么 | 怎样省资源,又付出什么 |
|---|---|---|
| MoE | 每个 token 都算全部参数太贵 | 只激活少量 FFN 专家,用较小计算承载更大总容量;代价是全部专家仍占显存,路由、通信和均衡更复杂 |
| KDA | 超长历史做全量 attention 算不起、存不下 | 把历史压进固定状态,再周期性用全局 MLA 补交互(第 21 章);代价是固定状态可能覆盖精确细节 |
| 稀疏 Attention | 所有 token 两两连接是 O(n²) | 只算窗口、全局或动态 top-k 连接;代价是没被选中的历史可能漏掉 |
| FlashAttention | 显存读写和中间矩阵太贵 | 数学不变,分块计算并减少 HBM 往返;实现更复杂,而且没有消除稠密计算量 |
| 量化 / 蒸馏 | 原模型部署成本太高 | 用更低精度或小模型承接大模型能力;压得太狠会损失细节与通用性 |
| 合成数据 | 高质量自然数据和稀缺任务轨迹不够 | 生成缺口样本,再用测试、规则、verifier 或人工筛选;验证不足会复制幻觉、偏见和套路 |
这些算法绝不是“不重要”:转化效率提高 2 倍,相当于同样资源做出了更多有效计算,甚至让原本不可训练的规模变得可行。 但它们通常没有凭空创造新的知识来源或无限算力,而是在资源约束下重新分配计算、压缩表示、减少浪费、制造并筛选训练信号。 因而看一项新技术时,比“名字新不新”更有用的问题是: 它省了哪种资源?省下来的资源去了哪里?牺牲了什么?最终让多少高质量数据变成了多少可用能力?
这里讨论的是当前主流范式内部的竞争:团队间差距越来越取决于谁拥有更多高质量、低污染、可验证的数据, 谁能投入并稳定利用更多算力,以及谁能用算法和工程把这两者浪费得更少。Transformer、反向传播、自监督目标这类基础算法 曾经改变过可扩展的能力上限,未来的新范式也可能再次改写规则。
6. 涌现能力:量变到质变
涌现能力(emergent abilities)指的是:某些能力在小模型上几乎为零, 但当规模越过某个门槛后会突然出现。比如:
- 少样本学习(few-shot):在提示里给几个例子,它就能照着做新题,不用重新训练;
- 按步骤推理(chain-of-thought):让它“一步一步想”,复杂问题的正确率明显提高;
- 遵循复杂指令:听懂并完成多步骤任务。
这些能力没有被任何人“显式编程”进去,而是在“预测下一个 token”这个朴素目标 + 巨大规模下,自己长出来的。
为什么会“量变到质变”?
第 5 节说损失是平滑下降的,这里怎么又变成突然出现?这看似矛盾,其实不冲突。涌现的成因目前学界还没有定论,但有几条被广泛接受的解释,拼起来能说清大半:
① 复合任务是多个子技能的“连乘”,像木桶效应。 很多高级能力(如多步推理)要好几个子能力同时到位,错一环整件事就失败。假设某任务需要 5 个子技能都答对,每个子技能的正确率随规模从 60% 平滑升到 90%:
② 要越过一个“容量门槛”才够用。 有些能力需要模型内部长出足够精细的表征/电路;参数和数据不够时,模型根本腾不出“脑容量”去编码这些间接、罕见的模式,越过临界规模后才学得动。就像水一直加热(平滑),到 100°C 才沸腾(相变)。
③ 很可能有一部分是“度量方式”造成的错觉。 这是近年一个重要反驳:很多涌现是用“全对才算分”的严苛指标衡量的(比如多位数加法必须完全正确)——这种指标天生非线性,会把平滑进步放大成断崖式跳变。换成连续、宽容的指标(按 token 部分给分、看概率),同一批模型的曲线又变回平滑上升,拐点就消失了。
同一批模型,换一把“尺子”结果就不同:黄线(全对才算分)在门槛处陡然跃升,看着像“质变”;蓝线(部分给分)则平滑上升,和第 5 节的规模定律一致。所以“突然涌现”里,既有真实的门槛/连乘效应,也有度量放大的成分。
规模定律管的是“平均损失平滑下降”;涌现是这种平滑进步在复合任务 + 严苛指标下表现出的“看起来突然”的跃升。底层是量变(每个子能力平滑提升),表面上呈现质变(连乘 / 门槛 + 度量放大)。真正的成因至今仍是开放问题。
7. 大模型是怎么炼成的:预训练 + 后训练
从“会接话的语料模型”到“有用、能落地的助手”,通常要走这几步。
这几步可以归成两大阶段,这也是你会反复听到的两个词:
- 预训练(pre-training) = 第 ① 步:在海量文本上自监督地学“通用语言能力 + 世界知识”。最烧钱、最耗时,决定了模型的“底子”。
- 后训练(post-training) = 第 ②③④ 步:在预训练好的底座模型(base model)之上做的所有加工——SFT 教它听话、RLHF/DPO 按人类偏好对齐、蒸馏压小。数据量比预训练小得多,却直接决定它好不好用。
开源社区里名字带 -base 的通常是只做过预训练的底座模型:博学,但只会顺着你的话往下接;
带 -chat / -instruct 的则是又做过后训练的版本,才会好好回答问题、听从指令。
今天各家大模型拉开体验差距的,很大一部分就在后训练这一段的数据质量与工艺。
测评:贯穿训练和上线的质检系统
大模型测评不是“随手问几个问题看看聪不聪明”,而是一套质量控制工作: 用固定题集、真实任务、自动脚本、人工规则和线上反馈,判断模型到底会什么、不会什么、有没有退步、能不能上线。 它本身通常不直接训练模型,但会反过来告诉训练团队该补什么数据、调哪段后训练、哪些版本不能发布。
| 测评维度 | 具体看什么 | 常见问题 |
|---|---|---|
| 基础能力 | 语言理解、数学、代码、知识问答、推理、长文本 | 数学变强了,代码是否退步? |
| 指令遵循 | 格式约束、多轮对话、角色边界、只输出 JSON 等 | 用户说“不要解释”,它还在啰嗦吗? |
| 安全与对齐 | 危险内容、隐私泄漏、越狱、歧视、过度拒绝 | 安全了,但是否把正常问题也拒掉了? |
| 可靠性 | 幻觉、引用来源、证据不足时能否承认不知道 | 它是在回答,还是在编一个像真的答案? |
| 产品体验 | 清晰度、啰嗦程度、延迟、成本、工具调用成功率 | benchmark 高,但用户是不是觉得难用? |
放到训练和发布链路里看,测评几乎每一站都在场:
| 环节 | 测评重点 | 测评结论用来干什么 |
|---|---|---|
| 预训练中 | loss / perplexity、基础 benchmark、不同 checkpoint 的能力走势 | 判断训练是否有效、哪个 checkpoint 值得继续训或拿去后训练 |
| 后训练中 | SFT / RLHF / DPO 前后,指令遵循、安全、偏好、幻觉是否改善 | 选择后训练配方,发现对齐税、灾难性遗忘和安全退步 |
| 上线前 | 新旧模型对比、红线安全、核心业务 case、延迟与成本 | 做发布门禁:能不能上线、灰度多少、哪些能力要回滚 |
| 上线后 | A/B 实验、用户反馈、人工抽检、投诉、安全事件、失败日志 | 发现离线榜单看不到的真实问题,进入下一轮数据和后训练 |
| 应用层 | 模型 + prompt + RAG + 工具 + 产品流程的端到端效果 | 判断问题到底出在模型、检索、工具、提示词还是业务链路 |
模型测评尽量只看模型本身:同一题、同一 prompt、同一解码参数,比较模型 A/B 的能力。 系统测评则看完整产品链路:检索有没有召回正确文档、rerank 有没有排对、工具有没有执行成功、最终答案有没有解决用户问题。 RAG 问答答错时,不一定是模型笨;也可能是切片、召回、排序或 prompt 出了问题。
所以测评岗位的产出,通常不是一个孤零零的分数,而是一整套证据: 测评集、自动评测脚本、人工标注规范、模型对比报告、安全红队报告、badcase 分析、上线准入结论和回归看板。 最有价值的测评报告会说清楚:哪里变好了、哪里变差了、为什么变差、下一轮训练该补什么。
① 预训练(Pre-training):自监督地读遍互联网
在海量文本(互联网级别)上,做的就是第 19 章那件事:预测下一个词。它最妙的一点是 不需要人工标注——因为“下一个词是什么”文本里现成就有,把后文盖住让模型猜即可。 这种“答案自带、不用人工打标签”的方式叫自监督学习。这一步最烧钱、最耗时, 却是模型获得“通用语言能力 + 世界知识”的来源。
监督学习:目标(答案)由人工标注,比如给一张图片标上“猫”。
自监督学习:目标从数据里自动抠出来,比如把“青海长云暗雪山,孤城遥望玉门关”里的
“玉门关”盖住,让模型猜——被盖的词就是现成的答案。两者都要有目标值,只是自监督省掉了人工。
海量数据下人工标注不可能,所以预训练必须靠自监督。
② 指令微调(SFT):把“博学”调教成“听话”
预训练完的模型“博学但不一定听话”——你问它问题,它可能只顾着把你的话接着往下写,而不是回答。 指令微调(SFT,Supervised Fine-Tuning)用一批“指令 + 理想回答”的高质量数据继续训练, 把它从“只会接话”调成“会回答你的问题、完成你的任务”。这一步数据量小得多,但作用关键。 注意:它用的还是第 19 章那套“预测下一个 token + 交叉熵 + 反向传播”,只是把训练数据从“互联网文本”换成了“标准问答范文”,并没有换算法。
就是一问一答的“范文”,比如:
指令:“用一句话解释什么是黑洞。” → 理想回答:“黑洞是引力强到连光都逃不出来的天体。”
成千上万条这样覆盖问答、翻译、写代码、总结的范文,教会模型看到指令就给出对应的回答,
而不是把指令当普通文本接着往下续。这里质量远比数量重要——几万条精挑细选的,常胜过几百万条粗制滥造的。
为什么少量 SFT 数据,能把模型“掰”得这么明显?
这听起来反直觉:预训练吃了几万亿 token,SFT 可能只有几十万到几百万条样本,凭什么能让模型行为大变? 关键在于,SFT 不是从零教模型知识,而是在已经很会续写、很懂语言的底座上,重新校准它的“使用接口”。
预训练模型早就见过解释、教程、代码、问答、论文、论坛讨论,所以它并不是不会回答;问题是它的默认目标只是“把文本接得像”。 你输入“解释一下梯度下降”,底座可能续写成百科、课堂笔记、论坛回复,也可能只是顺着你的话往下编。 SFT 把训练分布集中改成:
| 阶段 | 主要学什么 | 为什么影响不同 |
|---|---|---|
| 预训练 | 语言规律、世界知识、代码模式、推理痕迹 | 范围极宽,决定“会什么” |
| SFT | 看到指令后,应该怎样组织答案、遵守格式、完成任务 | 正好打在上线时最常见的用户交互分布上,决定“怎么把会的东西拿出来” |
| RLHF / DPO | 同一个问题下,哪种回答更有帮助、更安全、更符合人类偏好 | 继续把输出风格从“能回答”推向“更像好回答” |
所以数据量小不等于影响小:后训练样本少,但它们正好覆盖模型最终被调用的入口。
还要记住一个训练顺序上的事实:后训练发生在预训练之后。同一批参数已经被预训练塑好大体能力, SFT 再用更小的学习率、更新更短的时间,把“指令区域”的输出往范文方向拉。 它不必重写整个模型,只要把常见 prompt 附近的行为调顺,用户体感就会非常明显。
预训练像长期读书:模型在海量文本、代码和图像里形成语感、知识底座、世界模型和基本推理痕迹; 后训练像进入真实工作:用范文、偏好、工具结果和任务反馈,教它在具体场景里怎样把事做对、怎样回答才算合格。 更短地说,预训练决定模型会什么;SFT 决定模型怎么听指令地调用这些能力; 偏好优化决定模型两个可行答案里更该选哪一个。
这也解释了小模型和大模型的差别。粗略类比,小模型像受过专门训练的中专/技工,大模型更像知识面更宽、抽象能力更强的博士。 前者在熟悉工位上可以练得非常熟,甚至超过更大的通用模型;但任务一旦跨领域、跨模态、需要融会贯通, 底座容量和预训练见识的差距就会重新显现。后训练能把“博学但散漫”的底座调成“会接任务”的助手, 但如果底座完全没学过中文、数学或代码,少量 SFT 很难凭空造出这些能力。
训练时,哪部分 token 真正在计分?
很多人第一次听说 SFT 会困惑:既然还是“预测下一个 token”,那是不是整段
system / user / assistant 文本都拿去算 loss?真实实现里通常不是。
更常见的做法是:把整段对话都喂给模型看,但只对 assistant / completion 部分算 loss;
前面的 prompt(system/user) 主要是拿来当上下文条件,自己通常不直接计分。
| 位置 | 内容 | 是否计入 loss | 为什么 |
|---|---|---|---|
| system / user | 提示词 / 指令 / 题干 | 通常不计 | 它们负责告诉模型“题目是什么”,不是本轮想让模型去模仿的输出 |
| assistant | 理想回答 | 通常计 | 这是 SFT 真正想教模型学会的那段输出 |
结束符 <eos> | 回答结束位置 | 常常计 | 让模型顺便学会“这里该停了” |
一句最短的话: prompt 负责出题,assistant 负责得分。
比如一条样本被格式化成:
[<user> 解释牛顿第一定律 <assistant> 牛顿第一定律说 ... <eos>]
训练时模型会把这整串 token 都过一遍前向,但 loss mask 大致像这样:
token: [<user> 解 释 牛 顿 ... <assistant> 牛 顿 第 一 定 律 说 ... <eos>]
mask : [ 0 0 0 0 0 ... 0 1 1 1 1 1 1 1 ... 1 ]
这里的 0/1 不是“看不看”,而是“计不计分”:0 表示这个位置不算 loss,1 表示这个位置要算 loss。 所以 mask 掉 prompt != 模型没看到 prompt。它照样看了整道题,只是老师打分时主要看它的“答题区”。
tokens = [prompt..., assistant..., <eos>]; 1
target_mask = [0, 0, 0, ..., 1, 1, 1, 1]; 2
logits = model(tokens[:-1]); 3
loss = Σ target_mask[t+1] * CrossEntropy(logits[t], tokens[t+1]) 4
- 把完整 prompt + answer 拼成一条训练序列。
- 给每个被预测的目标位置配一个“计不计分”的开关。assistant 回答区域通常标 1,prompt 区通常标 0。
- 前向时模型整段都看,因为回答必须依赖题目。
logits[t]预测的是tokens[t+1],所以算 loss 时要看目标位置t+1是否标了 1。SFT 真正在优化的是 “给定这个 prompt,回答该怎么写”。
这也是它和预训练在“训练感觉”上的一个关键区别:预训练更像对整段自然文本普遍计分; SFT 则更像拿 prompt 当题干、拿 assistant 当标准答案。底层依然常是交叉熵,但监督重点已经从 “文本通常怎么继续写”变成了“面对指令时,理想回答应该怎么写”。
在预训练底座上继续 SFT/微调时,模型可能新任务学会了、旧本领丢了——比如微调成“只会写邮件”,通用推理变差。 缓解办法包括:混一定比例的原预训练数据、用小学习率、只训少量参数(LoRA/PEFT——在权重旁加低秩小矩阵,只更新这部分), 以及控制微调轮次。这不是 bug,而是在旧分布与新任务之间抢参数的必然张力。
LoRA / PEFT: “只训一小块参数”是怎么做到的?
PEFT(Parameter-Efficient Fine-Tuning)是“参数高效微调”的总称,LoRA 是其中最常见的一种。 它的关键不是换掉 SFT 的训练算法,而是不再直接改原来那块巨大的权重矩阵。假设某层原本前向是:
LoRA 会把它改成:
这里的核心思想叫低秩增量:不去学一整个巨大的 ΔW,而是假设“这次微调真正需要的改动,可以用一个很低秩的小补丁近似出来”。 于是训练时:
- 原权重 W 冻结:前向时照样参与计算,但不更新。
- 只训练 A、B:梯度只流到这两块新增矩阵,Adam 的状态也只为它们维护。
- 推理时可并回去:训练完后,把
(α/r)BA加回 W,就又变回一层普通线性层。
初始化时 A 用小随机数、B 全设为 0。于是训练刚开始的一瞬 BA = 0,前向退回 y = Wx——
模型和原底座一字不差,不会因为凭空加了个随机补丁把好好的底座搞乱。训练启动后 B 才从 0 慢慢“长”出来,一点点学到这次微调需要的增量。
到底省多少?拿具体数字算一遍。 设某层 din = dout = 4096、取 rank r = 8:
LoRA:A(8×4096) + B(4096×8) = 6.5 万 个 → 约 1/256 可训练参数缩到约 1/256;Adam 还要给每个可训练参数额外存 2 份动量状态,这块显存也跟着省同样的倍数——省显存往往比省参数更实惠
| 做法 | 全量微调 | LoRA |
|---|---|---|
| 更新什么 | 直接更新整块大矩阵 W | 冻结 W,只更新小矩阵 A / B |
| 训练参数量 | 很大 | 很小(由 rank r 决定) |
| 优化器状态 | 要给全部参数存 Adam 状态 | 只给 LoRA 参数存状态 |
| 底座权重显存 | 要放 | 也还得放,LoRA 省的是“可训练部分”,不是把底座凭空删掉 |
所以 LoRA 更准确的说法是: 省训练参数、优化器状态和微调成本,但底座模型本体仍然要在。
这也是为什么很多开源项目会写“7B 模型 + LoRA 微调”——本体还是 70 亿参数,只是训练时不再硬拧这 70 亿个旋钮, 而是在若干层旁边外挂一些很小的“微调旋钮”。最常见的插入位置,就是 attention 里的 WQ/WK/WV/WO 和 FFN 的线性层。
那这些参数到底存在哪?
这是 LoRA 最容易被绕晕、也最实用的一点:底座和 LoRA 是两份完全分开的权重。
| 存什么 | 大小 | 微调时 | |
|---|---|---|---|
| 底座权重 W | 原始 7B / 70B 模型(那几十亿个旋钮) | 几十 ~ 上百 GB | 冻结,只读不改 |
| LoRA 权重 A/B | 每个挂了 LoRA 的层各一对小矩阵 | 通常几 MB ~ 几百 MB | 只训这个 |
微调跑完,只产出一个几 MB 的 LoRA 文件(常叫 adapter);底座那几十 GB 一个字节都没动过。
用的时候:加载底座 + 加载 adapter,前向按 y = Wx + (α/r)BAx 一起算(或先把 (α/r)BA 并回 W 再跑)。
正因为 adapter 这么小,你可以给同一个底座配好多套 LoRA——客服一套、写代码一套、翻译一套,每套才几 MB,要用哪个就挂哪个、随时热插拔,而不必为每个任务各存一份几十 GB 的完整模型。这也是开源社区能分享海量“XX 风格 LoRA”的原因。
③ RLHF:按人类的喜好“对齐”
SFT 已经能让模型“好好回答”,但“什么才是更好的回答”很难写成标准答案——语气、分寸、有没有真的帮上忙, 这些没法像“1+1=2”那样标注。这里有个关键的转念:让人“写出满分答案”很难,但让人“判断两个答案哪个更好”很容易。 RLHF(基于人类反馈的强化学习)就建立在这句话上,分三步走:
把“人的口味”先蒸馏成一个会自动打分的裁判,再让模型去追这个裁判的高分。
- 收集偏好:同一个问题让模型给出多个回答,请人排序哪个更好。这种“比较题”标起来又快又稳。
- 训练奖励模型:用这些排序,训练一个专门的打分模型(reward model),让它学会给任意回答打出一个“人类有多喜欢”的分数——相当于把“人的口味”蒸馏成一个可自动打分的裁判。
- 用强化学习优化:让大模型不停生成回答、让裁判打分,再用强化学习(如 PPO)把它朝高分方向推。同时挂一个“别跑太偏”的约束(KL 惩罚),防止它为了讨好打分器而说出一堆通顺却怪异的废话。(PPO、策略梯度等 RL 基础见第 12 章。)
RLHF/DPO 把模型调得更安全、听话、像助手,但往往要付一点能力代价——复杂推理、创造性、某些专业深度可能不如对齐前的底座。 俗称“对齐税”:不是模型“坏了”,而是优化目标从“接话像互联网”变成了“人类更喜欢”。KL 惩罚、保守的奖励模型、过度拒绝有害内容, 都会让这种体感更明显。工程上常在能力评测与安全评测之间找平衡。
今天聊天助手那种得体的语气、拒绝有害请求的分寸,很多就来自这一步。近来也流行更简化的 DPO:跳过“单独训一个奖励模型”,直接拿人类偏好数据把模型“掰”过去,工程上更省事,思路完全一致。
④ 知识蒸馏:让小模型“拜大模型为师”
大模型效果好,但太重,难以塞进你的手机或个人电脑。知识蒸馏(distillation)让一个小的 学生模型去模仿大的教师模型:不只学“正确答案”,还学教师输出的整个概率分布 (即“软目标”)——因为“它觉得‘吃饭’概率 0.6、‘干饭’0.2、‘用膳’0.05”这种细微的偏好本身就是宝贵知识。
上面讲的是经典蒸馏(Hinton 那一套):学生对着教师的软概率分布学,所以才需要调温度。 但今天在 LLM 圈里,大家口头说的“蒸馏”通常指另一种更省事的做法:让教师模型生成一大批高质量回答,再拿这些回答当普通训练数据去 SFT 学生——学的是硬答案(一个个 token),完全不碰概率分布,也就不涉及温度。
举个真实例子:DeepSeek 开源的 DeepSeek-R1-Distill-Qwen-14B(140 亿参数)虽然名字里带 Distill,
走的其实就是后一条路——用 R1 生成的约 80 万条推理轨迹去 SFT 一个 Qwen 底座。
所以听到“蒸馏”时最好追问一句:学的是软分布,还是老师写出来的答案?两者都能让小模型继承不少本事,但机制不是一回事。
蒸馏和直接做小模型,换的是体积与速度,付的是能力上限。学生很难 100% 复制教师的“暗知识”, 复杂推理、长尾知识、细腻概率偏好最容易丢——用起来就像“同款但没那么聪明”。这和量化、MoE 压 k导致的降智是不同环节, 但体感类似:不是不会,而是浅了、窄了。
一个小模型在编程、数学或某个 Agent 评测里接近大模型,也不等于“堆参数没用了”。它往往是拿几样东西来换:
- 更长的推理时间:小模型一步看不出的题,靠更长思维链、多候选搜索、测试和修复慢慢逼近;单步便宜,整次任务未必便宜。
- 更窄的能力范围:专门练编程、数学或工具轨迹后,这个工位上很能打;但常识、写作、科学、多语言或跨领域迁移可能弱很多。
- 更少的模态和体验:砍掉视觉、音频、视频能省参数和训练成本,但前端设计、图表理解、真实世界任务会吃亏。
所以看“小模型打大模型”的结果,不能只看分数,还要看任务范围、推理预算、延迟、多模态能力和通用性。 更准确的结论是:底座规模决定上限,后训练决定能不能把上限用出来;小模型可以靠专精和更多推理预算追上某些任务, 但它通常牺牲了宽度、速度或跨场景鲁棒性。
传统蒸馏常像“一位大老师带一个小学生”。MiMo-V2-Flash 这类模型展示了更工程化的做法: 让数学、代码、Agent、工具使用等领域老师分别提供反馈,学生在自己当前生成的轨迹上接受批改, 不只学最终答案,还学每一步、每个 token 附近的偏好信号。这类多教师在线蒸馏的目标不是单纯压小, 而是把多个专家模型或 RL 专项模型的能力合并进一个更快的统一模型。
⑤ 为什么这几年才爆发:四个卡点同时解开
到这里,我们已经把大模型的核心训练流程拆开了。现在补一个更宏观、但很关键的问题: 神经网络、反向传播、GPU、互联网都不是今天才出现,为什么大模型偏偏在最近几年爆发? 答案不是某个单点突然神了,而是四个长期卡住的条件第一次同时接上:数据够喂、算法能学、算力能训、工程能用。
| 卡点 | 前文伏笔 | 怎么被解决 | 少了它会怎样 |
|---|---|---|---|
| 数据 能喂 |
第 19 章的语言模型目标:预测下一个 token | Web 文本和代码本身就带着“下一个 token”答案,不需要人工逐条标注; 自监督预训练把海量文本变成训练题库。后训练再用指令数据和偏好反馈,把底座模型推向可用助手。 | 模型容量再大也吃不饱;只会在小语料上背模板,学不到广泛知识、代码模式和真实表达方式。 |
| 算法 能学 |
反向传播解决调参; RNN 的问题引出注意力; Transformer成为可堆叠骨架 | 反向传播 + 交叉熵让“预测下一个 token”能端到端优化; 自注意力解决长距离关系,Transformer 让训练天然并行; 规模定律又把“继续放大是否值得”变成可估算的工程判断。 | 有数据也学不动;模型要么串行太慢,要么长距离信息丢失,要么不知道该怎样按比例放大。 |
| 算力 能训 |
矩阵是神经网络的计算形状; GPU擅长海量并行乘加 | GPU/CUDA 把矩阵洪流跑起来,HBM 提供高带宽显存,高速互联让多卡像一台更大的机器协同。 训练成本仍然巨大,但从“根本算不完”变成“可以预算、可以排期、可以复现”。 | 曲线再漂亮也只是纸面路线图;一次训练要拖到不可接受的时间,模型迭代速度跟不上。 |
| 工程 能用 |
下一章第 21 章会展开:显存、并行、通信、推理服务 | 数据清洗与去重保证“喂进去的东西别太脏”;数据/张量/流水线并行解决“单卡装不下”; checkpoint、容错和监控让长训练不中途白费;推理侧靠 KV cache、连续批处理、量化和负载均衡把模型送到真实用户面前。 | 模型可能训得出,但服务不了:延迟太高、成本太贵、显存爆掉、线上不稳定,最终只能停在实验室指标。 |
所以“大模型爆发”更像四道闸门同时打开:Web/Code/Feedback 提供可扩展的数据, Transformer + 规模定律给出可扩展的算法路线,GPU 集群提供可扩展的训练能力, 工程系统把训练和服务做成可持续迭代的流水线。只有其中一块成熟,最多产生漂亮 demo; 四块同时成熟,才会出现 ChatGPT 之后这种社会级应用扩散。
数据解决“学什么”,算法解决“怎么学”,算力解决“训不训得动”, 工程解决“能不能稳定给人用”。大模型时代不是把其中一个做到极致,而是四个环节都跨过了最低门槛。
8. 模型是怎么一代代迭代升级的?
学会了“炼一个模型”,一个很自然的问题是:GPT-4 到 GPT-5,难道是重新训一个吗? 答案是——大版本升级,底座确实基本是从头重新训一个;但你平时感受到的大多数“变强”,并不是重训,而是更便宜、更频繁的后训练迭代。 迭代其实发生在好几个时间尺度上:
| 迭代类型 | 怎么做 | 要重训底座吗 | 成本 / 频率 | 例子 |
|---|---|---|---|---|
| 大版本 | 从随机初始化重新预训练一个新底座 | 是 | 极高 / 一两年一次 | GPT-4 → GPT-5 |
| 中版本 | 底座不变,重做/加强后训练(SFT+RLHF) | 否 | 中 / 几个月 | Llama-3 → Llama-3-Instruct(同一底座多做一遍后训练) |
| 小版本快照 | 换更新的对齐数据、调安全策略、修 bug | 否 | 低 / 常态 | 同名模型的日期后缀更新,如 DeepSeek-V3 → V3-0324 |
| 能力扩展 | 加多模态 / 工具调用 / 更长上下文 / 推理模式 | 多为增量训练或微调 | 中 | 加视觉、加 reasoning、把上下文从 32K 拉到 128K |
| 蒸馏出轻量版 | 用大模型当老师蒸馏出小模型 | 否(训小的) | 中 | 大模型 → mini / lite 版 |
提醒一句:商业模型改个名字(比如冒出个 -turbo)时,往往好几行一起发生了——
知识截止日往前挪要动预训练语料,上下文从 32K 拉到 128K 要续训,再叠上新的后训练和更便宜的推理配置。
闭源模型通常不公开细节,所以看到一个新名字时别急着往某一行里塞;这张表是帮你拆解可能变了什么,不是给商业版本号做分类。
那 Flash / Pro 这种区别是什么?
很多产品还会在同一代模型里分出不同档位,名字可能叫 Pro、Flash、Mini、Lite、Turbo。这通常不是“GPT-4 → GPT-5”那种代际升级,而是同一产品线里按能力、速度、价格、上下文长度做的工程取舍。
| 档位 | 通常怎么来的 | 优点 | 代价 | 适合场景 |
|---|---|---|---|---|
| Pro / Max | 更大的底座、更完整的后训练,或推理时给更多计算预算 | 复杂推理、长文理解、代码、多轮稳健性更强 | 更慢、更贵、吞吐低 | 难题、重要决策、长文档深分析 |
| Flash / Turbo | 更小模型、蒸馏版、量化版、MoE 少激活专家,或推理服务做了更激进的加速 | 响应快、便宜、并发能力强 | 复杂题可能更容易浅答、漏细节或出错 | 客服、摘要、批量分类、实时交互 |
| Mini / Lite | 用大模型当老师蒸馏出来的小学生模型 | 成本低、部署灵活,甚至能跑在端侧 | 能力上限更低,长尾知识和复杂推理更容易丢 | 固定流程、低成本大规模调用、隐私端侧场景 |
这些名字不是严格学术分类,不同厂商含义会变;但底层取舍差不多:把同一代能力切成“更强但更贵”和“更快但更省”的服务档位。
所以选模型时不要只看名字像不像“新一代”。更实用的判断是:这件事是要一次答得最稳,还是要大量、便宜、低延迟地完成? 前者偏向 Pro,后者偏向 Flash / Mini。它们的关系更像“同一车系的性能版和省油版”,不是“上一代车和下一代车”。
为什么大版本非得“从头再来”?
既然后训练那么省,为什么大版本不能在旧模型上“接着训”?因为一次真正的代际提升,往往三样东西同时变了,旧权重根本接不上:
- 结构变了:参数规模、层数、上下文长度甚至架构(比如换 MoE、改注意力)都可能改,旧权重的形状对不上,没法续训。
- 数据变了:新一代会用更大、更新、更干净的数据重新配比;在旧模型上打补丁,改不动它已经“学歪”的底子。
- 要冷启动:想要能力发生质变,通常得从随机初始化重新走一遍完整预训练——几千上万张 GPU 跑几个月,烧掉的钱以千万美元计。所以大版本不会频繁出。
大模型迭代的两个时间尺度:大圆点是从头预训练的新底座(贵、稀少),小圆点是同一底座上不断做的后训练更新(便宜、频繁)。
把预训练底座想成“一个人读完了海量的书、世界观定型”——贵、慢、很少发生;把后训练想成“给他做岗前培训、教他说话得体、纠正坏习惯”——便宜、快、可以反复做。 GPT-4 → GPT-5 是换了个读书更多、脑子更大的新人;而 GPT-4 的多次小更新,是同一个人反复参加培训。 你某天觉得“这个模型最近变聪明/变听话了”,绝大多数时候是后训练和对齐数据更新了,底座根本没动。
9. 最近的一些新方向(建立个印象就好)
大模型领域跑得飞快,新词层出不穷。但你会发现一个规律:再新的花样,也都长在前面这套地基上。 下面几个最常被提到的方向,不求精通,先混个脸熟。
推理模型:先“想很久”,再作答
以 OpenAI o1、DeepSeek-R1 为代表的推理模型(reasoning model),核心变化是: 在给出最终答案前,先自己生成一大段思维链(第 22 章会细讲),一步步推演,想清楚了再回答。 相当于把“一步一步想”从你来提示,变成了模型天生就会、而且能想很长。
- 测试时算力(test-time compute):让模型在回答时“多花时间思考”(生成更多中间推理),难题正确率明显提升——花的不再只是训练算力,还有推理时的算力。
- 怎么训出来的:很多用一种“可验证奖励”的强化学习(RLVR)——数学、代码这类有标准答案的任务,答对给正奖励、答错给负奖励,让模型自己摸索出好的推理套路。这是 RLHF 之后后训练的新玩法。
那模型推理时怎么知道该想多久?它不是凭空有个“自知之明”开关,而是三件事叠在一起:
- 外部预算:产品或 API 会给这次请求一个思考档位,比如
low / medium / high、reasoning_effort、thinking_budget或最大 reasoning token 数。服务端再把它变成模型能感知的控制信号,例如特殊 token、系统指令、解码配置或内部路由策略。 - 模型策略:训练和强化学习会让模型见到“简单题短想、难题多想”的样本与奖励。久而久之,模型会学到一种停机策略:什么时候继续推演、什么时候检查、什么时候转入最终回答。
- 运行时截断:就算模型还想继续生成中间推理,一旦 reasoning token、总输出 token、工具调用轮数或超时达到上限,服务端也会强制停止或转入最终回答。
所以“思考深度”更准确地说是外部预算 + 模型学到的停机策略 + runtime 硬限制共同决定的。 调高它不会改变模型权重,只是允许同一个模型在推理阶段花更多 token、更多候选或更多验证轮次。简单题可能只是变慢变贵;难题才更可能因此做对。
真正难的是:推理长度本身不好直接监督。训练时通常不是教模型“这题必须想 137 个 token”, 而是让它学会在预算内判断继续想是否值得。
- SFT 给长度示范:数据里可以放“简单题 → 短推理”“难题 → 长推理 / 多次检查”的样本,让模型先模仿不同题型下的展开方式。
- RL 奖励正确性:数学、代码、逻辑题可以用最终答案、测试用例或 verifier 判断对错。模型如果靠更长推理把题做对,就会得到更高奖励。
- 成本项惩罚磨蹭:只奖励答对会鼓励模型无限展开,所以奖励里常会扣掉 reasoning token、工具调用或耗时成本,逼它学会“能短想就短想,难题才多想”。
- effort 条件控制:训练时把
low / medium / high这类档位也作为条件喂给模型,让同一类题在低档更简短,高档更愿意检查和尝试。 - runtime 兜底:训练只能塑造倾向,不能保证每次都停得刚好;线上仍要靠 max reasoning tokens、超时和工具轮数上限兜住成本。
effort 条件控制可以理解成“给同一个模型装一个推理预算旋钮”。训练样本不只长这样:
题目 → 推理过程 → 答案
而是会把预算档位也放进条件里,像这样:
[effort=low] 题目 → 短推理 / 少检查 → 答案
[effort=high] 题目 → 更完整推理 / 多检查 / 可尝试备选解法 → 答案
这里的 [effort=high] 不一定真是用户能看到的文字,也可能是服务端插入的特殊 token、隐藏控制字段或路由配置。
关键是模型在训练时反复见到“同类问题 + 不同 effort 条件 → 不同长度和细致程度的推理轨迹”。
到推理时,产品 UI 里的“快速 / 深度思考”或 API 里的 reasoning_effort,就会被服务端翻译成类似的控制信号。
这不是精确控制“必须想 512 个 token”。它控制的是分布倾向: low 档更倾向于少展开、快给答案;high 档更倾向于拆步骤、做检查、必要时换一种解法。 最终长度仍由题目难度、模型停机策略和 runtime 上限共同决定。
所以 reasoning 模型学到的不是精确计时器,而是一种策略: 这道题继续推演带来的正确率收益,值不值得多花这些 token。 这也是为什么高 effort 往往更强但更慢、更贵,而且不是所有问题都会明显受益。
多模态:不只吃文字
多模态(multimodal)模型(GPT-4V、Gemini、Qwen-VL 等)能同时处理图、音、视频和文字。 内核不变:各模态都切成 token → 编成向量 → 拼成一条序列 → 送进同一个 Transformer → 往往仍自回归生成文字。
① 各模态怎么切成 token
| 模态 | 切法 | 直觉 |
|---|---|---|
| 文字 | BPE / 子词 | 本章 §3 |
| 图像 | 16×16 等 patch 小块 | 一张图 ≈ 一句由上百个“图块词”组成的句子(第 13 章局部块思想) |
| 音频 | 频谱片段或神经 codec 码 | 声音也排成 token 序列 |
| 视频 | 抽帧后每帧走图像流程 | 序列更长,更吃算力 |
② 编码、投影、拼进 LLM
图像经 ViT 等视觉编码器变成 patch 向量,再经投影层 MLP拉到与词嵌入相同维度; 文字照常 BPE + 嵌入。推理时典型序列:
[系统提示] [图开始] patch₁…patchₙ [图结束] [用户问题 tokens] [模型开始生成…]
自注意力让“猫”这类文字 token 直接关注猫所在的 patch——跨模态对齐靠统一注意力,不必硬接两套系统。
③ 训练通常分阶段
- CLIP 式对齐:成对“图+配文”,用点积/余弦把配对拉近、非配对推远。
- 接 LLM + 训投影:冻住或轻微微调语言模型,用“图→描述”学连接器。
- 多模态指令微调:图+问答三元组(VQA 等),类似 SFT。
- (可选) RLHF:按人类偏好再对齐(第 12 章)。
CLIP 全名是 Contrastive Language-Image Pre-training, 可以理解成“用对比学习做图文预训练”。它不是扩散模型本身,而是一套先学好的图文对齐模型: 一个图片编码器把图变成 image vector,一个文本编码器把句子变成 text vector。
图片编码器: image → image vector
文本编码器: text → text vector
配对图文: 拉近
不配对图文: 推远
训练时,一张“猫坐在沙发上”的图片应该靠近文字 a cat sitting on a sofa,
远离 a red sports car。久而久之,图片和文字就被放进同一个语义坐标系里:
意思相近的图和句子,向量也相近。 所以“CLIP 式对齐”说的就是这件事。
名字不同,套路都是:编码 → 对齐维度 → 拼序列 → 注意力融合 → 预测下一个 token。 LLaVA、Qwen-VL 等主流属于 patch 向量直接与文字 token 早融合进一个 Transformer。
反过来:文生图与文生视频(扩散模型)
上面多模态讲的是“图/音进来 → 出文字”(理解)。反方向——“文字进来 → 出图/视频”(生成)——今天主流用的是另一套和“预测下一个 token”完全不同的技术: 扩散模型(Diffusion Model)。它是这几年最漂亮的想法之一,先把它单独讲透,再看文生图 / 文生视频怎么用它。
① 扩散模型:先学“去噪”,再从噪声里“显影”
往一杯清水里滴一滴墨水,墨分子会自发随机扩散开,直到整杯均匀混浊。这是物理里最典型的“有序 → 无序”过程,而且不可逆——你从没见过混浊的水自己聚回一滴墨。 对一张图一步步加噪直到变成均匀雪花,和墨水扩散数学上是同一回事:清晰结构(有序)散成随机噪声(无序)。模型这个名字就来自这里,而它要学的,正是把这个物理上“不可逆”的扩散硬生生倒放回去——从噪声逆扩散出图。
直接让模型“凭空画一张猫”太难——它要一次性决定几百万个像素,任何一步走偏都满盘皆输。扩散模型的聪明之处是把这件难事拆成很多步简单的事,而拆解的钥匙,是一个人人都懂的不对称现象:
往一张清晰照片上撒噪点易如反掌,撒到最后变成一屏电视雪花;可反过来,从雪花还原出照片却难如登天。 扩散模型的核心一招就是:既然“加噪”这么简单、答案还自带,那我就专门训练一个网络去学它的逆操作——“去噪”。
它分成正反两个方向:
- 正向 · 加噪(只为造训练题,不用学):拿一张清晰图,分成很多步、每步掺一点高斯噪声,几百步后变成纯雪花。每一步的“加了多少噪”都是我们自己撒的,所以答案现成——这又是一种自监督,不需要人工标注。
- 反向 · 去噪(这才是要训练的网络):给网络一张带噪的图 + 当前是第几步 + 文字提示,让它预测“这一步掺进去的噪声长什么样”。预测对了,把噪声减掉,图就清晰了一点点。用第 6 章的反向传播 + 第 8 章的优化器,在海量图上把这个“去噪器”练出来。
生成时把这个去噪器反复用几十步就行:从一张纯随机噪声出发 → 去噪器减掉一点噪 → 再减一点 → …… 一张清晰图像照片显影一样慢慢浮现。
扩散 = 一条可逆的“加噪—去噪”链。加噪用来造训练题(答案自带),真正学的是那条反向的去噪路;生成时从最右的纯噪声一路去噪回最左的清晰图。
一步从雪花跳到成品,等于让网络一次猜中全部像素,太难、也容易糊。拆成几十步,每步只需去掉一点点噪、把图改好一丁点,每一步都是网络能学好的“小任务”,难度被摊薄了。这也是扩散图像又清晰又多样的原因——代价是生成要跑几十次网络,所以比“一次出结果”的模型慢(后来有各种加速采样把步数压到几步)。
自回归(GPT):一个 token 一个 token 往后蹦,天生适合离散的文字; GAN:让“生成器”和“鉴别器”对抗,一步出图但训练不稳、容易崩。 扩散:把生成拆成多步去噪,训练稳、质量高、多样性好,特别适合图像/视频这种连续信号,如今是文生图/视频的主流。
② 文生图:让文字给去噪“掌舵”
扩散本身只会“去出一张图”,可怎么保证去出来的正好是你要的那张?办法是在去噪的每一步都把文字提示喂进去,让它决定“噪声该往哪个方向减”。这一步靠的正是第 17 章的注意力:
- 文字编码:先用一个文本编码器(常见是 CLIP)把提示词变成向量;
- 交叉注意力掌舵:去噪网络的每一步,让正在生成的图像特征去“查询”这些文字向量,做交叉注意力,从而“词 → 像素”地对齐——“戴帽子的橘猫”里的“橘”“帽子”各自拉动对应区域。
还有个省算力的关键工程:主流的 Stable Diffusion 不在原始像素上去噪(几百万像素太贵),而是先用一个自编码器(一个先把图压小、再还原回去的网络)把图压进小得多的潜空间(latent)里去噪,最后再解码回像素——这就是名字里 “Latent” 的由来。
直觉上这像个不可能的任务:难道要人一张张标“这句话对应图里哪些像素”?其实它靠三个巧劲绕开了人工标注:
- 数据是现成的,不用标。 互联网上有几十亿张图天生自带配文——网页
alt文本、图片标题、社交媒体配字、商品描述……(公开数据集 LAION 就有约 50 亿对)。爬下来就是“图 + 配文”训练对,和第 7 节预训练一样是自监督,无需人工对齐。 - 不要求精确对齐每个词,只要求“文字能影响去噪”。 训练目标始终是那个简单的“预测这一步的噪声”,loss 还是均方误差。文字只是作为额外条件喂进去——因为“看着‘橘猫’去噪”比“啥都不看瞎猜”预测得更准,梯度下降自然就逼模型去利用文字。所以“词↔像素”的对齐,是它为把噪声预测得更准而顺带涌现的副产品,没人显式教。
- CLIP 已经先把图文对齐好了。 上文讲过,CLIP 是一套“图片编码器 + 文本编码器”的双塔模型,本身就是拿几亿“图+配文”对、用对比学习把配对的图文向量拉近、不配对的推远。文生图系统如果直接复用它的文本编码器,拿到的文字向量就已经活在一个“和图像语义对齐好的空间”里——最难的对齐,CLIP 提前替它做了一大半。
③ 文生视频:在文生图上再管住“时间”
视频无非是一连串图像帧。所以文生视频大体是文生图的“扩展版”,但多了一个致命难点:帧与帧之间要连贯——同一个人不能下一帧突然换脸,物体运动要顺滑。逐帧独立生成必然“鬼畜闪烁”,所以关键动作是让模型同时看多帧、把时间也纳入注意力:
- 时空注意力:去噪网络不只在一帧内做空间注意力,还在帧与帧之间做时间注意力,让相邻帧互相“对齐”,保证同一物体连贯、运动平滑。
- 3D 潜空间:把“一段视频”整体压进潜空间(多了时间这一维),对整段一起去噪,而不是一帧一帧各画各的。
- Diffusion + Transformer(DiT):Sora 这类模型把视频切成时空小块(spacetime patch)当 token,用 Transformer 主干做去噪——等于把第 18 章的 Transformer 和扩散缝在一起,既吃得下长序列,又能 scale up。
和图文对齐一样,连续性没人显式去教,而是被训练方式“逼”出来的,关键有两点:
- 把整段视频当一个整体去噪,而不是一帧一帧分开画。 训练时对整段(比如 16 帧)一起加噪,再让网络一起去噪。于是网络在预测某一帧的噪声时,视野里同时有前后帧——想把这一帧的噪声猜准,就不得不参考相邻帧,连续自然成了“预测得准”的前提。
- 时间注意力让每个位置直接“看”别的帧。 借第 17 章的注意力:同一个物体在第 3 帧的 patch,可以直接和它在第 2、4 帧的 patch 做注意力,把“我上一刻在哪、该往哪动”对齐起来。运动是否顺滑,就成了让噪声预测更准的一部分。
而“运动到底该长什么样”(重力、走路的姿态、水的流动……)这些常识,来自海量真实视频:真实视频里的运动本就是连贯的,模型在几百万段视频上学“去噪”,等于顺带把真实世界的动态规律吸收了进去——这也是为什么好的视频模型偶尔被说“像学到了一点物理直觉”。当然它并不真懂物理,数据不够时照样会穿模、鬼畜。
文字模型:预测下一个 token;文生图:从噪声里去噪出一张图,文字用交叉注意力掌舵; 文生视频:在文生图基础上,把时间也放进注意力,逼帧与帧连贯。三者主干都还是你学过的那套神经网络 + 注意力 + 梯度下降,只是“预测目标”换了。
更长的上下文
早期模型一次只能读几千 token,如今动辄支持几十万甚至上百万——你能把一整本书、一个代码仓库丢进去让它一起看。 难点在第 17 章那句话:注意力计算量随长度平方增长,所以需要稀疏注意力等优化(第 21 章)才扛得住。
上下文窗口大小是怎么定出来的?
常有人问“为什么这个模型是 8K,那个是 128K”。答案是:窗口大小不是某一个因素拍板的,而是三道关卡里最紧的那个—— 任何一关卡住,窗口就到头了。
| 关卡 | 决定什么 | 卡住会怎样 |
|---|---|---|
| ① 位置编码 (硬上限) |
注意力本身对位置无感,全靠位置编码标记先后。方案决定了“最远能编到多远” | 早期可学习绝对位置(如 GPT-2 的 1024)定死一张位置表,超出就没有对应向量,是一堵硬墙;现代 RoPE / ALiBi 等相对位置有一定外推能力,才谈得上做到 128K、1M |
| ② 训练长度 (软上限) |
位置编码“支持”到某长度,不等于模型“用得好”;得在长序列上真正训练/微调过,它才会用远处的信息 | 没在长序列上训过,远处信息就用不起来。常见做法:先用短序列(如 4K)便宜地预训练,再用长序列续训;或事后用位置插值 / NTK / YaRN 把 RoPE “拉伸”后再少量微调——这就是模型能“事后加长”的原因 |
| ③ 算力 / 显存 (现实约束) |
标准 softmax attention 的计算与显存随长度平方增长,推理时 KV cache 又随长度线性膨胀吃显存 | 最卡脖子的一关:长度翻倍,标准 attention 开销约 4 倍。FlashAttention、稀疏/滑窗注意力、KDA 等递归状态架构、PagedAttention(第 21 章)决定了厂商“愿意开多长”、你“用得起多长” |
一句话:位置编码能编多远 × 训练时真喂过多长 × 推理时扛得住多长,取最紧的那个,就是窗口上限。
模型标称支持 128K,不代表这 128K 里的信息都能被可靠利用。存在著名的 “迷失在中间(lost in the middle)”现象:开头和结尾的内容记得牢,正中间的容易被忽略。 所以有效上下文常明显短于标称值——把最关键的材料放在开头或结尾,往往比一股脑塞满窗口更靠谱。
若产品侧把输入截断(只保留最后几千 token),或你贴的代码/文档超出窗口被 silently 砍掉, 模型等于没看到关键前文——回答变短、变偏、变健忘,常被误以为是“模型变笨了”。 长上下文能力取决于训练时的长度扩展与推理时的显存/KV cache(第 21 章),也取决于你有没有真的把材料完整送进去。
更省的架构、更强的“手脚”
- MoE(混合专家):每次只激活一部分“专家”子网络,用更少的实际计算撑起更大的参数量(第 21 章细讲)。DeepSeek-V3 就是典型。
- Agent(智能体):让模型学会调用工具、上网、写代码、多步做事,从“会聊天”变成“能办事”(第 22 章细讲)。
推理模型、多模态、长上下文、MoE……概念很唬人,但拆开都是你已经学过的东西: token 化 + Transformer + 预测下一个 token + (后)训练。抓住这个内核,追新会轻松很多。
10. 它的本质与局限:清醒地看待它
把上面串起来,你会得到对大模型最准确的一句话概括: 它是一个被海量文本喂大的、极其强大的“下一个 token 概率预测器”。 理解这一点,它的“超能力”和“毛病”就都说得通了。
幻觉(hallucination):它的目标是“预测最像样、最连贯的下一个词”,而不是“说真话”。(如何靠证据与验证缓解幻觉,见第 22 章。)
当它对某事没有可靠依据时,照样会生成通顺合理、却是编造的内容。
知识截止:参数一旦训练完就固定,它的知识停在训练数据那一刻,不知道今天的新闻、天气、股价。
偏见:训练数据里的偏见会被它一并学进去。
不会真正“算”与“查”:它是在做极其复杂的模式延续,不是在执行精确计算或实时检索。
好消息是:这些局限大多有工程解法——给它接上实时检索(RAG)、外部工具(function calling)、 让它调用计算器或搜索引擎。这些正是第 22 章的主题。把它当成一个 强大但会犯错的概率文本生成器,而不是全知神谕,你就能用得又稳又好。
11. 你已经走通了主干
回头看看这一路搭起来的东西:
- 从一个神经元的加权求和 + 激活(第 2 章),
- 到堆成网络(MLP)、让数据前向流动(第 3 章),
- 用损失衡量错误、靠梯度下降和反向传播学习(第 4–6 章),
- 再用现代训练栈把它训稳(第 9 章),
- 用注意力处理序列、拼出Transformer(第 16–18 章),
- 做成会写字的语言模型(第 19 章),
- 最后放大成大模型,并学会它是怎么训练、为何有局限(本章)。
原理主干到此走完。但一个上千亿参数的模型,靠什么硬件才跑得起来?普通人又该怎么把它用好? 这两个非常实际的问题,我们用接下来两章回答。
小结
- 大模型内核 = 第 19 章的“预测下一个 token + 自回归”,只是规模大上亿倍;参数主体是嵌入 + L 层 Block(每层约 12d²) + LM Head,GPT-3 约 175B。
- 真实分词用 BPE/子词:高频组合合并成一个 token,存进词表;词表大小是权衡。
- 词嵌入把词变成“语义坐标”,点积/余弦相似度衡量语义远近;词向量可迁移复用。
- Scaling Law:参数、数据、算力一起放大,性能可预测提升;超过门槛会“涌现”新能力。
- 训练数据不是原始互联网的简单堆叠,而是经过正文抽取、去重、质量过滤、安全/隐私过滤、污染检测、领域分类、重加权和分词打包后的工程产物。真正稀缺的是高质量、低重复、低污染、合法可用、能带来新增能力的 token。
- 在当前 Transformer + 自回归预训练范式内,竞争底座可理解为有效数据 × 有效算力 × 转化效率:数据决定可学到什么,算力决定能消化多少,MoE/KDA/稀疏注意力/量化/合成数据等近期方法主要提高资源利用率或弥补资源缺口,但不会凭空创造知识和算力。
- 预训练(自监督)像长期读书,练出语言、知识和世界模型底座;后训练(SFT → RLHF/DPO → 蒸馏)像进入真实工作,把它调成好用的助手。SFT 数据量远小于预训练,但正好打在“用户指令 → 助手回答”的使用入口上,所以能显著改变体感;它常常仍是交叉熵训练,但通常只对 assistant/completion 部分计 loss,prompt 更多是作为条件输入。新的后训练还会用多教师在线蒸馏,把数学、代码、Agent 等专项老师的能力压进一个统一模型。
- 大模型测评是训练和上线的质检系统:预训练中选 checkpoint,后训练中看指令/安全/幻觉是否改善,上线前做发布门禁,上线后用 A/B、人工抽检和日志发现真实问题;应用层还要把模型、prompt、RAG、工具和产品流程一起测。
- 最近方向:推理模型、多模态(patch→ViT→投影→拼序列)、长上下文、MoE——内核仍是 token + Transformer。推理模型的“思考深度”由 effort 条件训练、外部预算、模型学到的停机策略和 runtime 硬限制共同决定;上下文窗口由位置编码 × 训练长度 × 算力显存三关中最紧的一关决定,且标称长度≠有效长度。
- 降智/对齐税/遗忘等多半发生在后训练、蒸馏、量化、MoE 压 k、截断、产品护栏等环节,先定位链路再判断能力。小模型追上大模型通常靠专精、更长推理或砍掉多模态来换分数,不能只看 benchmark,还要看任务范围、延迟和通用性。
- 它本质是概率预测器,所以会幻觉、有知识截止和偏见——要理性使用,并靠 RAG/工具补救。
动手与思考
问题 1:GPT-3 的 1750 亿参数主要装在哪儿?单层 Block 量级怎么估?
主体在 L 层 Transformer Block(每层四套 [d×d] 注意力矩阵 + 两层 FFN),加上词嵌入和 LM Head(常为 [V×d],可与嵌入绑定)。单层主项约 12d²;GPT-3 用 L=96、d=12288 时,96 层合计约 1700 亿,再加嵌入约 6 亿,总数约 175B。详见 §2。
问题 2:为什么真实大模型用 BPE/子词,而不是像本书那样按字符分词?
字符级会让序列变得很长,而注意力计算量随长度平方增长,代价高。BPE 把高频组合合并成一个 token,序列更短、更高效,同时又比“整词”更灵活(能拼出没见过的词)。
问题 3:为什么用“向量夹角/点积”而不是“距离”来衡量词的语义相似度?
因为训练中向量会被整体拉伸或缩放,距离会“强烈波动”,不稳定;而方向(夹角)更能反映本质的语义关系。余弦相似度只看方向;未归一化的点积还受模长影响——模长相当时点积也可作近似,点积越大夹角往往越小、语义越近。
问题 4:训练数据为什么不能“直接抓网页就开训”?它和自监督有什么关系?
原始网页里混着导航栏、广告、重复转载、SEO spam、乱码、隐私、泄漏评测题和大量低质文本,直接训练会浪费 token 预算,甚至让模型学坏。真正的训练数据要先做正文抽取、去重、质量过滤、安全/隐私过滤、污染检测、领域分类和配比。预训练仍然是自监督:清洗后的文本不需要人工逐条标答案,模型把前文当输入、把下一个 token 当自动生成的答案来学。
问题 5:大模型为什么会“一本正经地胡说八道”?怎么缓解?
因为它的目标是预测“最像样、最连贯的下一个词”,而不是“说真话”;缺乏依据时也会编出通顺但错误的内容(幻觉)。缓解办法包括给它接实时检索(RAG)、外部工具/计算器(function calling),以及对关键事实自己核对。
问题 6:“预训练”和“后训练”分工是什么?为什么 -base 模型不好直接聊天?
预训练像长期读书:在海量文本上自监督地学到语言能力、世界知识和代码/推理模式,给出一个“博学但只会接话”的底座模型(base)。后训练像进入真实工作:在底座之上用 SFT → RLHF/DPO → 蒸馏加工,教它听指令、按人类偏好回答、在具体任务里把事做对。SFT 数据量虽然远小于预训练,但它正好覆盖最终用户最常见的交互入口,而且不是重新教知识,只是把已有能力校准成“指令 → 助手回答”的模式。-base 没做后训练,所以往往只会顺着你的话往下写,而不是好好回答——要 -chat/-instruct 那样做过后训练的版本才好用。
问题 7:SFT 为什么常常“只对 assistant 部分算 loss”,而把 prompt mask 掉?
因为 SFT 真正想教模型学的是“给定这道题,标准答案该怎么写”。prompt/system/user 主要负责提供条件上下文,assistant/completion 才是想让模型模仿的输出。所以训练时通常整段都喂给模型看,但只在回答区计分。注意: mask prompt 不等于没看 prompt——回答的 loss 仍会通过计算图逼模型学会理解题目。
问题 8:一个模型的上下文窗口(比如 128K)到底是由什么决定的?
由三道关卡里最紧的那个决定:①位置编码能表示多远(可学习绝对位置是硬墙,RoPE/ALiBi 才能外推);②训练时真的在多长的序列上练过(没练过就用不好远处信息,可用位置插值/YaRN 事后拉长);③推理时的算力与显存(注意力随长度平方增长,KV cache 随长度线性膨胀)。此外标称长度 ≠ 有效长度,存在“迷失在中间”,关键材料放开头或结尾更可靠。
问题 9:推理模型怎么知道自己该“想多久”?
不是模型凭空知道,而是几层机制合起来:训练时可以把 [effort=low]、[effort=high] 这类条件放进样本,让模型学到同类题在低档短推理、高档多检查;RL 再用正确性奖励和 token 成本惩罚,塑造“继续想是否值得”的策略;服务端推理时给外部预算,并用 max reasoning tokens / 工具轮数 / 时间做硬截断。调高思考深度不改权重,只是给同一个模型更多推理阶段计算。
原理清楚了,但“上千 GPU 训数周”到底是怎么回事?下一章我们钻进机房, 看看大模型靠什么硬件和并行技巧才跑得起来:GPU、显存、数据并行、张量并行、KV cache……