跳到主要内容

第一次手术——十八层减到十六层

这一章讲三件事: 改造一个模型前为什么必须先量一张基线成绩单;「删掉两层」在代码里到底发生了什么;以及蒸馏怎么把删掉的能力找回来。 原书这一章是全书方法的完整预演——本章的主走查就是一次真实手术的全部数字,后面每一章都会把这个流程的某一段换成更精密的版本。

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. 可带走的

  1. 先量基线,再看两张成绩单: 能力(基准)与效率(耗时),缺一不可;
  2. 每个基准都有一条随机线,报告里的「持平」可能是「已经贴地」;
  3. 删层 = 切列表 + 改说明书,但参数账要算全:嵌入表和输出头不跟着层走;
  4. 删 11% 的层 ≠ 省 11% 的钱:参数只少 4.16%,可推理快 10%——层的时间收益大于体积收益;
  5. 蒸馏学的是把握不是答案;KL 散度是「学生离老师有多远」的尺子;
  6. 恢复用通用数据,哪怕目标模型是领域专用的——先恢复通用能力,特化留给下一步;
  7. 幻觉是结构损伤的症状:模型还「会说话」,但开始编造,这比报错更危险。

7. 原文地图

主题原书章原文位置
NVIDIA 模型家族打法2 An end-to-end rearchitecting projecttext/05-ch02-2-an-end-to-end-rearchitecting-project.txt:57(搜「fully train the largest」)
性能两维度、五步工作流2 An end-to-end rearchitecting projecttext/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-270m2 An end-to-end rearchitecting projecttext/05-ch02-2-an-end-to-end-rearchitecting-project.txt:134(搜「gemma-3-270m」)
参数与层数盘点2 An end-to-end rearchitecting projecttext/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 projecttext/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 projecttext/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 projecttext/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 projecttext/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 projecttext/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 projecttext/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 projecttext/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 projecttext/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 projecttext/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1727(搜「refinement details」)

Footnotes

  1. 出处:「2 An end-to-end rearchitecting project」第 57 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:57,搜「fully train the largest」)。

  2. 出处:「2 An end-to-end rearchitecting project」第 134 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:134,搜「gemma-3-270m」)。T4 是 Colab 免费档最小的 GPU。

  3. 出处:「2 An end-to-end rearchitecting project」第 96 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:96,搜「capabilities, the model」)。

  4. 出处:「2 An end-to-end rearchitecting project」第 488-497 段(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:497,搜「a stricter test」)。

  5. 出处:「2 An end-to-end rearchitecting project」第 517 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:517,搜「automated testing harness」)。

  6. 出处:「2 An end-to-end rearchitecting project」第 654 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:654,搜「chance level of 0.50」)。

  7. 出处:「2 An end-to-end rearchitecting project」第 691 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:691,搜「refining the nuances」)。

  8. 出处:「2 An end-to-end rearchitecting project」第 729 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:729,搜「Python list」)与第 758-771 行的代码(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:759,搜「num_hidden_layers」)。

  9. 出处:「2 An end-to-end rearchitecting project」第 789 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:789,搜「embed_tokens」)。

  10. 出处:「2 An end-to-end rearchitecting project」第 850 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:850,搜「2.5 million hectares」)与第 864 行(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:864,搜「wanders and loses focus」)。

  11. 出处:「2 An end-to-end rearchitecting project」第 882 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:882,搜「8 and 12 percentage points」);表 2.2 的逐项百分比在第 931-971 行(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:937,搜「-16.55%」)。

  12. 出处:「2 An end-to-end rearchitecting project」第 980 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:980,搜「little room left to degrade」)。

  13. 出处:「2 An end-to-end rearchitecting project」第 1061 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1061,搜「full prediction distribution」)。

  14. 出处:「2 An end-to-end rearchitecting project」第 1271 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1271,搜「Kullback-Leibler divergence」)与第 1277 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1277,搜「surprise」)。

  15. 出处:「2 An end-to-end rearchitecting project」第 1366 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1366,搜「less GPU memory」)。

  16. 出处:「2 An end-to-end rearchitecting project」第 1404 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1404,搜「learning engine」)与第 1411 行代码(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1411,搜「AdamW」);四步循环在第 1302-1311 行(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1302,搜「Select the lesson」)。

  17. 出处:「2 An end-to-end rearchitecting project」第 1124 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1124,搜「standard reference」)与第 1039 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1039,搜「15,000 rows」)。

  18. 出处:「2 An end-to-end rearchitecting project」第 1600 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1600,搜「recovered between 87% and 98%」);表 2.3 在第 1544-1591 行(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1552,搜「83.1 / 91.5」)。

  19. 出处:「2 An end-to-end rearchitecting project」第 1619 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1619,搜「lost the mountains」)。

  20. 出处:「2 An end-to-end rearchitecting project」第 426 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:426,搜「making the test deterministic」)与第 432 行(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:432,搜「num_beams=3」)。

  21. 出处:「2 An end-to-end rearchitecting project」第 159 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:159,搜「same directional conclusions」)。

  22. 出处:「2 An end-to-end rearchitecting project」第 1727 段(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1727,搜「refinement details」)。

  23. 出处:「2 An end-to-end rearchitecting project」表 2.2 的 4.611 秒在第 920-926 行(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:922,搜「5.124s」);正文另一处 4.181 秒在第 1002 行(text/05-ch02-2-an-end-to-end-rearchitecting-project.txt:1002,搜「4.181 seconds」)。两处均为原文照录。