第一次手术——十八层减到十六层
这一章讲三件事: 改造一个模型前为什么必须先量一张基线成绩单;「删掉两层」在代码里到底发生了什么;以及蒸馏怎么把删掉的能力找回来。 原书这一章是全书方法的完整预演——本章的主走查就是一次真实手术的全部数字,后面每一章都会把这个流程的某一段换成更精密的版本。
1. 这一章讲什么
第 01 章给了路线图:剪枝 → 蒸馏恢复 → 特化。这一章把它走通一遍,但刻意用最简单的刀:删掉模型最后两层。任务设定是行业里真实存在的一幕——「手上有一个能干活的基模,要一个更小更快的版本」;NVIDIA 拼装机器家族用的正是这个组合:结构优化(把架构改轻改快)加知识恢复,家族里只需完整调教最大的那台1。
本章的模型是 gemma-3-270m:谷歌出的 2.7 亿参数小模型,一块 Colab 免费 T4 显卡就能带动2。它在全书链条里的位置: 这一章让你先摸到全流程的手感;第三章补齐「模型内部长什么样」的理论;第四章才开始回答本章刻意回避的那个问题——该删哪两层。
2. 主走查:一次手术的完整数字链
本章的主走查就是这次手术本身。先把全程的数字摆在一张图里,每一节展开其中一段:
gemma-3-270m 基线
参数 268,098,176 · 18 层 · arc_easy 0.59 / winogrande 0.54(0.5375)
hellaswag 0.34 / lambada 0.43 · 推理 5.124 秒
│ 删最后 2 层(手动切列表)
▼
gemma-pruned:256,950,912 参数(-4.16%)· 16 层
arc 0.49(-16.55%)· lambada 0.36(-16.58%)
hellaswag 0.31(-9.60%)· winogrande 0.54(持平!)
推理 4.611 秒(快 10%)
│ 蒸馏:老师=原 18 层模型,15,000 条 SlimPajama 通用文本
▼
student(恢复后):参数不变、速度不变
arc 0.54(恢复到基线的 91.5%)· winogrande 0.55(102%)
hellaswag 0.33(97.6%)· lambada 0.38(87.2%)
图说:所有数字出自原书表格;剪后推理时间原书表 2.2 记 4.611 秒,
但同章正文另一处写 4.181 秒——这是原书自身的小不一致,两处我们都如实记录[^3]。
2.1 走查第 ① 步:基线,以及它会怎么骗你
「性能」在本书里有两个必须同时看的维度:能力(答得对不对,用基准测)和推理效率(多快、吃多少电和内存)3。基线四件套是 ARC-Easy(四选一科学题,瞎猜 25%)、Winogrande(指代消解,二选一,瞎猜 50%)、HellaSwag(常识续写四选一)、LAMBADA(要真正生成出段落末词,不是选择题,更严)4。评测交给 lm-eval 库——一个「LLM 的自动化测试台」5。
基线里有个细节此刻像废话,后面值回票价:winogrande 得分 0.5375,距离瞎猜的 0.50 只有一线6。记住它。
2.2 走查第 ② 步:删层,或 者「手术其实就是切列表」
先交代选谁挨刀。本章删最后两层,依据是一个朴素假设:末端层精于输出前的润色,删掉它们能保住更通用的知识7。这个假设对不对,第四章会用数据重新审——本章刻意先不问。
手术本体简单到令人失望。现代模型的层都挂在 model.model.layers 上,而这个容器的行为和一个普通 Python 列表一模一样:取前 16 层、包回 nn.ModuleList、把配置里的层数改成 16,完事8。
layers = model.model.layers # 18 个块,像 list 一样可切片
keep = layers[:16] # 留前 16 个
model.model.layers = nn.ModuleList(keep) # 装回去
model.config.num_hidden_layers = 16 # 改「说明书」
图说:config 是模型的「内部说明书」,不更新的话,
任何读它的代码都会拿着旧尺寸去找已经不存在的东西[^10]。
删完盘点:268,098,176 → 256,950,912,参数只少了 4.16%。删掉 18 层里的 11%,怎么只瘦 4%?因为机器不只有层:最前面的嵌入(把每个词换成一行数值的大字典)和最后的输出头一动没动,它们占着大头9。
输出头对着的是十几万词条的词表(这台机器认得的全部单词清单),所以它也很大。层的收益不只体现在参数上——层少了,续写时随对话变长的内存也少涨,这是后面章节的主角,这里先埋一笔。
2.3 走查第 ③ 步:损伤报告
肉眼测试:还是问「Paris is the capital of」。机器仍知道答案是法国——但开始编造「巴黎占地 250 万公顷、被群山环绕」这类幻觉(一本正经地编造),而且比原来更容易跑题10。结构损伤的典型症状不是「不会说话了」,而是说话的可信度掉了。
基准成绩单印证:四个基准掉了 8 到 12 个百分点;arc_easy 相对跌幅 16.55%,lambada 16.58%11。唯独 winogrande 持平。现在收回 2.1 节埋的那笔账:一个瞎猜就能拿 0.50 的二选一测试,基线只有 0.5375——它已经贴着地板,「没掉分」不是能力还在,是没剩多少可掉的了12。读任何剪枝报告,都要先问每项基准离随机线多远。
2.4 走查第 ④ 步:蒸馏,让学生学「怎么想」而不只是「想什么」
恢复用的方法是知识蒸馏:原 18 层模型当老师,16 层的残模型当学生。目标不是让学生答对,而是让它模仿老师的完整预测分布——不只学「下一个词是 X」,还学「老师觉得 X 有多可能、第二名 Y 有多可能」13。
两把尺子和一个循环:
-
差异用什么量:KL 散度——量「学生看到老师的答案时有多意外」:两边越接近,值越低。训练目标就是调学生的权重,把这个值压下去14;
-
老师的答案怎么拿: 老师前向计算时关掉梯度(每个数值该往哪挪的指引)记录,省下一大块显卡内存、也更快——反正它不用被训练15;
-
循环: 取一批文本 → 老师交答案 → 学生交答案 → 算两者差异 → 沿着「差得少一点」的方向调学生的权重 → 换下一批。
2.5 走查第 ④ 步(续):谁调权重、调多大、拿什么教
-
调权的部件叫优化器——按「离目标还差多少」决定每个数值往哪挪、挪多少的那件工具;本书用 AdamW;
-
它参照的尺子是误差:学生交卷与目标之间的差距;
-
每步挪动的幅度叫学习率——它控制每一次调权挪多远,这里取 1e-516。
教材选 SlimPajama 的 15,000 条——一个大规模通用语料(拿来喂机器读的海量文本),主题和文风 杂,正适合恢复「通用能力」而不是特化某领域17。
2.6 走查第 ⑤ 步:验收
结果回到开头的总图:参数和速度保持剪枝后的水平,四项基准恢复到原模型的 87%-98%18。最后再问一次巴黎——这次没有群山了,答案与基模相当19。
把五个数字连成一句话,这一章就带走了:减重 4.16%、提速 10%、花一份 15,000 条的通用数据,买回 87%-98% 的能力。
3. 核心原理补两笔
为什么基线先于一切。 没有基线,「变好还是变坏」无从谈起;本章每次评估都跑同一套基准、同一套提示,连生成都固定用确定性(同样输入必得同样输出)设置,保证前后可比20。
具体做法:关掉随机采样(让机器按把握挑,而不是抽签)、用束搜索一次比较多条高分续路、禁止连续重复同样的两词组合。
为什么这章的蒸馏够用、第六章还要重来。 本章只把最后一层的输出对齐(两边的答案互相对上)。第六章会加两路信号:数据集的「标准答案」,和模型中间层的内部状态——让学生的「思考过程」也照着老师走。信号更多,代价也更复杂:两台机器层数不一样,中间层怎么一一对齐(逐层找到该向谁学的对应关系)?这是第六章要解决的新问题。
4. 作者的判断与证据
给了证据的: 全部表格数字(参数、基准、耗时)来自作者在 Colab T4 上跑的可复现 notebook;书里同时给出了复现用的三个旋钮(评测样本上限、恢复样本数、遍数),并明说降配跑数字会浮动但方向不变21。
作者的判断: 「删最后几层通常安全」在章末总结里被表述为一般规律——末端层装的是「润色细节而非核心知识」22。注意这个规律在本章只是被假设、然后碰巧没出大事,真正的验证(包括反例)在第四章:数据驱动方法有时恰恰想保住末端。
5. 边界与局限
- 本章没有回答「删哪层」。 删最后两层是演示用的默认值;第四章会展示:同样删四块,选错位置 lambada 能掉到只剩基线的 9%。
- 0.53 亿参数的小模型放大了运气。 winogrande 贴地飞行、降幅「只有」8-12 个点,都和模型小、基准少有关;换大模型、换基准组合,数字结构会不同。
- 恢复没有到 100%。 lambada 只回到 87.2%;「长程语言能力最难恢复」这条线会贯穿到第六章和第九章。
- 原书自身的一处数字矛盾(表 2.2 的 4.611 秒 vs 正文的 4.181 秒)我们照实呈现,不做裁决23。
6. 可带走的
- 先量基线,再看两张成绩单: 能力(基准)与效率(耗时),缺一不可;
- 每个基准都有一条随机线,报告里的「持平」可能是「已经贴地」;
- 删层 = 切列表 + 改说明书,但参数账要算全:嵌入表和输出头不跟着层走;
- 删 11% 的层 ≠ 省 11% 的钱:参数只少 4.16%,可推理快 10%——层的时间收益大于体积收益;
- 蒸馏学的是把握不是答案;KL 散度是「学生离老师有多远」的尺子;
- 恢复用通用数据,哪怕目标模型是领域专用的——先恢复通用能力,特化留给下一步;
- 幻觉是结构损伤的症状:模型还「会说话」,但开始编造,这比报错更危险。
7. 原文地图
| 主题 | 原书章 | 原文位置 |
|---|---|---|
| NVIDIA 模型家族打法 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:57(搜「fully train the largest」) |
| 性能两维度、五步工作流 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:96(搜「capabilities, the model」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:110(搜「Establish a baseline」) |
| 选型 gemma-3-270m | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:134(搜「gemma-3-270m」) |
| 参数与层数盘点 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:339(搜「268098176」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:393(搜「or transformer blocks」) |
| 四个基准与随机线 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:488(搜「random chance sits at 25」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:491(搜「random chance sits at 50」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:497(搜「a stricter test」) |
| 基线分数与贴近随机线 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:569(搜「0.59」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:654(搜「chance level of 0.50」) |
| 删末两层的假设与切列表 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:691(搜「refining the nuances」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:729(搜「Python list」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:777(搜「instruction manual」) |
| 参数只少 4.16% 的原因 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:783(搜「4.16%」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:789(搜「embed_tokens」) |
| 幻灯与量化损失 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:850(搜「2.5 million hectares」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:882(搜「8 and 12 percentage points」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:980(搜「little room left to degrade」) |
| 蒸馏设定与数据 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1061(搜「full prediction distribution」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1124(搜「standard reference」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1039(搜「15,000 rows」) |
| KL 散度与训练循环 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1277(搜「surprise」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1366(搜「less GPU memory」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1404(搜「learning engine」) |
| 恢复结果与巴黎复测 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1600(搜「recovered between 87% and 98%」) · text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1619(搜「lost the mountains」) |
| 末端层装润色细节 | 2 An end-to-end rearchitecting project | text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1727(搜「refinement details」) |