核心思想

原始训练是:

没有任何约束,权重想取什么值就取什么值。

Pruning 变成了一个带约束的优化问题:

关键符号

  • 范数,含义是矩阵里非零元素的个数
  • 约束 意味着:剪完之后最多只能保留 N 个非零权重
  • 目标不变:在这个稀疏约束下,损失函数仍然尽量小

约束优化的疑问

  • 这个约束的梯度是怎么优化的?L0 范数的梯度几乎处处为零,不可导,没法用梯度下降。
  • 实际工程上有两种替代方案:
  1. 用 L1 范数近似,可导,会把小权重压向零
  2. Magnitude-based Pruning

Magnitude-Based Pruning

这是实际上大多数 pruning 工作的做法。

原理

核心假设:

一个权重的绝对值越小,它对输出的贡献越小,可以安全地置零。

形式上,给每个权重 定义重要性分数:

然后设定一个阈值 ,把所有 的权重置零:

具体流程

  1. 正常训练,得到收敛的权重 W
  2. 计算每个权重的重要性分数,最简单就是 ,也有用平方的
  3. 选阈值,生成 mask
  4. Fine-tune,但 mask 固定。在剩余权重上继续训练,被置零的权重在反向传播中梯度也被 mask 掉,不允许它们“复活”。

选阈值有两种方式:

  1. 指定阈值 ,把所有分数小于 的置零
  2. 指定稀疏率 (更常用):比如要剪掉 70% 的权重,就把最小的 70% 直接 mask 掉

mask 矩阵 是一个 0/1 矩阵:

实际权重变为:

疑问

  • 权重小等于不重要吗?
  • 实际上应该考虑权重和实际激活值的乘积,甚至是对 loss 的梯度信息
  • 于是有了后续的高级方法:
  1. gradient × weight:
  2. Hessian-based:考虑二阶信息,代表工作是 OBS(Optimal Brain Surgeon)

工程应用分类

理论 FLOPs实际加速原因
结构化剪枝下降真实加速tensor shape 变小,GEMM 直接受益
非结构化剪枝下降几乎没有GPU 不擅长通用稀疏计算
Semi-structured下降~2xNV 有专用稀疏 Tensor Core