强度剪枝依据一个简单前提:模型参数(通常是权重)的绝对值越小,对模型输出的贡献越不明显,因此可以在对性能影响很小的情况下将其移除。此方法旨在模型权重矩阵中直接生成稀疏性。
主要观点:小权重,小影响?
强度剪枝背后的设想源于神经网络计算输出的方式。在许多运算中,特别是矩阵乘法 (Y=WX+b),输出 Y 是输入 X 的加权和,其中权重是 W 的元素。如果特定权重 wij 的强度接近零,则无论输入 xj 是多少,它对相应输出元素 yi (特别是项 wijxj)的贡献也将很小。假定移除这样的权重(将其设为零)对输出的改变不如移除大强度权重那样剧烈。
尽管这是一种启发式方法,但在实践中,对于LLM等过参数化模型而言,它通常表现出人意料地好,因为这类模型中的许多权重确实可能是冗余或贡献微乎其微的。
一次性剪枝:一种直接形式
最基本的实现是一次性剪枝。它包含以下步骤:
- 训练: 将密集LLM训练到收敛,或从预训练模型开始。
- 排序: 计算目标层或整个模型中每个权重 w 的绝对强度 ∣w∣。
- 设置阈值: 确定剪枝阈值。这可以是一个全局阈值,或者更常见的是由目标稀疏度 S 定义。对于目标稀疏度 S,找到权重强度的 (S×100) 百分位数,所有强度低于此值的权重都设为零。
- 应用掩码: 创建一个二进制掩码 M,其中如果 ∣wij∣ 低于阈值则 Mij=0,否则 Mij=1。然后,剪枝后的权重 Wpruned 为 Wpruned=W⊙M,其中 ⊙ 表示逐元素乘法。
这种方法速度快,但可能过于激进。同时移除大部分权重可能会明显降低模型准确性,有时是不可恢复的。
迭代剪枝:一种更循序渐进的方式
为减轻一次性剪枝带来的准确性下降,迭代强度剪枝 (IMP) 普遍使用。IMP 不会一次性移除所有目标权重,而是遵循一个循环:
- 剪枝: 移除一小部分当前活跃的、强度最低的权重(例如,剩余权重的5-10%)。
- 微调: 在原始训练数据或相关子集上对剪枝后的模型进行有限轮次的再训练(微调)。这使得剩余权重能够适应并补偿被移除的权重,从而恢复损失的准确性。
- 重复: 继续这种剪枝-微调循环,直到达到期望的整体稀疏度。
迭代强度剪枝 (IMP) 流程:剪除小部分权重,随后进行微调循环。
这种循序渐进的移除和交错进行的微调,与一次性剪枝相比,通常能在更高稀疏度下带来更好的准确性。
IMP中的微调策略
微调步骤对于迭代剪枝的成功非常重要。重要的考量包括:
- 学习率: 通常使用比初始预训练学习率更小的学习率。这有助于缓慢调整剩余权重,而不引起不稳定。学习率方案(例如,逐渐衰减)也可能有益。
- 持续时间: 微调通常需要的训练轮数少于原始训练。目标是恢复准确性,而非从头开始训练。每个周期的最佳轮数通常通过经验确定。
- 掩码处理: 在微调过程中,被剪枝权重(设为零的权重)的梯度必须保持为零。只有未剪枝的权重应得到更新。这通常通过在优化器步骤之前对梯度应用剪枝掩码来实现。
确定稀疏度和范围
目标稀疏度是一个重要的决定。更高的稀疏度会带来更小的模型和可能更快的推理速度(如果得到硬件/软件支持),但通常以准确性为代价。这种关系通常是非线性的:初期的剪枝可能影响很小,但达到某个点后准确性会急剧下降。
迭代强度剪枝过程中,随着稀疏度的增加,准确性会下降。性能初期通常保持稳定,但在更高稀疏度下可能会明显下降。
另一个选择是剪枝的范围:
- 全局剪枝: 对整个模型中的所有权重进行排序,并应用单一阈值。
- 层级剪枝: 对每个层独立地对权重进行排序和剪枝,可能对每层应用不同的稀疏度。这有时可以产生更好的结果,因为它允许使稀疏度适应不同层的敏感度。
优点和缺点
优点:
- 简单性: 主要想法易于理解,且相对容易实现,特别是一次性版本。
- 有效性: 可以实现大幅模型尺寸减小,通常伴随可接受的准确性损失,特别是在使用迭代方法时。
- 通用性: 适用于各种模型架构和包含权重参数的层。
缺点:
- 非结构化稀疏性: 标准强度剪枝通常导致不规则的、细粒度的稀疏模式(单个权重被置零)。在没有针对稀疏计算设计的专用库或硬件支持的情况下,这通常无法在通用硬件(如GPU或CPU)上直接转化为明显的延迟改进。我们将在后面讨论结构化剪枝,其针对此情况。
- 计算成本: 迭代剪枝需要重复的微调循环,这可能计算开销大且耗时,特别是对于非常大的模型。
- 强度 ≠ 重要性: 强度低总是意味着重要性低的假定是一种经验法则。一些低强度权重在微调过程中可能会变得重要,或者某些结构可能依赖于小权重组合。
强度剪枝是LLM优化工具集中的一项基本方法。尽管它在减小模型尺寸方面有效,但其对推理速度的影响通常是间接的,除非搭配特定的硬件或软件支持。在考虑更复杂的结构化剪枝方法或训练期间动态调整稀疏性的方法之前,理解其工作方式和迭代优化流程非常重要。