宽度剪枝——给 MLP 瘦身,顺便改性格
这一章讲三件事: 删 GLU 里的神经元为什么必须「成对删」;只看权重幅度剪 40% 会发生什么——一半能力崩塌、另一半反而变强;以及怎么用你的数据当裁判,让剪枝指向你想保住的能力。 第 03 章说过「门路内容路成对工作」,本章从这句话出发;第 04 章的「重要性相对于数据」,本章把它推到神经元粒度。
1. 这一章讲什么
深度剪枝是把一整块端走,粗暴但有效;宽度剪枝是给 MLP 换小一号的零件,精细得多。它的适用对象是宽模型——本章主角 Llama-3.2-1B,扩张四倍。本书给它的定位有句话值得先记住:这技术不只用来提性能,还能改模型的性格1。
它在全书链条里的位置: 深度剪枝管「块够不够」,宽度剪枝管「每块里的知识加工厂开多大」;两把刀可以叠加(第六章末尾会验证),而「性格会变」这个现象会在第七章的特化任务里被正面利用。
2. 顶层全景
目标:把 MLP 的中间维从 8192 砍到 6554、4915……(改宽度,不动块数)
│
├─ 选谁:峰峰值幅度(gate/up 权重范围相加,小的先走) ← 5.1
├─ 约束:内容路与门路成对删;收缩层挑列,扩张层挑行 ← 5.1
├─ 重建:建三个新 Linear 层,搬走留任者的权重,改 config ← 5.1
├─ 进阶:重要性 = 结构分(三层幅度,归一化后相加)
│ × 激活分(down_proj 入口的 L2 范数,钩子截获) ← 5.2
└─ 后果:能力二象性(推理崩/守纪升)+ 域特化 + 提速看比率 ← 5.1-5.2
3. 核心原理
3.1 约束先行:为什么必须成对删
第 03 章讲过 GLU 的分工:内容路(up_proj)生成「这个词可能有什么含义」,门路(gate_proj)生成「此刻该放行哪份」。门路的第 i 个门只管内容路的第 i 份内容——它们是锁定成对的搭档。只删一边,门就对着空位过滤、内容没了看门的,逐元素相乘直接错位2。
所以重要性必须按「对」算。本书用的尺子叫峰峰值幅度:一个神经元的全部权重里,最大值加最小值的绝对值,就是这个神经元的「摆动范围」。范围大=制造显著激活的潜力大。把门路、内容路的范围相加,得到这一对的合计变换潜力,潜力最低的对子先走3。
代码就几行:两张权重矩阵(每张 8192 行×2048 列,行=神经元,列=它对 2048 个输入的权重),逐行取 max+|min|,两张相加。书里的教学例子:神经元 X 权重在 [-0.2, 0.1],范围 0.3;Y 在 [-0.5, 0.4],范围 0.9;Z 在 [0.0, 0.4],范围 0.4——X 先出局4。
3.2 重建与账本
选出要留的对子之后是「换零件」:新建三个尺寸缩小的小 Linear 层,把留任神经元的权重搬进去——门路、内容路挑行,收缩层挑列(它接收的正是前两者的输出);最后更新配置里的中间维,否则下游代码还按旧尺寸找东西5。
一个易漏的细节:留任者的索引(第几号的编号清单)是按挑选顺序排出来的,直接存下会让权重的排列顺序偏离原模型。
所以要重排(放回原顺序)——这是给下一章的蒸馏铺路6。
本书的演示配置:剪 40%,8192→4915(扩张从四倍变约 2.4 倍);全模型参数从 1,235,814,400 降到 913,770,496,减了 3.22 亿、-26.06%。给个体感:每块约 6000 万参数,这相当于抽走五个块的全部内容——但 16 个块一个没少,深度完好7。这套方法与激活函数无关(SwiGLU/GeGLU/ReGLU 通吃),在 LLaMA、Gemma、Qwen 家族上都验证过8。
3.3 主走查:剪 40% 之后,一半崩、一半升
走查对象:静态幅度法剪 40% 的 Llama-3.2-1B,不做任何恢复,直接考试。 全部数字出自原书与其依据的论文,逐项列出:
崩掉的一半(知识与推理)
GSM8K(多步算术): 0.0660 → 0.0205 -68.9% ← 崩得最狠
HellaSwag(常识续写): 0.6363 → 0.3737 -41.3%
ARC-Challenge(科学题): 0.3626 → 0.2509 -30.8%
MMLU(57 科目知识): 0.3111 → 0.2689 -13.6%
困惑度:WikiText 11.57 → 56.33(+387%)
LAMBADA 5.75 → 90.38(+1472%)
升起来的一半(忠实与精确)
IFEval(指令遵循): 0.1035 → 0.1516 +46.5%
MUSR(长文约束推理): 0.3399 → 0.4286 +26.1%
TruthfulQA-MC2(抗误区):0.3772 → 0.4298 +13.9%
图说:这些全是原书实测。规律一句话——
要「多想」的崩,要「照办」的升[^9]。
怎么读这张表?崩的一边,死因指向思考链路:多步推理(链式思考)被砍伤了,而靠背诵的知识(MMLU)伤得轻——剪枝伤的是「怎么想」,不是「知道什么」;贴近语言基本功的阅读理解几乎无损(BoolQ -1.9%、WinoGrande -4.8%)9。
升的一边,共同点是惩罚跑题:原模型爱 给回答添不属于任务的内容,剪过之后表达力下降、输出更短更贴题,反而在「只许输出 JSON(一种机器可查的键值格式)」「只许说证据里有的」这类考试上得分10。
书里给的总结值得原样记:它失去了精致,获得了纪律——不是一个更差的模型,是一个能力画像不同的模型11。画像的用途:发票转 JSON 时不许「好心纠正」错字;agent 发转账请求时不许夹带「friendly preamble」;做内容审核时只许输出单个标签,省 token 也防止自我辩论12。
这条二象性规律在更大模型上更夸张:同是 40% 剪枝,Llama-3.2-3B 的 IFEval 从 0.0943 升到 0.1645(+74.4%);而且 IFEval 随剪枝率不是单调的——10% 时 0.1423、30% 时冲到 0.1811、50% 回落13。
3.4 数据驱动版:结构分 × 激活分
静态法「一视同仁」的短板立刻显形:它不知道哪些神经元对你的任务才重要。数据驱动版把重要性改成乘法:
最终重要性 = 结构分 × 激活分
结构分:三层的峰峰值幅度各自归一化到 [0,1] 后相加
(这次把收缩层也算进来;不归一化,数值大的层会淹没其他层)
激活分:钩子在收缩层入口截获的 L2 范数,按批次累加
图说:乘法是关键——两个因子有一个接近零,乘积就接近零[^15]。
为什么在收缩层入口量? 那是信号刚过完门、还没被压缩的位置:再往下游走,8192 个神经元已被混成 2048 维,分不清谁贡献了什么;在这里,你能看见「门控+激活」过滤之后每个神经元的真实输出14。
为什么是 L2 范数? 书里给了最直观的对比:一个神经元输出 [+5, -5, +5, -5]——
| 度量 | 数值 | 问题 |
|---|---|---|
| 简单求和 | 0 | 正负抵消,明明在干活却被判死亡 |
| L1(绝对值求和) | 20 | 不抵消,但大小不分 |
| L2(平方和开根) | 10 | 不抵消,且奖励尖峰 |
再对照一组:[10,0,0,0] 与 [5,5,0,0] 的 L1 都是 10,L2 却是 10 对 7.07——L2 偏袒「平时安静、一击致命」的专家神经元,压制恒定的背景噪声(无意义的持续小动静)15。这正是特化想要的口味。
工程上还有一笔账:激活不能原样攒在显存里(会爆),所以钩子里就地算成范数,把小小的累加结果放 CPU16。
3.5 主走查(下半场):两个同名模型,两种性格
走查对象:同一个 Llama-3.2-1B,同样的 20% 剪枝,只换校准数据。 一份用 WikiText(正式百科文),一份用 SMS 垃圾短信数据(口语、缩写、短句);剪完参数完全相同(都从 1.24B 到 1.07B,-13.03%),外部看不出任何区别17。
行为却分岔了。同一个填空「Paris is the capital of」:wiki 模型答得规矩(人口 210 万、 位于东北部);sms 模型冒出事实错(「比纽约洛杉矶芝加哥加起来还大」)、句子更直白18。用困惑度验收(低=模型对这类文本「不意外」):
| 模型(参数相同) | WikiText 困惑度 | SMS 困惑度 |
|---|---|---|
| 原模型 | 25.69 | 122.91 |
| wiki 校准模型 | 36.28 | 182.54 |
| SMS 校准模型 | 48.65 | 165.54 |
| 静态 20% 剪枝 | 52 | 217 |
每个模型都在自己校准过的域里最从容,而静态法两头不讨好19。注意诚实的那半句:特化成立,但两个剪后模型在自己领域里仍不如原模型——砍掉 20% 容量的代价是真的;数据驱动剪枝的价值是「在我关心的域里少受伤」,让后续恢复更快更省20。
性能账是另一套逻辑。 速度只跟剪枝率挂钩、与删谁无关:两模型速度都是 18.31→21.9 token/秒(+19.6%,T4 实测);能耗从 1.322 降到 1.236 焦/词(-6.5%)。顺带一个反直觉观察:剪枝模型会生成更多 token(行为变了),每 token 的能耗却不因行为改变——省在架构,行为的事交给后续训练21。
最后一层效率细节:GPU 对齐。 中间维最好能被 64、128 整除——现代 GPU 把矩阵切块(tile)并行处理,尺寸不对齐就要补零。本书 6554 这种「随缘尺寸」在 T4(受限于内存带宽——每秒能搬多少数据)上无所谓,在 A100/H100 的高负载推理里才吃得出差别;作者的 OptiPFair 库有现成参数自动取整22。
4. 作者的判断与证据
给了证据的: 二象性表格来自作者 2025 年的论文《Fragile Knowledge, Robust Instruction-Following: The Width Pruning Dichotomy in Llama-3.2》——对 1B/3B 系统性测过 10%-60% 六档剪枝率;激活引导的思路来自 CFSP 论文(Wang 等,2024),但公式是作者自己简化的混合分23。
作者的判断(而且示范了一种态度): 「学术论文不是要逐字遵守的圣经,是基本思想的来源」——从第一篇拿幅度公式,从第二篇拿「在收缩层入口测激活」的直觉,中间的混合分是自己的东西,用实验验证过比替代方案强24。这是全书方法论上最「可复制」的一页:拆论文、取核心、适配自己的算力。
边界内的坦白: TruthfulQA 上升的机制书里没有定论(表达力下降?输出熵(输出的随机度、发散程度)降低?真的更少不懂装懂?),只有现象成立——「剪过的模型更少输出自信的胡说」25。
5. 边界与局限
- 提速有天花板。 真正的瓶颈常在注意力模块的内存搬运;宽度剪枝只在「GPU 算力吃紧」的场景对速度有明显收益,否则只是边际改善26。
- 剪后必然不如原模型。 就算是自己最擅长的域,困惑度也高于原模型;「特化赢原模型」只在特定任务指标上发生过,不是普遍承诺。
- 能耗数字的环境敏感。 实测在共享的 Colab 上做,作者自己提醒只能当对比基线,不能当绝对值27。
- 校准数据决定一切,也限制一切。 若校准域选窄了,被删掉的可能是别处救命的神经元;书里给的方法没有「校准集代表性」的检验程序。
- GPU 对齐的效果依赖硬件。 T4 上做对齐基本白做,这是书里明说的硬件事实,别拿着结论乱套。