核心思想
原始训练是:
没有任何约束,权重想取什么值就取什么值。
Pruning 变成了一个带约束的优化问题:
关键符号
- 是 范数,含义是矩阵里非零元素的个数
- 约束 意味着:剪完之后最多只能保留 N 个非零权重
- 目标不变:在这个稀疏约束下,损失函数仍然尽量小
约束优化的疑问
- 这个约束的梯度是怎么优化的?L0 范数的梯度几乎处处为零,不可导,没法用梯度下降。
- 实际工程上有两种替代方案:
- 用 L1 范数近似,可导,会把小权重压向零
- Magnitude-based Pruning
Magnitude-Based Pruning
这是实际上大多数 pruning 工作的做法。
原理
核心假设:
一个权重的绝对值越小,它对输出的贡献越小,可以安全地置零。
形式上,给每个权重 定义重要性分数:
然后设定一个阈值 ,把所有 的权重置零:
具体流程
- 正常训练,得到收敛的权重 W
- 计算每个权重的重要性分数,最简单就是 ,也有用平方的
- 选阈值,生成 mask
- Fine-tune,但 mask 固定。在剩余权重上继续训练,被置零的权重在反向传播中梯度也被 mask 掉,不允许它们“复活”。
选阈值有两种方式:
- 指定阈值 ,把所有分数小于 的置零
- 指定稀疏率 (更常用):比如要剪掉 70% 的权重,就把最小的 70% 直接 mask 掉
mask 矩阵 是一个 0/1 矩阵:
实际权重变为:
疑问
- 权重小等于不重要吗?
- 实际上应该考虑权重和实际激活值的乘积,甚至是对 loss 的梯度信息
- 于是有了后续的高级方法:
- gradient × weight:
- Hessian-based:考虑二阶信息,代表工作是 OBS(Optimal Brain Surgeon)
工程应用分类
| 理论 FLOPs | 实际加速 | 原因 | |
|---|---|---|---|
| 结构化剪枝 | 下降 | 真实加速 | tensor shape 变小,GEMM 直接受益 |
| 非结构化剪枝 | 下降 | 几乎没有 | GPU 不擅长通用稀疏计算 |
| Semi-structured | 下降 | ~2x | NV 有专用稀疏 Tensor Core |