GBLM-Pruner 论文精读:预训练完成后,梯度还能帮助我们剪枝吗?
大语言模型剪枝通常依赖三个问题:权重有多大、对应特征是否经常被使用、删除之后会不会明显破坏模型输出。
幅值剪枝只回答了第一个问题,Wanda进一步考虑了第二个问题,而GBLM-Pruner试图利用梯度回答第三个问题。
它的核心观点是:
即使大语言模型已经完成预训练,少量校准数据产生的梯度仍然包含参数敏感性信息。将梯度加入权重重要性评估,可以更准确地判断哪些权重适合被删除。
一、论文基本信息
| 项目 | 内容 |
|---|---|
| 论文题目 | Beyond Size: How Gradients Shape Pruning Decisions in Large Language Models |
| 方法名称 | GBLM-Pruner:Gradient-Based Language Model Pruner |
| 作者 | Rocktim Jyoti Das、Mingjie Sun、Liqun Ma、Zhiqiang Shen |
| 首次提交 | 2023年11月8日 |
| 最新公开版本 | arXiv v2,2024年4月8日 |
| 论文状态 | arXiv预印本 |
| 论文链接 | arXiv页面 (arXiv) |
| 官方代码 | VILA-Lab/GBLM-Pruner (GitHub) |
论文主要研究的是一次性大语言模型权重剪枝。它不删除完整的注意力头、MLP神经元或者Transformer层,而是将一部分单独的权重置为零,支持普通非结构化稀疏以及2:4、4:8半结构化稀疏。
二、论文要解决什么问题
2.1 只看权重大小并不可靠
最简单的幅值剪枝认为:
权重绝对值越小,对模型越不重要,因此越应该被删除。
这种判断有一定合理性,但并不总是正确。
假设模型中有两个权重,它们的数值都很小:
第一个权重发生轻微变化时,模型损失几乎不变;
第二个权重发生轻微变化时,模型损失明显上升。
虽然两个权重的数值相近,但第二个权重显然更加重要。
因此,权重数值只能说明参数本身有多大,不能直接说明模型对这个参数有多敏感。
2.2 Wanda加入了激活,但没有直接观察损失变化
Wanda在权重幅值之外加入了输入激活。
它认为,一个权重的重要性不仅取决于自身大小,还取决于对应输入通道是否经常出现较强激活。也就是说:
权重大、输入激活强:通常比较重要;
权重小、输入激活弱:通常更适合删除。
相比纯幅值剪枝,这种数据驱动的判断明显更加合理,而且不需要更新剩余权重。
但是,激活仍然只是描述了这个连接在前向传播中被使用的程度。它没有直接回答:
删除这个权重以后,模型的语言建模损失会增加多少?
2.3 SparseGPT精度较高,但处理过程更加复杂
SparseGPT通过局部二阶信息估计删除权重造成的影响,并在剪枝过程中调整剩余权重,用其他参数补偿被删除权重带来的误差。
这种方式通常能够保持较好的模型性能,但需要处理近似Hessian逆矩阵,并执行逐层权重补偿。GBLM-Pruner的作者认为,相比Wanda,SparseGPT实现更加复杂;相比SparseGPT,Wanda虽然简单,却更偏经验设计。
GBLM-Pruner希望在两者之间找到一个平衡:
比纯幅值剪枝和Wanda更充分地利用模型信息;
不执行SparseGPT式的剩余权重更新;
不进行剪枝后微调;
不改变模型原有网络结构。
三、核心思想
GBLM-Pruner在Wanda的权重与激活指标上,进一步加入了损失梯度。
三种信息分别表示:
| 信息 | 它反映的问题 |
|---|---|
| 权重幅值 | 这个连接本身有多强 |
| 输入激活 | 这个连接在校准数据中被使用得有多频繁 |
| 损失梯度 | 模型损失对这个权重有多敏感 |
因此,一个比较适合删除的权重通常同时具有以下特点:
权重数值较小;
对应输入激活较弱;
损失对该权重不敏感。
相反,即使一个权重数值很小,只要它的梯度较大,GBLM-Pruner仍可能将其保留下来。
论文最终使用的评分关系可以用一句纯文本表示:
权重重要性 = 权重与激活的联合得分 + 放大后的权重与梯度联合得分
其中梯度项需要额外放大,是因为预训练模型上的梯度通常比激活数值小很多。论文通过消融实验将放大系数设置为100。
四、为什么训练结束后梯度仍然有用
经典Optimal Brain Surgeon剪枝方法通常假设,模型已经训练到局部最优点,此时梯度接近零,因此可以忽略一阶梯度项,重点利用二阶曲率信息判断参数重要性。
GBLM-Pruner重新审视了这个假设。
一个预训练大语言模型可能在原始海量训练数据上接近某种最优状态,但在当前抽取的有限校准样本上,梯度并不会严格等于零。即使梯度数值较小,不同参数之间的梯度大小仍可能存在明显差异。
这些差异可以反映:
在当前语言建模目标下,改变某个权重会对损失产生多大影响。
因此,GBLM-Pruner并不要求梯度足够大,而是关注不同权重之间的相对梯度差异。只要这种相对排序具有信息,梯度就能够帮助剪枝。
从直觉上看:
激活回答的是“这个权重是否经常参与计算”;
梯度回答的是“模型是否在意这个权重发生变化”。
这两种信息并不完全相同,因此可以相互补充。
五、GBLM-Pruner具体怎样执行
5.1 准备少量校准数据
论文从C4训练集中随机抽取128个文本序列,每个序列长度为2048个Token。
这些数据不需要人工标签。模型直接使用原本的自回归语言建模目标,即根据前面的Token预测后面的Token,并计算语言建模损失。(ar5iv)
使用通用语言建模损失的目的,是让剪枝过程尽量保持任务无关性,而不是专门服务于某一个下游任务。
5.2 对每个校准样本执行反向传播
每个校准序列输入模型后,程序先进行前向传播计算损失,然后执行一次反向传播,获得各个线性层权重的梯度。
这里必须特别说明:
GBLM-Pruner所说的training-free,并不表示完全不使用反向传播。
它仍然需要计算梯度,只是不使用优化器更新模型参数,也不执行剪枝后的重新训练。
官方代码虽然创建了AdamW优化器,但只使用它清空梯度。每个样本执行loss.backward()后,代码保存梯度统计,然后再次清空梯度,并没有调用参数更新步骤。(GitHub)
因此,更准确的描述是:
GBLM-Pruner是一种无需重新训练、无需参数更新的后训练剪枝方法,但不是无反向传播的剪枝方法。
5.3 聚合多个样本的梯度
不同文本样本产生的梯度方向可能不同。
如果简单地把所有带正负符号的梯度直接相加,正梯度和负梯度会相互抵消。最后得到的数值很小,并不一定表示该权重不重要,也可能只是不同样本对它的优化方向相反。
为避免这种抵消,GBLM-Pruner使用两种方式聚合梯度:
L1聚合:累加不同样本梯度的绝对值;
L2聚合:累加梯度平方,最后再开平方。
两种方式都不关心梯度是正还是负,而是衡量这个权重在多个样本上总体具有多强的敏感性。
官方代码分别保存L1和L2梯度文件。L1版本直接累加绝对梯度,L2版本累加梯度平方后再开平方。(GitHub)
5.4 收集输入激活
除了梯度之外,方法还需要获得每个线性层的输入激活。
官方实现通过前向Hook收集线性层输入,并统计对应输入维度的激活尺度。这一部分基本继承了Wanda的数据统计方式。(GitHub)
因此,GBLM-Pruner实际上包含两种数据统计:
一次带反向传播的梯度统计;
一次逐层前向传播的激活统计。
5.5 计算权重重要性
对每个权重,方法计算两部分得分。
第一部分来自Wanda:
权重越大,对应输入激活越强,重要性越高。
第二部分来自梯度:
权重越大,损失对它越敏感,重要性越高。
论文不是用两个分数相乘,而是将它们相加。消融实验表明,当激活项和梯度项以减法组合时,剪枝性能会完全崩溃;以加法组合时,两种信息能够形成互补。
5.6 在每个输出神经元内部排序
得到重要性分数后,GBLM-Pruner并不是在整个模型中进行一次全局排序。
对于一个线性层,它会在每个输出神经元内部,分别比较连接到该神经元的所有输入权重,然后删除其中分数最低的一部分。
例如设置50%稀疏率时,每个输出神经元都会删除约一半得分较低的输入连接。
论文比较了整层排序、输入维度排序、输出维度排序以及128元素分组等多种粒度。结果表明,按单个输出神经元独立比较的效果最好,LLaMA-2-7B在50%稀疏率下的困惑度为6.86。(ar5iv)
官方代码也印证了这一点:它沿权重矩阵最后一个维度排序,并在每一行中选出得分最低的指定比例权重,将其直接置为零。(GitHub)
5.7 逐层传播剪枝后的输出
GBLM-Pruner按照Transformer层顺序逐层剪枝。
当前层完成剪枝后,程序重新计算该层在校准样本上的输出,并将剪枝后的输出作为下一层的输入。
这样,后续层收集到的激活来自前面已经剪枝的网络,而不是始终来自原始稠密模型。(GitHub)
完整流程可以概括为:
校准文本 → 计算梯度 → 聚合梯度 → 收集激活 → 计算重要性 → 排序并置零 → 重新计算当前层输出 → 继续剪下一层
六、理论分析到底说明了什么
论文从Optimal Brain Surgeon框架出发,重新保留了传统推导中经常被忽略的一阶梯度项。
原来的思路主要关注二阶信息:删除一个权重后,模型损失曲面会发生怎样的变化。GBLM-Pruner认为,除了这种曲率信息,还应该考虑损失沿当前梯度方向的变化。
经过近似处理,作者得到的主要结论是:
删除一个权重造成的损失变化,一部分与权重和输入激活有关,另一部分与权重和损失梯度有关。
这为“激活项加梯度项”的重要性指标提供了理论动机。(ar5iv)
不过,理论推导与最终实现之间并不是完全一致的。
理论推导中的激活部分带有平方,梯度部分也保留了方向信息;实际方法则:
去掉了激活项的平方;
对权重和梯度取绝对值或范数;
使用加法组合两部分;
为梯度项增加了100倍的经验缩放。
这些修改主要由消融实验决定,而不是全部由理论严格推出。(ar5iv)
因此,对这部分更准确的理解是:
理论解释了为什么梯度可能有用,但最终剪枝指标仍然是一种理论启发下的经验设计。
七、实验设置
论文在六个LLaMA模型上进行了实验。(ar5iv)
| 设置 | 内容 |
|---|---|
| 模型 | LLaMA-1-7B、13B、30B;LLaMA-2-7B、13B、70B |
| 校准数据 | C4 |
| 校准样本数 | 128 |
| 序列长度 | 2048 Tokens |
| 硬件 | NVIDIA A100 40GB或80GB |
| 主要稀疏率 | 50% |
| 稀疏形式 | 非结构化、2:4、4:8 |
| 困惑度数据集 | WikiText |
| 零样本任务 | BoolQ、RTE、HellaSwag、WinoGrande、ARC-easy、OBQA |
| 对比方法 | 幅值剪枝、SparseGPT、Wanda |
| 是否剪Embedding | 否 |
| 是否剪最终分类头 | 否 |
| 剪枝后微调 | 无 |
八、实验结果解读
8.1 50%非结构化剪枝
下面是WikiText困惑度,数值越低越好。(ar5iv)
| 方法 | LLaMA-2-7B | LLaMA-2-13B | LLaMA-2-70B | LLaMA-1-7B | LLaMA-1-13B | LLaMA-1-30B |
|---|---|---|---|---|---|---|
| 原始模型 | 5.47 | 4.88 | 3.32 | 5.68 | 5.09 | 4.10 |
| 幅值剪枝 | 16.03 | 6.83 | 5.36 | 17.29 | 20.21 | 7.54 |
| SparseGPT | 7.00 | 6.03 | 4.25 | 7.22 | 6.19 | 5.32 |
| Wanda | 6.92 | 5.97 | 4.22 | 7.26 | 6.15 | 5.24 |
| GBLM-Pruner | 6.86 | 5.88 | 4.17 | 7.15 | 6.11 | 5.18 |
GBLM-Pruner在六个模型上都取得了最低困惑度,说明梯度确实能够改善权重选择。
但需要注意,GBLM-Pruner相对于Wanda的提升幅度并不大。例如:
LLaMA-2-7B从6.92降低到6.86;
LLaMA-2-13B从5.97降低到5.88;
LLaMA-2-70B从4.22降低到4.17。
因此,实验更准确地证明了:
梯度能够为Wanda提供小幅但比较稳定的补充,而不是带来数量级上的性能提升。
8.2 只使用梯度是否有效
论文单独测试了“权重加梯度”的评分方式,不使用激活。
在LLaMA-2-7B和13B上,仅加入梯度就能将困惑度从幅值剪枝的16.03和6.83,降低到约7.09和5.96。其结果已经接近Wanda和SparseGPT。
这说明梯度并不是一个无效的附加项。即使不使用激活,它本身也能够提供较强的参数重要性信号。
不过,梯度和激活一起使用时效果最好,说明两者提供的信息并不完全重复。
8.3 梯度聚合方式非常关键
论文比较了直接梯度累加、L1聚合和L2聚合。
| 梯度处理方式 | 50%剪枝后困惑度 |
|---|---|
| 带符号梯度直接累加 | 119.72 |
| L1聚合 | 7.17 |
| L2聚合 | 7.09 |
直接累加的结果几乎完全失效,原因是不同样本的正负梯度发生了严重抵消。
使用L1或L2范数后,模型恢复到合理性能。这说明GBLM-Pruner真正有效的关键,不只是“使用梯度”,而是:
使用经过跨样本绝对值或范数聚合的稳定梯度统计。
(ar5iv)
8.4 为什么梯度缩放系数设置为100
由于预训练模型的梯度较小,如果直接把梯度项加到激活项上,梯度几乎不会影响最终排序。
论文测试了从0.001到100000的多个缩放系数。LLaMA-2-7B在50%稀疏率下,当系数为100时取得最低困惑度6.858。系数继续增大后,性能又开始下降。(ar5iv)
这说明:
梯度项过小,相当于退化为Wanda;
梯度项过大,会压制激活信息;
两部分需要保持合适的数值平衡。
同时,这也暴露了一个问题:固定系数100是通过实验选择的,不一定适用于所有模型和数据集。
8.5 零样本任务结果
在LLaMA-1系列上,GBLM-Pruner的平均零样本准确率均高于SparseGPT和Wanda。(ar5iv)
| 模型 | SparseGPT | Wanda | GBLM-Pruner |
|---|---|---|---|
| LLaMA-1-7B | 61.77 | 61.17 | 63.07 |
| LLaMA-1-13B | 66.27 | 66.45 | 66.65 |
| LLaMA-1-30B | 69.33 | 70.84 | 71.17 |
不过,这种优势并不是在所有模型上都成立。
在论文补充的LLaMA-2结果中:
LLaMA-2-13B上,GBLM-Pruner平均准确率为67.74,略高于SparseGPT的67.54和Wanda的67.62;
LLaMA-2-70B上,GBLM-Pruner为73.27,低于SparseGPT的74.00,也略低于Wanda的73.36。(ar5iv)
因此,困惑度上的提升比较稳定,但零样本任务上的优势会受到具体模型和任务影响。
8.6 2:4和4:8半结构化剪枝
2:4表示每连续4个权重中必须删除2个。4:8表示每连续8个权重中删除4个。两者稀疏率都是50%,但局部位置约束比普通非结构化剪枝更严格。
实验表明:
在严格的2:4稀疏下,SparseGPT通常更有优势;
在4:8稀疏下,GBLM-Pruner在多数较大模型上取得更好结果;
非结构化剪枝仍然是GBLM-Pruner表现最稳定的场景。(ar5iv)
例如在LLaMA-2-7B的2:4剪枝中:
SparseGPT:10.82;
Wanda:12.11;
GBLM-Pruner:11.91。
这里GBLM-Pruner没有超过SparseGPT。
这说明,当硬件要求非常严格的局部稀疏模式时,仅靠权重重要性排序可能不够,SparseGPT对剩余权重的误差补偿仍然有价值。
8.7 对校准数据是否敏感
作者随机抽取了五组不同的128条校准数据,对LLaMA-2-7B进行50%剪枝。
得到的困惑度分别为:
6.86、6.87、6.89、6.86、6.87。
不同数据划分之间的波动很小。作者还将校准样本数量从1增加到512,结果显示GBLM-Pruner对样本数量变化的敏感程度低于SparseGPT。(ar5iv)
不过,这只能说明它在论文测试设置下比较稳定,并不能证明梯度与校准数据分布无关。若校准数据集中在代码、数学或特定领域,最终保留的权重仍可能偏向对应数据分布。
九、梯度为什么产生了看似结构化的剪枝模式
论文将梯度生成的掩码可视化后发现,使用L1或L2方式聚合梯度时,掩码中出现了明显的横向和纵向条带;直接累加带符号梯度时,掩码则更加杂乱。
这说明,同一输入维度或者输出维度上的多个权重可能具有相关的梯度敏感性。
虽然GBLM-Pruner执行的是逐权重非结构化剪枝,但最后形成的稀疏位置并不完全随机,而是带有某种通道级相关性。
不过,论文只进行了可视化观察,没有进一步证明这些条带是否对应:
某个完整注意力头;
某个MLP神经元;
某种具体语言能力;
可以安全删除的完整结构。
因此,这部分更适合作为一个有趣现象,而不是结构化剪枝结论。
十、与其他大语言模型剪枝方法的区别
| 方法 | 重要性依据 | 是否需要反向传播 | 是否更新剩余权重 | 是否改变网络维度 |
|---|---|---|---|---|
| 幅值剪枝 | 权重大小 | 否 | 否 | 否 |
| Wanda | 权重和输入激活 | 否 | 否 | 否 |
| SparseGPT | 权重、激活和二阶近似 | 否 | 是 | 否 |
| LLM-Pruner | 梯度和结构依赖 | 是 | 通常需要恢复训练 | 是 |
| GBLM-Pruner | 权重、激活和梯度 | 是 | 否 | 否 |
GBLM-Pruner尤其容易与LLM-Pruner混淆。
两者虽然都使用梯度,但目标不同:
LLM-Pruner主要进行结构化剪枝,删除注意力头、通道等完整结构;
GBLM-Pruner主要进行逐权重稀疏化,把低分权重设置为零。
因此,GBLM-Pruner得到的模型张量形状通常没有变化,只是其中零权重比例增加。
十一、方法优点
11.1 证明了预训练模型梯度仍有价值
论文最重要的贡献,是重新审视了“训练结束后梯度可以忽略”的传统假设。
实验表明,少量无标签校准数据产生的梯度,经过正确聚合后,确实能够改善大语言模型权重重要性排序。
11.2 不需要剪枝后微调
剪枝完成后可以直接评估,不需要LoRA恢复、知识蒸馏或者全参数微调。
这降低了对训练数据和训练资源的依赖。
11.3 不需要更新剩余权重
与SparseGPT相比,GBLM-Pruner不需要在删除权重后重新调整剩余参数,也不需要在剪枝阶段执行复杂的误差补偿。
论文附录还测试了为GBLM-Pruner加入OBS式权重更新,结果没有带来改善。
11.4 方法逻辑直观
权重、激活和梯度分别表示连接强度、使用程度和损失敏感性。
三者结合后,比单独依赖权重大小更容易解释。
十二、方法局限
12.1 “无需训练”容易产生误解
GBLM-Pruner不更新参数,但仍然需要对每个校准样本执行反向传播。
对于数十亿参数的大语言模型,计算并存储所有线性层梯度仍然会带来明显的时间、显存和内存开销。它的校准成本显然高于只需要前向传播的Wanda。(GitHub)
所以不能简单地把它理解为“几乎零成本的剪枝”。
12.2 非结构化稀疏不等于真实推理加速
论文的主要优势来自50%非结构化剪枝。
但将一半权重设置为零,并不会让普通PyTorch密集矩阵乘法自动减少一半计算时间。要获得真实加速,还需要:
稀疏权重存储格式;
对应的稀疏GEMM内核;
硬件对目标稀疏模式的支持;
推理框架能够正确调用稀疏算子。
论文主要报告困惑度和任务准确率,没有系统报告真实延迟、Token吞吐量、显存占用和能耗。因此,它证明的是相同稀疏率下模型精度保持得更好,而不是已经证明端到端部署速度更快。(ar5iv)
12.3 在硬件友好的2:4稀疏下不占优势
2:4更容易被特定GPU稀疏计算单元利用,但GBLM-Pruner在这一设置下经常不如SparseGPT。
这意味着它在精度最好的非结构化场景与实际硬件最容易加速的场景之间,仍然存在一定距离。
12.4 相比Wanda的提升比较有限
GBLM-Pruner在50%非结构化剪枝下稳定优于Wanda,但多数模型的困惑度差距只有0.03到0.09左右。
考虑到GBLM-Pruner需要额外执行反向传播,在实际应用中需要判断:
这一小幅精度提升,是否值得额外的梯度计算成本?
论文没有给出完整的剪枝时间、峰值显存和成本收益分析。
12.5 梯度缩放系数带有经验性
最终采用的100倍缩放来自LLaMA-2-7B上的消融实验。
不同模型规模、数值精度、校准数据和损失函数可能具有完全不同的梯度尺度,因此固定系数未必能够直接推广。
更加理想的方式可能是根据每层的激活和梯度分布,自动进行尺度对齐。
12.6 理论推导与实际评分并不完全一致
理论分析保留了梯度方向和部分平方项,而最终实现使用绝对值、范数、加法和人工缩放。
因此,理论更多提供了设计方向,不能看作对最终指标的完整严格证明。
12.7 零样本优势并不普遍
GBLM-Pruner在LLaMA-1系列上的平均准确率较好,但在LLaMA-2-70B上没有超过SparseGPT和Wanda。
这说明更低的语言建模困惑度,并不保证所有知识、阅读理解和常识推理任务都同步提升。
十三、这篇论文真正有价值的地方
GBLM-Pruner最重要的价值,不是提出了一个特别复杂的剪枝算法,而是增加了一个新的观察维度。
此前一次性大语言模型剪枝主要关注:
权重 → 权重加激活 → 权重、激活与二阶补偿
GBLM-Pruner进一步提出:
权重、激活之外,还可以直接观察损失梯度。
它说明,预训练结束并不代表梯度完全失去价值。即使模型不再训练,梯度仍可以作为一种诊断信号,用于判断模型对哪些参数更加敏感。
从这个角度看,GBLM-Pruner的贡献主要是剪枝准则的扩展,而不是网络结构、稀疏内核或者部署框架上的创新。
十四、一句话总结
GBLM-Pruner利用少量校准文本计算大语言模型的权重梯度,并将梯度敏感性加入Wanda的权重与激活评分中,在不更新剩余权重、不进行剪枝后微调的条件下,提高了LLaMA模型50%非结构化剪枝后的性能;但它仍需要成本较高的反向传播,而且非结构化零权重并不能直接转化为真实推理加速。
