模型剪枝经典论文精读: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 Learning,GAL 进行结构化剪枝,并且可以联合剪掉 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 不够灵活。
有些方法直接学习二值 mask:
mask = 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
↓
删除 mask=0 对应的 channels / branches / blocks
↓
fine-tuning 剪枝后模型
和 DCP 相比,DCP 是:
重构损失 + 判别损失
GAL 则是:
输出对齐损失 + 对抗损失 + mask 稀疏正则
它不只是想让某层特征重构得像,而是通过对抗学习,让剪枝网络整体输出分布接近原始网络。
四、方法细节
4.1 Baseline 网络与 Pruned 网络
论文定义原始预训练网络为:
其中:
-
x:输入图像;
-
:baseline 网络参数;
-
:baseline 网络输出特征。
带 soft mask 的剪枝网络定义为:
其中:
-
:剪枝网络参数;
-
m:soft 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 mask,soft mask 是连续可优化变量,因此更容易用梯度方法训练。论文强调,soft mask 可以缓解 hard filter pruning 的 slackness 问题。
4.3 为什么用 Generative Adversarial Learning?
GAL 把剪枝网络看作 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 game:generator 是剪枝网络,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 引入 FISTA,Fast 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 selection,GAL 在当前层输入 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 mask;
-
:concat 操作。
如果某个 ,该 branch 就可以整体删除。
这比逐个 filter 剪枝更粗粒度,能够直接减少一个完整分支的计算。论文明确说明,GAL 可以用于 branch selection,并在 GoogLeNet 中删除对应 mask 为 0 的 branch。
4.11 GAL 如何剪 block?
对于 ResNet,GAL 可以给 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-thresholding
5.6 ResNet block selection
5.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/110;ImageNet 上测试 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-10:GAL 优于 L1 和 SSS
在 CIFAR-10 的 VGGNet 实验中,baseline classification error 为 6.04%。论文报告,当 (\lambda=0.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 rate,GAL 在精度和压缩率上都更好。
这个结果说明:
GAL 不是只把参数压得更稀疏,
而是在保持输出接近 baseline 的同时,
学到了更有效的结构化稀疏 mask。
7.2 DenseNet-40 / CIFAR-10:复杂连接下仍可用
DenseNet 的 dense connectivity 会让结构化剪枝更复杂,因为删除某一层输出可能影响后面多个层的输入维度。论文因此在 DenseNet-40 中只剪当前层输入 channels,而不是直接同步删除上层输出 feature maps,以避免维度不匹配。
实验中,当 (\lambda=0.01) 时,GAL 剪掉 3362 / 8904 channels,FLOPs saving 为 35.3%,相比 Network Slimming 的 32.8% 计算节省更高,但 error 略高,为 5.39% vs. 5.19%。
这个结果说明 GAL 可以扩展到 DenseNet,但复杂连接结构仍需要工程上的特殊处理。
7.3 GoogLeNet / CIFAR-10:branch selection 有效
GoogLeNet 是典型多分支网络。GAL 可以直接学习每个 branch 的 soft mask,并删除 mask 为 0 的 branch。
论文报告,GAL 在 GoogLeNet 上删除 14 / 36 branches,FLOPs saving 为 38.2%,parameter saving 为 49.3%,classification error 只增加 0.49%。
这个实验很重要,因为它说明 GAL 不只是 channel pruning 方法,而是可以做更粗粒度的 branch pruning。
7.4 ResNet-56 / CIFAR-10:block selection 能直接删残差块
对于 ResNet-56,GAL 通过 block selection 删除 residual blocks。论文报告,当 (\lambda=0.6) 时,GAL 删除 10 / 27 residual blocks,FLOPs pruned rate 为 37.6%,并且 error 反而下降 0.12%。当 (\lambda=0.8) 时,删除更多 blocks,FLOPs pruned rate 达到 60.2%,fine-tuning 后 error 为 8.42%。
这说明 ResNet 中确实存在 block-level redundancy。相比只剪 channels,block pruning 可以直接跳过整段残差映射,结构更粗、加速潜力也更明显。
7.5 ResNet-50 / ImageNet:联合剪 block 和 channel
在 ImageNet 上,GAL 评估了 ResNet-50。原始 ResNet-50 的 Top-1 / Top-5 error 为 23.85 / 7.13,FLOPs 为 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 mask,mask 往往只是接近 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-free
GAL 不直接依赖真实标签,而是让 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 类似 teacher,pruned 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 tokens
GAL 的 “soft mask + teacher output alignment + adversarial learning + sparsity” 思想可以迁移,但原始结构选择公式不能直接照搬。
十、后续影响
GAL 的影响主要体现在三个方面。
第一,它把 GAN 引入结构化剪枝,让剪枝网络通过对抗学习模仿原始网络输出分布。这比单纯 MSE 重构或分类 loss 更强调分布级对齐。
第二,它推动了 soft mask learning 在剪枝中的使用。相比 hard mask,soft 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 等异构结构的端到端联合剪枝。
更多推荐
所有评论(0)