跳到主要内容

10 · 压缩:大模型的知识,装进小模型

1. 这一章讲什么

训练出来只是第一步,部署要问:显存装得下吗?推理快吗?原书第 10 章讲模型压缩的两大技术:知识蒸馏——「借助教师-学生模型结构,传递高效知识」,用大模型教小模型;模型剪枝——「通过删除冗余的权重实现压缩效果」1

这一章是全书「从训练到部署」的转折点:前面所有技术都在把模型练好,这一章开始把模型变小。12 章的推理优化(量化+蒸馏)会回到这里。

2. 顶层全景:两条路,一个目标

目标:参数更少、显存更省、推理更快,精度别掉太多

├─ 蒸馏(再学一次): 大教师 ──软标签──► 小学生模仿
│ 「知识」=教师输出的完整概率分布

└─ 剪枝(直接动手): 权重剪枝 → 把不重要的权重置零(非结构化)
结构化剪枝 → 整通道/整卷积核移除
BERT 特供 → 剪注意力头、剪整层

3. 核心原理

3.1 蒸馏:答案之外,还要学「犹豫的方式」

蒸馏的设置:一个训练好的大模型(教师),一个结构简单的小模型(学生);教师的任务不是直接给答案,而是输出软标签——它在每个候选上的完整概率分布(每个候选各多大可能),学生照着模仿2

为什么软标签比标准答案值钱?看一个直觉:教师判「这张图是马 0.7、骡 0.25、狗 0.05」——它在「马和骡有点像、和狗很不像」这件事上的犹豫结构,是标准答案(「马」,1 个比特)里完全没有的信息。学生模仿分布,等于连「类与类的亲缘关系」一起学了。原书的实现:蒸馏损失=交叉熵(保住对真实标签的准确性)+ KL 散度(拉近学生与教师的分布)3

KL 散度(相对熵)量的是「两个概率分布差多远」:教师说 0.7/0.25/0.05、学生说 0.5/0.4/0.1,KL 就给个正数惩罚;学生越像教师,KL 越小。原书实现里还有一个温度:把教师和学生的输出都先除以 temperature=2.0 再算 softmax(把打分变成总和为 1 的占比),占比被「抹平」,软信息更充分;KL 散度项再乘温度的平方补回量纲4

主走查:蒸馏前后,账怎么算。(原书 10.2.2 的对比数据。)

教师 BERT-base 学生 DistilBERT 变化
模型参数量 110.00M 66.00M 省 40%
训练时间 65.32 秒 32.54 秒 约一半
推理时间 8.75 秒 4.26 秒 约一半
验证准确率 0.8852 0.8735 掉 1.2 个点

走查说明:这组数字是蒸馏的「典型交易」——用约 1 个百分点的精度,换一半的推理时间和四成的参数。第二组对照(SST-2 情感分类,RoBERTa-large 355.36M → DistilRoBERTa 82.88M)结构相同:推理 15.23 秒→7.85 秒,精度 0.9165→0.90175。两组合起来才是完整证据:不同体量、不同任务上,交易比例都成立。

3.2 剪枝:把「不干活」的权重裁掉

剪枝的出发点:大模型里大量权重对结果影响甚微,白占地方。权重剪枝(行话叫「非结构化」——只置零、不改形状——剪枝)按重要性排序,把不重要的单个权重置零——原书用 l1_unstructured 按绝对值大小剪,设 0.5 就是剪掉一半6。工具箱比喻:把不常用的工具清出去,箱子轻了,关键工具还在7。效果(原书数据):参数 101,770 → 50,918,推理时间 0.0235 秒 → 0.0198 秒8

结构化剪枝(行话叫非结构化的反面)动的是「整块」:以通道或卷积核为单位整个移除,原书用 ln_structured(n=2 即按 L2 范数(把整组数折成一个大小)排序、dim=0 沿通道维)剪掉 20% 的通道。

输出显示每层的稀疏——被剪空的占比——达 20%9。两者的本质区别:置零的权重形状还在,通用硬件照样要算(除非专门的稀疏硬件);移除的通道是真的没了,矩阵变小、推理实打实变快——这就是「结构化剪枝适用于硬件加速」的含义10

主走查(第二走查):三级剪枝,精度掉多少。 原书 10.3.3 的 MNIST 手写数字部署案例:

基础模型:98.23%
│ 非结构化权重剪枝
├─► 97.45% (掉了 0.78 个点)
│ 结构化通道剪枝
└─► 96.83% (累计掉 1.4 个点)
模型大小压到 0.87 MB,推理 1.02 秒

走查说明:三级数字给出剪枝的通用规律——每剪一刀,都在拿精度换资源(内存与算得快慢);部署的决策就是找「精度还能接受」的那条线。原书还有更激进的一档:直接剪 BERT 的注意力头和整层(结合层剪枝与注意力头剪枝),精度 92.45% → 91.60%,模型 304.87 MB11——多头注意力里本来就有冗余头,这是 Transformer 时代的剪枝特供。

4. 作者的判断与证据

  • 有演示数据的: 蒸馏两组对照(BERT/DistilBERT、RoBERTa/DistilRoBERTa 的参数、时间、精度)、剪枝三组数字(101,770→50,918;98.23→96.83;92.45→91.60)。
  • 是作者判断的: 「相比于直接训练学生模型,通过知识蒸馏的方式显著提高了模型的准确性」(10.2.1)——书里没有「直接训练学生」的对照数字,这句比较没有实验支撑,读时保留。
  • 书内数字打架一处: 10.2.1 文字说验证准确率「最终达到 89.21%」12,10.2.2 表格里 DistilBERT 是 0.8735——两次实验设置未必相同,但原书没有说明,引用哪个都要注明出处段落。

5. 边界与局限

  • 原书蒸馏只覆盖输出层模仿(软标签);中间层蒸馏(让学生的中间表示也像教师)没有讲。
  • 蒸馏效率对照用的是「蒸馏好的学生」与「教师」比;训练蒸馏花的那一遍成本(教师的推理开销+学生的训练)没有计账——蒸馏省的是部署,不是训练。
  • 剪枝的「微调恢复」只在部署案例里一句带过(「如果精度下降,可进一步微调」13);实际操作里「剪一刀→微调几轮」是标准循环。
  • 量化(12.4 会出场的第三条压缩路)在这一章只出现于导语,机制完全没讲——书把它放到了第 12 章。
  • 教师为什么「知道」马像骡?——因为它的参数里压着海量数据的统计结构;软标签是这个结构的唯一出口。原书没展开这层,我们补在这里。

6. 可带走的

  1. 蒸馏学的不是答案,是教师「犹豫的方式」;软标签携带类间亲缘信息。
  2. 蒸馏损失=交叉熵+KL 散度;温度 T 抹平分布,KL 项乘 T² 补量纲——看到 T=2 别以为写错。
  3. 典型交易比例:精度掉约 1 个点,推理时间和参数省一半/四成(BERT 系)。
  4. 蒸馏省部署、不省训练;别把教师的训练成本忘掉。
  5. 非结构化剪枝置零(形状不变,通用硬件不受益),结构化剪枝移除(矩阵真变小,推理真变快)。
  6. 每剪一刀都要在精度上付账;部署前先画「剪枝比例 vs 精度」的曲线再定刀。
  7. 注意力头有冗余,BERT 可以剪头、剪层——Transformer 压缩的特供入口。

7. 原文地图

主题原书章原文位置
章导语第10章text/62-ch10.txt:24(搜「知识蒸馏(Knowledge Distillation」)
教师-学生与软标签10.1text/63-fm.txt:24(搜「Teacher-Student Model」) · text/63-fm.txt:36(搜「软标签」)
蒸馏损失=交叉熵+KL10.1text/63-fm.txt:45(搜「KL散度」) · text/63-fm.txt:76(搜「相对熵」)
温度与 T²10.2text/64-fm.txt:129(搜「temperature=2.0」) · text/64-fm.txt:141(搜「temperature ** 2」)
BERT/DistilBERT 对照10.2text/64-fm.txt:217(搜「教师模型 (BERT-base)」) · text/64-fm.txt:232(搜「110.00M」)
RoBERTa 对照10.2text/64-fm.txt:332(搜「355.36M」)
89.21% 与表格打架处10.2text/64-fm.txt:169(搜「89.21%」)
权重剪枝与工具箱10.3text/65-fm.txt:33(搜「去除不重要的模型权重」) · text/65-fm.txt:36(搜「工具箱」) · text/65-fm.txt:72(搜「l1_unstructured」)
剪枝前后参数量10.3text/65-fm.txt:90(搜「101770」)
结构化剪枝10.3text/65-fm.txt:115(搜「神经元、卷积核或者通道」) · text/65-fm.txt:157(搜「ln_structured」) · text/65-fm.txt:172(搜「Sparsity in conv1.weight」)
MNIST 三级剪枝10.3text/65-fm.txt:257(搜「98.23%」) · text/65-fm.txt:272(搜「0.87 MB」)
BERT 剪头剪层10.3text/65-fm.txt:294(搜「注意力头剪枝」) · text/65-fm.txt:348(搜「92.45%」)

Footnotes

  1. 出处:「第10章 模型蒸馏与剪枝」第 24-28 段(text/62-ch10.txt:24,搜「知识蒸馏(Knowledge Distillation」)。

  2. 出处:「10.1 知识蒸馏:教师—学生模型」第 36 与 51 段(text/63-fm.txt:36,搜「软标签」;text/63-fm.txt:36,搜「软标签会传递给学生」)。

  3. 出处:「10.1 知识蒸馏:教师—学生模型」第 45 与 76 段(text/63-fm.txt:45,搜「KL散度」;text/63-fm.txt:76,搜「相对熵」)。

  4. 出处:「10.2 知识蒸馏在文本模型中的应用」第 128-141 段(text/64-fm.txt:129,搜「temperature=2.0」;text/64-fm.txt:141,搜「temperature ** 2」)。

  5. 出处:「10.2 知识蒸馏在文本模型中的应用」第 217-250 与 317-350 段(text/64-fm.txt:217,搜「教师模型 (BERT-base)」;text/64-fm.txt:232,搜「110.00M」;text/64-fm.txt:332,搜「355.36M」)。

  6. 出处:「10.3 模型剪枝技术」第 71-73 段(text/65-fm.txt:72,搜「l1_unstructured」)。

  7. 出处:「10.3 模型剪枝技术」第 36 段(text/65-fm.txt:36,搜「工具箱」)。

  8. 出处:「10.3 模型剪枝技术」第 84-99 段(text/65-fm.txt:90,搜「101770」)。

  9. 出处:「10.3 模型剪枝技术」第 153-159 与 171-177 段(text/65-fm.txt:157,搜「ln_structured」;text/65-fm.txt:172,搜「Sparsity in conv1.weight」)。

  10. 出处:「10.3 模型剪枝技术」第 24 段(text/65-fm.txt:24,搜「适用于硬件加速」)。

  11. 出处:「10.3 模型剪枝技术」第 294 与 347-363 段(text/65-fm.txt:294,搜「注意力头剪枝」;text/65-fm.txt:348,搜「92.45%」)。

  12. 出处:「10.2 知识蒸馏在文本模型中的应用」第 169 段(text/64-fm.txt:169,搜「89.21%」)。

  13. 出处:「10.3 模型剪枝技术」第 215 段(text/65-fm.txt:215,搜「可进一步微调」)。