LLM WIKI · 课程精读

LEARNING UNIT · 16

剪枝与二阶压缩

从权重置零出发,比较 OBD、OBS、GPTQ 式二阶目标以及结构化注意力头剪枝。

已整理章节
12 节
单元来源
11 条视频
总时长
32:00
状态
已发布
学习位置
16 / 20
01

主题讲解 · 02:21

把权重置零为何在计算图上等价于剪枝

学习目标

  • 能用阈值和二值 mask 写出基于权重幅值的剪枝。
  • 能解释小权重归零后参数分布与稀疏度怎样变化。
  • 能把线性层矩阵元素对应到输入、输出之间的加权连边。
  • 能从矩阵乘法证明某个权重为零时,对应连边贡献消失。
  • 能区分“数值上为零”“稀疏存储”和“真实硬件加速”。

前置与衔接

本课是剪枝主题的最小模型。

后续 OBD、OBS 等方法会讨论怎样更聪明地选择被剪权重;这里先回答更基础的问题:为什么常见剪枝实现表现为把权重元素写成零?

答案来自线性层的代数与连接图之间的一一对应。

核心讲解

1. 基于幅值的阈值剪枝

设权重矩阵为 WW,阈值为 ε>0\varepsilon>0

最简单的 magnitude pruning 规则是:

Wjipruned={Wji,Wji>ε,0,Wjiε.W_{ji}^{\mathrm{pruned}}= \begin{cases} W_{ji},&|W_{ji}|>\varepsilon,\\ 0,&|W_{ji}|\le\varepsilon. \end{cases}

它假设绝对值很小的权重对输出影响通常较小,因此优先归零。

图 1

基于幅值的剪枝用阈值把小权重置零;在线性层中,每个权重矩阵元素对应一条输入到输出的加权连边。

原视频 · 00:00 ↗

更紧凑地定义二值 mask:

M=1(W>ε),M=\mathbf 1(|W|>\varepsilon),

Wpruned=WM.W^{\mathrm{pruned}}=W\odot M.

\odot 表示逐元素乘法,而不是矩阵乘法。

图 2

二值条件 |W|>ε 生成保留掩码,逐元素乘回 W 后,阈值以内的元素变成零。

原视频 · 00:40 ↗

2. 阈值不是随便挑的常数

视频把 ε\varepsilon 描述为一个不太大的阈值。

工程中常见的两种设定方式是:

  • 固定阈值:所有 Wjiε|W_{ji}|\le\varepsilon 的元素归零;
  • 固定稀疏度:按 Wji|W_{ji}| 排序,选择目标比例的最小元素归零。

第二种方式更容易精确控制零元素比例。

若阈值处有并列值,需要确定 tie-breaking,否则可能多剪或少剪。

3. 权重分布为何在零附近出现空缺

许多训练后权重集中在零附近。

当阈值剪枝把中间一段小幅值权重统一写成零时:

  • 非零权重仍分布在负、正两侧;
  • 零位置数量显著增加;
  • 若只画非零值的直方图,零附近会出现空缺;
  • 若把零值也计入直方图,零点会出现一个质量峰。
图 3

把零附近的小权重归零后,非零权重分布在零点两侧,并形成可利用的稀疏结构。

原视频 · 01:00 ↗

图中“中间空出来”说的是剩余非零权重的分布。

不能误解为零权重已经从 dense 张量内存中自动消失。

4. 用一个线性层固定记号

采用视频板书的行向量写法:

x=[x1x2x3],x=\begin{bmatrix}x_1&x_2&x_3\end{bmatrix},
W=[123456].W= \begin{bmatrix} 1&2&3\\ 4&5&6 \end{bmatrix}.

输出为

y=xWT.y=xW^T.

因此

y=[x1+2x2+3x3,4x1+5x2+6x3].y= \begin{bmatrix} x_1+2x_2+3x_3, &4x_1+5x_2+6x_3 \end{bmatrix}.
图 4

矩阵乘法把每个输出写成输入分量乘对应权重后的加权和,与神经元连边图逐项对应。

原视频 · 01:40 ↗

在这个记号中,WW 的第 jj 行存放通向输出 yjy_j 的全部权重。

WjiW_{ji} 表示从输入 xix_i 到输出 yjy_j 的连边权重。

5. 矩阵元素就是连边的代数系数

一般形式为

yj=iWjixi.y_j=\sum_iW_{ji}x_i.

展开其中一项:

yj=cdots+Wjixi+.y_j=cdots+W_{ji}x_i+\cdots.

神经网络连接图把这项画成一条从 xix_i 指向 yjy_j 的边,并把 WjiW_{ji} 标在边上。

矩阵乘法与连接图并不是两个不同机制,而是同一线性变换的两种表达。

6. 把某个权重置零会发生什么

若把

Wji=0,W_{ji}=0,

那么对应项变成

Wjixi=0xi=0.W_{ji}x_i=0\cdot x_i=0.

不论输入 xix_i 取什么值,这条边都不再影响 yjy_j

图 5

将 W 中某个元素置零会删除相应输入到输出的贡献,因此在函数图上等价于剪掉那条加权边。

原视频 · 02:00 ↗

因此在函数和计算图语义上,这条连边可以删除。

这就是“权重置零等价于剪枝”的核心证明。

7. 一个具体置零例子

把上例中的 W12=2W_{12}=2 置零:

W=[103456].W'= \begin{bmatrix} 1&0&3\\ 4&5&6 \end{bmatrix}.

新输出为

y1=x1+3x3,y_1'=x_1+3x_3,
y2=4x1+5x2+6x3.y_2'=4x_1+5x_2+6x_3.

只有 x2y1x_2\to y_1 的贡献消失;其他五条边保持不变。

这类逐元素归零属于非结构化剪枝

若一次删除整个神经元、通道或注意力头,则属于更粗粒度的结构化剪枝。

8. 数值为零不等于存储和计算自动变少

视频提到稀疏矩阵更易存储和计算,这需要一个实现边界。

从数学上看,零权重的乘法可以省略。

但若 WprunedW^{\mathrm{pruned}} 仍以普通 dense tensor 存储,并调用 dense GEMM:

  • 零元素仍占用 dense 存储位置;
  • 通用内核通常仍执行对应乘加槽位;
  • 零很多也不保证墙钟时间下降。

要获得实际收益,通常还需要:

  • CSR/CSC、block sparse 等稀疏格式;
  • 目标硬件支持的稀疏模式,例如规则化块或 N:MN:M 稀疏;
  • 匹配的稀疏算子和足够高的稀疏度;
  • 把索引、mask 与调度开销计入性能评估。

因此应分三层表述:

  1. 权重归零让连边在函数上失效;
  2. 稀疏格式可以不存显式零;
  3. 稀疏内核才有机会跳过对应计算。

9. 小幅值为何只是启发式

单看 Wji|W_{ji}| 忽略了输入尺度和参数耦合。

即使 Wji|W_{ji}| 很小,如果 xi|x_i| 经常很大,乘积 WjixiW_{ji}x_i 仍可能重要。

反过来,一个较大权重也可能因输入方向很少激活而影响有限。

后续 OBD、OBS 等方法会引入曲率,估计置零权重后的损失增加,而不只看幅值。

跟练与练习

原视频练习

编者练习

x=[21],W=[30.124].x=\begin{bmatrix}2&-1\end{bmatrix}, \qquad W= \begin{bmatrix} 3&0.1\\ -2&4 \end{bmatrix}.ε=0.2\varepsilon=0.2,计算 mask、剪枝后的权重和输出 y=xWTy=xW^T

查看参考答案

mask 为
M=[1011],M= \begin{bmatrix} 1&0\\ 1&1 \end{bmatrix},
所以
Wpruned=[3024].W^{\mathrm{pruned}}= \begin{bmatrix} 3&0\\ -2&4 \end{bmatrix}.
输出为
y=[2×3+(1)×0,2×(2)+(1)×4]=[68].y= \begin{bmatrix} 2\times3+(-1)\times0, &2\times(-2)+(-1)\times4 \end{bmatrix} =\begin{bmatrix}6&-8\end{bmatrix}.

编者练习 2

一个 dense 权重矩阵已有 90%90\% 元素为零,能否仅凭这个比例断言推理速度提升十倍?

查看参考答案

不能。还要检查零元素是否采用稀疏格式、稀疏模式是否被硬件支持、实际调用的是 dense 还是 sparse kernel,以及索引和调度开销。数值稀疏度只说明潜在可跳过工作量,不直接等于端到端加速比。

常见误区

  • 把剪枝听成“减脂”:本课术语是 pruning,即剪枝。
  • 把 ε 当成模型参数:它是剪枝规则的阈值或由目标稀疏度导出的边界。
  • WMW\odot M 当矩阵乘法:这里是逐元素乘法。
  • 认为任意零都已物理删除:dense tensor 仍可能存储并计算这些槽位。
  • 把所有剪枝称为结构化剪枝:单个标量权重归零通常是非结构化剪枝。
  • 认为小权重必然不重要:幅值只是启发式,输入尺度和曲率也会影响真实损失。

本课小结

  • 幅值剪枝用 M=1(W>ε)M=\mathbf1(|W|>\varepsilon) 选择保留权重。
  • 在线性层中,WjiW_{ji} 是输入 xix_i 到输出 yjy_j 的加权连边。
  • Wji=0W_{ji}=0 使该边对任何输入的贡献恒为零,所以函数上等价于删边。
  • 数值归零、稀疏存储与硬件加速是三个不同层次,不能混为一谈。
  • 后续课程将从幅值启发式走向曲率感知的 OBD、OBS 与统一压缩方法。
02

主题讲解 · 03:28

圆形山谷为何让 OBD 退化为权重大小剪枝

学习目标

  • 能解释基于权重大小的剪枝如何由目标稀疏度确定阈值。
  • 能写出 OBD 的二阶重要性分数 SiOBD=12Hiiwi2S_i^{\mathrm{OBD}}=\frac12H_{ii}w_i^2
  • 能从代数上证明各向同性曲率下 OBD 与 magnitude pruning 排序相同。
  • 能从等高线几何解释“小权重不一定不重要”。
  • 能说明“OBD 退化为 magnitude pruning”成立所需的局部假设。

前置与衔接

需要知道剪枝把部分权重置零,稀疏度表示被置零权重的比例。

还需要把 Hessian 对角元素 HiiH_{ii} 理解为损失沿第 ii 个权重方向的局部曲率。

本课位于“剪枝与二阶压缩”单元。

它先建立 magnitude pruning 与 OBD 的评分差异,再回答一个特殊情形:当局部损失山谷近似圆形时,为什么两种评分会给出同一个剪枝顺序。

核心讲解

1. magnitude pruning 先按绝对值排序

最直接的非结构化剪枝规则是

wi={wi,wi>ε,0,wiε.w_i'= \begin{cases} w_i,& |w_i|>\varepsilon,\\ 0,& |w_i|\le \varepsilon. \end{cases}

其中 ε\varepsilon 不是任意拍定,而是由目标稀疏度决定。

图 1

基于权重大小的剪枝用阈值 ε 判断保留或置零,阈值可由目标稀疏度对应的顺序统计量确定。

原视频 · 00:20 ↗

假设共有 N=1000N=1000 个权重,目标稀疏度是 s=0.3s=0.3

那么需要剪掉

k=sN=300k=sN=300

个绝对值最小的权重。

wi|w_i| 从小到大排列,第 300300 小的绝对值就给出了切分位置。

实际实现可使用完整排序,也可使用 selection / top-k 一类顺序统计量算法,不必总把所有元素彻底排好序。

图 2

把权重绝对值排序后,在目标稀疏度对应的位置切分:阈值以下剪掉,以上保留。

原视频 · 00:40 ↗

这个方法隐含了一个判断:权重越小,置零它造成的损害越小。

但这个判断没有利用损失函数在不同方向上的曲率。

2. OBD 按“置零后的局部损失上升”排序

在 OBD 的局部二阶模型中,剪掉单个权重 wiw_i 的重要性分数为

SiOBD=ΔLi12Hiiwi2.S_i^{\mathrm{OBD}} =\Delta L_i \approx \frac12 H_{ii}w_i^2.

这里:

  • wi2w_i^2 表示把该坐标从 wiw_i 移到 00 所需位移的平方;
  • HiiH_{ii} 表示损失沿该坐标方向的局部曲率;
  • 分数越小,局部模型预测的损失上升越小,越适合先剪。
图 3

OBD 不按 |w_i| 排序,而按二阶曲率加权的 1/2 H_ii w_i^2 衡量置零权重后的损失上升。

原视频 · 01:20 ↗

因此 OBD 与 magnitude pruning 的流程外形很像:都算分、排序,再剪掉分数最小的一批。

真正的差别在评分:前者用 12Hiiwi2\frac12H_{ii}w_i^2,后者只看 wi|w_i|

课程提到 Hessian 信息可以借助校准数据估计。

准确地说,校准数据提供了在代表性输入上的损失或输出统计,具体实现仍要选择 Hessian 或近似曲率的计算方式。

3. 代数证明:各向同性让曲率成为共同常数

把二维局部损失写成

ΔL12ΔwTHΔw.\Delta L\approx \frac12\Delta w^T H\Delta w.

若等高线是圆形,局部二次曲率各向同性,可写为

H=λI,H=\lambda I,

其中 λ>0\lambda>0

于是每个坐标方向都有

Hii=λ.H_{ii}=\lambda.

OBD 分数变为

SiOBD=12λwi2.S_i^{\mathrm{OBD}} =\frac12\lambda w_i^2.
图 4

圆形山谷各方向曲率相同,使 H_ii 成为共同常数,按 1/2 H_ii w_i^2 排序等价于按 |w_i| 排序。

原视频 · 02:20 ↗

对所有权重而言,12λ\frac12\lambda 都是相同的正数。

乘上同一个正数不会改变排序,因此

rank ⁣(12λwi2)=rank(wi2)=rank(wi).\operatorname{rank}\!\left(\frac12\lambda w_i^2\right) =\operatorname{rank}(w_i^2) =\operatorname{rank}(|w_i|).

所以两种方法会在同一个位置切分,并剪掉同一组权重。

“退化”指评分排序等价,不是说二阶推导本身消失了。

4. 一般狭长山谷中,小权重未必能剪

如果 Hessian 不各向同性,不同方向的 HiiH_{ii} 可以相差很大。

考虑两个权重满足

w1>w2,|w_1|>|w_2|,

但曲率满足

H22H11.H_{22}\gg H_{11}.

那么完全可能出现

12H22w22>12H11w12.\frac12H_{22}w_2^2> \frac12H_{11}w_1^2.

此时 w2w_2 虽然绝对值更小,置零它反而造成更大的局部损失上升。

图 5

在各向异性的狭长山谷中,较小权重的置零位移仍可能跨越更多等高线,因此损失增量未必更小。

原视频 · 02:40 ↗

几何上,置零 wiw_i 是沿第 ii 个坐标轴移动到零平面。

在狭长、各向异性的山谷里,较短的坐标位移可能沿着陡峭方向,跨越很多等高线;较长位移也可能沿平缓方向,只跨越少量等高线。

所以“位移短”与“损失增长小”不是一般等价关系。

5. 圆形山谷把距离顺序变成损失顺序

圆形等高线没有特别陡或特别平的方向。

局部损失只由到中心的欧氏距离决定。

沿坐标轴把某个权重置零时,位移长度就是 wi|w_i|

图 6

在圆形等高线下,沿坐标轴置零的位移越短,跨越的等高线越少,损失上升顺序与权重绝对值顺序一致。

原视频 · 03:00 ↗

因此:

  • 较小的 wi|w_i| 对应较短的置零位移;
  • 较短位移对应较小的二次损失上升;
  • wi|w_i| 排序就等价于按 ΔLi\Delta L_i 排序。

这与前面的代数证明是同一个结论的两种表述。

6. 结论的适用边界

“圆形山谷”是局部二次模型中的理想情形。

它至少要求所比较方向的对角曲率相同。

若 Hessian 还含有显著非对角项,权重方向彼此耦合,仅比较 HiiH_{ii} 仍可能遗漏联动效应。

若模型未处在近似驻点,或剪枝位移大到离开局部二次区域,真实损失变化也可能偏离该评分。

因此本课结论适合用来理解算法关系,不应被读成“真实神经网络损失总是圆形”。

跟练与练习

原视频练习

编者练习

有两个权重 w1=0.2w_1=0.2w2=0.1w_2=0.1,对应曲率 H11=1H_{11}=1H22=100H_{22}=100。magnitude pruning 与 OBD 各会优先剪谁?

查看参考答案

magnitude pruning 只看绝对值,会优先剪 w2w_2。OBD 分数分别为 S1=12×1×0.22=0.02S_1=\frac12\times1\times0.2^2=0.02S2=12×100×0.12=0.5S_2=\frac12\times100\times0.1^2=0.5,所以 OBD 会优先剪 w1w_1。这个例子说明小权重若位于高曲率方向,仍可能很重要。

编者练习 2

H=7IH=7I,证明 OBD 排名前 kk 个最小分数与 wi|w_i| 最小的前 kk 个完全一致。

查看参考答案

此时 SiOBD=72wi2S_i^{\mathrm{OBD}}=\frac72w_i^2。函数 xx2x\mapsto x^2x0x\ge0 上单调递增,而所有分数又乘同一个正常数 7/27/2,因此 SiS_iwi2w_i^2wi|w_i| 的升序完全一致。若有相同绝对值,则两种评分都出现同样的并列,需要相同的 tie-breaking 才能得到逐元素完全相同的顺序。

常见误区

  • 误区:稀疏度 0.3 表示保留 30% 权重。纠正:本课程语境中表示剪掉、置零 30%。
  • 误区:阈值一定来自完整排序。纠正:只需要找到对应顺序统计量,具体算法可不做全排序。
  • 误区:OBD 仍只按权重大小剪。纠正:它按曲率加权的权重平方排序。
  • 误区:小权重一定不重要。纠正:高曲率方向上的小位移也可能造成大损失。
  • 误区:椭圆山谷都能让 OBD 退化。纠正:一般轴对齐椭圆仍有不同曲率;圆形要求各方向曲率相同。
  • 误区:排序等价说明所有损失增量数值相等。纠正:等价的是相对顺序,不是各权重分数相同。
  • 误区:真实模型的损失山谷一定满足圆形假设。纠正:这是帮助理解特殊关系的理想局部条件。

本课小结

  • magnitude pruning 按 wi|w_i| 排序,阈值由目标稀疏度对应的顺序统计量确定。
  • OBD 按 12Hiiwi2\frac12H_{ii}w_i^2 估计置零单个权重的局部损失代价。
  • H=λIH=\lambda I 时,曲率是共同正常数,OBD 排序退化为绝对值排序。
  • 在各向异性山谷中,小权重可能位于高曲率方向,不能只凭绝对值判断。
  • 下一课将从 Taylor 展开系统拆解 OBD 的三项假设,解释这个评分公式从哪里来。
03

主题讲解 · 03:37

从 Taylor 展开理解 OBD 的三项假设

学习目标

  • 能从一元 Taylor 展开过渡到多元损失的局部二次模型。
  • 能解释梯度 gg、Hessian HH 与扰动 Δw\Delta w 的 shape 和几何意义。
  • 能准确列出 OBD 的驻点、二次近似与权重解耦三项假设。
  • 能说明对角 Hessian 为什么对应轴对齐而非旋转的椭圆等高线。
  • 能推导剪掉单个权重时的 OBD 重要性分数。

前置与衔接

需要熟悉导数描述斜率、二阶导数描述曲率,并知道剪枝把某个权重从 wiw_i 改为 00

上一课直接使用了

SiOBD=12Hiiwi2.S_i^{\mathrm{OBD}}=\frac12H_{ii}w_i^2.

本课不再把它当作现成公式,而是从多元 Taylor 展开追溯它成立的条件。

核心讲解

1. 一元 Taylor 展开:高度、斜率与曲率

对一元损失函数 L(w)L(w),在 w0w_0 附近写 w=w0+Δww=w_0+\Delta w

Taylor 展开为

L(w0+Δw)=L(w0)+L(w0)Δw+12L(w0)(Δw)2+O((Δw)3).L(w_0+\Delta w) =L(w_0) +L'(w_0)\Delta w +\frac12L''(w_0)(\Delta w)^2 +O((\Delta w)^3).
图 1

一元 Taylor 展开用函数值、一阶斜率和二阶曲率逐步逼近损失函数。

原视频 · 00:20 ↗

三个显式项分别回答:

  • L(w0)L(w_0):展开点本身有多高;
  • L(w0)ΔwL'(w_0)\Delta w:沿切线移动带来多少一阶高度变化;
  • 12L(w0)(Δw)2\frac12L''(w_0)(\Delta w)^2:曲率让真实函数偏离切线多少。

加入的阶数越高,局部拟合通常越精细,但计算与存储也更复杂。

OBD 的名字 Optimal Brain Damage 虽然强调剪枝,其数学入口正是这个局部近似。

2. 多元 Taylor 展开把权重写成向量

神经网络参数不是一个标量,而是向量

w=(w1,w2,,wd)T.w=(w_1,w_2,\ldots,w_d)^T.

从当前参数 w0w_0 施加扰动 Δw\Delta w 后,新的参数为

w=w0+Δw.w=w_0+\Delta w.

多元二阶展开是

L(w0+Δw)L(w0)+gTΔw+12ΔwTHΔw,L(w_0+\Delta w) \approx L(w_0)+g^T\Delta w +\frac12\Delta w^TH\Delta w,

其中

g=L(w0)Rd,H=2L(w0)Rd×d.g=\nabla L(w_0)\in\mathbb{R}^d, \qquad H=\nabla^2L(w_0)\in\mathbb{R}^{d\times d}.
图 2

多元损失在 w_0 附近展开为 L(w_0)+g^TΔw+1/2 Δw^T HΔw,高度、切平面与曲率项共同描述局部山谷。

原视频 · 01:20 ↗

shape 检查如下:

  • gTg^T1×d1\times d
  • Δw\Delta wd×1d\times1
  • gTΔwg^T\Delta w 是标量;
  • ΔwTHΔw\Delta w^TH\Delta w 也是标量。

几何上,gTΔwg^T\Delta w 描述切平面的高度变化,二次型描述局部山谷的弯曲方式。

3. 假设一:当前模型已在近似驻点

OBD 假设训练后的参数 w0w_0 已经收敛到局部谷底附近,因此

g=L(w0)0.g=\nabla L(w_0)\approx0.

于是一次项消失:

gTΔw0.g^T\Delta w\approx0.
图 3

OBD 假设模型已收敛且当前权重位于谷底,因此一阶梯度 g 为零。

原视频 · 02:00 ↗

几何上,这意味着展开点处的切平面近似水平。

这并不要求训练误差为零,也不要求 L(w0)=0L(w_0)=0

“损失值为零”和“损失对参数的一阶导为零”是两件不同的事。

真实模型中,随机优化、有限训练与数值误差都可能让 gg 只近似为零。

4. 假设二:局部山谷可由二次函数描述

OBD 忽略三阶及以上项,保留

ΔL=L(w0+Δw)L(w0)12ΔwTHΔw.\Delta L =L(w_0+\Delta w)-L(w_0) \approx \frac12\Delta w^TH\Delta w.

课程把这一点形容为山谷是“完美抛物线”。

更谨慎的表述是:在当前点附近、对所考虑的剪枝扰动范围,二次近似足够有用。

它不宣称真实深度网络的全局损失面就是一个二次函数。

若一次剪掉很多权重,Δw\Delta w 很大,局部 Taylor 近似可能明显失真。

5. 假设三:权重之间解耦,Hessian 近似对角

一般 Hessian 为

H=[H11H12H21H22].H= \begin{bmatrix} H_{11}&H_{12}&\cdots\\ H_{21}&H_{22}&\cdots\\ \vdots&\vdots&\ddots \end{bmatrix}.

非对角项 HijH_{ij} 描述第 iijj 个权重扰动之间的二阶耦合。

OBD 把它近似成

Hdiag(H11,H22,,Hdd).H\approx\operatorname{diag}(H_{11},H_{22},\ldots,H_{dd}).
图 4

权重解耦对应 Hessian 近似对角,等高线是轴对齐椭圆而不是旋转椭圆。

原视频 · 02:40 ↗

此时二次型可拆为逐坐标求和:

ΔL12j=1dHjj(Δwj)2.\Delta L \approx\frac12\sum_{j=1}^{d}H_{jj}(\Delta w_j)^2.

没有 ΔwiΔwj\Delta w_i\Delta w_j 交叉项,因此每个权重的局部代价可以单独计算。

在二维正曲率情形中,对角 Hessian 对应轴对齐椭圆。

旋转椭圆意味着主曲率方向与坐标轴不一致,也就是原坐标下存在耦合项。

还要区分“轴对齐椭圆”和“圆”:前者只要求 Hessian 对角,后者还要求各对角元素相同。

6. 三项假设如何导出单权重重要性

现在只剪掉第 ii 个权重,其他权重保持不变。

扰动满足

Δwi=0wi=wi,\Delta w_i=0-w_i=-w_i,

并且对 jij\ne i

Δwj=0.\Delta w_j=0.

代入对角二次型:

ΔLi12Hii(Δwi)2=12Hiiwi2.\Delta L_i \approx\frac12H_{ii}(\Delta w_i)^2 =\frac12H_{ii}w_i^2.
图 5

在梯度为零、忽略三阶以上项且 Hessian 对角时,剪掉 w_i 的局部损失增量为 1/2 H_ii w_i^2。

原视频 · 03:20 ↗

这就是 OBD 的 saliency 或重要性分数。

分数小表示在当前局部模型下,把该权重置零预计造成的损失上升小。

因此 OBD 对所有权重计算分数,优先剪掉分数最小者。

7. 三项假设分别解决什么难题

三项假设不是重复表达:

  1. 驻点假设去掉一阶项,避免剪枝方向与当前梯度共同影响损失;
  2. 二次近似截断高阶项,让损失变化可由 Hessian 描述;
  3. 对角假设去掉权重耦合,让每个权重获得独立标量评分。

前两项建立“局部二阶世界”,第三项才把一般二次型简化为 OBD 可批量排序的逐权重分数。

下一课的 OBS 会保留前两项,但放松第三项。

跟练与练习

原视频练习

编者练习

给定 H=[4001],w=[0.20.3].H=\begin{bmatrix}4&0\\0&1\end{bmatrix}, \qquad w=\begin{bmatrix}0.2\\0.3\end{bmatrix}. 按 OBD 分数应先剪哪个权重?

查看参考答案

两个分数分别是 S1=12×4×0.22=0.08S_1=\frac12\times4\times0.2^2=0.08S2=12×1×0.32=0.045S_2=\frac12\times1\times0.3^2=0.045。虽然 w2>w1|w_2|>|w_1|,OBD 仍优先剪 w2w_2,因为第二个方向曲率更低。

编者练习 2

若 Hessian 为 H=[2112],H=\begin{bmatrix}2&1\\1&2\end{bmatrix}, 为什么不能把 ΔL\Delta L 写成两个互不相关的 12Hii(Δwi)2\frac12H_{ii}(\Delta w_i)^2 之和?

查看参考答案

展开二次型得到 ΔL=12(2Δw12+2Δw1Δw2+2Δw22)\Delta L=\frac12(2\Delta w_1^2+2\Delta w_1\Delta w_2+2\Delta w_2^2)。中间的交叉项说明一个权重扰动的代价取决于另一个权重如何变化,不能把两者当成独立问题。这正是 OBD 对角假设忽略、OBS 尝试保留的信息。

常见误区

  • 误区:模型收敛等于 L(w0)=0L(w_0)=0。纠正:OBD 使用的是 g0g\approx0,损失值可以非零。
  • 误区:二阶近似说明三阶导数在真实模型中严格为零。纠正:它们是在局部近似里被忽略。
  • 误区:Hessian 对角说明所有方向曲率相同。纠正:对角元素仍可不同,只表示坐标解耦。
  • 误区:轴对齐椭圆就是圆。纠正:只有所有相关对角曲率相等时才是圆。
  • 误区:HiiH_{ii} 是权重 wiw_i 的一阶梯度。纠正:它是损失对 wiw_i 的二阶偏导。
  • 误区:剪掉 wiw_iΔwi=wi\Delta w_i=w_i。纠正:新值减旧值是 0wi=wi0-w_i=-w_i,平方后符号才消失。
  • 误区:局部分数能精确预测任意高稀疏度下的最终损失。纠正:大扰动会削弱 Taylor 近似可靠性。

本课小结

  • 多元 Taylor 展开把剪枝后的损失变化拆为一次项、二次项和高阶余项。
  • OBD 假设当前权重在近似驻点、局部损失可二次化、Hessian 可近似对角。
  • 对角 Hessian 消除权重间交叉项,对应坐标轴对齐的局部山谷。
  • 单独置零 wiw_i 时,局部损失增量为 12Hiiwi2\frac12H_{ii}w_i^2
  • 下一课将看到 OBS 如何保留前两项假设、恢复 Hessian 的非对角耦合,并用补偿处理被剪权重。
04

主题讲解 · 02:57

OBS 如何保留权重耦合并逐步补偿

学习目标

  • 能比较 OBS 相对 OBD 保留和放松了哪些局部假设。
  • 能解释非对角 Hessian 如何表示权重之间的二阶耦合。
  • 能写出 OBS 的单权重重要性分数与最优补偿向量。
  • 能从评分对象和执行流程比较 magnitude pruning、OBD 与 OBS。
  • 能说明朴素 OBS 为什么一次剪一个权重,并在下一轮前更新状态。

前置与衔接

需要掌握上一课的局部二次模型

ΔL12ΔwTHΔw\Delta L\approx\frac12\Delta w^TH\Delta w

以及 OBD 对 Hessian 做对角近似后得到的逐权重分数。

本课进入 OBS(Optimal Brain Surgeon)。

核心变化不是放弃二阶近似,而是恢复 OBD 忽略的权重耦合,并允许其他权重在剪掉一个坐标后协同调整。

核心讲解

1. 先复盘 OBD 的三项假设

在当前参数 w0w_0 附近,完整展开写成

L(w0+Δw)L(w0)+gTΔw+12ΔwTHΔw+高阶项.L(w_0+\Delta w) \approx L(w_0)+g^T\Delta w +\frac12\Delta w^TH\Delta w +\text{高阶项}.

OBD 使用三项简化:

  1. 模型位于近似驻点,g0g\approx0
  2. 忽略三阶及以上项;
  3. 把 Hessian 近似成对角阵。
图 1

OBD 保留局部二阶项:假设梯度为零、忽略三阶以上项,并额外把 Hessian 近似为对角阵。

原视频 · 00:20 ↗

前两项把问题限制在局部二次世界。

第三项进一步删除所有交叉项,使

ΔL12iHii(Δwi)2.\Delta L\approx\frac12\sum_iH_{ii}(\Delta w_i)^2.

因此 OBD 能给每个权重一个独立分数,并一次排序剪掉一批。

2. OBS 保留前两项,但放松对角假设

OBS 同样假设

g0g\approx0

并忽略高阶项,所以仍以

ΔL12ΔwTHΔw\Delta L\approx\frac12\Delta w^TH\Delta w

作为目标。

不同的是,OBS 允许 HH 是一般非对角矩阵。

图 2

OBS 仍采用 1/2 Δw^T HΔw,但保留 Hessian 非对角项,因此不同权重的变化相互耦合。

原视频 · 01:00 ↗

展开后会出现

HijΔwiΔwjH_{ij}\Delta w_i\Delta w_j

形式的交叉项。

这表示剪掉 wiw_i 后,如果同时适当调整其他权重,某些损失上升可以被抵消。

因此 OBS 不再把“剪掉一个权重”理解为只有这个坐标变化,而是把它理解为一个带约束的全向量优化问题。

3. 把单权重剪枝写成约束优化

若要剪掉第 ii 个权重,新参数必须满足

wi+Δwi=0.w_i+\Delta w_i=0.

用第 ii 个单位向量 eie_i 表示,就是

eiTΔw=wi.e_i^T\Delta w=-w_i.

OBS 要求在这个约束下最小化局部损失:

minΔw12ΔwTHΔws.t.eiTΔw=wi.\min_{\Delta w}\frac12\Delta w^TH\Delta w \quad \text{s.t.}\quad e_i^T\Delta w=-w_i.

这是标准的等式约束二次优化,可用 Lagrange 乘子求解。

构造

J(Δw,λ)=12ΔwTHΔw+λ(eiTΔw+wi).\mathcal{J}(\Delta w,\lambda) =\frac12\Delta w^TH\Delta w +\lambda(e_i^T\Delta w+w_i).

Δw\Delta w 求导并令其为零:

HΔw+λei=0.H\Delta w+\lambda e_i=0.

HH 可逆,则

Δw=λH1ei.\Delta w=-\lambda H^{-1}e_i.

再代回约束可得

λ=wi[H1]ii.\lambda=\frac{w_i}{[H^{-1}]_{ii}}.

因此最优补偿向量为

Δwi=wi[H1]iiH1ei.\Delta w_i^* =-\frac{w_i}{[H^{-1}]_{ii}}H^{-1}e_i.

这里上标星号表示“在剪掉第 ii 个候选权重时的最优整向量改变量”,不是只有第 ii 个分量。

4. OBS 的重要性分数来自最小约束代价

把最优补偿向量代回二次目标,可得

SiOBS=ΔLi=12wi2[H1]ii.S_i^{\mathrm{OBS}} =\Delta L_i^* =\frac12\frac{w_i^2}{[H^{-1}]_{ii}}.
图 3

朴素 OBS 用 1/2·w_i^2/[H^{-1}]_ii 作为单个候选权重的重要性分数。

原视频 · 01:40 ↗

注意它不是简单把 OBD 的 HiiH_{ii} 换成 [H1]ii[H^{-1}]_{ii}

逆 Hessian 对角元素出现在分母,因此实际曲率因子是

1[H1]ii.\frac{1}{[H^{-1}]_{ii}}.

这个量已经考虑了其他权重可通过耦合方向进行补偿的能力。

若某个方向很容易由其他坐标共同调整来吸收,约束最小代价会相应改变。

5. 三种评分方法放到一起比较

图 4

magnitude pruning、OBD 与 OBS 分别按 |w_i|、1/2 H_ii w_i^2 和 1/2·w_i^2/[H^{-1}]_ii 衡量重要性。

原视频 · 02:00 ↗

三种方法可写成:

Simag=wi,S_i^{\mathrm{mag}}=|w_i|,
SiOBD=12Hiiwi2,S_i^{\mathrm{OBD}}=\frac12H_{ii}w_i^2,
SiOBS=12wi2[H1]ii.S_i^{\mathrm{OBS}}=\frac12\frac{w_i^2}{[H^{-1}]_{ii}}.

它们利用的信息逐步增加:

  • magnitude pruning 只看权重数值;
  • OBD 再看单坐标曲率;
  • OBS 使用完整 Hessian 的逆所携带的耦合信息。

这不自动保证任何有限实现都严格更优。

估计误差、数值稳定性、计算预算和局部模型失真都会影响实际结果。

6. 执行流程:OBS 是“剪一个—补偿—再更新”

magnitude pruning 与经典 OBD 常先计算所有分数,再按排序一次性剪掉一批权重。

朴素 OBS 则一次选择当前分数最小的单个权重。

剪掉它以后,使用 Δwi\Delta w_i^* 更新其他权重,让局部损失上升尽量小。

图 5

OBS 每次置零一个权重后补偿其余权重,再更新 Hessian 逆矩阵,随后继续选择下一权重。

原视频 · 02:40 ↗

补偿后的参数已经改变,下一轮面对的有效问题也改变了。

课程因此把流程概括为:

  1. 计算当前候选权重的 OBS 分数;
  2. 选择分数最小者并置零;
  3. 按逆 Hessian 方向补偿其余权重;
  4. 更新所维护的逆 Hessian 状态;
  5. 继续选择下一权重。

这种顺序化处理比一次性按静态分数剪完更昂贵,但它能把每一步的补偿纳入后续决策。

7. “保留什么、修改什么”的准确答案

OBS 保留:

  • 当前模型在近似驻点,因而忽略一阶项;
  • 局部损失可由二阶 Taylor 项描述,因而忽略三阶以上项。

OBS 修改:

  • 不再要求 Hessian 对角;
  • 不再要求剪掉 wiw_i 时其他权重全部不动;
  • 不再只做一轮静态批量排序,而是逐权重剪枝并补偿。

所以 OBS 不是另起炉灶,而是在相同局部二次框架中解除 OBD 的“权重解耦”限制。

跟练与练习

原视频练习

编者练习

写出 OBS 剪掉 wiw_i 时的约束,并解释为什么 H1eiH^{-1}e_i 通常会让多个权重同时变化。

查看参考答案

约束是 eiTΔw=wie_i^T\Delta w=-w_i,保证新权重的第 ii 项为零。最优变化是 Δwi=wi[H1]iiH1ei\Delta w_i^*=-\frac{w_i}{[H^{-1}]_{ii}}H^{-1}e_iH1eiH^{-1}e_i 是逆 Hessian 的第 ii 列;当 Hessian 非对角时,这一列通常有多个非零元素,所以除了被剪坐标,其他权重也会发生补偿变化。

编者练习 2

为什么 OBS 的分数不能写成 12[H1]iiwi2\frac12[H^{-1}]_{ii}w_i^2

查看参考答案

约束优化的最小代价是 12wi2/[H1]ii\frac12w_i^2/[H^{-1}]_{ii},逆 Hessian 对角元素在分母。可把它理解为有效曲率 1/[H1]ii1/[H^{-1}]_{ii} 乘权重平方。把它误写到分子会颠倒该因子对候选排序的作用,也无法在对角 Hessian 情形下正确退化为 OBD 分数。

常见误区

  • 误区:OBS 放弃了二阶 Taylor 近似。纠正:它仍保留局部二次目标。
  • 误区:OBS 只是不把 Hessian 对角线以外的元素存下来。纠正:它恰恰要利用耦合信息。
  • 误区:OBS 分数是 12[H1]iiwi2\frac12[H^{-1}]_{ii}w_i^2。纠正:[H1]ii[H^{-1}]_{ii} 位于分母。
  • 误区:H1eiH^{-1}e_i 只含第 ii 个非零元素。纠正:一般非对角矩阵的第 ii 列会含多个非零分量。
  • 误区:补偿意味着把被剪权重重新加回来。纠正:约束始终保证该权重的新值为零,补偿发生在可调整方向上。
  • 误区:OBS 与 OBD 都必须一次剪一批。纠正:本课讨论的朴素 OBS 是逐权重更新。
  • 误区:使用更多二阶信息就无条件更好。纠正:曲率估计与求逆近似也会引入误差和成本。

本课小结

  • OBS 保留 OBD 的驻点与局部二次假设,但不再把 Hessian 近似为对角阵。
  • 剪掉 wiw_i 被写成约束 eiTΔw=wie_i^T\Delta w=-w_i,其余权重可协同补偿。
  • OBS 分数为 12wi2/[H1]ii\frac12w_i^2/[H^{-1}]_{ii},最优补偿沿 H1eiH^{-1}e_i
  • 朴素 OBS 逐个剪枝,在每次剪枝后补偿并更新状态。
  • 下一课将证明:当 Hessian 恰好对角时,OBS 的评分和补偿都会退化为 OBD。
05

主题讲解 · 02:29

对角 Hessian 下 OBS 如何完整退化为 OBD

学习目标

  • 能写出 OBD 与 OBS 共享的局部二次损失模型。
  • 能证明对角 Hessian 下 OBS 重要性分数退化为 OBD 分数。
  • 能解释 OBS 补偿公式中的 eie_iH1eiH^{-1}e_i
  • 能证明对角 Hessian 下补偿向量只在被剪坐标留下 wi-w_i
  • 能说明“OBD 是特殊的 OBS”成立的算法与近似边界。

前置与衔接

上一课得到 OBS 的两个核心公式:

SiOBS=12wi2[H1]ii,S_i^{\mathrm{OBS}} =\frac12\frac{w_i^2}{[H^{-1}]_{ii}},
Δwi=wi[H1]iiH1ei.\Delta w_i^* =-\frac{w_i}{[H^{-1}]_{ii}}H^{-1}e_i.

本课要检验的不只是评分公式。

因为朴素 OBS 还会逐权重补偿,所以只有证明“评分退化”和“补偿退化”同时成立,才能说 OBD 是 OBS 的完整特殊情形。

核心讲解

1. 两种方法共享同一个局部二次目标

OBD 与 OBS 都从近似驻点和二阶 Taylor 截断出发:

ΔL12ΔwTHΔw.\Delta L\approx\frac12\Delta w^TH\Delta w.

它们的区别是:

  • OBD 假设 HH 对角;
  • OBS 允许 HH 为一般非对角矩阵。
图 1

OBD 与 OBS 共享局部二阶损失模型,但 OBD 进一步要求 Hessian 为对角阵。

原视频 · 00:00 ↗

因此要从 OBS 得到 OBD,最自然的特殊化就是令

H=diag(h1,h2,,hd),H=\operatorname{diag}(h_1,h_2,\ldots,h_d),

并假设相关 hih_i 非零,使逆矩阵存在。

2. 对角矩阵求逆只需逐元素取倒数

对角 Hessian 的逆仍是对角阵:

H1=diag ⁣(1h1,1h2,,1hd).H^{-1} =\operatorname{diag}\!\left( \frac1{h_1}, \frac1{h_2}, \ldots, \frac1{h_d} \right).

所以第 ii 个对角元素满足

[H1]ii=1Hii.[H^{-1}]_{ii}=\frac1{H_{ii}}.

这个等式是后面两个退化证明共同使用的关键。

3. 第一层退化:OBS 分数变回 OBD 分数

一般 OBS 分数为

SiOBS=12wi2[H1]ii.S_i^{\mathrm{OBS}} =\frac12\frac{w_i^2}{[H^{-1}]_{ii}}.

代入

[H1]ii=1Hii,[H^{-1}]_{ii}=\frac1{H_{ii}},

得到

SiOBS=12wi21/Hii=12Hiiwi2=SiOBD.S_i^{\mathrm{OBS}} =\frac12\frac{w_i^2}{1/H_{ii}} =\frac12H_{ii}w_i^2 =S_i^{\mathrm{OBD}}.
图 2

当 H 对角时,[H^{-1}]_ii=1/H_ii,OBS 评分中的分母取倒数后恢复 H_ii。

原视频 · 00:40 ↗

因此在同一组权重与同一对角 Hessian 下,两种方法给每个候选权重完全相同的局部重要性分数。

它们会选择同一个最小分数候选。

但仅有这一步还不够,因为 OBS 剪完后会补偿其他权重,而经典 OBD 通常按静态分数排序后直接置零。

4. 一般 OBS 补偿会修改整个权重向量

剪掉第 ii 个权重的约束为

eiTΔw=wi.e_i^T\Delta w=-w_i.

满足该约束并最小化二次损失的变化是

Δwi=wi[H1]iiH1ei.\Delta w_i^* =-\frac{w_i}{[H^{-1}]_{ii}}H^{-1}e_i.
图 3

一般 OBS 在置零 w_i 后按 Δw=−w_i/[H^{-1}]_ii·H^{-1}e_i 调整整个权重向量。

原视频 · 01:20 ↗

eie_i 是第 ii 个标准基向量:

ei=(0,,0,1,0,,0)T.e_i=(0,\ldots,0,1,0,\ldots,0)^T.

矩阵乘 H1eiH^{-1}e_i 会抽取 H1H^{-1} 的第 ii 列。

H1H^{-1} 非对角,这一列通常包含多个非零分量,于是补偿会同时修改多个权重。

5. 对角结构让 H⁻¹eᵢ 只剩一个方向

HH 对角时,H1H^{-1} 同样对角。

它的第 ii 列除第 ii 项外全为零,因此

H1ei=1Hiiei.H^{-1}e_i =\frac1{H_{ii}}e_i.
图 4

OBD 的对角 Hessian 使 H^{-1} 也为对角阵,单位向量 e_i 只抽取第 i 个坐标方向。

原视频 · 01:40 ↗

再把它代入补偿公式:

Δwi=wi1/Hii(1Hiiei).\Delta w_i^* =-\frac{w_i}{1/H_{ii}} \left(\frac1{H_{ii}}e_i\right).

分母中的 1/Hii1/H_{ii} 与向量中的 1/Hii1/H_{ii} 相消,得到

Δwi=wiei.\Delta w_i^*=-w_ie_i.

6. 第二层退化:补偿等价于只把被剪权重置零

向量 wiei-w_ie_i 的具体形状是

Δwi=(0,,0,wi,0,,0)T.\Delta w_i^* =(0,\ldots,0,-w_i,0,\ldots,0)^T.

更新后第 ii 个权重变成

wi+(wi)=0,w_i+(-w_i)=0,

其他 jij\ne i 的权重满足

wj+0=wj.w_j+0=w_j.
图 5

代入对角结构后,[H^{-1}]_ii 与第 i 个逆曲率相消,Δw 只在第 i 位留下 −w_i,其余权重不变。

原视频 · 02:00 ↗

也就是说,OBS 虽然形式上执行了“最优补偿”,结果却没有对其余权重做任何补偿。

这正是 OBD 的置零行为。

7. 为什么评分与补偿必须分别证明

若只证明评分相同,只能说明两种方法第一步选中同一个候选。

如果 OBS 随后大幅调整其他权重,下一轮参数与分数就可能不同,算法轨迹不会与 OBD 相同。

现在我们同时得到:

  1. SiOBS=SiOBDS_i^{\mathrm{OBS}}=S_i^{\mathrm{OBD}}
  2. Δwi=wiei\Delta w_i^*=-w_ie_i,其余权重不变。

因此在对角 Hessian 的同一局部二次模型中,OBS 利用耦合补偿的额外自由度完全消失。

OBD 可以看作 OBS 在“权重真正解耦”条件下的特殊情形。

8. 一次性 OBD 与逐次 OBS 的细微边界

课程强调 OBS 一次剪一个权重,而 OBD 常按分数一次剪掉一批。

在理想对角模型下,每次 OBS 补偿都只置零当前坐标,不改动其他权重。

若还把 Hessian 视为固定的局部二次模型,则剩余候选的分数也不因交叉补偿而变化。

此时逐次选择与按同一分数一次排序可得到相同的剪枝集合。

但在真实实现中,下列因素会破坏严格等价:

  • Hessian 只是估计或近似对角;
  • 剪枝后重新估计曲率,导致下一轮分数变化;
  • 存在阻尼、数值截断或不可逆方向;
  • 一次剪很多权重使局部二次近似失真;
  • 并列分数采用不同 tie-breaking。

所以“OBD 是特殊的 OBS”是模型假设下的结构关系,不是对所有工程实现逐指令相同的声明。

9. 与上一课的关系图

上一课说 OBS 相对 OBD 放松了 Hessian 对角假设。

本课从反方向验证:一旦重新施加这个假设,OBS 的两个新增能力都会消失。

  • 完整逆 Hessian 评分退化为单坐标曲率评分;
  • 跨权重补偿退化为只在被剪坐标上的置零。

因此 OBD 与 OBS 不是互不相干的两套公式,而是同一个约束二次优化在不同 Hessian 结构假设下的两个层次。

跟练与练习

原视频练习

编者练习

给定 H=[2005],w=[0.30.4].H=\begin{bmatrix}2&0\\0&5\end{bmatrix}, \qquad w=\begin{bmatrix}0.3\\0.4\end{bmatrix}. 若剪掉 w1w_1,计算 OBS 分数与补偿向量。

查看参考答案

H1=diag(1/2,1/5)H^{-1}=\operatorname{diag}(1/2,1/5),所以 [H1]11=1/2[H^{-1}]_{11}=1/2。OBS 分数为 12×0.32/(1/2)=0.09\frac12\times0.3^2/(1/2)=0.09,与 OBD 的 12×2×0.32=0.09\frac12\times2\times0.3^2=0.09 相同。补偿为 0.3/(1/2)×(1/2,0)T=(0.3,0)T-0.3/(1/2)\times(1/2,0)^T=(-0.3,0)^T,只把第一个权重置零。

编者练习 2

H1H^{-1} 的第 ii 列有三个非零元素,能否仍说剪掉 wiw_i 时“不需要补偿其他权重”?

查看参考答案

一般不能。补偿方向正比于 H1eiH^{-1}e_i,也就是第 ii 列。只要这一列在其他坐标上非零,最优 Δw\Delta w 就会修改那些权重。只有对角或具有足够特殊稀疏结构、使该列除第 ii 项外为零时,补偿才退化为单纯置零。

常见误区

  • 误区:OBD 与 OBS 的分数本来就一样。纠正:只有 HH 对角时 1/[H1]ii=Hii1/[H^{-1}]_{ii}=H_{ii}
  • 误区:矩阵求逆就是把所有元素逐个取倒数。纠正:逐元素倒数只适用于这里的非零对角矩阵。
  • 误区:eie_i 是全一向量。纠正:它只有第 ii 项为 1。
  • 误区:H1eiH^{-1}e_i 取出第 ii 行。纠正:右乘列向量取出第 ii 列。
  • 误区:补偿退化为零向量。纠正:第 ii 项仍为 wi-w_i,只是其余项为零。
  • 误区:评分相同就足以证明两种算法完全相同。纠正:还必须检查权重更新与后续状态。
  • 误区:理论特殊情形保证任何近似实现位级一致。纠正:阻尼、更新策略与数值误差都可能造成差异。

本课小结

  • 对角 Hessian 的逆仍对角,并满足 [H1]ii=1/Hii[H^{-1}]_{ii}=1/H_{ii}
  • 代入 OBS 分数后得到 12Hiiwi2\frac12H_{ii}w_i^2,与 OBD 完全一致。
  • 对角结构使 H1ei=(1/Hii)eiH^{-1}e_i=(1/H_{ii})e_i,补偿最终化为 wiei-w_ie_i
  • 因而 OBS 在评分和补偿两个层面都退化为 OBD。
  • 这一关系依赖局部二次、可逆对角 Hessian 与一致更新等假设;真实近似实现仍需单独验证。
06

主题讲解 · 03:36

OBS 如何用约束二次优化选择被剪权重

学习目标

  • 能把“将第 ii 个权重置零”写成关于 DeltawDelta w 的线性约束。
  • 能从局部二阶损失模型建立 OBS 的约束优化问题。
  • 能用拉格朗日乘子推导最优补偿向量。
  • 能解释 H1eiH^{-1}e_i 为何编码了其他权重对第 ii 个权重的补偿。
  • 能推导 OBS 重要性分数,并说明算法为何优先剪最小分数。

前置与衔接

前两课已经说明:OBS 相比 OBD 保留 Hessian 的非对角项,并在剪掉一个权重后补偿其他权重。

但“补偿”不是一条经验规则。

它来自一个明确的问题:在第 ii 个权重必须变成零的前提下,怎样调整整个权重向量,才能让局部损失增加最少?

本课把这个问题完整解出。

核心讲解

1. 从局部二阶损失出发

设当前权重为 ww,施加变化后为 w+Δww+\Delta w

在当前点附近,若一阶梯度近似为零并忽略三阶以上项,则损失增量近似为

ΔL12ΔwTHΔw,\Delta L\approx\frac12\Delta w^TH\Delta w,

其中 HH 是损失关于权重的 Hessian。

图 1

OBS 把置零第 i 个权重写成带等式约束的二次优化,并允许其余权重共同补偿。

原视频 · 00:00 ↗

这个二次型同时考虑:

  • 每个坐标方向自身的曲率;
  • 不同权重变化之间的耦合;
  • 多个权重共同变化时的总损失代价。

OBS 要做的不是单独计算“把 wiw_i 改成零”的代价,而是允许所有坐标一起变化,再寻找代价最小的可行变化。

2. 目标函数为何是二次型

对固定候选 ii,OBS 的优化目标是

minΔw12ΔwTHΔw.\min_{\Delta w}\quad \frac12\Delta w^TH\Delta w.
图 2

局部二阶模型以 1/2·ΔwᵀHΔw 衡量剪枝扰动导致的损失增量。

原视频 · 00:40 ↗

HH 为正定矩阵,这个目标是严格凸二次函数,约束下的解唯一。

若 Hessian 仅半正定或数值上接近奇异,工程实现通常需要阻尼或稳定化处理;本课推导先采用 H1H^{-1} 存在的理想条件。

3. 把“置零一个权重”写成等式约束

剪掉第 ii 个权重意味着

wi+Δwi=0.w_i+\Delta w_i=0.

因此

Δwi=wi.\Delta w_i=-w_i.

eie_i 为第 ii 个标准基向量,则

eiTΔw=Δwi.e_i^T\Delta w=\Delta w_i.

约束可以统一写成

g(Δw)=eiTΔw+wi=0.g(\Delta w)=e_i^T\Delta w+w_i=0.
图 3

把 w_i 置零等价于要求 Δw_i=−w_i,也可写成 e_iᵀΔw+w_i=0。

原视频 · 01:20 ↗

这里的 eie_i 不是新参数,它只负责从向量中抽取第 ii 个坐标。

至此,OBS 的单权重剪枝问题成为

minΔw12ΔwTHΔw,s.t.eiTΔw+wi=0.\begin{aligned} \min_{\Delta w}\quad &\frac12\Delta w^TH\Delta w,\\ \text{s.t.}\quad &e_i^T\Delta w+w_i=0. \end{aligned}

4. 拉格朗日函数把约束并入目标

引入标量拉格朗日乘子 λ\lambda

L(Δw,λ)=12ΔwTHΔw+λ(eiTΔw+wi).\mathcal L(\Delta w,\lambda) =\frac12\Delta w^TH\Delta w +\lambda(e_i^T\Delta w+w_i).

Δw\Delta w 求梯度并令其为零:

ΔwL=HΔw+λei=0.\nabla_{\Delta w}\mathcal L =H\Delta w+\lambda e_i=0.
图 4

对拉格朗日函数关于 Δw 求梯度,驻点条件为 HΔw+λe_i=0。

原视频 · 02:00 ↗

于是

Δw=λH1ei.\Delta w=-\lambda H^{-1}e_i.

这个式子先确定了方向:最优变化沿 H1H^{-1} 的第 ii 列。

因为

H1eiH^{-1}e_i

正好抽取 H1H^{-1} 的第 ii 列。

若该列在多个坐标上非零,置零 wiw_i 时就应同时调整那些坐标。

5. 用置零约束解出 λ

Δw=λH1ei\Delta w=-\lambda H^{-1}e_i

代回约束:

eiT(λH1ei)+wi=0.e_i^T(-\lambda H^{-1}e_i)+w_i=0.

注意

eiTH1ei=[H1]ii.e_i^TH^{-1}e_i=[H^{-1}]_{ii}.

所以

λ[H1]ii+wi=0,-\lambda[H^{-1}]_{ii}+w_i=0,

进而

λ=wi[H1]ii.\lambda=\frac{w_i}{[H^{-1}]_{ii}}.

最优补偿向量为

Δwi=wi[H1]iiH1ei.\Delta w_i^* =-\frac{w_i}{[H^{-1}]_{ii}}H^{-1}e_i.
图 5

由约束解出 λ=w_i/[H⁻¹]_ii,最优补偿沿 H⁻¹e_i 方向调整整个权重向量。

原视频 · 02:40 ↗

ii 个分量确实等于 wi-w_i

[Δwi]i=wi[H1]ii[H1]ii=wi.[\Delta w_i^*]_i =-\frac{w_i}{[H^{-1}]_{ii}}[H^{-1}]_{ii} =-w_i.

因此这个解既满足置零要求,也利用其余坐标降低二次损失。

6. 把最优补偿代回目标

Δwi=λH1ei\Delta w_i^*=-\lambda H^{-1}e_i

代入二次目标:

ΔLi=12(Δwi)THΔwi=12λ2eiTH1ei=12λ2[H1]ii.\begin{aligned} \Delta L_i^* &=\frac12(\Delta w_i^*)^TH\Delta w_i^*\\ &=\frac12\lambda^2e_i^TH^{-1}e_i\\ &=\frac12\lambda^2[H^{-1}]_{ii}. \end{aligned}

再代入

λ=wi[H1]ii,\lambda=\frac{w_i}{[H^{-1}]_{ii}},

得到

ΔLi=12wi2[H1]ii.\boxed{ \Delta L_i^* =\frac12\frac{w_i^2}{[H^{-1}]_{ii}} }.
图 6

把最优补偿代回二次目标,最小损失增量为 1/2·w_i²/[H⁻¹]_ii。

原视频 · 03:20 ↗

这就是朴素 OBS 的重要性分数。

分数越小,表示“强制把该权重置零并最优补偿其余权重”造成的局部损失上升越小。

因此每轮选择最小分数候选,而不是最大分数候选。

7. 分子与分母分别表达什么

分子 wi2w_i^2 表示到零的坐标距离。

在其他条件相同时,权重绝对值越小,置零位移通常越小。

分母 [H1]ii[H^{-1}]_{ii} 则反映在完整耦合曲率下,第 ii 个坐标可被整个参数系统吸收和补偿的程度。

不能把分母简单理解为 1/Hii1/H_{ii},除非 HH 真的是对角矩阵。

这正是 OBS 与 OBD 的区别。

8. 推导边界

该公式依赖局部二次近似、近似驻点和可逆 Hessian。

它没有保证一次剪掉大量权重后仍精确,也没有说明真实网络的全局任务损失一定按该二次式变化。

实际算法还要处理:

  • Hessian 或曲率代理的估计误差;
  • 阻尼与数值稳定性;
  • 逐次剪枝后的逆矩阵更新;
  • 大规模参数下不能显式存储完整 Hessian 的成本。

本课公式的价值是把“选择谁、怎样补偿、预计损失多少”统一成一个可验证的约束优化解。

跟练与练习

原视频练习

编者练习

给定 H1=[2113],w=[0.40.2].H^{-1}= \begin{bmatrix} 2&1\\ 1&3 \end{bmatrix}, \qquad w=\begin{bmatrix}0.4\\-0.2\end{bmatrix}. 若剪掉第一个权重,求最优 Δw\Delta w 与 OBS 分数。

查看参考答案

[H1]11=2[H^{-1}]_{11}=2H1e1=(2,1)TH^{-1}e_1=(2,1)^T。因此
Δw=0.42(2,1)T=(0.4,0.2)T.\Delta w^*=-\frac{0.4}{2}(2,1)^T=(-0.4,-0.2)^T.
第一坐标变化为 0.4-0.4,满足置零约束;第二坐标也被补偿。分数为
120.422=0.04.\frac12\frac{0.4^2}{2}=0.04.

编者练习 2

若两个候选的 wi|w_i| 相同,但 [H1]11=4[H^{-1}]_{11}=4[H1]22=1[H^{-1}]_{22}=1,OBS 会优先剪哪一个?

查看参考答案

优先剪第一个。分子相同,而第一个分母更大,所以其最小损失增量只有第二个的四分之一。这个例子说明 OBS 排序不能只看权重绝对值。

常见误区

  • 把 Hessian 写成海森“向量”HH 是二阶偏导组成的矩阵。
  • eie_i 当成误差项:它是标准基向量,只负责选择第 ii 个坐标。
  • 认为 Δw\Delta w 只含第 ii:一般非对角 HH 下,最优补偿会改变多个权重。
  • [H1]ii[H^{-1}]_{ii} 写成 1/Hii1/H_{ii}:仅在对角 Hessian 等特殊结构下成立。
  • 选择最大 OBS 分数剪枝:分数表示预计损失增加,应优先选择最小者。
  • 把局部二次近似当成全局精确损失:大扰动或大量剪枝会削弱近似可靠性。

本课小结

  • OBS 把单权重剪枝写成带线性等式约束的二次优化。
  • 拉格朗日驻点给出补偿方向 H1eiH^{-1}e_i
  • 最优补偿为 wiH1ei/[H1]ii-w_iH^{-1}e_i/[H^{-1}]_{ii}
  • 最小损失增量为 12wi2/[H1]ii\frac12w_i^2/[H^{-1}]_{ii},算法优先剪最小分数。
  • 下一课把目标从“置零”推广到“移动到量化值”,由此得到 OBQ。
07

主题讲解 · 02:31

把剪枝看成量化到零:OBS 与 OBQ 的统一关系

学习目标

  • 能区分 OBC 统一压缩框架与 OBQ 量化方法。
  • 能解释“剪枝是量化到零”在操作上的含义。
  • 能并列写出 OBS 与 OBQ 的重要性分数。
  • 能并列写出两者的最优补偿公式。
  • 能通过令 qi=0q_i=0 证明评分与补偿都退化为 OBS。

前置与衔接

上一课得到 OBS 的两个结果:

SiOBS=12wi2[H1]ii,S_i^{\mathrm{OBS}} =\frac12\frac{w_i^2}{[H^{-1}]_{ii}},
ΔwiOBS=wi[H1]iiH1ei.\Delta w_i^{\mathrm{OBS}} =-\frac{w_i}{[H^{-1}]_{ii}}H^{-1}e_i.

它们都围绕同一个硬约束:把 wiw_i 从当前值移动到 00

本课只改变目标值:不一定移动到零,也可以移动到某个可表示的量化值 qiq_i

核心讲解

1. OBC 与 OBQ 不是同一个缩写

课程板书提到 OBC 论文中的统一视角。

这里应区分:

  • OBC(Optimal Brain Compression):把二阶剪枝与量化放进同一压缩框架;
  • OBQ(Optimal Brain Quantization):该视角下的逐权重量化方法。

两者关系密切,但讨论具体的量化评分与补偿公式时,应使用 OBQ。

图 1

OBS 与 OBQ 都逐次处理一个权重、补偿其余权重并维护逆 Hessian;差别在于目标值是 0 还是量化值 q_i。

原视频 · 00:00 ↗

OBS 与 OBQ 的共同流程是:

  1. 选择一个当前最适合处理的权重;
  2. 把它固定到目标值;
  3. 调整其余权重以补偿输出或损失变化;
  4. 维护后续选择所需的曲率信息;
  5. 继续处理下一个权重。

2. 剪枝就是目标值固定为零的量化

一般量化把浮点权重 wiw_i 映射到量化集合中的值 qiq_i

wiqi.w_i\longmapsto q_i.

若定义特殊的映射

quant(wi)=0,\operatorname{quant}(w_i)=0,

那么所有被处理权重的目标值都是零。

这在参数值层面就是剪枝。

图 2

若把量化映射固定为 quant(w)=0,量化动作就退化为把权重剪成零。

原视频 · 00:20 ↗

“剪枝是特殊量化”不是说两种工程实现的稀疏存储、内核或加速方式相同。

它指的是二阶约束优化中的目标值关系。

3. OBQ 的约束只比 OBS 多一个 qᵢ

沿用“新权重等于旧权重加变化量”的记号:

wnew=w+Δw.w^{\mathrm{new}}=w+\Delta w.

把第 ii 个权重量化到 qiq_i,约束为

wi+Δwi=qi.w_i+\Delta w_i=q_i.

也就是

eiTΔw+wiqi=0.e_i^T\Delta w+w_i-q_i=0.

与 OBS 相比,只是把原来的 wiw_i 换成了 wiqiw_i-q_i

对应的约束二次优化为

minΔw12ΔwTHΔw,s.t.eiTΔw+wiqi=0.\begin{aligned} \min_{\Delta w}\quad &\frac12\Delta w^TH\Delta w,\\ \text{s.t.}\quad &e_i^T\Delta w+w_i-q_i=0. \end{aligned}

4. OBQ 重要性分数推广“到零距离”

重复上一课的拉格朗日推导,可得最小目标增量

SiOBQ=12(wiqi)2[H1]ii.S_i^{\mathrm{OBQ}} =\frac12\frac{(w_i-q_i)^2}{[H^{-1}]_{ii}}.
图 3

OBQ 的重要性分数为 1/2·(w_i−q_i)²/[H⁻¹]_ii,它把 OBS 中到零的距离推广为到目标量化值的距离。

原视频 · 01:00 ↗

与 OBS 对比:

SiOBS=12wi2[H1]ii.S_i^{\mathrm{OBS}} =\frac12\frac{w_i^2}{[H^{-1}]_{ii}}.

二者分母完全相同,分子表达不同的目标距离:

  • OBS:wi0w_i-0
  • OBQ:wiqiw_i-q_i

因此重要性不仅由权重本身大小决定,还由它离可选量化值有多远决定。

5. 令 qᵢ=0,评分公式退化为 OBS

qi=0q_i=0 代入:

SiOBQ=12(wi0)2[H1]ii=12wi2[H1]ii=SiOBS.\begin{aligned} S_i^{\mathrm{OBQ}} &=\frac12\frac{(w_i-0)^2}{[H^{-1}]_{ii}}\\ &=\frac12\frac{w_i^2}{[H^{-1}]_{ii}}\\ &=S_i^{\mathrm{OBS}}. \end{aligned}

所以两种方法会给候选权重相同的局部代价。

不过,和“OBD 是特殊 OBS”的证明一样,只比较评分还不够。

还要检验处理该权重后,其他权重怎样补偿。

6. 先固定 Δw 的符号约定

不同资料可能把变化量定义成

Δw=wnewwold\Delta w=w^{\mathrm{new}}-w^{\mathrm{old}}

或相反方向。

符号会随定义变化,但最终新权重和损失增量不应变化。

图 4

板书明确 Δw=w−w₀ 的记号约定;推导时需始终用同一新旧权重方向解释补偿符号。

原视频 · 01:40 ↗

本课统一采用

Δw=wnewwold.\Delta w=w^{\mathrm{new}}-w^{\mathrm{old}}.

于是目标坐标必须满足

Δwi=qiwi=(wiqi).\Delta w_i=q_i-w_i=-(w_i-q_i).

7. OBQ 补偿公式也只是替换目标距离

最优变化向量为

ΔwiOBQ=wiqi[H1]iiH1ei.\Delta w_i^{\mathrm{OBQ}} =-\frac{w_i-q_i}{[H^{-1}]_{ii}}H^{-1}e_i.

其第 ii 个坐标为

[ΔwiOBQ]i=(wiqi)=qiwi,[\Delta w_i^{\mathrm{OBQ}}]_i =-(w_i-q_i)=q_i-w_i,

所以更新后正好得到

wi+[ΔwiOBQ]i=qi.w_i+[\Delta w_i^{\mathrm{OBQ}}]_i=q_i.

其余坐标则沿 H1H^{-1}ii 列补偿。

8. 令 qᵢ=0,补偿公式也退化为 OBS

代入 qi=0q_i=0

ΔwiOBQ=wi0[H1]iiH1ei=wi[H1]iiH1ei=ΔwiOBS.\begin{aligned} \Delta w_i^{\mathrm{OBQ}} &=-\frac{w_i-0}{[H^{-1}]_{ii}}H^{-1}e_i\\ &=-\frac{w_i}{[H^{-1}]_{ii}}H^{-1}e_i\\ &=\Delta w_i^{\mathrm{OBS}}. \end{aligned}
图 5

OBQ 补偿式中的扰动幅度由 w_i−q_i 决定;令 q_i=0 后,评分与补偿同时退化为 OBS。

原视频 · 02:00 ↗

现在两个层面都已吻合:

  1. 候选评分相同;
  2. 处理候选后的完整权重变化相同。

因此在这一二阶逐权重框架内,OBS 确实是 OBQ 在 qi=0q_i=0 时的特殊情形。

9. 统一视角能帮助什么

把剪枝和量化放在同一视角,可以把核心问题统一为:

剪枝的目标集合通常只含零;量化的目标集合含若干离散值。

这也解释了为什么两种方法会共享逆 Hessian 分母和补偿方向。

但部署效果仍然不同:

  • 稀疏剪枝需要稀疏格式与稀疏计算支持;
  • 低比特量化需要量化表示、scale/zero-point 与对应内核;
  • 相同的二阶目标关系不等于相同的硬件收益。

跟练与练习

原视频练习

编者练习

wi=0.7w_i=0.7qi=0.5q_i=0.5[H1]ii=2[H^{-1}]_{ii}=2。分别计算 OBQ 分数与把同一权重剪为零的 OBS 分数。

查看参考答案

OBQ 分数为
12(0.70.5)22=0.01.\frac12\frac{(0.7-0.5)^2}{2}=0.01.
OBS 分数为
120.722=0.1225.\frac12\frac{0.7^2}{2}=0.1225.
在相同曲率分母下,移动到邻近量化值的局部代价远小于直接移动到零。

编者练习 2

只证明 SiOBQqi=0=SiOBSS_i^{\mathrm{OBQ}}|_{q_i=0}=S_i^{\mathrm{OBS}},为何还不足以断言两个算法完全退化?

查看参考答案

评分相同只保证当前轮选择候选的标准相同。若处理候选后对其他权重的补偿不同,下一轮的权重状态与评分可能分叉。还必须证明补偿公式在 qi=0q_i=0 时也等于 OBS 补偿。

常见误区

  • 把 OBC 和 OBQ 混用:OBC 是统一压缩框架,OBQ 是其中的量化方法。
  • 认为剪枝与量化的部署效果相同:这里的特例关系针对优化形式,不针对存储和硬件内核。
  • 忘记量化目标 qiq_i:OBQ 分子是 (wiqi)2(w_i-q_i)^2,不是 wi2w_i^2
  • 只比较评分,不比较补偿:完整退化需要两部分同时成立。
  • 因符号不同判定公式冲突:先检查 Δw\Delta w 定义的是新减旧还是旧减新。
  • 认为 qᵢ 必须是零:一般 OBQ 中它是量化集合选出的目标值,零只是特殊情况。

本课小结

  • OBC 提供统一压缩视角,OBQ 是具体的二阶逐权重量化方法。
  • OBQ 将 OBS 的目标零推广为任意量化值 qiq_i
  • OBQ 分数为 12(wiqi)2/[H1]ii\frac12(w_i-q_i)^2/[H^{-1}]_{ii}
  • OBQ 补偿为 (wiqi)H1ei/[H1]ii-(w_i-q_i)H^{-1}e_i/[H^{-1}]_{ii}
  • qi=0q_i=0 后,评分与补偿都退化为 OBS。
  • 下一课将看到 GPTQ 怎样把层输出重构误差写成类似的二次型。
08

主题讲解 · 03:21

GPTQ 的层重构目标如何变成逐行二次型

学习目标

  • 能写出 GPTQ 使用的层输出重构目标及其矩阵形状。
  • 能用 Frobenius 范数与 trace 恒等式改写目标。
  • 能解释 XXTXX^T 为什么由校准激活决定。
  • 能推导 H=2XXTH=2XX^T 下的二次型形式。
  • 能说明 trace 如何把矩阵目标拆成逐输出行的二次型之和。
  • 能区分该曲率代理与完整任务损失的 Hessian。

前置与衔接

前两课从局部二阶损失模型推导了 OBS 和 OBQ。

GPTQ 看起来从另一个目标出发:量化权重后,尽量保持某一层在校准数据上的输出不变。

本课要证明,这个矩阵重构目标也能改写成与 OBS 相似的二次型形状。

相似的是代数结构,不是说两者优化的原始目标完全相同。

核心讲解

1. 先固定矩阵形状

采用课程板书的右乘约定:

WRm×n,XRn×N.W\in\mathbb R^{m\times n}, \qquad X\in\mathbb R^{n\times N}.

这里:

  • mm 是输出通道数;
  • nn 是输入通道数;
  • NN 是校准样本或 token 位置数;
  • WXRm×NWX\in\mathbb R^{m\times N} 是该线性层的输出。

量化前权重为 WW,量化后权重为 W^\widehat W

定义

ΔW=WW^.\Delta W=W-\widehat W.

因为后续目标会平方,所以把差定义成相反方向也得到同一数值;但一篇推导中必须保持一致。

图 1

GPTQ 的层输出重构误差可借助 Frobenius 范数与 trace 恒等式改写成逐行二次型。

原视频 · 00:00 ↗

2. GPTQ 关注层输出重构误差

课程给出的目标是

WXW^XF2.\|WX-\widehat W X\|_F^2.

利用分配律:

WXW^X=(WW^)X=ΔWX.WX-\widehat W X =(W-\widehat W)X =\Delta W X.

所以目标化为

ΔWXF2.\|\Delta W X\|_F^2.
图 2

GPTQ 以 ‖WX−ŴX‖²_F 衡量量化前后该层在校准激活上的输出差异。

原视频 · 01:20 ↗

这不是直接比较 WWW^\widehat W 的元素距离。

同一个权重误差 ΔW\Delta W 作用在不同激活 XX 上,输出误差可能很不一样。

因此 GPTQ 的目标是数据感知的。

3. Frobenius 范数平方等于 trace

对任意矩阵 AA

AF2=i,jAij2=Tr(AAT).\|A\|_F^2 =\sum_{i,j}A_{ij}^2 =\operatorname{Tr}(AA^T).
图 3

恒等式 ‖A‖²_F=Tr(AAᵀ) 把所有矩阵元素的平方和转成 trace。

原视频 · 01:40 ↗

原因是 AATAA^T 的第 ii 个对角元素为

(AAT)ii=jAij2,(AA^T)_{ii}=\sum_jA_{ij}^2,

而 trace 再把所有对角元素相加。

A=ΔWXA=\Delta W X,得到

ΔWXF2=Tr ⁣((ΔWX)(ΔWX)T).\|\Delta W X\|_F^2 =\operatorname{Tr}\!\left((\Delta W X)(\Delta W X)^T\right).

4. 展开转置后出现 activation Gram

根据

(AB)T=BTAT,(AB)^T=B^TA^T,

(ΔWX)T=XTΔWT.(\Delta W X)^T=X^T\Delta W^T.

因此

ΔWXF2=Tr(ΔWXXTΔWT).\begin{aligned} \|\Delta W X\|_F^2 &=\operatorname{Tr}(\Delta W X X^T\Delta W^T). \end{aligned}
图 4

令 ΔW=W−Ŵ 后,‖ΔWX‖²_F=Tr(ΔWXXᵀΔWᵀ),激活通过 XXᵀ进入曲率代理。

原视频 · 02:00 ↗

XXTRn×nXX^T\in\mathbb R^{n\times n} 是输入激活的 Gram 矩阵。

它描述输入维度在校准数据上的二阶相关性:

  • 对角元素是各输入维度的平方能量;
  • 非对角元素反映输入维度之间的相关。

这也是 GPTQ 目标具有“曲率感知”结构的来源。

5. 定义 H=2XXᵀ 恢复 1/2 形式

为了与经典二次型统一,定义

H=2XXT.H=2XX^T.

于是

XXT=12H,XX^T=\frac12H,

目标可以写为

ΔWXF2=Tr ⁣(12ΔWHΔWT).\begin{aligned} \|\Delta W X\|_F^2 &=\operatorname{Tr}\!\left(\frac12\Delta W H\Delta W^T\right). \end{aligned}

这里的 HH 确实是该行级二次重构目标关于权重误差的 Hessian。

但它不是整个网络任务损失关于全部模型参数的精确 Hessian。

更稳妥的表述是:它是由校准激活得到的层重构曲率矩阵或 Hessian 代理。

6. 按输出行拆分 ΔW

ΔW\Delta W 写成行向量堆叠:

ΔW=[Δw1Δw2Δwm],\Delta W= \begin{bmatrix} \Delta w_1\\ \Delta w_2\\ \vdots\\ \Delta w_m \end{bmatrix},

其中每个

ΔwrR1×n.\Delta w_r\in\mathbb R^{1\times n}.

矩阵乘积

ΔWHΔWT\Delta W H\Delta W^T

的第 (r,s)(r,s) 项为

ΔwrHΔwsT.\Delta w_rH\Delta w_s^T.
图 5

把 ΔW 按输出行拆分后,1/2·Tr(ΔWHΔWᵀ) 分解为各行独立的二次型之和。

原视频 · 02:20 ↗

完整矩阵包含不同行之间的交叉项,但 trace 只取对角项。

7. trace 把矩阵目标化成逐行求和

因此

Tr ⁣(12ΔWHΔWT)=12r=1mΔwrHΔwrT.\begin{aligned} \operatorname{Tr}\!\left(\frac12\Delta W H\Delta W^T\right) &=\frac12\sum_{r=1}^{m}\Delta w_rH\Delta w_r^T. \end{aligned}
图 6

trace 只汇总乘积矩阵的对角项,得到 1/2·Σ_r Δw_rHΔw_rᵀ。

原视频 · 02:40 ↗

每一项

12ΔwrHΔwrT\frac12\Delta w_rH\Delta w_r^T

与 OBS 中的向量二次型

12ΔwTHΔw\frac12\Delta w^TH\Delta w

形状相同;差别只是这里采用行向量记号。

于是 GPTQ 可以按输出行处理量化误差,并在每一行内利用相同的曲率矩阵 H=2XXTH=2XX^T

8. “类似 OBS”到底指什么

相似点包括:

  • 目标都是权重变化的二次型;
  • 都由一个曲率矩阵对不同输入方向加权;
  • 非对角项都表达坐标之间的耦合;
  • 固定一个权重后,可以通过调整其他权重补偿误差。

不同点包括:

  • OBS 从局部任务损失近似出发;
  • 本课的 GPTQ 形式从线性层输出重构误差出发;
  • GPTQ 的 HH 由校准激活 XX 直接构造;
  • 矩阵目标因 trace 自然拆成多个输出行。

因此不能把“同形”误写成“同一个目标”。

9. 校准数据为什么重要

若某个输入方向在 XX 中能量很大,沿该方向的权重误差会被更强地惩罚。

若两个输入维度高度相关,XXTXX^T 的非对角项会很大,量化一个坐标时就可能通过另一个坐标补偿。

更换校准样本会改变 XX,也会改变 HH 与量化误差的优先级。

所以 GPTQ 的结果不仅由原始权重决定,也由校准分布决定。

跟练与练习

原视频练习

编者练习

X=[1002],Δw=[ab].X= \begin{bmatrix} 1&0\\ 0&2 \end{bmatrix}, \qquad \Delta w=\begin{bmatrix}a&b\end{bmatrix}. 分别从 ΔwX22\|\Delta wX\|_2^212ΔwHΔwT\frac12\Delta wH\Delta w^T 计算目标,并验证二者相等。

查看参考答案

ΔwX=(a,2b)\Delta wX=(a,2b),所以直接计算得到
ΔwX22=a2+4b2.\|\Delta wX\|_2^2=a^2+4b^2.
另一方面,H=2XXT=diag(2,8)H=2XX^T=\operatorname{diag}(2,8),因此
12ΔwHΔwT=12(2a2+8b2)=a2+4b2.\frac12\Delta wH\Delta w^T =\frac12(2a^2+8b^2) =a^2+4b^2.

编者练习 2

XXTXX^T 有显著非对角元素,这对量化某一个输入维度对应权重后的补偿意味着什么?

查看参考答案

它表示输入维度之间在校准数据上相关。量化一个坐标产生的输出误差可能通过调整相关坐标来部分补偿,因此逐坐标误差不应被视为完全独立。

常见误区

  • 把 GPTQ 误写成其他缩写:本课方法名是 GPTQ。
  • 把 Frobenius 范数当成普通求和:这里使用的是所有元素平方和再开方;目标取其平方。
  • 忘记转置顺序反转(ΔWX)T=XTΔWT(\Delta WX)^T=X^T\Delta W^T
  • 把 H 说成完整任务损失 Hessian:这里 H=2XXTH=2XX^T 来自层输出重构目标。
  • 忽略矩阵朝向:本课采用 WXWX,若代码采用 XWTXW^T,形状与 Gram 矩阵写法要相应调整。
  • 认为 trace 会保留所有行间交叉项:trace 只取最终乘积矩阵的对角元素。
  • 把“类似 OBS”理解成“与 OBS 完全相同”:代数形状相同,不代表原始优化目标和工程流程完全相同。

本课小结

  • GPTQ 以 WXW^XF2\|WX-\widehat WX\|_F^2 衡量量化前后的层输出重构误差。
  • 定义 ΔW=WW^\Delta W=W-\widehat W,目标成为 ΔWXF2\|\Delta WX\|_F^2
  • Frobenius/trace 恒等式将其改写为 Tr(ΔWXXTΔWT)\operatorname{Tr}(\Delta WXX^T\Delta W^T)
  • 定义 H=2XXTH=2XX^T 后,目标成为 12Tr(ΔWHΔWT)\frac12\operatorname{Tr}(\Delta WH\Delta W^T)
  • trace 最终把它拆成 12rΔwrHΔwrT\frac12\sum_r\Delta w_rH\Delta w_r^T
  • 下一课将把 magnitude pruning、OBD、OBS 与 OBQ 的重要性分数放入同一条特例链。
09

主题讲解 · 01:45

从 OBQ 到权重大小剪枝的特例链

学习目标

  • 能统一解释四种方法中“重要性分数”的含义。
  • 能写出 magnitude pruning、OBD、OBS 与 OBQ 的评分公式。
  • 能说明 qi=0q_i=0 如何让 OBQ 退化为 OBS。
  • 能说明对角 Hessian 如何让 OBS 退化为 OBD。
  • 能说明各向同性 Hessian 如何让 OBD 排序退化为按权重绝对值排序。
  • 能区分“评分排序等价”和“完整工程实现等价”。

前置与衔接

此前各课依次得到:

SiOBD=12Hiiwi2,S_i^{\mathrm{OBD}}=\frac12H_{ii}w_i^2,
SiOBS=12wi2[H1]ii,S_i^{\mathrm{OBS}}=\frac12\frac{w_i^2}{[H^{-1}]_{ii}},
SiOBQ=12(wiqi)2[H1]ii.S_i^{\mathrm{OBQ}}=\frac12\frac{(w_i-q_i)^2}{[H^{-1}]_{ii}}.

本课把这些公式与最简单的 magnitude pruning 放在同一条假设链上。

核心讲解

1. 先统一“重要性”的方向

这里的分数表示:强制改变第 ii 个权重后,局部目标预计最少增加多少。

因此:

  • 分数越大,改变该权重的代价越高,权重越重要;
  • 分数越小,越适合作为下一处理或剪枝候选。
图 1

magnitude pruning、OBD、OBS 与 OBQ 形成逐步增加结构假设的特例链。

原视频 · 00:00 ↗

“选最小分数剪”与“分数越大越重要”是同一件事的两个说法,不能把方向倒过来。

图 2

重要性分数表示移动或置零某个权重预计造成的目标增量;分数越大,越不应优先修改。

原视频 · 00:20 ↗

2. 最一般的一端:OBQ

在这四个公式中,OBQ 允许第 ii 个权重移动到一般量化值 qiq_i

SiOBQ=12(wiqi)2[H1]ii.S_i^{\mathrm{OBQ}} =\frac12\frac{(w_i-q_i)^2}{[H^{-1}]_{ii}}.

它同时考虑:

  • 当前权重到目标量化值的距离;
  • 完整曲率耦合下其他权重的补偿能力。

在比较候选时,qiq_i 也可能随候选权重而不同,例如取其邻近量化格点。

3. 第一层特例:量化目标固定为零

qi=0,q_i=0,

SiOBQ=12(wi0)2[H1]ii=12wi2[H1]ii=SiOBS.\begin{aligned} S_i^{\mathrm{OBQ}} &=\frac12\frac{(w_i-0)^2}{[H^{-1}]_{ii}}\\ &=\frac12\frac{w_i^2}{[H^{-1}]_{ii}}\\ &=S_i^{\mathrm{OBS}}. \end{aligned}
图 3

在 OBQ 分数中令目标量化值 q_i=0,即得到 OBS 的置零权重评分。

原视频 · 00:40 ↗

这一步施加的是目标值假设:从一般离散量化值缩小到零。

它没有对 Hessian 的结构做任何简化。

4. 第二层特例:Hessian 为对角阵

OBS 分数为

SiOBS=12wi2[H1]ii.S_i^{\mathrm{OBS}} =\frac12\frac{w_i^2}{[H^{-1}]_{ii}}.

H=diag(h1,,hd),H=\operatorname{diag}(h_1,\ldots,h_d),

[H1]ii=1Hii.[H^{-1}]_{ii}=\frac1{H_{ii}}.

代入得到

SiOBS=12wi21/Hii=12Hiiwi2=SiOBD.\begin{aligned} S_i^{\mathrm{OBS}} &=\frac12\frac{w_i^2}{1/H_{ii}}\\ &=\frac12H_{ii}w_i^2\\ &=S_i^{\mathrm{OBD}}. \end{aligned}

这一步施加的是解耦假设:不同权重方向之间没有二阶交叉项。

上一课还证明,在这个条件下 OBS 的跨权重补偿也退化为只把目标坐标置零。

5. 第三层特例:所有方向曲率相同

OBD 分数仍会按每个坐标的曲率 HiiH_{ii} 加权:

SiOBD=12Hiiwi2.S_i^{\mathrm{OBD}} =\frac12H_{ii}w_i^2.

若进一步假设

H=λI,λ>0,H=\lambda I, \qquad \lambda>0,

则所有候选都有相同曲率:

Hii=λ.H_{ii}=\lambda.

于是

SiOBD=λ2wi2.S_i^{\mathrm{OBD}} =\frac\lambda2w_i^2.

共同正因子 λ/2\lambda/2 不影响排序,所以

arg miniSiOBD=arg miniwi2=arg miniwi.\operatorname*{arg\,min}_i S_i^{\mathrm{OBD}} =\operatorname*{arg\,min}_i w_i^2 =\operatorname*{arg\,min}_i|w_i|.

这正是 magnitude pruning 的排序规则。

图 4

H 为对角阵时 OBS 退化为 OBD;进一步令各方向曲率相同,排序只由 |w_i| 决定。

原视频 · 01:00 ↗

这里施加的是比“对角”更强的各向同性假设:所有坐标方向曲率完全相同。

6. 四种方法的评分对照

方法重要性分数或排序量额外假设
OBQ12(wiqi)2/[H1]ii\frac12(w_i-q_i)^2/[H^{-1}]_{ii}一般目标量化值 qiq_i
OBS12wi2/[H1]ii\frac12w_i^2/[H^{-1}]_{ii}qi=0q_i=0
OBD12Hiiwi2\frac12H_{ii}w_i^2再假设 HH 对角
magnitude pruningwi|w_i|再假设 H=λIH=\lambda I,只保留排序

这张表应从上往下读作“不断增加约束和结构假设”。

越往下,计算越简单,但忽略的信息也越多。

7. 对角不等于各向同性

这是最容易漏掉的一步。

H=diag(1,100),H=\operatorname{diag}(1,100),

它确实是对角阵,但两个方向曲率差异很大。

此时 OBD 分数仍会强烈区分方向,不能只按 wi|w_i| 排序。

只有所有 HiiH_{ii} 都相同,曲率因子才是对所有候选相同的常数。

所以:

各向同性对角,\text{各向同性}\Longrightarrow\text{对角},

但反向一般不成立。

8. 特例关系不自动覆盖所有实现细节

本课主要比较重要性评分的代数退化。

若要断言完整算法轨迹相同,还需核对:

  • 是逐个处理还是一次处理整组权重;
  • 处理后是否更新 Hessian 或逆 Hessian;
  • 是否执行跨权重误差补偿;
  • 阈值并列时如何 tie-breaking;
  • 稀疏或低比特结果怎样存储与执行。

例如,magnitude pruning 与 OBD 在 H=λIH=\lambda I 下给出相同排序,但一个实现可能全局剪枝,另一个可能逐层设定稀疏度。

排序等价不保证最终稀疏模式和部署速度都相同。

9. 这条链的直觉

OBQ 问:把权重移动到哪个离散目标最便宜?

OBS 固定回答:目标就是零。

OBD 再假设:每个权重方向互不耦合,只需看自己的曲率。

magnitude pruning 最后再假设:所有方向曲率都一样,于是只剩“离零有多远”。

每一步都不是凭空换公式,而是在上一层目标上加入一个明确假设。

跟练与练习

原视频练习

编者练习

给定两个权重 w1=0.2,w2=0.1,w_1=0.2,\qquad w_2=0.1, 以及对角 Hessian H=diag(1,10).H=\operatorname{diag}(1,10). magnitude pruning 与 OBD 会分别优先剪哪个?

查看参考答案

magnitude pruning 只看绝对值,会优先剪 w2w_2
OBD 分数为
S1=12×1×0.22=0.02,S_1=\frac12\times1\times0.2^2=0.02,
S2=12×10×0.12=0.05.S_2=\frac12\times10\times0.1^2=0.05.
所以 OBD 反而优先剪 w1w_1。这个反例说明“对角 Hessian”还不足以让 OBD 退化为 magnitude pruning。

编者练习 2

H=3IH=3I,按 OBD 分数和按 wi|w_i| 排序是否会在分数数值上完全相同?

查看参考答案

不会数值相同,但排序相同。OBD 分数是 32wi2\frac32w_i^2,magnitude pruning 使用 wi|w_i|。平方和共同正比例因子都是单调变换,不改变非负绝对值的排序。

常见误区

  • 把重要性方向写反:分数越小越适合优先剪,越大表示预计损失越高。
  • 认为 OBS 到 OBD 只需 H 可逆:关键条件是 HH 对角,而不只是可逆。
  • 认为对角矩阵必为 λI:对角元素可以彼此不同,各向同性是更强假设。
  • 说 magnitude pruning 分数等于 OBD 分数:在 H=λIH=\lambda I 下通常是排序等价,不是数值相等。
  • 忘记 OBQ 的目标值:只有令 qi=0q_i=0 才能退化为 OBS。
  • 把评分特例当成部署等价:稀疏格式、量化格式和硬件执行仍有本质差异。

本课小结

  • 四种方法都在评估改变某个权重的局部代价,分数越小越适合优先处理。
  • qi=0q_i=0 时,OBQ 评分退化为 OBS。
  • HH 对角时,OBS 评分退化为 OBD。
  • H=λIH=\lambda I 时,OBD 排序退化为按 wi|w_i| 排序。
  • 这条链展示了计算简化来自哪些额外假设,也提醒我们辨别假设是否真实成立。
  • 下一课转向固定掩码微调:剪枝完成后,怎样防止零权重重新生长。
10

主题讲解 · 03:16

固定剪枝掩码:微调时如何阻止零权重复活

学习目标

  • 能把目标稀疏度换算成需要剪掉的权重数量。
  • 能用绝对值顺序统计量建立固定二值 mask。
  • 能解释普通微调为何会让已置零权重重新变成非零。
  • 能写出屏蔽梯度与更新后重新施加 mask 的两种形式。
  • 能证明两种形式在理想 SGD 条件下的代数等价。
  • 能识别 momentum、weight decay 与优化器状态带来的工程边界。

前置与衔接

前几课关注“剪谁”和“怎样补偿”:magnitude pruning、OBD、OBS、OBQ 都会给出权重的重要性或扰动代价。

剪枝完成后,常常还要微调模型来恢复精度。

如果目标是保持固定的稀疏模式,那么微调不能让已剪位置重新生长。

本课用一个固定二值 mask 把“剪枝一次”变成“整个微调期间持续满足的约束”。

核心讲解

1. 固定掩码流程总览

设权重张量为 WW,目标稀疏度为 ss

固定支持集剪枝通常包含:

  1. 计算重要性,本课示例使用 W|W|
  2. 按目标稀疏度确定要剪的元素;
  3. 生成二值 mask MM
  4. 得到 WMW\odot M
  5. 微调每次更新后继续施加同一个 MM
图 1

固定支持集剪枝先生成二值 mask,再在微调更新中持续施加该 mask,防止已剪权重重新生长。

原视频 · 00:00 ↗

这里的“固定”表示 mask 的零位置不改变。

若允许零位置重新生长,那属于动态稀疏训练或 regrowth 设计,是另一类方法。

2. 从目标稀疏度得到剪枝数量

课程使用 3×33\times3、共九个权重的示例。

若目标稀疏度为

s=13,s=\frac13,

则应剪元素数为

k=9×13=3.k=9\times\frac13=3.
图 2

九个权重、目标稀疏度 1/3 时,需要按绝对值剪掉三个最小权重。

原视频 · 00:20 ↗

NsNs 不是整数,实现需要明确取整规则,并保证最终非零数量与接口定义一致。

“稀疏度”通常指零元素占比,不要和保留率混淆。

3. 剪的是绝对值最小,而不是第三大

magnitude pruning 按

wi|w_i|

从小到大选择。

要剪三个权重,就应找到第三小的绝对值作为边界,而不是第三大。

课程例子中的绝对值依次为

0.1,0.2,0.3,,0.9,0.1,0.2,0.3,\ldots,0.9,

所以阈值边界是

ε=0.3.\varepsilon=0.3.
图 3

阈值 ε 应取绝对值顺序统计量;实现中可用 top-k 或 kth-value 类方法避免完整排序。

原视频 · 00:40 ↗

在大张量中不一定要完整排序。

top-k、kth-value 或选择算法可以更直接地找到边界。

若边界处存在并列值,仅靠 W>ε|W|>\varepsilon 可能无法保证恰好剪 kk 个;此时需要确定性的 tie-breaking 或直接按索引集合生成 mask。

4. 二值 mask 表达固定支持集

在无并列且要把边界一起剪掉的示例中,可定义

M=1(W>ε),M=\mathbf 1(|W|>\varepsilon),

其中 MMWW 形状相同,元素只取 0011

剪枝结果为

Wpruned=WM.W_{\mathrm{pruned}}=W\odot M.

\odot 表示逐元素乘法。

图 4

二值 mask 保留阈值以上元素;普通微调会让零位置复活,因此每次更新后需重新施加固定 mask。

原视频 · 01:00 ↗

Mij=0M_{ij}=0 的位置属于已剪支持集;Mij=1M_{ij}=1 的位置仍可训练。

mask 本身应被持久保存,不能在每一步根据已经变化的权重重新计算,否则支持集会改变。

5. 为什么普通微调会让零权重复活

普通 SGD 更新为

Wnew=WoldαWL.W_{\mathrm{new}} =W_{\mathrm{old}}-\alpha\nabla_W L.

即使某位置当前满足

[Wold]ij=0,[W_{\mathrm{old}}]_{ij}=0,

其梯度也未必为零。

[WL]ij0,[\nabla_W L]_{ij}\ne0,

更新后该位置立即变成非零。

所以“参数现在为零”不等于“它以后自动保持为零”。

6. 写法一:屏蔽已剪位置的更新

一种概念写法是先屏蔽梯度:

Wnew=Woldα(WLM).W_{\mathrm{new}} =W_{\mathrm{old}} -\alpha(\nabla_WL\odot M).
图 5

更新式 W_new=W_old−α(∇W⊙M) 把已剪位置的当前梯度置零,但固定稀疏实现仍需考虑优化器状态。

原视频 · 03:00 ↗

Mij=0M_{ij}=0 时,当前梯度更新项被置零。

WoldW_{\mathrm{old}} 的该位置已经为零,理想的无状态 SGD 会继续保持零。

7. 写法二:优化器更新后重新施加 mask

更直接的参数约束写法是

Wnew=(WoldαWL)M.W_{\mathrm{new}} =\left(W_{\mathrm{old}}-\alpha\nabla_WL\right)\odot M.

它先执行一次普通更新,再把所有已剪位置投影回零。

图 6

若旧权重已满足 W_old=W_old⊙M,则屏蔽梯度更新与先更新再乘 mask 在代数上等价。

原视频 · 02:20 ↗

若旧权重已经满足

Wold=WoldM,W_{\mathrm{old}}=W_{\mathrm{old}}\odot M,

则由分配律:

(WoldαWL)M=WoldMα(WLM)=Woldα(WLM).\begin{aligned} (W_{\mathrm{old}}-\alpha\nabla_WL)\odot M &=W_{\mathrm{old}}\odot M -\alpha(\nabla_WL\odot M)\\ &=W_{\mathrm{old}} -\alpha(\nabla_WL\odot M). \end{aligned}

所以在这个前提下,两种公式给出相同的新权重。

8. 为什么工程上更常强调 step 后重掩码

真实优化器不一定是无状态 SGD。

即使把当前 raw gradient 的已剪位置清零,参数仍可能因以下机制或更新路径而需要额外核对:

  • momentum 缓冲区保留过去的非零速度;
  • Adam 的一阶、二阶矩状态仍非零;
  • decoupled weight decay 绕过 raw-gradient mask 直接作用于参数;它单独作用于精确零时仍保持零,但不能被“梯度已屏蔽”这个检查覆盖;
  • 优化器或训练框架在 hook 之外执行额外更新。

因此固定支持集实现通常在

``python optimizer.step() ``

之后,在无梯度上下文中重新执行

``python weight.mul_(mask) ``

这样至少能保证参数在每次 step 后回到固定稀疏集合。

若要保持严格固定支持,还应考虑将已剪位置对应的 momentum/Adam 状态同步清零,避免状态持续积累或在 mask 解除时突然释放。

9. 一个稳健的训练循环

概念性伪代码如下:

```python mask = build_fixed_mask(weight, target_sparsity)

with torch.no_grad(): weight.mul_(mask)

for batch in loader: optimizer.zero_grad() loss = forward_and_loss(batch) loss.backward() optimizer.step()

with torch.no_grad(): weight.mul_(mask) mask_optimizer_state(optimizer, weight, mask) ```

最后一行是否需要、如何实现,取决于优化器类型与训练框架。

它是工程补充,不改变课程中两种权重更新公式的代数关系。

10. 不要每步重新按大小生成 mask

若每步都重新计算

Mt=1(Wt>εt),M_t=\mathbf1(|W_t|>\varepsilon_t),

那么某些旧零位置可能恢复,某些旧保留位置可能被新剪。

这不再是固定掩码微调,而是动态更新稀疏拓扑。

两种策略都可能有研究价值,但训练语义不同:

  • 固定 mask:恢复精度,同时保持既定稀疏结构;
  • 动态 mask:允许连接交换或重新生长,以探索新的稀疏结构。

本课讨论前者。

11. 阈值、mask 与稀疏内核是三层问题

阈值负责决定剪谁。

mask 负责在训练中维持零位置。

真正获得推理加速还需要硬件与内核支持相应稀疏模式。

一个权重张量中有很多零,不代表通用 dense GEMM 会自动变快。

因此应分别验证:

  1. 数值稀疏度是否正确;
  2. 微调期间 mask 是否保持;
  3. 导出格式是否保留稀疏结构;
  4. 目标运行时是否有匹配的稀疏算子。

跟练与练习

原视频练习

编者练习

Wold=(0,2,1),M=(0,1,1),WL=(3,4,5),α=0.1.W_{\mathrm{old}}=(0,2,-1), \quad M=(0,1,1), \quad \nabla_WL=(3,4,5), \quad \alpha=0.1. 分别用“屏蔽梯度”和“更新后重掩码”计算 WnewW_{\mathrm{new}}

查看参考答案

屏蔽梯度:
WLM=(0,4,5),\nabla_WL\odot M=(0,4,5),
Wnew=(0,2,1)0.1(0,4,5)=(0,1.6,1.5).W_{\mathrm{new}}=(0,2,-1)-0.1(0,4,5)=(0,1.6,-1.5).
更新后重掩码:
(Wold0.1WL)M=(0.3,1.6,1.5)(0,1,1)=(0,1.6,1.5).(W_{\mathrm{old}}-0.1\nabla_WL)\odot M =(-0.3,1.6,-1.5)\odot(0,1,1) =(0,1.6,-1.5).
两者相同,因为旧权重已经满足 Wold=WoldMW_{\mathrm{old}}=W_{\mathrm{old}}\odot M

编者练习 2

若阈值处有四个权重绝对值都等于 0.30.3,但目标只允许再剪其中两个,直接使用 M=1(W>0.3)M=\mathbf1(|W|>0.3) 有什么问题?

查看参考答案

它会把四个等于阈值的权重全部剪掉,超过目标剪枝数量。应使用带确定性 tie-breaking 的 top-k/索引集合,明确选择其中两个,再由选中索引生成固定 mask。

常见误区

  • 把目标稀疏度当保留率:稀疏度 1/31/3 表示三分之一元素为零。
  • 说剪第三大权重:magnitude pruning 为达到稀疏度,应选择绝对值最小的一组。
  • 按带符号值排序:重要性基线用 wi|w_i|,不是直接比较正负数。
  • 认为置零后会天然保持零:普通梯度更新可以立即使它重新非零。
  • 每步重新生成 mask:这会改变支持集,不再是固定剪枝微调。
  • 只清零 raw gradient 就认为万无一失:momentum、Adam 状态可让已剪位置复活;decoupled weight decay 虽不会单独把精确零变成非零,但也绕过梯度屏蔽路径,应统一在 step 后检查 mask。
  • 零很多就等于推理更快:实际加速还依赖稀疏格式、模式与运行时内核。

本课小结

  • 目标稀疏度先转换成剪枝数量,再由绝对值顺序统计量确定候选。
  • 固定二值 mask MM 同时表达剪枝结果和微调期间的支持集约束。
  • 普通微调会让已剪位置复活,因此必须持续施加 mask。
  • Wold=WoldMW_{\mathrm{old}}=W_{\mathrm{old}}\odot M 的理想 SGD 条件下,屏蔽梯度与 step 后重掩码代数等价。
  • 对 momentum、Adam 等有状态更新,step 后重掩码更稳健;严格固定支持时还应处理优化器状态,并检查绕过 raw-gradient hook 的更新路径。
  • 本课完成了固定稀疏微调的基础;本单元还有未整理内容,因此暂不生成单元综合稿。
11

主题讲解 · 02:39

结构化剪掉注意力头后,投影矩阵怎样配套裁剪

学习目标

  • 能写出标准多头注意力中 WQ,WK,WV,WOW_Q,W_K,W_V,W_O 的基准形状。
  • 能区分“减少头数”和“缩小单头维度”。
  • 能在 XWXW 记号下判断 Q/K/V 投影与输出投影应裁剪哪个轴。
  • 能解释拼接后的头输出为何变窄,以及 WOW_O 怎样恢复 dmodeld_{\mathrm{model}}
  • 能把数学矩阵轴映射到 PyTorch nn.Linear 的实际权重存储轴。
  • 能区分注意力头剪枝与 MQA。

前置与衔接

前面的剪枝课程主要把单个权重置零。

注意力头剪枝是一种结构化剪枝:删除的是一整组属于同一 head 的 Q/K/V 通道,以及 WOW_O 中与这组通道配套的输入块。

本课用“四个头剪掉两个头”的例子追踪所有形状。

核心讲解

1. 固定行向量矩阵约定

令序列长度为 TT,输入为

XRT×dmodel.X\in\mathbb R^{T\times d_{\mathrm{model}}}.

采用右乘记号:

Q=XWQ,K=XWK,V=XWV.Q=XW_Q, \quad K=XW_K, \quad V=XW_V.

在标准多头注意力中,若

dmodel=hdkd_{\mathrm{model}}=h\,d_k

dv=dkd_v=d_k,则未剪枝时可写成

WQ,WK,WVRdmodel×dmodel.W_Q,W_K,W_V \in\mathbb R^{d_{\mathrm{model}}\times d_{\mathrm{model}}}.

拼接后的头输出再乘

WORdmodel×dmodel.W_O\in\mathbb R^{d_{\mathrm{model}}\times d_{\mathrm{model}}}.
图 1

四头注意力剪掉两头后,Q、K、V 的总宽度减半,单头宽度保持不变,W_O 再把拼接输出投影回 d_model。

原视频 · 00:00 ↗

2. 剪枝前四个投影都可看作方阵

视频示例设原来有四个头:

h=4,dk=dmodel4.h=4, \qquad d_k=\frac{d_{\mathrm{model}}}{4}.

Q、K、V 的总宽度都是

hdk=dmodel.h\,d_k=d_{\mathrm{model}}.

所以四个头对应四个连续通道块。

图 2

标准多头注意力中,W_Q、W_K、W_V 与 W_O 在未剪枝时都可视为 d_model×d_model 的投影。

原视频 · 00:20 ↗

头剪枝要删除完整块,而不是在每个头内部零散删除若干标量。

3. 剪掉两头不改变 dₖ

保留头数为

h=2.h'=2.

单头维度仍为原来的 dkd_k,所以保留头的总宽度为

dkeep=hdk=2dmodel4=dmodel2.d_{\mathrm{keep}} =h'd_k =2\cdot\frac{d_{\mathrm{model}}}{4} =\frac{d_{\mathrm{model}}}{2}.

这点非常关键:

  • 变的是 head count:424\to2
  • 不变的是 head dimension:dkd_k

若把 dkd_k 也除以二,会重复缩减容量,并且不再是视频中的头剪枝。

4. Q/K/V 投影删除输出列

XWXW 的记号下,WQW_Q 的列对应投影输出通道。

删除两个头对应的列块后:

WQRdmodel×dkeep.W_Q' \in\mathbb R^{d_{\mathrm{model}}\times d_{\mathrm{keep}}}.

同理:

WK,WVRdmodel×dkeep.W_K',W_V' \in\mathbb R^{d_{\mathrm{model}}\times d_{\mathrm{keep}}}.

于是

Q,K,VRT×dkeep.Q',K',V' \in\mathbb R^{T\times d_{\mathrm{keep}}}.

板书用“砍掉右半部分”示意删除两头;若实际保留的不是前两个头,则应按 head index 选择相应通道块,而不是固定裁右半边。

5. W_O 要删除与之配套的输入行

拼接输出进入 WOW_O 之前,特征宽度从 dmodeld_{\mathrm{model}} 变成 dkeepd_{\mathrm{keep}}

因此 WOW_O 的输入轴必须同步裁剪:

WORdkeep×dmodel.W_O' \in\mathbb R^{d_{\mathrm{keep}}\times d_{\mathrm{model}}}.
图 3

在 XW 的行向量约定下,Q/K/V 投影删除被剪头对应的输出列,而 W_O 删除对应的输入行。

原视频 · 00:40 ↗

视频用“保留上半部分”表示保留前两个头对应的行块。

Q/K/V 与 WOW_O 的裁剪轴不同,是因为它们位于 head 计算的两侧:

  • Q/K/V 投影把 dmodeld_{\mathrm{model}} 映射到 head 通道;
  • WOW_O 把 head 通道映射回 dmodeld_{\mathrm{model}}

6. 保留头仍独立计算注意力

Q,K,VQ',K',V' 按头拆成

Qh,Kh,VhRT×dk,h=1,2.Q_h,K_h,V_h \in\mathbb R^{T\times d_k}, \qquad h=1,2.

每个保留头继续独立完成:

Ah=softmax ⁣(QhKhTdk),A_h =\operatorname{softmax}\!\left( \frac{Q_hK_h^T}{\sqrt{d_k}} \right),
Oh=AhVh.O_h=A_hV_h.
图 4

保留下来的每个头仍独立计算 Q_hK_hᵀ、softmax 与 A_hV_h;改变的是头数,不是单头维度。

原视频 · 01:20 ↗

每个 OhO_h 的形状仍是

T×dk.T\times d_k.

因此剪枝没有改变单头内部的 attention matrix 形状 T×TT\times T

它只减少需要计算和保存的头数。

7. 拼接输出先变窄,再由 W_O 恢复

两个头拼接:

O=Concat(O1,O2)RT×dkeep.O'=\operatorname{Concat}(O_1,O_2) \in\mathbb R^{T\times d_{\mathrm{keep}}}.

此时

dkeep=dmodel2.d_{\mathrm{keep}}=\frac{d_{\mathrm{model}}}{2}.

再乘裁剪后的输出投影:

Y=OWO.Y=O'W_O'.

形状为

(T×dkeep)(dkeep×dmodel)=T×dmodel.(T\times d_{\mathrm{keep}}) (d_{\mathrm{keep}}\times d_{\mathrm{model}}) =T\times d_{\mathrm{model}}.
图 5

两个剩余头拼接得到宽度 d_model/2 的 O′,再乘裁剪后的 W_O∈R^{d_model/2×d_model} 恢复模型宽度。

原视频 · 01:40 ↗

因此该 attention block 的外部接口仍是 dmodeld_{\mathrm{model}}

残差连接和下一层都不需要随头数缩窄。

8. 参数量怎样变化

忽略 bias,原四个投影共含

4dmodel24d_{\mathrm{model}}^2

个参数。

保留一半头后:

  • 三个输入投影各有 dmodeldkeepd_{\mathrm{model}}d_{\mathrm{keep}}
  • 输出投影有 dkeepdmodeld_{\mathrm{keep}}d_{\mathrm{model}}

合计

4dmodeldkeep=2dmodel2.4d_{\mathrm{model}}d_{\mathrm{keep}} =2d_{\mathrm{model}}^2.

在这个理想例子中,注意力投影参数量减半。

端到端速度还会受 kernel、batch、序列长度和剩余模块影响,不能直接断言整层或整模型也加速两倍。

9. PyTorch 权重存储轴与数学写法相反

nn.Linear(in_features, out_features) 的权重通常存成

[out_features,in_features],[\mathrm{out\_features},\mathrm{in\_features}],

前向内部等价于乘权重转置。

因此在实际张量上:

  • q/k/v projection 常删除权重的
  • output projection 常删除权重的

这与前文 XWXW 数学记号中的“QKV 删列、WOW_O 删行”并不矛盾,只是存储转置了。

具体 Hugging Face 模型类、融合 QKV 布局和版本可能不同;实施前必须以当前模块的真实 shape 与 forward 为准,不能机械套轴编号。

10. 注意力头剪枝不是 MQA

注意力头剪枝的示例同步减少选定的 Q、K、V 头:

hQ=hK=hV=2.h_Q=h_K=h_V=2.

MQA(Multi-Query Attention)则保留多个 Q 头,但让所有 Q 头共享一组 K、V:

hQ>1,hK=hV=1.h_Q>1, \qquad h_K=h_V=1.
图 6

注意力头剪枝同步减少 Q、K、V 的选定头;MQA 则保留多个 Q 头,只让 K、V 共享单个头。

原视频 · 02:00 ↗

MQA 主要减少 KV projection 与 KV cache,不等同于从已有 MHA 中同步删除 Q/K/V 头。

对 GQA、MQA 做结构剪枝时,Q 头与 KV 头的分组约束也与标准 MHA 不同。

跟练与练习

原视频练习

编者练习

dmodel=768,h=12,dk=64.d_{\mathrm{model}}=768, \quad h=12, \quad d_k=64. 剪掉 3 个头后,在 XWXW 记号下写出 WQW_Q'WOW_O' 的形状。

查看参考答案

剩余头数 h=9h'=9,保留总宽度为
dkeep=9×64=576.d_{\mathrm{keep}}=9\times64=576.
因此
WQR768×576,W_Q'\in\mathbb R^{768\times576},
WOR576×768.W_O'\in\mathbb R^{576\times768}.
K、V 投影与 WQW_Q' 同形。

编者练习 2

若 PyTorch 中 q_proj.weight.shape == [768, 768],保留 9 个头后应把哪个轴缩到 576?

查看参考答案

nn.Linear 权重按 [out_features, in_features] 存储。q_proj 要减少输出通道,所以第 0 轴缩到 576,得到 [576, 768]。这与数学记号 WQR768×576W_Q'\in\mathbb R^{768\times576} 互为转置布局。

常见误区

  • 把单头维度也除以二:本例只减少头数,dkd_k 不变。
  • 只裁 Q/K/V,不裁 W_O:拼接宽度变化后,输出投影输入轴必须同步调整。
  • 在所有矩阵上裁同一物理轴:数学 XWXWnn.Linear 存储的轴方向不同。
  • 认为 W_O 把头数重新变回四个:它只恢复外部特征宽度,不重新创建被剪头。
  • 把头剪枝等同于 MQA:MQA 保留多个 Q 头并共享单组 K/V。
  • 认为参数减半就必然端到端加速两倍:还要考虑其他模块和实际 kernel 效率。

本课小结

  • 头剪枝删除完整 Q/K/V 通道块,并同步删除 WOW_O 中对应输入块。
  • 四头剪两头时,保留总宽度从 dmodeld_{\mathrm{model}} 变为 dmodel/2d_{\mathrm{model}}/2,但 dkd_k 不变。
  • 每个剩余头继续独立计算,拼接后的 OO' 再由 WOW_O' 投影回 dmodeld_{\mathrm{model}}
  • 实现时必须先固定矩阵约定,再映射到框架真实存储轴。
  • 头剪枝与 MQA 的 Q/K/V 头数关系不同,不能混用裁剪规则。
12

单元综合

从幅值置零到二阶补偿:剪枝、量化与结构化裁剪的统一视角

单元能力目标

完成本单元后,应能把剪枝和量化都视为“对权重施加离散约束,再评估并补偿局部损失”的问题。

具体需要做到:

  • 区分权重数值置零、稀疏存储和硬件加速;
  • 从二阶 Taylor 展开推导 OBD 的重要性分数;
  • 说明 OBS 怎样利用 Hessian 非对角耦合补偿被剪权重;
  • 推导 OBD、OBS 与 OBQ 的退化关系;
  • 把 GPTQ 层重构误差写成逐行二次型;
  • 设计固定 mask 微调,防止零权重复活;
  • 区分非结构化权重剪枝与注意力头结构化剪枝;
  • 用 shape 检查 Q/K/V 与输出投影的配套裁剪。

概念连接

1. 权重置零在函数图上删除一条贡献

线性层写为

yj=iWjixi.y_j=\sum_iW_{ji}x_i.

WjiW_{ji} 表示输入 xix_i 到输出 yjy_j 的加权连边。

Wji=0,W_{ji}=0,

则该项对任意输入都没有贡献,在函数图上等价于删除这条边。

幅值剪枝常构造二值 mask:

M=1(W>ε),M=\mathbf1(|W|>\varepsilon),
Wpruned=WM.W_{pruned}=W\odot M.

2. 数值零不自动变成性能收益

必须分开三层:

  1. 数值层:张量中某些元素等于零;
  2. 表示层:使用 CSR、block sparse 或其他格式跳过零;
  3. 执行层:目标硬件与 kernel 真正利用该稀疏结构。

稠密 GEMM 通常仍会读取并乘以数值零。

所以“剪掉 50% 权重”不自动等于计算量或延迟减半。

3. 幅值剪枝隐含同曲率假设

幅值剪枝按

wi|w_i|

排序,优先删除较小权重。

它隐含地认为不同坐标对损失的敏感度相近。

如果一个小权重位于高曲率方向,置零可能造成很大损失;一个较大权重位于平坦方向,反而可能更安全。

二阶方法用 Hessian 显式描述这种方向敏感度。

4. OBD 从多元 Taylor 展开出发

在当前权重 ww 附近:

L(w+Δw)L(w)+gTΔw+12ΔwTHΔw.L(w+\Delta w) \approx L(w) +g^T\Delta w +\frac12\Delta w^TH\Delta w.

OBD 的核心假设是:

  1. 当前点近似驻点,g0g\approx0
  2. 局部二次近似足够准确;
  3. Hessian 可近似为对角阵。

若只置零第 ii 个权重:

Δwi=wi.\Delta w_i=-w_i.

对角 Hessian 下得到重要性分数

SiOBD=12Hiiwi2.S_i^{OBD} = \frac12H_{ii}w_i^2.

5. 圆形山谷让 OBD 退化为幅值排序

若局部曲率各向同性:

H=λI,λ>0,H=\lambda I, \qquad \lambda>0,

SiOBD=λ2wi2.S_i^{OBD} = \frac\lambda2w_i^2.

所有坐标共享同一个正常数,按 OBD 分数排序等价于按

wi|w_i|

排序。

幅值剪枝可以看成在“局部山谷近似圆形”时的曲率方法特例。

6. OBS 保留权重间耦合

OBS 不再假设 Hessian 对角,而是求解:

minΔw12ΔwTHΔw\min_{\Delta w} \frac12\Delta w^TH\Delta w

满足剪枝约束

eiTΔw=wi.e_i^T\Delta w=-w_i.

使用 Lagrange 乘子可得最优补偿:

Δw=wi[H1]iiH1ei.\Delta w^* = - \frac{w_i} {[H^{-1}]_{ii}} H^{-1}e_i.

它不仅把 wiw_i 置零,还允许其他权重沿 Hessian 耦合方向协同调整。

7. OBS 的最小局部损失

代回目标:

SiOBS=12wi2[H1]ii.S_i^{OBS} = \frac12 \frac{w_i^2} {[H^{-1}]_{ii}}.

算法优先处理分数小的权重。

与 OBD 相比,分母 [H1]ii[H^{-1}]_{ii} 汇总了完整曲率耦合,而不是只看 HiiH_{ii}

这带来更高计算与存储成本,也依赖 Hessian 可逆或稳定近似。

8. 对角 Hessian 下 OBS 完整退化为 OBD

H=diag(h1,,hn),H=\operatorname{diag}(h_1,\ldots,h_n),

[H1]ii=1/hi.[H^{-1}]_{ii}=1/h_i.

OBS 分数变为

SiOBS=12hiwi2=SiOBD.S_i^{OBS} = \frac12h_iw_i^2 =S_i^{OBD}.

同时

H1ei=(1/hi)ei,H^{-1}e_i=(1/h_i)e_i,

补偿只剩

Δw=wiei.\Delta w=-w_ie_i.

所以评分与补偿两层都退化。

9. OBQ 把“置零”推广到任意量化值

OBS 的目标值固定为 0。

OBQ 让第 ii 个权重移动到量化格点 qiq_i

Δwi=qiwi.\Delta w_i=q_i-w_i.

最优补偿为

Δw=wiqi[H1]iiH1ei.\Delta w^* = - \frac{w_i-q_i} {[H^{-1}]_{ii}} H^{-1}e_i.

最小局部损失为

SiOBQ=12(wiqi)2[H1]ii.S_i^{OBQ} = \frac12 \frac{(w_i-q_i)^2} {[H^{-1}]_{ii}}.

qi=0q_i=0,评分与补偿都回到 OBS。

10. 特例链揭示每次简化付出的假设

统一链条为:

OBQqi=0OBSH 对角OBDH=λIMagnitude.OBQ \xrightarrow{q_i=0} OBS \xrightarrow{H\ \text{对角}} OBD \xrightarrow{H=\lambda I} Magnitude.

每向右一步,计算更简单,但丢弃更多结构:

  • 任意量化目标变成零;
  • 权重耦合被忽略;
  • 坐标曲率差异被忽略。

选择方法时应判断这些假设在目标层是否近似成立。

11. GPTQ 从层输出重构误差定义目标

设校准激活矩阵为 XX,原权重为 WW,量化权重为 W^\widehat W

GPTQ 式层重构目标为

WXW^XF2.\|WX-\widehat WX\|_F^2.

定义

ΔW=WW^,\Delta W=W-\widehat W,

ΔWXF2=Tr(ΔWXXTΔWT).\|\Delta WX\|_F^2 = \operatorname{Tr} (\Delta WXX^T\Delta W^T).

H=2XXT,H=2XX^T,

得到

12Tr(ΔWHΔWT).\frac12 \operatorname{Tr} (\Delta WH\Delta W^T).

12. trace 把重构目标拆成逐行二次型

ΔW\Delta W 的第 rr 行记为 Δwr\Delta w_r

12Tr(ΔWHΔWT)=12rΔwrHΔwrT.\frac12 \operatorname{Tr} (\Delta WH\Delta W^T) = \frac12 \sum_r \Delta w_rH\Delta w_r^T.

同一个输入侧曲率代理 HH 作用于每个输出行。

这里的 H=2XXTH=2XX^T 是层输出重构目标的 Hessian 或曲率代理,不应无条件等同于完整模型训练损失的全局 Hessian。

13. 剪枝后的 mask 是支持集约束

达到目标稀疏度后,用固定 mask

M{0,1}shape(W)M\in\{0,1\}^{shape(W)}

表示哪些位置允许非零。

微调时若普通优化器直接更新 WW,被剪位置可能收到非零梯度并重新生长。

严格支持集约束要求持续满足

W=WM.W=W\odot M.

14. mask 梯度与 step 后重掩码

简单 SGD、无 momentum/weight decay 的理想条件下:

  • 先把梯度乘 mask;
  • 或先 step,再把权重乘 mask;

可以得到相同保留位置更新。

但对 momentum、Adam、decoupled weight decay 等有状态优化器,已剪位置的内部状态可能让权重复活。

更稳健的方案包括:

  • step 后重新施加 mask;
  • 同步清零已剪位置的 optimizer state;
  • 检查 weight decay、参数 EMA 或其他绕过 raw-gradient hook 的路径。

15. 非结构化剪枝与结构化头剪枝不同

非结构化剪枝删除单个权重元素,得到不规则稀疏模式。

注意力头剪枝删除一整块 Q/K/V 通道与对应输出投影输入块,产生规则的维度缩减。

结构化剪枝更容易映射到 dense kernel,但粒度更粗,可能一次删除更多功能。

16. 注意力头裁剪的 shape 账本

标准 MHA 中,每个头宽度为 dkd_k,头数为 HH,总拼接宽度为

Hdk=dmodel.Hd_k=d_{model}.

若保留头集合 H\mathcal H'

  • Q/K/V 投影删除被剪头对应的输出通道块;
  • 保留头继续独立计算 attention;
  • 拼接宽度变为 Hdk|\mathcal H'|d_k
  • 输出投影 WOW_O 删除对应输入行或列块,具体取决于矩阵存储约定;
  • 最终输出维仍可保持 dmodeld_{model}

四头剪两头时,dkd_k 不变,总中间宽度减半。

17. 头剪枝不是 MQA/GQA

头剪枝减少完整 attention head 数量,并配套裁剪 Q/K/V 与输出投影。

MQA/GQA 改变的是 Q head 与 K/V head 的共享关系。

二者都涉及 head 数,却有不同 shape 和计算图,不能复用同一裁剪规则。

对比与决策

1. 选择重要性指标

  • 只需快速基线、曲率差异较小:magnitude pruning。
  • 可接受对角曲率近似:OBD。
  • 需要权重耦合补偿且能承担逆曲率成本:OBS。
  • 目标是移动到任意量化格点:OBQ/GPTQ 式方法。

2. 选择稀疏粒度

  • 单权重稀疏:灵活、压缩率高,但硬件利用难。
  • block/channel/head 结构化稀疏:规则、易部署,但功能粒度粗。

应同时评估任务精度、存储格式、kernel 和真实延迟。

3. 审计二阶方法的假设

依次检查:

  1. 是否接近驻点;
  2. 二次近似作用在哪个损失与数据集;
  3. Hessian/曲率代理如何构造;
  4. 是否对角、分块或阻尼;
  5. 逆或更新是否数值稳定;
  6. 每次量化/剪枝后是否更新状态。

综合训练

编者练习

wi=0.2w_i=0.2Hii=100H_{ii}=100;另一个权重 wj=1w_j=1Hjj=1H_{jj}=1。计算 OBD 分数并比较 magnitude 排序。

查看参考答案

Si=12×100×0.22=2S_i=\frac12\times100\times0.2^2=2Sj=12×1×12=0.5S_j=\frac12\times1\times1^2=0.5。magnitude 会先剪 ii,因为 0.2<10.2<1;OBD 会先剪 jj,因为它位于更平坦方向。该例说明各向异性曲率下,小权重不一定更安全。

编者练习 2

已知 [H1]ii=4[H^{-1}]_{ii}=4wi=0.8w_i=0.8,候选量化值 qi=0.5q_i=0.5。计算 OBQ 局部最小损失;若改为剪枝到 0,损失是多少?

查看参考答案

量化误差为 wiqi=0.3w_i-q_i=0.3,所以 SiOBQ=0.32/(2×4)=0.01125S_i^{OBQ}=0.3^2/(2\times4)=0.01125。剪枝时 qi=0q_i=0,得到 0.82/(8)=0.080.8^2/(8)=0.08。同一曲率下,移动到更近的量化格点局部代价更小。

编者练习 3

一个 8-head MHA 的 dmodel=1024d_{model}=1024,每头 dk=128d_k=128。剪掉 3 个头后,写出保留拼接宽度,以及输出投影需要怎样配套修改。

查看参考答案

保留 5 个头,拼接宽度为 5×128=6405\times128=640。Q/K/V 投影删除三个头对应的输出通道块;WOW_O 必须删除这三个头对应的输入块,使其从 640 维中间表示投影回 1024 维。具体删除存储矩阵的行还是列,要先确认框架权重是数学右乘 [in,out] 还是 PyTorch 常见 [out,in]

进入下一单元前

  • 已能区分数值置零、稀疏表示与硬件加速。
  • 已能从 Taylor 假设推导 OBD,并解释何时退化为 magnitude。
  • 已能推导 OBS 的约束补偿与最小损失。
  • 已能写出 OBQ→OBS→OBD→Magnitude 的特例链。
  • 已能把 GPTQ 重构误差转为逐行二次型,并限定曲率代理语义。
  • 已能设计固定 mask 与 optimizer state 处理,防止权重复活。
  • 已能按 shape 配套裁剪 Q/K/V 与输出投影。
  • 若仍会把稀疏率直接换算成加速比,回看 P55。
  • 若仍会把 OBS 只理解为换一个分数,回看 P63、P65 的补偿方向。
  • 若仍把头剪枝当 MQA/GQA,回看 P78 的 head 关系。