LEARNING UNIT · 16
剪枝与二阶压缩
从权重置零出发,比较 OBD、OBS、GPTQ 式二阶目标以及结构化注意力头剪枝。
- 已整理章节
- 12 节
- 单元来源
- 11 条视频
- 总时长
- 32:00
- 状态
- 已发布
- 学习位置
- 16 / 20
主题讲解 · 02:21
把权重置零为何在计算图上等价于剪枝
学习目标
- 能用阈值和二值 mask 写出基于权重幅值的剪枝。
- 能解释小权重归零后参数分布与稀疏度怎样变化。
- 能把线性层矩阵元素对应到输入、输出之间的加权连边。
- 能从矩阵乘法证明某个权重为零时,对应连边贡献消失。
- 能区分“数值上为零”“稀疏存储”和“真实硬件加速”。
前置与衔接
本课是剪枝主题的最小模型。
后续 OBD、OBS 等方法会讨论怎样更聪明地选择被剪权重;这里先回答更基础的问题:为什么常见剪枝实现表现为把权重元素写成零?
答案来自线性层的代数与连接图之间的一一对应。
核心讲解
1. 基于幅值的阈值剪枝
设权重矩阵为 ,阈值为 。
最简单的 magnitude pruning 规则是:
它假设绝对值很小的权重对输出影响通常较小,因此优先归零。
基于幅值的剪枝用阈值把小权重置零;在线性层中,每个权重矩阵元素对应一条输入到输出的加权连边。
原视频 · 00:00 ↗更紧凑地定义二值 mask:
则
表示逐元素乘法,而不是矩阵乘法。
二值条件 |W|>ε 生成保留掩码,逐元素乘回 W 后,阈值以内的元素变成零。
原视频 · 00:40 ↗2. 阈值不是随便挑的常数
视频把 描述为一个不太大的阈值。
工程中常见的两种设定方式是:
- 固定阈值:所有 的元素归零;
- 固定稀疏度:按 排序,选择目标比例的最小元素归零。
第二种方式更容易精确控制零元素比例。
若阈值处有并列值,需要确定 tie-breaking,否则可能多剪或少剪。
3. 权重分布为何在零附近出现空缺
许多训练后权重集中在零附近。
当阈值剪枝把中间一段小幅值权重统一写成零时:
- 非零权重仍分布在负、正两侧;
- 零位置数量显著增加;
- 若只画非零值的直方图,零附近会出现空缺;
- 若把零值也计入直方图,零点会出现一个质量峰。
把零附近的小权重归零后,非零权重分布在零点两侧,并形成可利用的稀疏结构。
原视频 · 01:00 ↗图中“中间空出来”说的是剩余非零权重的分布。
不能误解为零权重已经从 dense 张量内存中自动消失。
4. 用一个线性层固定记号
采用视频板书的行向量写法:
输出为
因此
矩阵乘法把每个输出写成输入分量乘对应权重后的加权和,与神经元连边图逐项对应。
原视频 · 01:40 ↗在这个记号中, 的第 行存放通向输出 的全部权重。
表示从输入 到输出 的连边权重。
5. 矩阵元素就是连边的代数系数
一般形式为
展开其中一项:
神经网络连接图把这项画成一条从 指向 的边,并把 标在边上。
矩阵乘法与连接图并不是两个不同机制,而是同一线性变换的两种表达。
6. 把某个权重置零会发生什么
若把
那么对应项变成
不论输入 取什么值,这条边都不再影响 。
将 W 中某个元素置零会删除相应输入到输出的贡献,因此在函数图上等价于剪掉那条加权边。
原视频 · 02:00 ↗因此在函数和计算图语义上,这条连边可以删除。
这就是“权重置零等价于剪枝”的核心证明。
7. 一个具体置零例子
把上例中的 置零:
新输出为
只有 的贡献消失;其他五条边保持不变。
这类逐元素归零属于非结构化剪枝。
若一次删除整个神经元、通道或注意力头,则属于更粗粒度的结构化剪枝。
8. 数值为零不等于存储和计算自动变少
视频提到稀疏矩阵更易存储和计算,这需要一个实现边界。
从数学上看,零权重的乘法可以省略。
但若 仍以普通 dense tensor 存储,并调用 dense GEMM:
- 零元素仍占用 dense 存储位置;
- 通用内核通常仍执行对应乘加槽位;
- 零很多也不保证墙钟时间下降。
要获得实际收益,通常还需要:
- CSR/CSC、block sparse 等稀疏格式;
- 目标硬件支持的稀疏模式,例如规则化块或 稀疏;
- 匹配的稀疏算子和足够高的稀疏度;
- 把索引、mask 与调度开销计入性能评估。
因此应分三层表述:
- 权重归零让连边在函数上失效;
- 稀疏格式可以不存显式零;
- 稀疏内核才有机会跳过对应计算。
9. 小幅值为何只是启发式
单看 忽略了输入尺度和参数耦合。
即使 很小,如果 经常很大,乘积 仍可能重要。
反过来,一个较大权重也可能因输入方向很少激活而影响有限。
后续 OBD、OBS 等方法会引入曲率,估计置零权重后的损失增加,而不只看幅值。
跟练与练习
原视频练习
编者练习
设 取 ,计算 mask、剪枝后的权重和输出 。
查看参考答案
mask 为
所以
输出为
编者练习 2
一个 dense 权重矩阵已有 元素为零,能否仅凭这个比例断言推理速度提升十倍?
查看参考答案
不能。还要检查零元素是否采用稀疏格式、稀疏模式是否被硬件支持、实际调用的是 dense 还是 sparse kernel,以及索引和调度开销。数值稀疏度只说明潜在可跳过工作量,不直接等于端到端加速比。
常见误区
- 把剪枝听成“减脂”:本课术语是 pruning,即剪枝。
- 把 ε 当成模型参数:它是剪枝规则的阈值或由目标稀疏度导出的边界。
- 把 当矩阵乘法:这里是逐元素乘法。
- 认为任意零都已物理删除:dense tensor 仍可能存储并计算这些槽位。
- 把所有剪枝称为结构化剪枝:单个标量权重归零通常是非结构化剪枝。
- 认为小权重必然不重要:幅值只是启发式,输入尺度和曲率也会影响真实损失。
本课小结
- 幅值剪枝用 选择保留权重。
- 在线性层中, 是输入 到输出 的加权连边。
- 使该边对任何输入的贡献恒为零,所以函数上等价于删边。
- 数值归零、稀疏存储与硬件加速是三个不同层次,不能混为一谈。
- 后续课程将从幅值启发式走向曲率感知的 OBD、OBS 与统一压缩方法。
主题讲解 · 03:28
圆形山谷为何让 OBD 退化为权重大小剪枝
学习目标
- 能解释基于权重大小的剪枝如何由目标稀疏度确定阈值。
- 能写出 OBD 的二阶重要性分数 。
- 能从代数上证明各向同性曲率下 OBD 与 magnitude pruning 排序相同。
- 能从等高线几何解释“小权重不一定不重要”。
- 能说明“OBD 退化为 magnitude pruning”成立所需的局部假设。
前置与衔接
需要知道剪枝把部分权重置零,稀疏度表示被置零权重的比例。
还需要把 Hessian 对角元素 理解为损失沿第 个权重方向的局部曲率。
本课位于“剪枝与二阶压缩”单元。
它先建立 magnitude pruning 与 OBD 的评分差异,再回答一个特殊情形:当局部损失山谷近似圆形时,为什么两种评分会给出同一个剪枝顺序。
核心讲解
1. magnitude pruning 先按绝对值排序
最直接的非结构化剪枝规则是
其中 不是任意拍定,而是由目标稀疏度决定。
基于权重大小的剪枝用阈值 ε 判断保留或置零,阈值可由目标稀疏度对应的顺序统计量确定。
原视频 · 00:20 ↗假设共有 个权重,目标稀疏度是 。
那么需要剪掉
个绝对值最小的权重。
把 从小到大排列,第 小的绝对值就给出了切分位置。
实际实现可使用完整排序,也可使用 selection / top-k 一类顺序统计量算法,不必总把所有元素彻底排好序。
把权重绝对值排序后,在目标稀疏度对应的位置切分:阈值以下剪掉,以上保留。
原视频 · 00:40 ↗这个方法隐含了一个判断:权重越小,置零它造成的损害越小。
但这个判断没有利用损失函数在不同方向上的曲率。
2. OBD 按“置零后的局部损失上升”排序
在 OBD 的局部二阶模型中,剪掉单个权重 的重要性分数为
这里:
- 表示把该坐标从 移到 所需位移的平方;
- 表示损失沿该坐标方向的局部曲率;
- 分数越小,局部模型预测的损失上升越小,越适合先剪。
OBD 不按 |w_i| 排序,而按二阶曲率加权的 1/2 H_ii w_i^2 衡量置零权重后的损失上升。
原视频 · 01:20 ↗因此 OBD 与 magnitude pruning 的流程外形很像:都算分、排序,再剪掉分数最小的一批。
真正的差别在评分:前者用 ,后者只看 。
课程提到 Hessian 信息可以借助校准数据估计。
准确地说,校准数据提供了在代表性输入上的损失或输出统计,具体实现仍要选择 Hessian 或近似曲率的计算方式。
3. 代数证明:各向同性让曲率成为共同常数
把二维局部损失写成
若等高线是圆形,局部二次曲率各向同性,可写为
其中 。
于是每个坐标方向都有
OBD 分数变为
圆形山谷各方向曲率相同,使 H_ii 成为共同常数,按 1/2 H_ii w_i^2 排序等价于按 |w_i| 排序。
原视频 · 02:20 ↗对所有权重而言, 都是相同的正数。
乘上同一个正数不会改变排序,因此
所以两种方法会在同一个位置切分,并剪掉同一组权重。
“退化”指评分排序等价,不是说二阶推导本身消失了。
4. 一般狭长山谷中,小权重未必能剪
如果 Hessian 不各向同性,不同方向的 可以相差很大。
考虑两个权重满足
但曲率满足
那么完全可能出现
此时 虽然绝对值更小,置零它反而造成更大的局部损失上升。
在各向异性的狭长山谷中,较小权重的置零位移仍可能跨越更多等高线,因此损失增量未必更小。
原视频 · 02:40 ↗几何上,置零 是沿第 个坐标轴移动到零平面。
在狭长、各向异性的山谷里,较短的坐标位移可能沿着陡峭方向,跨越很多等高线;较长位移也可能沿平缓方向,只跨越少量等高线。
所以“位移短”与“损失增长小”不是一般等价关系。
5. 圆形山谷把距离顺序变成损失顺序
圆形等高线没有特别陡或特别平的方向。
局部损失只由到中心的欧氏距离决定。
沿坐标轴把某个权重置零时,位移长度就是 。
在圆形等高线下,沿坐标轴置零的位移越短,跨越的等高线越少,损失上升顺序与权重绝对值顺序一致。
原视频 · 03:00 ↗因此:
- 较小的 对应较短的置零位移;
- 较短位移对应较小的二次损失上升;
- 按 排序就等价于按 排序。
这与前面的代数证明是同一个结论的两种表述。
6. 结论的适用边界
“圆形山谷”是局部二次模型中的理想情形。
它至少要求所比较方向的对角曲率相同。
若 Hessian 还含有显著非对角项,权重方向彼此耦合,仅比较 仍可能遗漏联动效应。
若模型未处在近似驻点,或剪枝位移大到离开局部二次区域,真实损失变化也可能偏离该评分。
因此本课结论适合用来理解算法关系,不应被读成“真实神经网络损失总是圆形”。
跟练与练习
原视频练习
编者练习
有两个权重 、,对应曲率 、。magnitude pruning 与 OBD 各会优先剪谁?
查看参考答案
magnitude pruning 只看绝对值,会优先剪 。OBD 分数分别为 ,,所以 OBD 会优先剪 。这个例子说明小权重若位于高曲率方向,仍可能很重要。
编者练习 2
若 ,证明 OBD 排名前 个最小分数与 最小的前 个完全一致。
查看参考答案
此时 。函数 在 上单调递增,而所有分数又乘同一个正常数 ,因此 、 与 的升序完全一致。若有相同绝对值,则两种评分都出现同样的并列,需要相同的 tie-breaking 才能得到逐元素完全相同的顺序。
常见误区
- 误区:稀疏度 0.3 表示保留 30% 权重。纠正:本课程语境中表示剪掉、置零 30%。
- 误区:阈值一定来自完整排序。纠正:只需要找到对应顺序统计量,具体算法可不做全排序。
- 误区:OBD 仍只按权重大小剪。纠正:它按曲率加权的权重平方排序。
- 误区:小权重一定不重要。纠正:高曲率方向上的小位移也可能造成大损失。
- 误区:椭圆山谷都能让 OBD 退化。纠正:一般轴对齐椭圆仍有不同曲率;圆形要求各方向曲率相同。
- 误区:排序等价说明所有损失增量数值相等。纠正:等价的是相对顺序,不是各权重分数相同。
- 误区:真实模型的损失山谷一定满足圆形假设。纠正:这是帮助理解特殊关系的理想局部条件。
本课小结
- magnitude pruning 按 排序,阈值由目标稀疏度对应的顺序统计量确定。
- OBD 按 估计置零单个权重的局部损失代价。
- 当 时,曲率是共同正常数,OBD 排序退化为绝对值排序。
- 在各向异性山谷中,小权重可能位于高曲率方向,不能只凭绝对值判断。
- 下一课将从 Taylor 展开系统拆解 OBD 的三项假设,解释这个评分公式从哪里来。
主题讲解 · 03:37
从 Taylor 展开理解 OBD 的三项假设
学习目标
- 能从一元 Taylor 展开过渡到多元损失的局部二次模型。
- 能解释梯度 、Hessian 与扰动 的 shape 和几何意义。
- 能准确列出 OBD 的驻点、二次近似与权重解耦三项假设。
- 能说明对角 Hessian 为什么对应轴对齐而非旋转的椭圆等高线。
- 能推导剪掉单个权重时的 OBD 重要性分数。
前置与衔接
需要熟悉导数描述斜率、二阶导数描述曲率,并知道剪枝把某个权重从 改为 。
上一课直接使用了
本课不再把它当作现成公式,而是从多元 Taylor 展开追溯它成立的条件。
核心讲解
1. 一元 Taylor 展开:高度、斜率与曲率
对一元损失函数 ,在 附近写 。
Taylor 展开为
一元 Taylor 展开用函数值、一阶斜率和二阶曲率逐步逼近损失函数。
原视频 · 00:20 ↗三个显式项分别回答:
- :展开点本身有多高;
- :沿切线移动带来多少一阶高度变化;
- :曲率让真实函数偏离切线多少。
加入的阶数越高,局部拟合通常越精细,但计算与存储也更复杂。
OBD 的名字 Optimal Brain Damage 虽然强调剪枝,其数学入口正是这个局部近似。
2. 多元 Taylor 展开把权重写成向量
神经网络参数不是一个标量,而是向量
从当前参数 施加扰动 后,新的参数为
多元二阶展开是
其中
多元损失在 w_0 附近展开为 L(w_0)+g^TΔw+1/2 Δw^T HΔw,高度、切平面与曲率项共同描述局部山谷。
原视频 · 01:20 ↗shape 检查如下:
- 是 ;
- 是 ;
- 是标量;
- 也是标量。
几何上, 描述切平面的高度变化,二次型描述局部山谷的弯曲方式。
3. 假设一:当前模型已在近似驻点
OBD 假设训练后的参数 已经收敛到局部谷底附近,因此
于是一次项消失:
OBD 假设模型已收敛且当前权重位于谷底,因此一阶梯度 g 为零。
原视频 · 02:00 ↗几何上,这意味着展开点处的切平面近似水平。
这并不要求训练误差为零,也不要求 。
“损失值为零”和“损失对参数的一阶导为零”是两件不同的事。
真实模型中,随机优化、有限训练与数值误差都可能让 只近似为零。
4. 假设二:局部山谷可由二次函数描述
OBD 忽略三阶及以上项,保留
课程把这一点形容为山谷是“完美抛物线”。
更谨慎的表述是:在当前点附近、对所考虑的剪枝扰动范围,二次近似足够有用。
它不宣称真实深度网络的全局损失面就是一个二次函数。
若一次剪掉很多权重, 很大,局部 Taylor 近似可能明显失真。
5. 假设三:权重之间解耦,Hessian 近似对角
一般 Hessian 为
非对角项 描述第 、 个权重扰动之间的二阶耦合。
OBD 把它近似成
权重解耦对应 Hessian 近似对角,等高线是轴对齐椭圆而不是旋转椭圆。
原视频 · 02:40 ↗此时二次型可拆为逐坐标求和:
没有 交叉项,因此每个权重的局部代价可以单独计算。
在二维正曲率情形中,对角 Hessian 对应轴对齐椭圆。
旋转椭圆意味着主曲率方向与坐标轴不一致,也就是原坐标下存在耦合项。
还要区分“轴对齐椭圆”和“圆”:前者只要求 Hessian 对角,后者还要求各对角元素相同。
6. 三项假设如何导出单权重重要性
现在只剪掉第 个权重,其他权重保持不变。
扰动满足
并且对 有
代入对角二次型:
在梯度为零、忽略三阶以上项且 Hessian 对角时,剪掉 w_i 的局部损失增量为 1/2 H_ii w_i^2。
原视频 · 03:20 ↗这就是 OBD 的 saliency 或重要性分数。
分数小表示在当前局部模型下,把该权重置零预计造成的损失上升小。
因此 OBD 对所有权重计算分数,优先剪掉分数最小者。
7. 三项假设分别解决什么难题
三项假设不是重复表达:
- 驻点假设去掉一阶项,避免剪枝方向与当前梯度共同影响损失;
- 二次近似截断高阶项,让损失变化可由 Hessian 描述;
- 对角假设去掉权重耦合,让每个权重获得独立标量评分。
前两项建立“局部二阶世界”,第三项才把一般二次型简化为 OBD 可批量排序的逐权重分数。
下一课的 OBS 会保留前两项,但放松第三项。
跟练与练习
原视频练习
编者练习
给定 按 OBD 分数应先剪哪个权重?
查看参考答案
两个分数分别是 ,。虽然 ,OBD 仍优先剪 ,因为第二个方向曲率更低。
编者练习 2
若 Hessian 为 为什么不能把 写成两个互不相关的 之和?
查看参考答案
展开二次型得到 。中间的交叉项说明一个权重扰动的代价取决于另一个权重如何变化,不能把两者当成独立问题。这正是 OBD 对角假设忽略、OBS 尝试保留的信息。
常见误区
- 误区:模型收敛等于 。纠正:OBD 使用的是 ,损失值可以非零。
- 误区:二阶近似说明三阶导数在真实模型中严格为零。纠正:它们是在局部近似里被忽略。
- 误区:Hessian 对角说明所有方向曲率相同。纠正:对角元素仍可不同,只表示坐标解耦。
- 误区:轴对齐椭圆就是圆。纠正:只有所有相关对角曲率相等时才是圆。
- 误区: 是权重 的一阶梯度。纠正:它是损失对 的二阶偏导。
- 误区:剪掉 时 。纠正:新值减旧值是 ,平方后符号才消失。
- 误区:局部分数能精确预测任意高稀疏度下的最终损失。纠正:大扰动会削弱 Taylor 近似可靠性。
本课小结
- 多元 Taylor 展开把剪枝后的损失变化拆为一次项、二次项和高阶余项。
- OBD 假设当前权重在近似驻点、局部损失可二次化、Hessian 可近似对角。
- 对角 Hessian 消除权重间交叉项,对应坐标轴对齐的局部山谷。
- 单独置零 时,局部损失增量为 。
- 下一课将看到 OBS 如何保留前两项假设、恢复 Hessian 的非对角耦合,并用补偿处理被剪权重。
主题讲解 · 02:57
OBS 如何保留权重耦合并逐步补偿
学习目标
- 能比较 OBS 相对 OBD 保留和放松了哪些局部假设。
- 能解释非对角 Hessian 如何表示权重之间的二阶耦合。
- 能写出 OBS 的单权重重要性分数与最优补偿向量。
- 能从评分对象和执行流程比较 magnitude pruning、OBD 与 OBS。
- 能说明朴素 OBS 为什么一次剪一个权重,并在下一轮前更新状态。
前置与衔接
需要掌握上一课的局部二次模型
以及 OBD 对 Hessian 做对角近似后得到的逐权重分数。
本课进入 OBS(Optimal Brain Surgeon)。
核心变化不是放弃二阶近似,而是恢复 OBD 忽略的权重耦合,并允许其他权重在剪掉一个坐标后协同调整。
核心讲解
1. 先复盘 OBD 的三项假设
在当前参数 附近,完整展开写成
OBD 使用三项简化:
- 模型位于近似驻点,;
- 忽略三阶及以上项;
- 把 Hessian 近似成对角阵。
OBD 保留局部二阶项:假设梯度为零、忽略三阶以上项,并额外把 Hessian 近似为对角阵。
原视频 · 00:20 ↗前两项把问题限制在局部二次世界。
第三项进一步删除所有交叉项,使
因此 OBD 能给每个权重一个独立分数,并一次排序剪掉一批。
2. OBS 保留前两项,但放松对角假设
OBS 同样假设
并忽略高阶项,所以仍以
作为目标。
不同的是,OBS 允许 是一般非对角矩阵。
OBS 仍采用 1/2 Δw^T HΔw,但保留 Hessian 非对角项,因此不同权重的变化相互耦合。
原视频 · 01:00 ↗展开后会出现
形式的交叉项。
这表示剪掉 后,如果同时适当调整其他权重,某些损失上升可以被抵消。
因此 OBS 不再把“剪掉一个权重”理解为只有这个坐标变化,而是把它理解为一个带约束的全向量优化问题。
3. 把单权重剪枝写成约束优化
若要剪掉第 个权重,新参数必须满足
用第 个单位向量 表示,就是
OBS 要求在这个约束下最小化局部损失:
这是标准的等式约束二次优化,可用 Lagrange 乘子求解。
构造
对 求导并令其为零:
若 可逆,则
再代回约束可得
因此最优补偿向量为
这里上标星号表示“在剪掉第 个候选权重时的最优整向量改变量”,不是只有第 个分量。
4. OBS 的重要性分数来自最小约束代价
把最优补偿向量代回二次目标,可得
朴素 OBS 用 1/2·w_i^2/[H^{-1}]_ii 作为单个候选权重的重要性分数。
原视频 · 01:40 ↗注意它不是简单把 OBD 的 换成 。
逆 Hessian 对角元素出现在分母,因此实际曲率因子是
这个量已经考虑了其他权重可通过耦合方向进行补偿的能力。
若某个方向很容易由其他坐标共同调整来吸收,约束最小代价会相应改变。
5. 三种评分方法放到一起比较
magnitude pruning、OBD 与 OBS 分别按 |w_i|、1/2 H_ii w_i^2 和 1/2·w_i^2/[H^{-1}]_ii 衡量重要性。
原视频 · 02:00 ↗三种方法可写成:
它们利用的信息逐步增加:
- magnitude pruning 只看权重数值;
- OBD 再看单坐标曲率;
- OBS 使用完整 Hessian 的逆所携带的耦合信息。
这不自动保证任何有限实现都严格更优。
估计误差、数值稳定性、计算预算和局部模型失真都会影响实际结果。
6. 执行流程:OBS 是“剪一个—补偿—再更新”
magnitude pruning 与经典 OBD 常先计算所有分数,再按排序一次性剪掉一批权重。
朴素 OBS 则一次选择当前分数最小的单个权重。
剪掉它以后,使用 更新其他权重,让局部损失上升尽量小。
OBS 每次置零一个权重后补偿其余权重,再更新 Hessian 逆矩阵,随后继续选择下一权重。
原视频 · 02:40 ↗补偿后的参数已经改变,下一轮面对的有效问题也改变了。
课程因此把流程概括为:
- 计算当前候选权重的 OBS 分数;
- 选择分数最小者并置零;
- 按逆 Hessian 方向补偿其余权重;
- 更新所维护的逆 Hessian 状态;
- 继续选择下一权重。
这种顺序化处理比一次性按静态分数剪完更昂贵,但它能把每一步的补偿纳入后续决策。
7. “保留什么、修改什么”的准确答案
OBS 保留:
- 当前模型在近似驻点,因而忽略一阶项;
- 局部损失可由二阶 Taylor 项描述,因而忽略三阶以上项。
OBS 修改:
- 不再要求 Hessian 对角;
- 不再要求剪掉 时其他权重全部不动;
- 不再只做一轮静态批量排序,而是逐权重剪枝并补偿。
所以 OBS 不是另起炉灶,而是在相同局部二次框架中解除 OBD 的“权重解耦”限制。
跟练与练习
原视频练习
编者练习
写出 OBS 剪掉 时的约束,并解释为什么 通常会让多个权重同时变化。
查看参考答案
约束是 ,保证新权重的第 项为零。最优变化是 。 是逆 Hessian 的第 列;当 Hessian 非对角时,这一列通常有多个非零元素,所以除了被剪坐标,其他权重也会发生补偿变化。
编者练习 2
为什么 OBS 的分数不能写成 ?
查看参考答案
约束优化的最小代价是 ,逆 Hessian 对角元素在分母。可把它理解为有效曲率 乘权重平方。把它误写到分子会颠倒该因子对候选排序的作用,也无法在对角 Hessian 情形下正确退化为 OBD 分数。
常见误区
- 误区:OBS 放弃了二阶 Taylor 近似。纠正:它仍保留局部二次目标。
- 误区:OBS 只是不把 Hessian 对角线以外的元素存下来。纠正:它恰恰要利用耦合信息。
- 误区:OBS 分数是 。纠正: 位于分母。
- 误区: 只含第 个非零元素。纠正:一般非对角矩阵的第 列会含多个非零分量。
- 误区:补偿意味着把被剪权重重新加回来。纠正:约束始终保证该权重的新值为零,补偿发生在可调整方向上。
- 误区:OBS 与 OBD 都必须一次剪一批。纠正:本课讨论的朴素 OBS 是逐权重更新。
- 误区:使用更多二阶信息就无条件更好。纠正:曲率估计与求逆近似也会引入误差和成本。
本课小结
- OBS 保留 OBD 的驻点与局部二次假设,但不再把 Hessian 近似为对角阵。
- 剪掉 被写成约束 ,其余权重可协同补偿。
- OBS 分数为 ,最优补偿沿 。
- 朴素 OBS 逐个剪枝,在每次剪枝后补偿并更新状态。
- 下一课将证明:当 Hessian 恰好对角时,OBS 的评分和补偿都会退化为 OBD。
主题讲解 · 02:29
对角 Hessian 下 OBS 如何完整退化为 OBD
学习目标
- 能写出 OBD 与 OBS 共享的局部二次损失模型。
- 能证明对角 Hessian 下 OBS 重要性分数退化为 OBD 分数。
- 能解释 OBS 补偿公式中的 与 。
- 能证明对角 Hessian 下补偿向量只在被剪坐标留下 。
- 能说明“OBD 是特殊的 OBS”成立的算法与近似边界。
前置与衔接
上一课得到 OBS 的两个核心公式:
本课要检验的不只是评分公式。
因为朴素 OBS 还会逐权重补偿,所以只有证明“评分退化”和“补偿退化”同时成立,才能说 OBD 是 OBS 的完整特殊情形。
核心讲解
1. 两种方法共享同一个局部二次目标
OBD 与 OBS 都从近似驻点和二阶 Taylor 截断出发:
它们的区别是:
- OBD 假设 对角;
- OBS 允许 为一般非对角矩阵。
OBD 与 OBS 共享局部二阶损失模型,但 OBD 进一步要求 Hessian 为对角阵。
原视频 · 00:00 ↗因此要从 OBS 得到 OBD,最自然的特殊化就是令
并假设相关 非零,使逆矩阵存在。
2. 对角矩阵求逆只需逐元素取倒数
对角 Hessian 的逆仍是对角阵:
所以第 个对角元素满足
这个等式是后面两个退化证明共同使用的关键。
3. 第一层退化:OBS 分数变回 OBD 分数
一般 OBS 分数为
代入
得到
当 H 对角时,[H^{-1}]_ii=1/H_ii,OBS 评分中的分母取倒数后恢复 H_ii。
原视频 · 00:40 ↗因此在同一组权重与同一对角 Hessian 下,两种方法给每个候选权重完全相同的局部重要性分数。
它们会选择同一个最小分数候选。
但仅有这一步还不够,因为 OBS 剪完后会补偿其他权重,而经典 OBD 通常按静态分数排序后直接置零。
4. 一般 OBS 补偿会修改整个权重向量
剪掉第 个权重的约束为
满足该约束并最小化二次损失的变化是
一般 OBS 在置零 w_i 后按 Δw=−w_i/[H^{-1}]_ii·H^{-1}e_i 调整整个权重向量。
原视频 · 01:20 ↗是第 个标准基向量:
矩阵乘 会抽取 的第 列。
若 非对角,这一列通常包含多个非零分量,于是补偿会同时修改多个权重。
5. 对角结构让 H⁻¹eᵢ 只剩一个方向
当 对角时, 同样对角。
它的第 列除第 项外全为零,因此
OBD 的对角 Hessian 使 H^{-1} 也为对角阵,单位向量 e_i 只抽取第 i 个坐标方向。
原视频 · 01:40 ↗再把它代入补偿公式:
分母中的 与向量中的 相消,得到
6. 第二层退化:补偿等价于只把被剪权重置零
向量 的具体形状是
更新后第 个权重变成
其他 的权重满足
代入对角结构后,[H^{-1}]_ii 与第 i 个逆曲率相消,Δw 只在第 i 位留下 −w_i,其余权重不变。
原视频 · 02:00 ↗也就是说,OBS 虽然形式上执行了“最优补偿”,结果却没有对其余权重做任何补偿。
这正是 OBD 的置零行为。
7. 为什么评分与补偿必须分别证明
若只证明评分相同,只能说明两种方法第一步选中同一个候选。
如果 OBS 随后大幅调整其他权重,下一轮参数与分数就可能不同,算法轨迹不会与 OBD 相同。
现在我们同时得到:
- ;
- ,其余权重不变。
因此在对角 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 结构假设下的两个层次。
跟练与练习
原视频练习
编者练习
给定 若剪掉 ,计算 OBS 分数与补偿向量。
查看参考答案
,所以 。OBS 分数为 ,与 OBD 的 相同。补偿为 ,只把第一个权重置零。
编者练习 2
若 的第 列有三个非零元素,能否仍说剪掉 时“不需要补偿其他权重”?
查看参考答案
一般不能。补偿方向正比于 ,也就是第 列。只要这一列在其他坐标上非零,最优 就会修改那些权重。只有对角或具有足够特殊稀疏结构、使该列除第 项外为零时,补偿才退化为单纯置零。
常见误区
- 误区:OBD 与 OBS 的分数本来就一样。纠正:只有 对角时 。
- 误区:矩阵求逆就是把所有元素逐个取倒数。纠正:逐元素倒数只适用于这里的非零对角矩阵。
- 误区: 是全一向量。纠正:它只有第 项为 1。
- 误区: 取出第 行。纠正:右乘列向量取出第 列。
- 误区:补偿退化为零向量。纠正:第 项仍为 ,只是其余项为零。
- 误区:评分相同就足以证明两种算法完全相同。纠正:还必须检查权重更新与后续状态。
- 误区:理论特殊情形保证任何近似实现位级一致。纠正:阻尼、更新策略与数值误差都可能造成差异。
本课小结
- 对角 Hessian 的逆仍对角,并满足 。
- 代入 OBS 分数后得到 ,与 OBD 完全一致。
- 对角结构使 ,补偿最终化为 。
- 因而 OBS 在评分和补偿两个层面都退化为 OBD。
- 这一关系依赖局部二次、可逆对角 Hessian 与一致更新等假设;真实近似实现仍需单独验证。
主题讲解 · 03:36
OBS 如何用约束二次优化选择被剪权重
学习目标
- 能把“将第 个权重置零”写成关于 的线性约束。
- 能从局部二阶损失模型建立 OBS 的约束优化问题。
- 能用拉格朗日乘子推导最优补偿向量。
- 能解释 为何编码了其他权重对第 个权重的补偿。
- 能推导 OBS 重要性分数,并说明算法为何优先剪最小分数。
前置与衔接
前两课已经说明:OBS 相比 OBD 保留 Hessian 的非对角项,并在剪掉一个权重后补偿其他权重。
但“补偿”不是一条经验规则。
它来自一个明确的问题:在第 个权重必须变成零的前提下,怎样调整整个权重向量,才能让局部损失增加最少?
本课把这个问题完整解出。
核心讲解
1. 从局部二阶损失出发
设当前权重为 ,施加变化后为 。
在当前点附近,若一阶梯度近似为零并忽略三阶以上项,则损失增量近似为
其中 是损失关于权重的 Hessian。
OBS 把置零第 i 个权重写成带等式约束的二次优化,并允许其余权重共同补偿。
原视频 · 00:00 ↗这个二次型同时考虑:
- 每个坐标方向自身的曲率;
- 不同权重变化之间的耦合;
- 多个权重共同变化时的总损失代价。
OBS 要做的不是单独计算“把 改成零”的代价,而是允许所有坐标一起变化,再寻找代价最小的可行变化。
2. 目标函数为何是二次型
对固定候选 ,OBS 的优化目标是
局部二阶模型以 1/2·ΔwᵀHΔw 衡量剪枝扰动导致的损失增量。
原视频 · 00:40 ↗若 为正定矩阵,这个目标是严格凸二次函数,约束下的解唯一。
若 Hessian 仅半正定或数值上接近奇异,工程实现通常需要阻尼或稳定化处理;本课推导先采用 存在的理想条件。
3. 把“置零一个权重”写成等式约束
剪掉第 个权重意味着
因此
令 为第 个标准基向量,则
约束可以统一写成
把 w_i 置零等价于要求 Δw_i=−w_i,也可写成 e_iᵀΔw+w_i=0。
原视频 · 01:20 ↗这里的 不是新参数,它只负责从向量中抽取第 个坐标。
至此,OBS 的单权重剪枝问题成为
4. 拉格朗日函数把约束并入目标
引入标量拉格朗日乘子 :
对 求梯度并令其为零:
对拉格朗日函数关于 Δw 求梯度,驻点条件为 HΔw+λe_i=0。
原视频 · 02:00 ↗于是
这个式子先确定了方向:最优变化沿 的第 列。
因为
正好抽取 的第 列。
若该列在多个坐标上非零,置零 时就应同时调整那些坐标。
5. 用置零约束解出 λ
把
代回约束:
注意
所以
进而
最优补偿向量为
由约束解出 λ=w_i/[H⁻¹]_ii,最优补偿沿 H⁻¹e_i 方向调整整个权重向量。
原视频 · 02:40 ↗第 个分量确实等于 :
因此这个解既满足置零要求,也利用其余坐标降低二次损失。
6. 把最优补偿代回目标
将
代入二次目标:
再代入
得到
把最优补偿代回二次目标,最小损失增量为 1/2·w_i²/[H⁻¹]_ii。
原视频 · 03:20 ↗这就是朴素 OBS 的重要性分数。
分数越小,表示“强制把该权重置零并最优补偿其余权重”造成的局部损失上升越小。
因此每轮选择最小分数候选,而不是最大分数候选。
7. 分子与分母分别表达什么
分子 表示到零的坐标距离。
在其他条件相同时,权重绝对值越小,置零位移通常越小。
分母 则反映在完整耦合曲率下,第 个坐标可被整个参数系统吸收和补偿的程度。
不能把分母简单理解为 ,除非 真的是对角矩阵。
这正是 OBS 与 OBD 的区别。
8. 推导边界
该公式依赖局部二次近似、近似驻点和可逆 Hessian。
它没有保证一次剪掉大量权重后仍精确,也没有说明真实网络的全局任务损失一定按该二次式变化。
实际算法还要处理:
- Hessian 或曲率代理的估计误差;
- 阻尼与数值稳定性;
- 逐次剪枝后的逆矩阵更新;
- 大规模参数下不能显式存储完整 Hessian 的成本。
本课公式的价值是把“选择谁、怎样补偿、预计损失多少”统一成一个可验证的约束优化解。
跟练与练习
原视频练习
编者练习
给定 若剪掉第一个权重,求最优 与 OBS 分数。
查看参考答案
,。因此
第一坐标变化为 ,满足置零约束;第二坐标也被补偿。分数为
编者练习 2
若两个候选的 相同,但 、,OBS 会优先剪哪一个?
查看参考答案
优先剪第一个。分子相同,而第一个分母更大,所以其最小损失增量只有第二个的四分之一。这个例子说明 OBS 排序不能只看权重绝对值。
常见误区
- 把 Hessian 写成海森“向量”: 是二阶偏导组成的矩阵。
- 把 当成误差项:它是标准基向量,只负责选择第 个坐标。
- 认为 只含第 项:一般非对角 下,最优补偿会改变多个权重。
- 把 写成 :仅在对角 Hessian 等特殊结构下成立。
- 选择最大 OBS 分数剪枝:分数表示预计损失增加,应优先选择最小者。
- 把局部二次近似当成全局精确损失:大扰动或大量剪枝会削弱近似可靠性。
本课小结
- OBS 把单权重剪枝写成带线性等式约束的二次优化。
- 拉格朗日驻点给出补偿方向 。
- 最优补偿为 。
- 最小损失增量为 ,算法优先剪最小分数。
- 下一课把目标从“置零”推广到“移动到量化值”,由此得到 OBQ。
主题讲解 · 02:31
把剪枝看成量化到零:OBS 与 OBQ 的统一关系
学习目标
- 能区分 OBC 统一压缩框架与 OBQ 量化方法。
- 能解释“剪枝是量化到零”在操作上的含义。
- 能并列写出 OBS 与 OBQ 的重要性分数。
- 能并列写出两者的最优补偿公式。
- 能通过令 证明评分与补偿都退化为 OBS。
前置与衔接
上一课得到 OBS 的两个结果:
它们都围绕同一个硬约束:把 从当前值移动到 。
本课只改变目标值:不一定移动到零,也可以移动到某个可表示的量化值 。
核心讲解
1. OBC 与 OBQ 不是同一个缩写
课程板书提到 OBC 论文中的统一视角。
这里应区分:
- OBC(Optimal Brain Compression):把二阶剪枝与量化放进同一压缩框架;
- OBQ(Optimal Brain Quantization):该视角下的逐权重量化方法。
两者关系密切,但讨论具体的量化评分与补偿公式时,应使用 OBQ。
OBS 与 OBQ 都逐次处理一个权重、补偿其余权重并维护逆 Hessian;差别在于目标值是 0 还是量化值 q_i。
原视频 · 00:00 ↗OBS 与 OBQ 的共同流程是:
- 选择一个当前最适合处理的权重;
- 把它固定到目标值;
- 调整其余权重以补偿输出或损失变化;
- 维护后续选择所需的曲率信息;
- 继续处理下一个权重。
2. 剪枝就是目标值固定为零的量化
一般量化把浮点权重 映射到量化集合中的值 :
若定义特殊的映射
那么所有被处理权重的目标值都是零。
这在参数值层面就是剪枝。
若把量化映射固定为 quant(w)=0,量化动作就退化为把权重剪成零。
原视频 · 00:20 ↗“剪枝是特殊量化”不是说两种工程实现的稀疏存储、内核或加速方式相同。
它指的是二阶约束优化中的目标值关系。
3. OBQ 的约束只比 OBS 多一个 qᵢ
沿用“新权重等于旧权重加变化量”的记号:
把第 个权重量化到 ,约束为
也就是
与 OBS 相比,只是把原来的 换成了 。
对应的约束二次优化为
4. OBQ 重要性分数推广“到零距离”
重复上一课的拉格朗日推导,可得最小目标增量
OBQ 的重要性分数为 1/2·(w_i−q_i)²/[H⁻¹]_ii,它把 OBS 中到零的距离推广为到目标量化值的距离。
原视频 · 01:00 ↗与 OBS 对比:
二者分母完全相同,分子表达不同的目标距离:
- OBS:;
- OBQ:。
因此重要性不仅由权重本身大小决定,还由它离可选量化值有多远决定。
5. 令 qᵢ=0,评分公式退化为 OBS
将 代入:
所以两种方法会给候选权重相同的局部代价。
不过,和“OBD 是特殊 OBS”的证明一样,只比较评分还不够。
还要检验处理该权重后,其他权重怎样补偿。
6. 先固定 Δw 的符号约定
不同资料可能把变化量定义成
或相反方向。
符号会随定义变化,但最终新权重和损失增量不应变化。
板书明确 Δw=w−w₀ 的记号约定;推导时需始终用同一新旧权重方向解释补偿符号。
原视频 · 01:40 ↗本课统一采用
于是目标坐标必须满足
7. OBQ 补偿公式也只是替换目标距离
最优变化向量为
其第 个坐标为
所以更新后正好得到
其余坐标则沿 第 列补偿。
8. 令 qᵢ=0,补偿公式也退化为 OBS
代入 :
OBQ 补偿式中的扰动幅度由 w_i−q_i 决定;令 q_i=0 后,评分与补偿同时退化为 OBS。
原视频 · 02:00 ↗现在两个层面都已吻合:
- 候选评分相同;
- 处理候选后的完整权重变化相同。
因此在这一二阶逐权重框架内,OBS 确实是 OBQ 在 时的特殊情形。
9. 统一视角能帮助什么
把剪枝和量化放在同一视角,可以把核心问题统一为:
剪枝的目标集合通常只含零;量化的目标集合含若干离散值。
这也解释了为什么两种方法会共享逆 Hessian 分母和补偿方向。
但部署效果仍然不同:
- 稀疏剪枝需要稀疏格式与稀疏计算支持;
- 低比特量化需要量化表示、scale/zero-point 与对应内核;
- 相同的二阶目标关系不等于相同的硬件收益。
跟练与练习
原视频练习
编者练习
设 、、。分别计算 OBQ 分数与把同一权重剪为零的 OBS 分数。
查看参考答案
OBQ 分数为
OBS 分数为
在相同曲率分母下,移动到邻近量化值的局部代价远小于直接移动到零。
编者练习 2
只证明 ,为何还不足以断言两个算法完全退化?
查看参考答案
评分相同只保证当前轮选择候选的标准相同。若处理候选后对其他权重的补偿不同,下一轮的权重状态与评分可能分叉。还必须证明补偿公式在 时也等于 OBS 补偿。
常见误区
- 把 OBC 和 OBQ 混用:OBC 是统一压缩框架,OBQ 是其中的量化方法。
- 认为剪枝与量化的部署效果相同:这里的特例关系针对优化形式,不针对存储和硬件内核。
- 忘记量化目标 :OBQ 分子是 ,不是 。
- 只比较评分,不比较补偿:完整退化需要两部分同时成立。
- 因符号不同判定公式冲突:先检查 定义的是新减旧还是旧减新。
- 认为 qᵢ 必须是零:一般 OBQ 中它是量化集合选出的目标值,零只是特殊情况。
本课小结
- OBC 提供统一压缩视角,OBQ 是具体的二阶逐权重量化方法。
- OBQ 将 OBS 的目标零推广为任意量化值 。
- OBQ 分数为 。
- OBQ 补偿为 。
- 令 后,评分与补偿都退化为 OBS。
- 下一课将看到 GPTQ 怎样把层输出重构误差写成类似的二次型。
主题讲解 · 03:21
GPTQ 的层重构目标如何变成逐行二次型
学习目标
- 能写出 GPTQ 使用的层输出重构目标及其矩阵形状。
- 能用 Frobenius 范数与 trace 恒等式改写目标。
- 能解释 为什么由校准激活决定。
- 能推导 下的二次型形式。
- 能说明 trace 如何把矩阵目标拆成逐输出行的二次型之和。
- 能区分该曲率代理与完整任务损失的 Hessian。
前置与衔接
前两课从局部二阶损失模型推导了 OBS 和 OBQ。
GPTQ 看起来从另一个目标出发:量化权重后,尽量保持某一层在校准数据上的输出不变。
本课要证明,这个矩阵重构目标也能改写成与 OBS 相似的二次型形状。
相似的是代数结构,不是说两者优化的原始目标完全相同。
核心讲解
1. 先固定矩阵形状
采用课程板书的右乘约定:
这里:
- 是输出通道数;
- 是输入通道数;
- 是校准样本或 token 位置数;
- 是该线性层的输出。
量化前权重为 ,量化后权重为 。
定义
因为后续目标会平方,所以把差定义成相反方向也得到同一数值;但一篇推导中必须保持一致。
GPTQ 的层输出重构误差可借助 Frobenius 范数与 trace 恒等式改写成逐行二次型。
原视频 · 00:00 ↗2. GPTQ 关注层输出重构误差
课程给出的目标是
利用分配律:
所以目标化为
GPTQ 以 ‖WX−ŴX‖²_F 衡量量化前后该层在校准激活上的输出差异。
原视频 · 01:20 ↗这不是直接比较 与 的元素距离。
同一个权重误差 作用在不同激活 上,输出误差可能很不一样。
因此 GPTQ 的目标是数据感知的。
3. Frobenius 范数平方等于 trace
对任意矩阵 :
恒等式 ‖A‖²_F=Tr(AAᵀ) 把所有矩阵元素的平方和转成 trace。
原视频 · 01:40 ↗原因是 的第 个对角元素为
而 trace 再把所有对角元素相加。
令 ,得到
4. 展开转置后出现 activation Gram
根据
有
因此
令 ΔW=W−Ŵ 后,‖ΔWX‖²_F=Tr(ΔWXXᵀΔWᵀ),激活通过 XXᵀ进入曲率代理。
原视频 · 02:00 ↗是输入激活的 Gram 矩阵。
它描述输入维度在校准数据上的二阶相关性:
- 对角元素是各输入维度的平方能量;
- 非对角元素反映输入维度之间的相关。
这也是 GPTQ 目标具有“曲率感知”结构的来源。
5. 定义 H=2XXᵀ 恢复 1/2 形式
为了与经典二次型统一,定义
于是
目标可以写为
这里的 确实是该行级二次重构目标关于权重误差的 Hessian。
但它不是整个网络任务损失关于全部模型参数的精确 Hessian。
更稳妥的表述是:它是由校准激活得到的层重构曲率矩阵或 Hessian 代理。
6. 按输出行拆分 ΔW
把 写成行向量堆叠:
其中每个
矩阵乘积
的第 项为
把 ΔW 按输出行拆分后,1/2·Tr(ΔWHΔWᵀ) 分解为各行独立的二次型之和。
原视频 · 02:20 ↗完整矩阵包含不同行之间的交叉项,但 trace 只取对角项。
7. trace 把矩阵目标化成逐行求和
因此
trace 只汇总乘积矩阵的对角项,得到 1/2·Σ_r Δw_rHΔw_rᵀ。
原视频 · 02:40 ↗每一项
与 OBS 中的向量二次型
形状相同;差别只是这里采用行向量记号。
于是 GPTQ 可以按输出行处理量化误差,并在每一行内利用相同的曲率矩阵 。
8. “类似 OBS”到底指什么
相似点包括:
- 目标都是权重变化的二次型;
- 都由一个曲率矩阵对不同输入方向加权;
- 非对角项都表达坐标之间的耦合;
- 固定一个权重后,可以通过调整其他权重补偿误差。
不同点包括:
- OBS 从局部任务损失近似出发;
- 本课的 GPTQ 形式从线性层输出重构误差出发;
- GPTQ 的 由校准激活 直接构造;
- 矩阵目标因 trace 自然拆成多个输出行。
因此不能把“同形”误写成“同一个目标”。
9. 校准数据为什么重要
若某个输入方向在 中能量很大,沿该方向的权重误差会被更强地惩罚。
若两个输入维度高度相关, 的非对角项会很大,量化一个坐标时就可能通过另一个坐标补偿。
更换校准样本会改变 ,也会改变 与量化误差的优先级。
所以 GPTQ 的结果不仅由原始权重决定,也由校准分布决定。
跟练与练习
原视频练习
编者练习
设 分别从 和 计算目标,并验证二者相等。
查看参考答案
,所以直接计算得到
另一方面,,因此
编者练习 2
若 有显著非对角元素,这对量化某一个输入维度对应权重后的补偿意味着什么?
查看参考答案
它表示输入维度之间在校准数据上相关。量化一个坐标产生的输出误差可能通过调整相关坐标来部分补偿,因此逐坐标误差不应被视为完全独立。
常见误区
- 把 GPTQ 误写成其他缩写:本课方法名是 GPTQ。
- 把 Frobenius 范数当成普通求和:这里使用的是所有元素平方和再开方;目标取其平方。
- 忘记转置顺序反转:。
- 把 H 说成完整任务损失 Hessian:这里 来自层输出重构目标。
- 忽略矩阵朝向:本课采用 ,若代码采用 ,形状与 Gram 矩阵写法要相应调整。
- 认为 trace 会保留所有行间交叉项:trace 只取最终乘积矩阵的对角元素。
- 把“类似 OBS”理解成“与 OBS 完全相同”:代数形状相同,不代表原始优化目标和工程流程完全相同。
本课小结
- GPTQ 以 衡量量化前后的层输出重构误差。
- 定义 ,目标成为 。
- Frobenius/trace 恒等式将其改写为 。
- 定义 后,目标成为 。
- trace 最终把它拆成 。
- 下一课将把 magnitude pruning、OBD、OBS 与 OBQ 的重要性分数放入同一条特例链。
主题讲解 · 01:45
从 OBQ 到权重大小剪枝的特例链
学习目标
- 能统一解释四种方法中“重要性分数”的含义。
- 能写出 magnitude pruning、OBD、OBS 与 OBQ 的评分公式。
- 能说明 如何让 OBQ 退化为 OBS。
- 能说明对角 Hessian 如何让 OBS 退化为 OBD。
- 能说明各向同性 Hessian 如何让 OBD 排序退化为按权重绝对值排序。
- 能区分“评分排序等价”和“完整工程实现等价”。
前置与衔接
此前各课依次得到:
本课把这些公式与最简单的 magnitude pruning 放在同一条假设链上。
核心讲解
1. 先统一“重要性”的方向
这里的分数表示:强制改变第 个权重后,局部目标预计最少增加多少。
因此:
- 分数越大,改变该权重的代价越高,权重越重要;
- 分数越小,越适合作为下一处理或剪枝候选。
magnitude pruning、OBD、OBS 与 OBQ 形成逐步增加结构假设的特例链。
原视频 · 00:00 ↗“选最小分数剪”与“分数越大越重要”是同一件事的两个说法,不能把方向倒过来。
重要性分数表示移动或置零某个权重预计造成的目标增量;分数越大,越不应优先修改。
原视频 · 00:20 ↗2. 最一般的一端:OBQ
在这四个公式中,OBQ 允许第 个权重移动到一般量化值 :
它同时考虑:
- 当前权重到目标量化值的距离;
- 完整曲率耦合下其他权重的补偿能力。
在比较候选时, 也可能随候选权重而不同,例如取其邻近量化格点。
3. 第一层特例:量化目标固定为零
令
则
在 OBQ 分数中令目标量化值 q_i=0,即得到 OBS 的置零权重评分。
原视频 · 00:40 ↗这一步施加的是目标值假设:从一般离散量化值缩小到零。
它没有对 Hessian 的结构做任何简化。
4. 第二层特例:Hessian 为对角阵
OBS 分数为
若
则
代入得到
这一步施加的是解耦假设:不同权重方向之间没有二阶交叉项。
上一课还证明,在这个条件下 OBS 的跨权重补偿也退化为只把目标坐标置零。
5. 第三层特例:所有方向曲率相同
OBD 分数仍会按每个坐标的曲率 加权:
若进一步假设
则所有候选都有相同曲率:
于是
共同正因子 不影响排序,所以
这正是 magnitude pruning 的排序规则。
H 为对角阵时 OBS 退化为 OBD;进一步令各方向曲率相同,排序只由 |w_i| 决定。
原视频 · 01:00 ↗这里施加的是比“对角”更强的各向同性假设:所有坐标方向曲率完全相同。
6. 四种方法的评分对照
| 方法 | 重要性分数或排序量 | 额外假设 |
|---|---|---|
| OBQ | 一般目标量化值 | |
| OBS | ||
| OBD | 再假设 对角 | |
| magnitude pruning | 再假设 ,只保留排序 |
这张表应从上往下读作“不断增加约束和结构假设”。
越往下,计算越简单,但忽略的信息也越多。
7. 对角不等于各向同性
这是最容易漏掉的一步。
若
它确实是对角阵,但两个方向曲率差异很大。
此时 OBD 分数仍会强烈区分方向,不能只按 排序。
只有所有 都相同,曲率因子才是对所有候选相同的常数。
所以:
但反向一般不成立。
8. 特例关系不自动覆盖所有实现细节
本课主要比较重要性评分的代数退化。
若要断言完整算法轨迹相同,还需核对:
- 是逐个处理还是一次处理整组权重;
- 处理后是否更新 Hessian 或逆 Hessian;
- 是否执行跨权重误差补偿;
- 阈值并列时如何 tie-breaking;
- 稀疏或低比特结果怎样存储与执行。
例如,magnitude pruning 与 OBD 在 下给出相同排序,但一个实现可能全局剪枝,另一个可能逐层设定稀疏度。
排序等价不保证最终稀疏模式和部署速度都相同。
9. 这条链的直觉
OBQ 问:把权重移动到哪个离散目标最便宜?
OBS 固定回答:目标就是零。
OBD 再假设:每个权重方向互不耦合,只需看自己的曲率。
magnitude pruning 最后再假设:所有方向曲率都一样,于是只剩“离零有多远”。
每一步都不是凭空换公式,而是在上一层目标上加入一个明确假设。
跟练与练习
原视频练习
编者练习
给定两个权重 以及对角 Hessian magnitude pruning 与 OBD 会分别优先剪哪个?
查看参考答案
magnitude pruning 只看绝对值,会优先剪 。
OBD 分数为
所以 OBD 反而优先剪 。这个反例说明“对角 Hessian”还不足以让 OBD 退化为 magnitude pruning。
编者练习 2
若 ,按 OBD 分数和按 排序是否会在分数数值上完全相同?
查看参考答案
不会数值相同,但排序相同。OBD 分数是 ,magnitude pruning 使用 。平方和共同正比例因子都是单调变换,不改变非负绝对值的排序。
常见误区
- 把重要性方向写反:分数越小越适合优先剪,越大表示预计损失越高。
- 认为 OBS 到 OBD 只需 H 可逆:关键条件是 对角,而不只是可逆。
- 认为对角矩阵必为 λI:对角元素可以彼此不同,各向同性是更强假设。
- 说 magnitude pruning 分数等于 OBD 分数:在 下通常是排序等价,不是数值相等。
- 忘记 OBQ 的目标值:只有令 才能退化为 OBS。
- 把评分特例当成部署等价:稀疏格式、量化格式和硬件执行仍有本质差异。
本课小结
- 四种方法都在评估改变某个权重的局部代价,分数越小越适合优先处理。
- 时,OBQ 评分退化为 OBS。
- 对角时,OBS 评分退化为 OBD。
- 时,OBD 排序退化为按 排序。
- 这条链展示了计算简化来自哪些额外假设,也提醒我们辨别假设是否真实成立。
- 下一课转向固定掩码微调:剪枝完成后,怎样防止零权重重新生长。
主题讲解 · 03:16
固定剪枝掩码:微调时如何阻止零权重复活
学习目标
- 能把目标稀疏度换算成需要剪掉的权重数量。
- 能用绝对值顺序统计量建立固定二值 mask。
- 能解释普通微调为何会让已置零权重重新变成非零。
- 能写出屏蔽梯度与更新后重新施加 mask 的两种形式。
- 能证明两种形式在理想 SGD 条件下的代数等价。
- 能识别 momentum、weight decay 与优化器状态带来的工程边界。
前置与衔接
前几课关注“剪谁”和“怎样补偿”:magnitude pruning、OBD、OBS、OBQ 都会给出权重的重要性或扰动代价。
剪枝完成后,常常还要微调模型来恢复精度。
如果目标是保持固定的稀疏模式,那么微调不能让已剪位置重新生长。
本课用一个固定二值 mask 把“剪枝一次”变成“整个微调期间持续满足的约束”。
核心讲解
1. 固定掩码流程总览
设权重张量为 ,目标稀疏度为 。
固定支持集剪枝通常包含:
- 计算重要性,本课示例使用 ;
- 按目标稀疏度确定要剪的元素;
- 生成二值 mask ;
- 得到 ;
- 微调每次更新后继续施加同一个 。
固定支持集剪枝先生成二值 mask,再在微调更新中持续施加该 mask,防止已剪权重重新生长。
原视频 · 00:00 ↗这里的“固定”表示 mask 的零位置不改变。
若允许零位置重新生长,那属于动态稀疏训练或 regrowth 设计,是另一类方法。
2. 从目标稀疏度得到剪枝数量
课程使用 、共九个权重的示例。
若目标稀疏度为
则应剪元素数为
九个权重、目标稀疏度 1/3 时,需要按绝对值剪掉三个最小权重。
原视频 · 00:20 ↗若 不是整数,实现需要明确取整规则,并保证最终非零数量与接口定义一致。
“稀疏度”通常指零元素占比,不要和保留率混淆。
3. 剪的是绝对值最小,而不是第三大
magnitude pruning 按
从小到大选择。
要剪三个权重,就应找到第三小的绝对值作为边界,而不是第三大。
课程例子中的绝对值依次为
所以阈值边界是
阈值 ε 应取绝对值顺序统计量;实现中可用 top-k 或 kth-value 类方法避免完整排序。
原视频 · 00:40 ↗在大张量中不一定要完整排序。
top-k、kth-value 或选择算法可以更直接地找到边界。
若边界处存在并列值,仅靠 可能无法保证恰好剪 个;此时需要确定性的 tie-breaking 或直接按索引集合生成 mask。
4. 二值 mask 表达固定支持集
在无并列且要把边界一起剪掉的示例中,可定义
其中 与 形状相同,元素只取 或 。
剪枝结果为
表示逐元素乘法。
二值 mask 保留阈值以上元素;普通微调会让零位置复活,因此每次更新后需重新施加固定 mask。
原视频 · 01:00 ↗的位置属于已剪支持集; 的位置仍可训练。
mask 本身应被持久保存,不能在每一步根据已经变化的权重重新计算,否则支持集会改变。
5. 为什么普通微调会让零权重复活
普通 SGD 更新为
即使某位置当前满足
其梯度也未必为零。
若
更新后该位置立即变成非零。
所以“参数现在为零”不等于“它以后自动保持为零”。
6. 写法一:屏蔽已剪位置的更新
一种概念写法是先屏蔽梯度:
更新式 W_new=W_old−α(∇W⊙M) 把已剪位置的当前梯度置零,但固定稀疏实现仍需考虑优化器状态。
原视频 · 03:00 ↗当 时,当前梯度更新项被置零。
若 的该位置已经为零,理想的无状态 SGD 会继续保持零。
7. 写法二:优化器更新后重新施加 mask
更直接的参数约束写法是
它先执行一次普通更新,再把所有已剪位置投影回零。
若旧权重已满足 W_old=W_old⊙M,则屏蔽梯度更新与先更新再乘 mask 在代数上等价。
原视频 · 02:20 ↗若旧权重已经满足
则由分配律:
所以在这个前提下,两种公式给出相同的新权重。
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
若每步都重新计算
那么某些旧零位置可能恢复,某些旧保留位置可能被新剪。
这不再是固定掩码微调,而是动态更新稀疏拓扑。
两种策略都可能有研究价值,但训练语义不同:
- 固定 mask:恢复精度,同时保持既定稀疏结构;
- 动态 mask:允许连接交换或重新生长,以探索新的稀疏结构。
本课讨论前者。
11. 阈值、mask 与稀疏内核是三层问题
阈值负责决定剪谁。
mask 负责在训练中维持零位置。
真正获得推理加速还需要硬件与内核支持相应稀疏模式。
一个权重张量中有很多零,不代表通用 dense GEMM 会自动变快。
因此应分别验证:
- 数值稀疏度是否正确;
- 微调期间 mask 是否保持;
- 导出格式是否保留稀疏结构;
- 目标运行时是否有匹配的稀疏算子。
跟练与练习
原视频练习
编者练习
设 分别用“屏蔽梯度”和“更新后重掩码”计算 。
查看参考答案
屏蔽梯度:
更新后重掩码:
两者相同,因为旧权重已经满足 。
编者练习 2
若阈值处有四个权重绝对值都等于 ,但目标只允许再剪其中两个,直接使用 有什么问题?
查看参考答案
它会把四个等于阈值的权重全部剪掉,超过目标剪枝数量。应使用带确定性 tie-breaking 的 top-k/索引集合,明确选择其中两个,再由选中索引生成固定 mask。
常见误区
- 把目标稀疏度当保留率:稀疏度 表示三分之一元素为零。
- 说剪第三大权重:magnitude pruning 为达到稀疏度,应选择绝对值最小的一组。
- 按带符号值排序:重要性基线用 ,不是直接比较正负数。
- 认为置零后会天然保持零:普通梯度更新可以立即使它重新非零。
- 每步重新生成 mask:这会改变支持集,不再是固定剪枝微调。
- 只清零 raw gradient 就认为万无一失:momentum、Adam 状态可让已剪位置复活;decoupled weight decay 虽不会单独把精确零变成非零,但也绕过梯度屏蔽路径,应统一在 step 后检查 mask。
- 零很多就等于推理更快:实际加速还依赖稀疏格式、模式与运行时内核。
本课小结
- 目标稀疏度先转换成剪枝数量,再由绝对值顺序统计量确定候选。
- 固定二值 mask 同时表达剪枝结果和微调期间的支持集约束。
- 普通微调会让已剪位置复活,因此必须持续施加 mask。
- 在 的理想 SGD 条件下,屏蔽梯度与 step 后重掩码代数等价。
- 对 momentum、Adam 等有状态更新,step 后重掩码更稳健;严格固定支持时还应处理优化器状态,并检查绕过 raw-gradient hook 的更新路径。
- 本课完成了固定稀疏微调的基础;本单元还有未整理内容,因此暂不生成单元综合稿。
主题讲解 · 02:39
结构化剪掉注意力头后,投影矩阵怎样配套裁剪
学习目标
- 能写出标准多头注意力中 的基准形状。
- 能区分“减少头数”和“缩小单头维度”。
- 能在 记号下判断 Q/K/V 投影与输出投影应裁剪哪个轴。
- 能解释拼接后的头输出为何变窄,以及 怎样恢复 。
- 能把数学矩阵轴映射到 PyTorch
nn.Linear的实际权重存储轴。 - 能区分注意力头剪枝与 MQA。
前置与衔接
前面的剪枝课程主要把单个权重置零。
注意力头剪枝是一种结构化剪枝:删除的是一整组属于同一 head 的 Q/K/V 通道,以及 中与这组通道配套的输入块。
本课用“四个头剪掉两个头”的例子追踪所有形状。
核心讲解
1. 固定行向量矩阵约定
令序列长度为 ,输入为
采用右乘记号:
在标准多头注意力中,若
且 ,则未剪枝时可写成
拼接后的头输出再乘
四头注意力剪掉两头后,Q、K、V 的总宽度减半,单头宽度保持不变,W_O 再把拼接输出投影回 d_model。
原视频 · 00:00 ↗2. 剪枝前四个投影都可看作方阵
视频示例设原来有四个头:
Q、K、V 的总宽度都是
所以四个头对应四个连续通道块。
标准多头注意力中,W_Q、W_K、W_V 与 W_O 在未剪枝时都可视为 d_model×d_model 的投影。
原视频 · 00:20 ↗头剪枝要删除完整块,而不是在每个头内部零散删除若干标量。
3. 剪掉两头不改变 dₖ
保留头数为
单头维度仍为原来的 ,所以保留头的总宽度为
这点非常关键:
- 变的是 head count:;
- 不变的是 head dimension:。
若把 也除以二,会重复缩减容量,并且不再是视频中的头剪枝。
4. Q/K/V 投影删除输出列
在 的记号下, 的列对应投影输出通道。
删除两个头对应的列块后:
同理:
于是
板书用“砍掉右半部分”示意删除两头;若实际保留的不是前两个头,则应按 head index 选择相应通道块,而不是固定裁右半边。
5. W_O 要删除与之配套的输入行
拼接输出进入 之前,特征宽度从 变成 。
因此 的输入轴必须同步裁剪:
在 XW 的行向量约定下,Q/K/V 投影删除被剪头对应的输出列,而 W_O 删除对应的输入行。
原视频 · 00:40 ↗视频用“保留上半部分”表示保留前两个头对应的行块。
Q/K/V 与 的裁剪轴不同,是因为它们位于 head 计算的两侧:
- Q/K/V 投影把 映射到 head 通道;
- 把 head 通道映射回 。
6. 保留头仍独立计算注意力
把 按头拆成
每个保留头继续独立完成:
保留下来的每个头仍独立计算 Q_hK_hᵀ、softmax 与 A_hV_h;改变的是头数,不是单头维度。
原视频 · 01:20 ↗每个 的形状仍是
因此剪枝没有改变单头内部的 attention matrix 形状 。
它只减少需要计算和保存的头数。
7. 拼接输出先变窄,再由 W_O 恢复
两个头拼接:
此时
再乘裁剪后的输出投影:
形状为
两个剩余头拼接得到宽度 d_model/2 的 O′,再乘裁剪后的 W_O∈R^{d_model/2×d_model} 恢复模型宽度。
原视频 · 01:40 ↗因此该 attention block 的外部接口仍是 。
残差连接和下一层都不需要随头数缩窄。
8. 参数量怎样变化
忽略 bias,原四个投影共含
个参数。
保留一半头后:
- 三个输入投影各有 ;
- 输出投影有 。
合计
在这个理想例子中,注意力投影参数量减半。
端到端速度还会受 kernel、batch、序列长度和剩余模块影响,不能直接断言整层或整模型也加速两倍。
9. PyTorch 权重存储轴与数学写法相反
nn.Linear(in_features, out_features) 的权重通常存成
前向内部等价于乘权重转置。
因此在实际张量上:
- q/k/v projection 常删除权重的行;
- output projection 常删除权重的列。
这与前文 数学记号中的“QKV 删列、 删行”并不矛盾,只是存储转置了。
具体 Hugging Face 模型类、融合 QKV 布局和版本可能不同;实施前必须以当前模块的真实 shape 与 forward 为准,不能机械套轴编号。
10. 注意力头剪枝不是 MQA
注意力头剪枝的示例同步减少选定的 Q、K、V 头:
MQA(Multi-Query Attention)则保留多个 Q 头,但让所有 Q 头共享一组 K、V:
注意力头剪枝同步减少 Q、K、V 的选定头;MQA 则保留多个 Q 头,只让 K、V 共享单个头。
原视频 · 02:00 ↗MQA 主要减少 KV projection 与 KV cache,不等同于从已有 MHA 中同步删除 Q/K/V 头。
对 GQA、MQA 做结构剪枝时,Q 头与 KV 头的分组约束也与标准 MHA 不同。
跟练与练习
原视频练习
编者练习
设 剪掉 3 个头后,在 记号下写出 与 的形状。
查看参考答案
剩余头数 ,保留总宽度为
因此
K、V 投影与 同形。
编者练习 2
若 PyTorch 中 q_proj.weight.shape == [768, 768],保留 9 个头后应把哪个轴缩到 576?
查看参考答案
nn.Linear 权重按 [out_features, in_features] 存储。q_proj 要减少输出通道,所以第 0 轴缩到 576,得到 [576, 768]。这与数学记号 互为转置布局。
常见误区
- 把单头维度也除以二:本例只减少头数, 不变。
- 只裁 Q/K/V,不裁 W_O:拼接宽度变化后,输出投影输入轴必须同步调整。
- 在所有矩阵上裁同一物理轴:数学 与
nn.Linear存储的轴方向不同。 - 认为 W_O 把头数重新变回四个:它只恢复外部特征宽度,不重新创建被剪头。
- 把头剪枝等同于 MQA:MQA 保留多个 Q 头并共享单组 K/V。
- 认为参数减半就必然端到端加速两倍:还要考虑其他模块和实际 kernel 效率。
本课小结
- 头剪枝删除完整 Q/K/V 通道块,并同步删除 中对应输入块。
- 四头剪两头时,保留总宽度从 变为 ,但 不变。
- 每个剩余头继续独立计算,拼接后的 再由 投影回 。
- 实现时必须先固定矩阵约定,再映射到框架真实存储轴。
- 头剪枝与 MQA 的 Q/K/V 头数关系不同,不能混用裁剪规则。
单元综合
从幅值置零到二阶补偿:剪枝、量化与结构化裁剪的统一视角
单元能力目标
完成本单元后,应能把剪枝和量化都视为“对权重施加离散约束,再评估并补偿局部损失”的问题。
具体需要做到:
- 区分权重数值置零、稀疏存储和硬件加速;
- 从二阶 Taylor 展开推导 OBD 的重要性分数;
- 说明 OBS 怎样利用 Hessian 非对角耦合补偿被剪权重;
- 推导 OBD、OBS 与 OBQ 的退化关系;
- 把 GPTQ 层重构误差写成逐行二次型;
- 设计固定 mask 微调,防止零权重复活;
- 区分非结构化权重剪枝与注意力头结构化剪枝;
- 用 shape 检查 Q/K/V 与输出投影的配套裁剪。
概念连接
1. 权重置零在函数图上删除一条贡献
线性层写为
表示输入 到输出 的加权连边。
若
则该项对任意输入都没有贡献,在函数图上等价于删除这条边。
幅值剪枝常构造二值 mask:
2. 数值零不自动变成性能收益
必须分开三层:
- 数值层:张量中某些元素等于零;
- 表示层:使用 CSR、block sparse 或其他格式跳过零;
- 执行层:目标硬件与 kernel 真正利用该稀疏结构。
稠密 GEMM 通常仍会读取并乘以数值零。
所以“剪掉 50% 权重”不自动等于计算量或延迟减半。
3. 幅值剪枝隐含同曲率假设
幅值剪枝按
排序,优先删除较小权重。
它隐含地认为不同坐标对损失的敏感度相近。
如果一个小权重位于高曲率方向,置零可能造成很大损失;一个较大权重位于平坦方向,反而可能更安全。
二阶方法用 Hessian 显式描述这种方向敏感度。
4. OBD 从多元 Taylor 展开出发
在当前权重 附近:
OBD 的核心假设是:
- 当前点近似驻点,;
- 局部二次近似足够准确;
- Hessian 可近似为对角阵。
若只置零第 个权重:
对角 Hessian 下得到重要性分数
5. 圆形山谷让 OBD 退化为幅值排序
若局部曲率各向同性:
则
所有坐标共享同一个正常数,按 OBD 分数排序等价于按
排序。
幅值剪枝可以看成在“局部山谷近似圆形”时的曲率方法特例。
6. OBS 保留权重间耦合
OBS 不再假设 Hessian 对角,而是求解:
满足剪枝约束
使用 Lagrange 乘子可得最优补偿:
它不仅把 置零,还允许其他权重沿 Hessian 耦合方向协同调整。
7. OBS 的最小局部损失
代回目标:
算法优先处理分数小的权重。
与 OBD 相比,分母 汇总了完整曲率耦合,而不是只看 。
这带来更高计算与存储成本,也依赖 Hessian 可逆或稳定近似。
8. 对角 Hessian 下 OBS 完整退化为 OBD
若
则
OBS 分数变为
同时
补偿只剩
所以评分与补偿两层都退化。
9. OBQ 把“置零”推广到任意量化值
OBS 的目标值固定为 0。
OBQ 让第 个权重移动到量化格点 :
最优补偿为
最小局部损失为
令 ,评分与补偿都回到 OBS。
10. 特例链揭示每次简化付出的假设
统一链条为:
每向右一步,计算更简单,但丢弃更多结构:
- 任意量化目标变成零;
- 权重耦合被忽略;
- 坐标曲率差异被忽略。
选择方法时应判断这些假设在目标层是否近似成立。
11. GPTQ 从层输出重构误差定义目标
设校准激活矩阵为 ,原权重为 ,量化权重为 。
GPTQ 式层重构目标为
定义
则
令
得到
12. trace 把重构目标拆成逐行二次型
把 的第 行记为 :
同一个输入侧曲率代理 作用于每个输出行。
这里的 是层输出重构目标的 Hessian 或曲率代理,不应无条件等同于完整模型训练损失的全局 Hessian。
13. 剪枝后的 mask 是支持集约束
达到目标稀疏度后,用固定 mask
表示哪些位置允许非零。
微调时若普通优化器直接更新 ,被剪位置可能收到非零梯度并重新生长。
严格支持集约束要求持续满足
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 中,每个头宽度为 ,头数为 ,总拼接宽度为
若保留头集合 :
- Q/K/V 投影删除被剪头对应的输出通道块;
- 保留头继续独立计算 attention;
- 拼接宽度变为 ;
- 输出投影 删除对应输入行或列块,具体取决于矩阵存储约定;
- 最终输出维仍可保持 。
四头剪两头时, 不变,总中间宽度减半。
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. 审计二阶方法的假设
依次检查:
- 是否接近驻点;
- 二次近似作用在哪个损失与数据集;
- Hessian/曲率代理如何构造;
- 是否对角、分块或阻尼;
- 逆或更新是否数值稳定;
- 每次量化/剪枝后是否更新状态。
综合训练
编者练习
设 ,;另一个权重 ,。计算 OBD 分数并比较 magnitude 排序。
查看参考答案
,。magnitude 会先剪 ,因为 ;OBD 会先剪 ,因为它位于更平坦方向。该例说明各向异性曲率下,小权重不一定更安全。
编者练习 2
已知 、,候选量化值 。计算 OBQ 局部最小损失;若改为剪枝到 0,损失是多少?
查看参考答案
量化误差为 ,所以 。剪枝时 ,得到 。同一曲率下,移动到更近的量化格点局部代价更小。
编者练习 3
一个 8-head MHA 的 ,每头 。剪掉 3 个头后,写出保留拼接宽度,以及输出投影需要怎样配套修改。
查看参考答案
保留 5 个头,拼接宽度为 。Q/K/V 投影删除三个头对应的输出通道块; 必须删除这三个头对应的输入块,使其从 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 关系。