Movement Pruning: Adaptive Sparsity by Fine-Tuning 解读
一、论文基本信息
论文题目:Movement Pruning: Adaptive Sparsity by Fine-Tuning
作者:Victor Sanh、Thomas Wolf、Alexander M. Rush
发表会议:NeurIPS 2020
方法名称:Movement Pruning
研究对象:BERT-base 等预训练语言模型的任务级剪枝
相关实现:Hugging Face 提供了 movement pruning / PruneBERT 相关代码和模型说明。官方相关仓库说明,这个方法用于对预训练模型如 BERT 做 fine-pruning,并强调它与 magnitude pruning 的区别:magnitude pruning 保留“远离 0 的权重”,movement pruning 保留“在微调过程中远离 0 的权重”。(GitHub)
这篇论文的核心问题是:
在预训练模型迁移到下游任务时,传统 magnitude pruning 是否仍然合适?
论文的回答是:不够合适。
原因是,BERT 这类模型的权重主要来自大规模预训练;下游 fine-tuning 通常只让权重发生很小变化。如果只看权重绝对值大小,那么剪枝决策很大程度上已经被预训练阶段决定了,而不是由当前下游任务决定。Movement Pruning 的思路是:不要只看权重当前有多大,而要看它在 fine-tuning 过程中是朝着“更重要”方向移动,还是朝着“可删除”方向移动。论文摘要明确指出,movement pruning 是一种简单、确定性的 first-order weight pruning 方法,更适合预训练模型的 fine-tuning 场景。
二、论文要解决的问题
传统 magnitude pruning 的逻辑非常直接:
权重绝对值大,说明重要。
权重绝对值小,说明不重要。
这种方法在从零开始训练的普通监督学习模型中很常见,也经常有效。因为模型权重完全由当前任务数据训练出来,权重大小和任务重要性之间通常存在一定关系。
但 BERT 这类预训练模型不一样。
预训练模型先在大规模通用语料上训练,再在下游任务上 fine-tune。Fine-tuning 阶段的数据通常比预训练数据小得多,权重不会发生剧烈变化。论文指出,在 transfer learning 场景中,权重值大多由原始预训练模型决定,fine-tuning 只做较小调整,因此 magnitude pruning 很难真正根据下游任务学习剪枝决策。
这就导致一个问题:
一个在预训练阶段绝对值很大的权重,不一定对当前下游任务重要。
一个原本绝对值较小的权重,也可能在 fine-tuning 中变得对当前任务重要。
所以 Movement Pruning 要解决的问题是:
如何让剪枝标准适应下游任务 fine-tuning,而不是被预训练权重大小锁死?
三、核心思想
Movement Pruning 的核心思想可以概括为:
保留那些在 fine-tuning 过程中远离 0 的权重,剪掉那些在 fine-tuning 过程中趋向 0 的权重。
这和 magnitude pruning 的判断标准完全不同。
Magnitude pruning 关心的是:
这个权重现在离 0 有多远?
Movement pruning 关心的是:
这个权重在当前任务训练过程中,是在远离 0,还是在靠近 0?
如果一个权重虽然当前绝对值很大,但 fine-tuning 过程中一直往 0 靠近,说明当前任务可能不需要它。
如果一个权重虽然当前绝对值不大,但 fine-tuning 过程中持续远离 0,说明当前任务正在强化它。
论文中明确说,movement pruning 与 magnitude pruning 的区别在于:低值和高值权重都可能被剪掉,只要它们在训练中收缩;而被保留的是那些在训练中远离 0 的连接。
这个思想非常适合 BERT 这种预训练模型,因为它真正利用了 fine-tuning 过程中产生的任务特定信号。
四、它是不是结构化剪枝?
严格来说,原始 Movement Pruning 主要是非结构化权重剪枝。
它剪的是单个 weight,而不是完整 attention head、FFN neuron、Transformer layer 或 channel。
也就是说,它产生的是稀疏矩阵:
某些权重变成 0。
矩阵整体形状不变。
Transformer 层数、hidden size、attention head 数量都不变。
所以它和 Head Pruning、LayerDrop、DynaBERT 这类结构化方法不同。
不过,Movement Pruning 的思想后来可以扩展到 block pruning 或结构化 pruning 中。例如后续工作会把 movement pruning 的思想用于更大的结构块。但这篇原始论文的核心方法是:
adaptive unstructured sparsity by fine-tuning。
这点很重要,因为它直接影响部署:
非结构化剪枝可以大幅减少非零参数量和存储。
但如果硬件或推理框架不能高效利用稀疏矩阵,实际推理速度不一定明显提升。
论文也明确指出,当前硬件对稀疏模型推理支持有限,从推理速度角度看,同等大小的小型 dense model 有时更理想。
五、方法细节:Score-Based Pruning
Movement Pruning 使用了一套score-based pruning框架。
简单说,每个权重 (W) 旁边都会有一个对应的重要性分数 (S)。
训练时,模型同时学习两类东西:
原始权重 (W)。
剪枝分数 (S)。
最后根据分数 (S) 生成二值 mask:
mask = 1,表示保留该权重。
mask = 0,表示剪掉该权重。
这和 magnitude pruning 的区别在于:magnitude pruning 的分数直接来自权重绝对值,而 movement pruning 的分数是在 fine-tuning 中学习出来的。
可以理解为:
Magnitude pruning:权重自己决定自己是否重要。
Movement pruning:额外学习一个“是否保留”的评分系统。
六、Hard Movement Pruning
论文提出了 hard movement pruning。
它的做法是:根据分数 (S) 保留 top-(v)% 的权重,其余权重 mask 为 0。
这里 (v) 表示保留比例。
例如:
保留 10% 权重,表示 90% 权重被剪掉。
保留 3% 权重,表示 97% 权重被剪掉。
问题是,top-k / top-v 操作本身不可导。也就是说,不能直接通过普通反向传播更新分数 (S)。
论文采用straight-through estimator,直通估计器。简单说,前向传播时用硬 mask,反向传播时假装 mask 操作可以传梯度,让梯度直接传给分数 (S)。论文明确说明,由于 Top-v 的梯度几乎处处为 0,它们在 backward pass 中忽略 Top-v,把梯度 straight-through 到 (S)。
这种设计的含义是:
前向时模型真的按照稀疏 mask 运行。
反向时分数仍然可以学习。
这就是 hard movement pruning 的核心。
七、为什么它能反映“movement”?
Movement Pruning 的分数更新和权重梯度有关。
直观上,如果一个权重的更新方向让它远离 0,那么对应分数会增加,更可能被保留。
如果一个权重的更新方向让它靠近 0,那么对应分数会下降,更可能被剪掉。
论文解释得很清楚:当权重在训练中远离 0 时,score 会增加;当权重向 0 收缩时,score 会降低。因此,score 可以被看作一种 movement accumulator,也就是对权重移动方向的累积记录。
这就是这篇论文最核心的思想。
它不是看某一时刻的权重大小,而是看 fine-tuning 过程中权重的运动趋势。
所以 Movement Pruning 更像是在问:
当前任务到底在强化哪些连接?
当前任务又在弱化哪些连接?
八、Soft Movement Pruning
除了 hard movement pruning,论文还提出了soft movement pruning。
Hard 版本用 top-v 保留固定比例权重;soft 版本则使用连续 mask,并加入稀疏正则,让模型自己学出稀疏结构。
可以这样理解:
Hard movement pruning:直接规定最后保留多少权重。
Soft movement pruning:通过正则项鼓励分数变稀疏,再根据阈值得到 mask。
Soft 版本通常表现更好,尤其在高稀疏率下。论文结果中,soft movement pruning 在 SQuAD、MNLI、QQP 上高稀疏区间普遍优于 magnitude pruning、L0 regularization 和 hard movement pruning。
原因也比较直观:
Hard top-v 对保留比例控制更直接,但训练中更硬、更不平滑。
Soft 版本让 mask 学习更连续,配合正则更容易优化。
所以论文最终实验中最强的通常是:
Soft Movement Pruning。
九、渐进式剪枝:不是一开始就剪到很稀疏
Movement Pruning 不是一开始就把模型剪到 3% 或 10% 权重。
它采用类似 automated gradual pruning 的方式:训练前期先保持较高保留率,随着 fine-tuning 进行,逐渐提高稀疏率,最后达到目标保留比例。
论文遵循 Zhu and Gupta 的 cubic sparsity scheduling,并且发现剪枝结束后加入一定 cool-down 步骤可以提升高稀疏率下表现。
这个设计很重要。
如果一开始就强行剪到极高稀疏度,模型还没适应任务,性能很容易崩。
渐进式剪枝的好处是:
先让模型学习任务。
再逐步收紧稀疏约束。
最后用 cool-down 让稀疏模型稳定下来。
十、实验设置
论文主要实验对象是BERT-base-uncased。
作者做的是task-specific pruning,也就是针对每个下游任务分别 fine-prune。论文说明,实验使用 BERT-base-uncased,并冻结 embedding modules,只 fine-tune Transformer layers 和任务特定 head;所有稀疏率都相对于 BERT-base 统计,对应模型大小。
实验任务包括三个英文 benchmark:
| 任务 | 类型 | 数据量 | 指标 |
|---|---|---|---|
| SQuAD v1.1 | 抽取式问答 | 约 8K 训练样本 | EM / F1 |
| MNLI | 自然语言推理 | 约 393K 训练样本 | matched / mismatched accuracy |
| QQP | 句子对相似 / 重复问题判断 | 约 364K 训练样本 | accuracy / F1 |
论文明确说明,SQuAD 是 span extraction,MNLI 和 QQP 是 paired sentence classification。
对比方法包括:
Magnitude Pruning。
L0 Regularization。
Reweighted Proximal Pruning。
LayerDrop。
mini-BERT。
论文还测试了 movement pruning 与知识蒸馏结合后的效果。
十一、实验结果解读
11.1 高稀疏率下,Movement Pruning 明显优于 Magnitude Pruning
论文最重要的结果是:
在高稀疏率下,movement pruning 明显优于 magnitude pruning。
当保留权重较多时,例如剩余 70% 以上,magnitude pruning 表现很好,甚至通常优于 movement pruning。但随着稀疏率提高,magnitude pruning 开始快速下降,而 movement pruning 更稳定。论文在结果部分明确指出,低稀疏区间 magnitude pruning 表现更好,但高稀疏区间 movement pruning 明显胜出。
这正好符合论文的理论判断:
低稀疏率时,剪掉少量小权重就够了。
高稀疏率时,必须根据任务重新判断哪些连接真正重要。
Magnitude pruning 只看权重大小,不能充分适应下游任务;movement pruning 利用 fine-tuning 中的任务信号,因此高稀疏率更强。
11.2 只保留 10% 权重时,Soft Movement Pruning 表现最好
论文 Table 2 报告了 10% 和 3% 剩余权重下的结果。
在SQuAD Dev上,BERT-base fine-tuned 是80.4 / 88.1 EM/F1。当只保留10% 权重时,Magnitude Pruning 为67.7 / 78.5,L0 Regularization 为69.9 / 80.0,Movement Pruning 为71.9 / 81.7,Soft Movement Pruning 为71.3 / 81.5。当只保留3% 权重时,Soft Movement Pruning 达到69.5 / 79.9,明显优于 Magnitude Pruning 的40.1 / 54.5。
在MNLI Dev上,10% 权重下 Soft Movement Pruning 达到80.7 / 81.1,3% 权重下达到79.0 / 79.6,明显优于 Magnitude Pruning。
在QQP Dev上,10% 权重下 Soft Movement Pruning 达到90.5 / 87.1,3% 权重下达到89.3 / 85.6,也显著优于 Magnitude Pruning。
这个结果很强,因为它说明:
即使只保留极少量 encoder 权重,BERT 仍然可以保留相当多的下游任务性能。
11.3 加入蒸馏后,性能进一步提升
论文进一步把 pruning 和 knowledge distillation 结合起来。Teacher 使用 fine-tuned BERT-base,训练目标是任务损失和输出分布蒸馏损失的组合。论文指出,蒸馏会提升所有剪枝方法,在所有数据集和稀疏率下都有帮助。
加入蒸馏后,在SQuAD上,10% 权重时 Soft Movement Pruning 达到76.6 / 84.9,3% 权重时达到72.7 / 82.3。在MNLI上,10% 权重时达到81.2 / 81.8,3% 权重时达到79.5 / 80.1。在QQP上,10% 权重时达到90.2 / 86.8,3% 权重时达到89.1 / 85.5。
这里的重点是:
Movement Pruning 本身已经很强,但和蒸馏结合后,在极高稀疏率下仍能保持更高性能。
论文摘要也指出,结合蒸馏后,模型可以在只剩3% 参数的情况下仍保持较小精度损失。(arXiv)
11.4 Movement Pruning 与 Magnitude Pruning 得到的稀疏模型差异很大
论文分析发现,movement pruning 和 magnitude pruning 最终保留下来的权重分布差异明显。
Magnitude pruning 会直接删除接近 0 的权重,因此剩余权重分布呈现明显“两边大、中间空”的形态。
Movement pruning 则不同。它不仅可能保留小权重,也可能剪掉大权重。论文观察到,movement pruning 的 score 和权重绝对值之间没有简单关系;高绝对值和低绝对值权重都可能重要,也都可能被剪。
这说明:
Movement Pruning 学到的不是“权重大就保留”,而是“对当前任务有用就保留”。
这正是它在 transfer learning 场景中优于 magnitude pruning 的根本原因。
11.5 全局剪枝与局部剪枝差距不大,但高稀疏下全局略有优势
论文还比较了 local selection 和 global selection。
Local selection 是在每个矩阵内部选出 top-v 权重。
Global selection 是在全网络所有矩阵中统一选出 top-v 权重。
直觉上,global selection 可以让不同层、不同矩阵获得不同稀疏率,因此可能更好。但论文发现,二者整体差距不大;只有在高稀疏率下,global movement pruning 有一定优势,例如在 SQuAD 只保留 3% 权重时差距约 2.3 F1。
论文还发现,全局一阶方法倾向于给低层保留更多权重,而高层被剪得更重。
这个现象很有意思:
BERT 低层可能承担更通用、基础的表示功能,因此在极高稀疏下更需要保留。
十二、方法优点
12.1 专门适合预训练模型 fine-tuning 场景
Movement Pruning 最大的贡献就是指出:
预训练模型剪枝不能只看权重大小,必须考虑 fine-tuning 过程中的任务适应方向。
这比传统 magnitude pruning 更符合 BERT 这类迁移学习模型的特点。
12.2 高稀疏率下效果明显更好
论文最有说服力的地方是在 10%、3% 剩余权重这种极端稀疏下,movement pruning 仍能保持较好性能,而 magnitude pruning 大幅下降。
这说明它真正适合extreme sparsity场景。
12.3 方法简单,不需要二阶信息
Movement Pruning 使用一阶梯度信号,不需要计算 Hessian 或复杂二阶近似。
所以它比二阶 pruning 方法更容易实现,也更适合大模型。
论文也明确指出,它不需要昂贵的二阶导数计算,importance scores 可以作为标准 fine-tuning 的副产物获得。
12.4 可以和蒸馏结合
它本身不依赖 teacher,但如果加入知识蒸馏,性能还能进一步提升。论文结果显示,distillation 会增强所有剪枝方法,而 soft movement pruning + distillation 表现最强。
这说明它和蒸馏、量化等压缩方法是互补的。
12.5 可以得到极小存储模型
Hugging Face 的实现说明中提到,movement pruning 可以获得极高稀疏模型,例如只保留约 5% 权重时仍保留约 95% dense performance;也展示了通过标准稀疏存储把 BERT encoder 大幅压缩的可能性。(GitHub)
这说明它对模型存储压缩很有价值。
十三、方法局限
13.1 原始方法是非结构化稀疏,不一定带来真实加速
这是 Movement Pruning 最大的局限。
它剪掉的是单个权重,得到的是稀疏矩阵。如果底层硬件和推理框架不能高效执行稀疏矩阵乘法,那么实际推理速度可能不会明显提升。
Hugging Face 相关说明也指出,标准 PyTorch 推理下,movement pruning 得到的极稀疏模型并没有明显 inference speed 提升,需要专门面向稀疏架构的推理设置。(GitHub)
所以它更直接的收益是:
模型存储变小。
而不是一定:
端到端推理马上变快。
13.2 需要任务级 fine-pruning
Movement Pruning 是在下游任务 fine-tuning 阶段学习稀疏结构。
这意味着每个任务通常要单独 fine-prune 一次。
如果希望得到一个通用稀疏 BERT,然后直接迁移到所有任务,这篇论文没有完全解决。
13.3 对低稀疏率不一定优于 magnitude pruning
论文结果显示,在低稀疏率、保留权重较多时,magnitude pruning 往往表现更好或更稳定。
所以 Movement Pruning 的优势主要在:
高稀疏率。
如果只剪掉少量权重,传统 magnitude pruning 可能已经足够。
13.4 训练和调参比简单 magnitude pruning 更复杂
Magnitude pruning 很简单:按权重大小排序剪掉即可。
Movement Pruning 需要额外 score 参数、mask 学习、稀疏率调度、warm-up、cool-down、soft/hard 选择等。
所以它的工程复杂度更高。
13.5 没有直接解决结构化压缩问题
如果目标是减少 heads、减少 layers、减少 FFN blocks、减少 hidden size,Movement Pruning 原始形式不是直接答案。
它可以作为更大结构块剪枝的思想基础,但原论文主要做的是 weight-level pruning。
十四、整体评价
Movement Pruning 的核心价值在于,它重新定义了预训练模型剪枝时“重要性”的含义。
在普通监督学习中,权重大小往往能反映任务重要性;但在 BERT 这样的预训练模型中,权重大小更多反映预训练阶段的通用知识。下游任务 fine-tuning 时,真正重要的是:哪些连接被当前任务进一步强化,哪些连接正在被弱化。
因此,Movement Pruning 的判断标准非常自然:
保留那些在 fine-tuning 中远离 0 的权重。
剪掉那些在 fine-tuning 中趋向 0 的权重。
这让它比 magnitude pruning 更适合 task-specific transfer learning 场景。实验也证明,在只保留 10% 甚至 3% encoder 权重的极端稀疏条件下,movement pruning 尤其是 soft movement pruning,明显优于 magnitude pruning 和 L0 regularization。
不过,它的核心局限也很清楚:它主要产生非结构化稀疏。如果没有稀疏硬件或专门推理库,参数少不等于速度快。因此,它更适合存储压缩、稀疏模型研究,或者作为后续 block pruning / structured sparse pruning 的基础思想。
十五、一句话总结
《Movement Pruning: Adaptive Sparsity by Fine-Tuning》提出一种面向预训练语言模型的任务自适应剪枝方法:不再根据权重绝对值大小决定保留或删除,而是根据 fine-tuning 过程中权重是否远离 0 来学习剪枝分数;实验表明,在 BERT 的 SQuAD、MNLI 和 QQP 任务上,Movement Pruning 尤其是 Soft Movement Pruning 在高稀疏率下明显优于 Magnitude Pruning,并且与蒸馏结合后可以在只保留极少参数时仍保持较强性能。