大模型剪枝系列——基于权重大小剪枝
前文(大模型剪枝系列——基于梯度的剪枝-CSDN博客)探讨了基于梯度的剪枝方法。现在,不妨回归本源,剖析剪枝领域中最古老、最简单,却也最持久、在工业实践中占据核心地位的方法——基于权重大小的剪枝 (Magnitude-Based Pruning)。
尽管从理论上看,梯度剪枝似乎更为“深刻”,但基于权重大小的剪枝凭借其无可比拟的简单性、低成本和有效性,成为了几乎所有模型压缩流程的起点和基石。
1. 定义
基于权重大小的剪枝(也称幅值剪枝),是一种假设参数的绝对值大小与其在模型中的重要性成正比,并据此移除绝对值最小的参数的剪枝方法。
- 核心假设 (The Lottery Ticket Hypothesis的启示): “一个参数的绝对值越大,它对模型的输出影响就越大”。这个简单直观的假设,构成了整个方法的理论基石。一个权重经过充分训练后,如果其值依然非常接近于零,我们有理由相信它对模型最终的决策贡献甚微,可以被安全地移除。
- 操作对象: 模型中所有的可训练参数,主要是权重矩阵(weight)和偏置(bias)。
- 结果: 根据剪枝的粒度,可以产生非结构化或结构化的稀疏模型。
2. 技术要素:简单背后的考量
尽管思想简单,但实施过程中仍有几个关键的技术要素需要决策:
- 重要性度量 (Importance Measure):
- L1范数 (绝对值): |w|。这是最经典、最常用的度量,直接衡量单个权重的大小。
- L2范数 (平方和的根): 对于结构化剪枝,我们需要评估一整个结构(如一个神经元或一个注意力头)的重要性。此时,通常会计算该结构内所有权重的L2范数 sqrt(∑w²)。一个L2范数很小的结构,意味着其内部所有权重都普遍很小。
- 稀疏度类型 (Sparsity Type):
- 全局剪枝 (Global Pruning): 在整个模型的所有权重中,统一进行排序和剪枝。例如,要达到50%的稀疏度,就移除整个模型中绝对值最小的那一半权重。全局剪枝通常效果更好,因为它允许模型自动在不同层之间分配稀疏度(例如,更重要的层保留更多参数)。
- 局部剪枝 (Local Pruning): 在每一层内部独立进行排序和剪枝。例如,为每一层都设定一个50%的稀疏度目标。这种方法更简单,但可能不是最优的,因为它强制所有层都承受相同的压缩率。
- 稀疏度调度 (Sparsity Schedule):
- 一次性剪枝 (One-shot): 训练结束后,一次性剪掉所有目标参数。这种方法速度快,但对模型性能损伤较大。
- 迭代剪枝 (Iterative): “剪一点 → 微调一下 → 再剪一点 → 再微调一下”。这是效果最好、也是最主流的方法。通过渐进式地增加稀疏度,并给予模型充分的“恢复时间”(微调),可以在极高的稀疏度下保持优异的性能。
3. 技术路径:主流的迭代剪枝流程
当前最被广泛认可和使用的高效路径,正是 迭代式幅值剪枝 (Iterative Magnitude Pruning, IMP)。
- 训练 (Train): 正常、充分地训练一个稠密的源模型,直到其收敛。
- 剪枝 (Prune):
- 根据选择的稀疏度类型(推荐全局)和度量(L1或L2范数),计算每个参数/结构的重要性分数。
- 设定一个剪枝率(例如,移除全局最低的20%的权重),将这些权重置零(形成一个剪枝掩码 a mask)。
- 微调 (Fine-tune):
- 冻结稀疏结构: 将剪枝掩码应用到模型上,确保那些被置零的权重在后续训练中永远保持为零。
- 恢复训练: 在原始训练数据上,用一个较小的学习率对“幸存”的权重进行几个周期的微调,让它们有机会补偿被移除权重的功能。
- 迭代 (Iterate): 重复步骤2和3,每次都提高一点剪枝率,直到达到最终的目标稀疏度(例如,80%)。
4. 应用场景
基于权重大小的剪枝几乎是所有模型压缩任务的**“第一站”**。
- 通用模型压缩: 任何希望减小模型尺寸、降低内存占用的场景,都可以先尝试迭代式幅值剪枝。它是最简单、最可靠的基线(Baseline)方法。
- 学术研究与分析: “彩票假设” (The Lottery Ticket Hypothesis) 这一里程碑式的研究,就是完全基于迭代式幅值剪枝进行的。它揭示了深度网络中存在着极其稀疏的、性能优越的“中奖子网络”。
- 作为其他剪枝方法的基础: 许多更复杂的剪枝方法(如RigL),在其“剪枝”步骤中,仍然采用的是简单高效的幅值剪枝。
5. 技术挑战、问题与解决方案
- 挑战1: 理论与实践的脱节(“死重”问题)。
- 问题: 核心假设“小权重=不重要”并非总是成立。一个权重在训练后期可能数值很小,但它在训练早期可能起到了关键的引导作用,帮助模型跳出局部最优。剪掉它可能会损害模型的泛化能力。这些权重被称为“死重”(Dead Weights),但它们曾经“活过”。
- 解决方案:
- 延迟剪枝: 不在训练一开始就剪枝,而是在模型训练到比较稳定、权重重要性分化比较明显的后期再开始迭代剪枝。
- 学习率倒带 (Learning Rate Rewinding): 在剪枝后微调时,将权重重置回训练早期的某个状态,并使用当时的学习率重新训练。这给了“幸存”权重一个重新“生长”的机会,效果通常比简单的微调更好。这是“彩票假设”研究中的关键技巧。
- 挑战2: 结构化剪枝的困难。
- 问题: 当直接将幅值剪枝的思想用于结构化剪枝时(例如,计算整个注意力头的L2范数),可能会遇到“一荣俱荣,一损俱损”的问题。一个结构单元内部可能只有少数几个权重非常大,拉高了整体的L2范数,掩盖了其他大量冗余权重的存在。
- 解决方案:
- 引入正则化: 在训练阶段就加入群组稀疏正则化 (Group Lasso Regularization)。这种正则化会惩罚整个结构单元(如一个通道或一个头)的L2范数,从而在训练过程中就自然地“鼓励”某些结构整体变得不重要(所有权重都趋向于零),使得后续基于幅值的结构化剪枝更为有效。
- 结合其他度量: 如Wanda方法所示,将权重大小与激活值大小结合,可以更准确地评估结构的重要性。
6. 具体例子与最新研究进展
- 例子: Mistral-7B 模型的部署实践
- 许多开源社区和公司在将Mistral-7B这样强大的模型部署到移动端或边缘设备时,第一步往往就是对其进行迭代式幅值剪枝,将其压缩到50%甚至更高的稀疏度,然后再进行量化。这充分证明了其在工业界的基础地位。
- 最新进展: Wanda (Weight and Activation based Pruning, 2023) & SparseGPT
- 【专家思辨:这是对“唯大小论”的修正】 Wanda和SparseGPT是近年来对幅值剪枝思想最重要的升级和修正。它们的核心洞察是:单独看权重大小是不够的,必须结合其对应的输入激活值大小。
- Wanda的核心公式: 重要性 I = |W| * ||X||₂ (权重大小 × 对应输入激活值的L2范数)。一个权重即使自身很大,但如果它处理的输入信号一直很弱,那它对最终结果的贡献依然很小。
- 重大突破: 这种“权重×激活”的度量方式极其有效,使得单次(One-shot)、免微调(Fine-tuning-free) 的高比例剪枝成为可能。这极大地降低了剪枝的计算成本,使得对千亿级大模型的快速压缩变得触手可及。
7. 未来趋势
- 从“静态”到“半动态”: 纯粹的静态权重大小正在被“权重×激活”这种半动态的度量所取代。这已成为新的SOTA(State-of-the-Art)基线。未来的研究将探索更复杂的、能捕捉更多动态信息的度量方式。
- 与硬件稀疏格式的深度绑定: NVIDIA的2:4稀疏格式可以说是为幅值剪枝“量身定做”的。它要求在每4个权重中,让绝对值最小的2个为零。这种硬件层面的支持,让古老的幅值剪枝思想在现代GPU上重新焕发了强大的生命力,实现了真正的推理加速。未来,硬件设计将更紧密地围绕这类简单的稀疏模式进行。
- 成为自动化压缩流程的“预处理器”: 在复杂的AutoML或NAS(神经架构搜索)流程中,基于权重大小的剪枝将作为一种高效的“预处理器”,快速地过滤掉大量明显不重要的参数,为后续更精细、成本更高的剪枝或搜索算法缩小搜索空间。
猫哥说
基于权重大小的剪枝性价比非常高,它用最简单的思想、最低的计算成本,解决了模型压缩这个核心问题中最普遍的部分。尽管它存在理论上的局限性,但在工程实践中,经过迭代微调、正则化以及与激活信息结合等方式的“魔改”后,它依然宝刀不老。