模型剪枝经典论文精读:Towards Optimal Structured CNN Pruning via Generative Adversarial Learning 一、论文基本信息论文题目Towards Optimal Structured CNN Pruning via Generative Adversarial Learning简称GAL作者Shaohui Lin、Rongrong Ji、Chenqian Yan、Baochang Zhang、Liujuan Cao、Qixiang Ye、Feiyue Huang、David Doermann发表信息CVPR 2019论文链接https://arxiv.org/abs/1903.09291官方代码https://github.com/ShaohuiLin/GAL这篇论文发表于CVPR 2019官方 GitHub 仓库说明其为PyTorch implementation for GAL并给出了 CIFAR-10 和 ImageNet 上的运行脚本、预训练模型和 fine-tuning 流程。论文的核心目标是用Generative Adversarial LearningGAL进行结构化剪枝并且可以联合剪掉 filters、branches 和 residual blocks 等不同粒度的结构。GAL 的核心观点是传统结构化剪枝大多采用逐层、多阶段的 “prune → retrain” 流程计算成本高而且通常只能针对某一种结构例如只剪 filter、只剪 channel 或只剪 block。GAL 则希望通过一个端到端的对抗学习过程学习稀疏的 soft mask让剪枝网络的输出分布尽量接近原始网络同时自动把冗余结构对应的 mask 推到 0。二、论文要解决的问题在 GAL 之前结构化剪枝已经有很多经典方法。例如L1 Filter Pruning: 根据 filter 的 L1 范数剪掉小范数 filters。 ThiNet: 根据下一层特征重构误差选择通道。 Channel Pruning: 用 LASSO 选择通道再用最小二乘重建权重。 Network Slimming: 通过 BN gamma 稀疏化选择通道。 NISP: 从最终响应层传播重要性。 DCP: 在通道选择中加入判别性损失。 SFP / FPGM / HRank: 分别从软剪枝、几何冗余、feature map rank 角度设计剪枝准则。这些方法虽然有效但 GAL 认为它们仍有几个不足。第一个问题是很多方法是 layer-wise、多阶段剪枝。典型流程是剪一层 ↓ fine-tuning ↓ 再剪下一层 ↓ 再 fine-tuning这种流程容易计算开销大而且局部剪枝不一定得到全局最优结构。论文指出已有方法通常依赖 layer-wise 的迭代剪枝和 retraining因此可能不是最优也会带来较高计算成本。第二个问题是很多方法只能剪某一种结构。例如只剪 filters 只剪 channels 只剪 blocks 只剪 branches但真实 CNN 的冗余结构可能同时存在于多个层级channel 级冗余 branch 级冗余 block 级冗余如果只剪单一结构就可能无法充分压缩网络。GAL 的目标是联合剪掉多种异构结构包括 channels / filters、branches 和 blocks。第三个问题是hard mask 不够灵活。有些方法直接学习二值 maskmask 1: 保留 mask 0: 删除但二值 mask 会带来难优化的问题。论文指出hard filter pruning 使用 binary mask 会导致优化困难而 GAL 把 binary mask 放松成 soft mask从而提升灵活性和准确性。第四个问题是很多剪枝方法依赖标签。例如使用分类 loss、group sparsity、BN gamma 稀疏化等方法时通常需要有标签数据。但在一些场景中可能只有无标签数据或者希望不依赖类别标签进行模型压缩。GAL 因此提出 label-free 的剪枝方式让剪枝网络去模仿原始网络输出而不是直接依赖真实标签。三、核心思想GAL 的核心思想可以概括为一句话把剪枝后的网络看作生成器让它生成尽可能接近原始网络输出的特征再用判别器区分这些特征来自原始网络还是剪枝网络同时用 soft mask 的 L1 稀疏正则把冗余结构压到 0。可以这样理解原始预训练网络 Teacher / Baseline 参数固定不更新 带 soft mask 的剪枝网络 Generator 需要学习权重和 mask 判别器 Discriminator 判断输入特征来自原始网络还是剪枝网络GAL 的训练目标不是直接用真实标签训练小模型而是让剪枝网络的输出分布接近原始网络。整体流程是预训练大模型 ↓ 复制一个同结构网络作为剪枝网络 ↓ 在可剪结构后面插入 soft mask ↓ 原始网络固定不动 ↓ 剪枝网络作为 generator ↓ discriminator 区分 baseline output 和 pruned output ↓ MSE loss 对齐两者输出 ↓ L1 正则让 soft mask 稀疏 ↓ FISTA 将更多 mask 精确推到 0 ↓ 删除 mask0 对应的 channels / branches / blocks ↓ fine-tuning 剪枝后模型和 DCP 相比DCP 是重构损失 判别损失GAL 则是输出对齐损失 对抗损失 mask 稀疏正则它不只是想让某层特征重构得像而是通过对抗学习让剪枝网络整体输出分布接近原始网络。四、方法细节4.1 Baseline 网络与 Pruned 网络论文定义原始预训练网络为其中x输入图像baseline 网络参数baseline 网络输出特征。带 soft mask 的剪枝网络定义为其中剪枝网络参数msoft mask带 mask 的剪枝网络输出。baseline 网络在训练中固定不更新剪枝网络需要学习和 m。论文明确说明baseline 选用 softmax 前的最终输出作为 supervised feature用来训练剪枝网络去近似 baseline。这点和知识蒸馏有点像Knowledge Distillation: teacher 输出指导 student。 GAL: baseline 输出指导 pruned network 同时通过 GAN 判别器进一步对齐输出分布。4.2 Soft Mask 的作用GAL 在要剪的结构后面加入 soft mask。如果某个结构输出为对应 soft mask 为则经过 mask 后变成如果接近 1说明该结构仍然活跃。如果说明该结构输出完全被屏蔽可以安全删除。因此soft mask 的意义是m_i 大 该 channel / branch / block 重要保留。 m_i 0 该 channel / branch / block 对后续计算无贡献删除。相比 binary masksoft mask 是连续可优化变量因此更容易用梯度方法训练。论文强调soft mask 可以缓解 hard filter pruning 的 slackness 问题。4.3 为什么用 Generative Adversarial LearningGAL 把剪枝网络看作 generator把判别器看作 discriminator。Generator: 带 soft mask 的剪枝网络 Discriminator: 判断输入特征来自 baseline 还是 pruned network判别器希望区分baseline output: f_b(x) pruned output: f_g(x, W_G, m)而剪枝网络希望骗过判别器让自己的输出看起来像 baseline 输出。这就是一个对抗过程Discriminator: 尽量分清 teacher output 和 pruned output。 Generator / pruned network: 尽量让 pruned output 接近 teacher output 让 discriminator 分不出来。论文中将这个过程写成 two-player gamegenerator 是剪枝网络discriminator 区分输入来自 baseline 输出还是剪枝网络输出从而迫使二者输出接近。4.4 GAL 的总目标函数GAL 的总目标可以写成其中对抗损失baseline 和 pruned network 的输出对齐损失正则项包括权重正则、mask 稀疏正则、判别器正则。论文明确将 GAL 优化写成这个 min-max 问题对剪枝网络参数和 soft mask 最小化对判别器参数最大化。4.5 Adversarial Loss对抗损失为其中baseline 输出特征分布剪枝网络输出特征分布判别器。这个公式就是 GAN 的基本形式。判别器希望D(f_b(x)) 接近 1 D(f_g(x)) 接近 0而剪枝网络希望让接近 1。论文还使用 dropout 作为 pruned network 中的噪声输入 z并说明该 dropout 只在更新剪枝网络时激活。4.6 Data Loss输出对齐仅靠 GAN 可能不稳定所以 GAL 还加入了 MSE 输出对齐损失这个损失的作用是让剪枝网络输出直接接近原始网络输出。这和知识蒸馏中的 feature matching 很像但这里不需要真实标签只需要原始模型输出。论文明确将 data loss 定义为 baseline output 和 pruned network output 之间的 MSE。4.7 Regularization让 mask 稀疏GAL 的正则项包括其中这个 L1 正则非常关键。它会把 soft mask 中的许多元素压小甚至压到 0。如果某个对应结构的输出对后续计算没有贡献就可以删除。论文明确指出当时可以可靠地移除对应结构因为它的输出对后续计算没有贡献。这里的控制剪枝强度λ 小 mask 稀疏弱剪得少精度更稳。 λ 大 mask 稀疏强剪得多压缩率更高但精度风险更大。4.8 为什么需要 FISTA理论上用 SGD 加 L1 正则也可以让 mask 变小。但论文发现单纯 SGD 很难把 mask 精确变成 0最后只能用阈值强行删除接近 0 的结构。问题是mask 接近 0 不等于 mask 等于 0如果强行 threshold可能误删仍有影响的结构导致精度明显下降。因此 GAL 引入FISTAFast Iterative Shrinkage-Thresholding Algorithm用 proximal shrinkage 的方式更新 mask使部分 mask 可以更可靠地变成精确 0。论文指出SGD 会导致 soft mask 中出现非精确 0 的 scaling factors而 FISTA 可以更有效地求解并可靠移除冗余结构。FISTA 中的核心 proximal 操作可以写成这其实就是 soft-thresholding如果 |z_i| 很小 直接压成 0。 如果 |z_i| 比阈值大 往 0 的方向收缩。这一步是 GAL 能够“可靠删除结构”的关键。4.9 GAL 如何剪 channel对于 channel selectionGAL 在当前层输入 feature maps 后面加 soft mask。第 (l) 层第 (j) 个输出 feature map 可以写成其中第 (l) 层第 (i) 个输入 feature map输入通道对应的 soft mask连接输入通道 (i) 和输出通道 (j) 的卷积核(*)卷积非线性激活。如果那么该输入通道对当前层所有输出都没有贡献所以可以删除当前层输入 channel 被删除 上一层对应输出 channel / filter 被删除论文说明GAL 在当前层输入后加入 soft mask用来指导当前层 input channel pruning 和上一层 output channel pruning。4.10 GAL 如何剪 branch对于 GoogLeNet、ResNeXt 这类多分支网络GAL 可以给每个 branch 加 mask。一个 Inception 模块可以写成其中第 i 个 branch 的变换第 i个 branch 的 soft maskconcat 操作。如果某个该 branch 就可以整体删除。这比逐个 filter 剪枝更粗粒度能够直接减少一个完整分支的计算。论文明确说明GAL 可以用于 branch selection并在 GoogLeNet 中删除对应 mask 为 0 的 branch。4.11 GAL 如何剪 block对于 ResNetGAL 可以给 residual block 的残差分支加 mask如果那么 residual mapping 被置零也就是这个 residual block 可以被跳过或删除。这个设计很适合 ResNet。因为删除 residual mapping 不会切断主干信息流shortcut 仍然保留。论文指出block selection 对 ResNet 很有效因为可以把残差映射置零而不切断信息流。五、关键公式5.1 总目标5.2 对抗损失5.3 输出对齐损失5.4 Mask 稀疏正则5.5 FISTA soft-thresholding5.6 ResNet block selection5.7 Channel selection六、实验设置GAL 在多个数据集上验证包括MNIST CIFAR-10 ImageNet ILSVRC 2012论文摘要和官方仓库都说明 GAL 在 MNIST、CIFAR-10 和 ImageNet ILSVRC 2012 上进行了实验。涉及的网络包括LeNet VGGNet DenseNet-40 GoogLeNet ResNet-56 ResNet-110 ResNet-50其中CIFAR-10 上主要测试 VGGNet、DenseNet-40、GoogLeNet、ResNet-56/110ImageNet 上测试 ResNet-50。论文还专门针对不同结构设计了 channel、branch、block 三种 selection。官方代码仓库说明代码在Python 3.6、PyTorch 0.4.1、CUDA 9.0、Ubuntu 16.04上测试并提供main.py训练、finetune.py微调和run.sh运行脚本。七、实验结果解读7.1 VGGNet / CIFAR-10GAL 优于 L1 和 SSS在 CIFAR-10 的 VGGNet 实验中baseline classification error 为 6.04%。论文报告当 (\lambda0.05) 时GAL 达到 6.23% error同时 FLOPs pruned rate 为 39.6%parameters pruned rate 为 77.6%。相比 L1 的 6.60% error、34.3% FLOPs pruned rate 和 64.0% parameter pruned rateGAL 在精度和压缩率上都更好。这个结果说明GAL 不是只把参数压得更稀疏 而是在保持输出接近 baseline 的同时 学到了更有效的结构化稀疏 mask。7.2 DenseNet-40 / CIFAR-10复杂连接下仍可用DenseNet 的 dense connectivity 会让结构化剪枝更复杂因为删除某一层输出可能影响后面多个层的输入维度。论文因此在 DenseNet-40 中只剪当前层输入 channels而不是直接同步删除上层输出 feature maps以避免维度不匹配。实验中当 (\lambda0.01) 时GAL 剪掉 3362 / 8904 channelsFLOPs saving 为 35.3%相比 Network Slimming 的 32.8% 计算节省更高但 error 略高为 5.39% vs. 5.19%。这个结果说明 GAL 可以扩展到 DenseNet但复杂连接结构仍需要工程上的特殊处理。7.3 GoogLeNet / CIFAR-10branch selection 有效GoogLeNet 是典型多分支网络。GAL 可以直接学习每个 branch 的 soft mask并删除 mask 为 0 的 branch。论文报告GAL 在 GoogLeNet 上删除 14 / 36 branchesFLOPs saving 为 38.2%parameter saving 为 49.3%classification error 只增加 0.49%。这个实验很重要因为它说明 GAL 不只是 channel pruning 方法而是可以做更粗粒度的 branch pruning。7.4 ResNet-56 / CIFAR-10block selection 能直接删残差块对于 ResNet-56GAL 通过 block selection 删除 residual blocks。论文报告当 (\lambda0.6) 时GAL 删除 10 / 27 residual blocksFLOPs pruned rate 为 37.6%并且 error 反而下降 0.12%。当 (\lambda0.8) 时删除更多 blocksFLOPs pruned rate 达到 60.2%fine-tuning 后 error 为 8.42%。这说明 ResNet 中确实存在 block-level redundancy。相比只剪 channelsblock pruning 可以直接跳过整段残差映射结构更粗、加速潜力也更明显。7.5 ResNet-50 / ImageNet联合剪 block 和 channel在 ImageNet 上GAL 评估了 ResNet-50。原始 ResNet-50 的 Top-1 / Top-5 error 为 23.85 / 7.13FLOPs 为 4.09B参数量为 25.5M。论文报告GAL-0.5: Top-1 / Top-5 error 28.05 / 9.06 FLOPs 2.33B Params 21.2M GAL-1: Top-1 / Top-5 error 30.12 / 10.25 FLOPs 1.58B Params 14.67M GAL-0.5-joint: Top-1 / Top-5 error 28.20 / 9.18 FLOPs 1.84B Params 19.31M GAL-1-joint: Top-1 / Top-5 error 30.69 / 10.88 FLOPs 1.11B Params 10.21M其中joint表示同时剪 heterogeneous structures也就是同时剪 blocks 和 channels。论文指出联合剪 block 和 channel 可以得到更高 speedup 和 compression。最有代表性的结论是GAL-1-joint 在 ResNet-50 上达到 1.11B FLOPs 和 10.21M 参数Top-5 error 为 10.88%。论文摘要也强调pruned ResNet-50 在 ImageNet 上实现 10.88% Top-5 error并达到 3.7× speedup。7.6 FISTA 的作用比 SGD 更可靠地得到 0 mask论文消融实验比较了 SGD 和 FISTA。作者指出如果只用 SGD 优化 soft maskmask 往往只是接近 0而不是精确为 0后续 threshold 可能导致性能大幅下降。FISTA 则可以在训练过程中更安全地将冗余结构对应 mask 推到 0。因此FISTA 不是一个可有可无的小技巧而是 GAL 能够可靠删除结构的关键。7.7 GAN 的作用没有 GAN 会明显退化论文还做了 GAN 消融实验比较了有无 GAN、以及 CGAN。结果显示没有 GAN 时 error 会明显升高GAL 也优于 CGAN。论文给出的一个例子是在 ResNet-56 上相同正则和优化器下label-free GAL 达到 8.42% error 和 65.9% parameter pruned rate而 label-dependent CGAN 为 9.56% error 和 50.5% parameter pruned rate。这说明 GAL 中的 adversarial learning 并不是装饰而是确实帮助剪枝网络更好地模仿 baseline 输出分布。八、方法优点8.1 可以端到端学习结构化稀疏GAL 不需要手工逐层计算重要性指标也不需要每剪一层就 fine-tuning。它通过 soft mask 和对抗学习在一个训练过程中学习要保留或删除的结构。这比传统 layer-wise pruning 更接近全局结构优化。8.2 支持异构结构联合剪枝GAL 可以剪channels / filters branches residual blocks这比只剪 filter 或只剪 channel 的方法更灵活。尤其在 ResNet 和 GoogLeNet 上block / branch level pruning 可以直接删除较大计算单元比单通道剪枝更容易获得显著 FLOPs reduction。8.3 Label-freeGAL 不直接依赖真实标签而是让 pruned network 去模仿 baseline output。这在没有标签或标签不方便使用的压缩场景下有优势。这也是它和 Network Slimming、DCP 等监督式剪枝方法的重要区别。8.4 Soft mask 比 binary mask 更容易优化直接学习 binary mask 是离散优化问题很难用常规梯度法优化。GAL 使用 continuous soft mask将 hard pruning 问题放松为可微优化问题。然后通过 L1 regularization 和 FISTA 把 mask 推向精确 0实现结构删除。8.5 和知识蒸馏有联系但更偏结构搜索GAL 中 baseline 类似 teacherpruned network 类似 student。但它不是手工设计小 student而是在同结构网络上加入 soft mask通过 mask 学出剪枝结构。所以 GAL 可以理解为Knowledge distillation GAN output alignment sparse architecture search九、方法局限9.1 训练流程复杂GAL 需要同时维护baseline network pruned generator network discriminator soft mask FISTA update fine-tuning相比 L1、FPGM、HRank 这类简单排序式剪枝GAL 的工程复杂度明显更高。9.2 GAN 训练不稳定GAN 本身就存在训练不稳定问题。虽然论文引入了 adversarial regularization 和 FISTA 来缓解问题但实际复现时判别器和生成器的平衡仍然是一个难点。如果 discriminator 太强pruned network 得不到有效梯度如果 discriminator 太弱对抗约束又失去作用。9.3 超参数较多GAL 至少涉及λ: mask 稀疏强度 μ / adversarial regularization: 判别器正则强度 generator learning rate discriminator learning rate FISTA update 参数 pruning structure type fine-tuning 策略官方代码运行示例中也需要设置LAMBDA、MIU、teacher_dir、student_model等参数。9.4 剪枝后仍需要 fine-tuning虽然 GAL 学到了稀疏 mask但最终删除结构后通常仍需要 fine-tuning。官方代码仓库也提供了finetune.py用于加载 pruned model 后继续微调。因此GAL 不是完全 one-shot pruning。9.5 对 Transformer / LLM 不直接适用GAL 原文面向 CNN 结构化剪枝剪枝对象主要是channels branches residual blocks对于 ViT、LLM、VLM剪枝对象变成attention heads MLP hidden dimensions tokens layers KV cache vision tokensGAL 的 “soft mask teacher output alignment adversarial learning sparsity” 思想可以迁移但原始结构选择公式不能直接照搬。十、后续影响GAL 的影响主要体现在三个方面。第一它把 GAN 引入结构化剪枝让剪枝网络通过对抗学习模仿原始网络输出分布。这比单纯 MSE 重构或分类 loss 更强调分布级对齐。第二它推动了soft mask learning在剪枝中的使用。相比 hard masksoft mask 让结构选择变得可微相比普通 L1 稀疏FISTA 让 mask 更容易达到精确 0。第三它展示了异构结构联合剪枝的潜力。GAL 不局限于 filter / channel而是可以剪 branch 和 block这使它更接近一种结构搜索方法。从专栏脉络看GAL 可以放在这里Pruning Filters for Efficient ConvNets ↓ ThiNet ↓ Channel Pruning ↓ Network Slimming ↓ NISP ↓ DCP ↓ SFP ↓ FPGM ↓ HRank ↓ GAL ↓ Rethinking the Value of Network Pruning如果说 HRank 问的是哪个 filter 输出的 feature map 信息量少那么 GAL 问的是能不能通过可学习 soft mask 让网络自己决定哪些 channels / branches / blocks 可以被删 同时保持输出分布接近原始模型这就是 GAL 在剪枝论文脉络中的核心位置。十一、一句话总结《Towards Optimal Structured CNN Pruning via Generative Adversarial Learning》提出用带 soft mask 的剪枝网络作为生成器通过对抗学习和 MSE 输出对齐来模仿原始网络并用 L1 稀疏正则与 FISTA 将冗余结构的 mask 推到 0从而实现 channels、branches、blocks 等异构结构的端到端联合剪枝。