一、论文基本信息论文题目Channel Pruning via Automatic Structure Search方法名称ABCPruner作者Mingbao Lin、Rongrong Ji、Yuxin Zhang、Baochang Zhang、Yongjian Wu、Yonghong Tian发表信息IJCAI 2020论文链接官方代码这篇论文提出了一种基于Artificial Bee Colony人工蜂群算法的自动通道剪枝方法方法名为ABCPruner。论文摘要中明确说明ABCPruner 的目标不是像传统方法那样选择“重要通道”而是直接搜索最优剪枝结构也就是每一层应该保留多少通道。官方 GitHub 仓库说明其为ABCPruner 的 PyTorch 实现对应 IJCAI 2020 论文Channel Pruning via Automatic Structure Search。二、论文要解决的问题传统通道剪枝方法大多关注这一层里哪些 filters / channels 更重要例如L1 Filter Pruning: 根据 filter 的 L1 范数选择通道。 ThiNet / Channel Pruning: 根据特征重构误差选择通道。 Network Slimming: 根据 BN gamma 稀疏性选择通道。 FPGM: 根据 filter 几何冗余选择通道。 HRank / CHIP: 根据 feature map 的 rank 或通道独立性选择通道。ABCPruner 认为通道剪枝真正关键的问题不一定是“哪些通道重要”而是每一层到底应该保留多少通道也就是网络剪枝后的结构C (c_1, c_2, ..., c_L)其中c_1: 第 1 层保留多少通道 c_2: 第 2 层保留多少通道 ... c_L: 第 L 层保留多少通道论文明确指出ABCPruner 受到 “channel pruning 的关键在于找到 optimal pruned structure而不是选择 important channels” 这一观点启发因此把剪枝问题转化为搜索最优层级通道数配置。这个问题很重要。因为即使你知道某一层内部哪些通道更重要如果每层剪枝率设得不好最终模型也可能不是最优。例如浅层剪太多 低级视觉特征被破坏。 深层剪太少 冗余参数没有充分去掉。 所有层统一剪 50% 忽略了不同层冗余程度不同。因此ABCPruner 关注的是不是通道级 importance ranking 而是网络级 structure search。三、核心思想ABCPruner 的核心思想可以概括为一句话把每一层保留通道数看作一个搜索变量把一个完整剪枝网络结构看作一个“食物源”然后用人工蜂群算法在结构空间中搜索精度最好的剪枝结构。一个候选剪枝结构可以表示为C (c_1, c_2, ..., c_L)例如对于一个 5 层 CNN原始通道数是[64, 128, 256, 256, 512]一个候选剪枝结构可能是[48, 96, 160, 192, 320]另一个候选结构可能是[32, 80, 128, 160, 256]ABCPruner 不直接问conv3 的第 17 个通道重要吗而是问conv3 最后应该保留 160 个通道还是 192 个通道整体流程可以概括为初始化多个候选剪枝结构 ↓ 每个结构对应一个剪枝网络 ↓ 对每个剪枝网络短暂训练得到 fitness ↓ 用人工蜂群算法更新候选结构 ↓ 重复搜索若干轮 ↓ 选择 fitness 最高的剪枝结构 ↓ 对该结构进行正式 fine-tuning论文 Figure 1 中描述的流程正是先初始化结构集合然后随机选择预训练模型 filters 赋给每个结构短训练以计算 fitness接着用 ABC 算法更新结构集合最终选出 fitness 最好的剪枝结构并保留其训练权重作为后续 fine-tuning 的 warm-up。四、方法细节4.1 剪枝结构表示给定一个包含 (L) 个卷积层的 CNN原始网络结构表示为其中c_j: 第 j 层原始通道数。剪枝后的结构表示为其中也就是说第 (j) 层剪枝后只保留个通道。论文将通道剪枝目标写成寻找一个最优剪枝结构 (C)使得该结构对应的剪枝网络经过训练或 fine-tuning 后在测试集上取得尽可能高的精度。可以理解为传统剪枝 重点是通道选择。 ABCPruner 重点是结构搜索。4.2 为什么不能暴力搜索如果每一层都可以保留任意数量的通道那么候选结构数量是对于深层网络这个数量极其巨大。论文中举例说明VGGNet-16、GoogLeNet、ResNet-152 的结构组合数量分别可以达到非常大的数量级因此暴力枚举不可行。直观来看假设每层有 100 种保留通道数选择 网络有 20 层 那么结构组合数量是 100^20。这显然无法逐个训练和评估。因此ABCPruner 第一步要做的是缩小结构搜索空间。4.3 Combination Shrinkage缩小搜索空间ABCPruner 不允许每一层保留任意通道数而是把可选通道数限制到一个离散集合例如如果某层有 100 个通道且 (\alpha70%)那么这一层可选保留通道数为10, 20, 30, 40, 50, 60, 70这样每一层不再有 100 种选择而只有 7 种选择。论文称这个过程为Combination Shrinkage其作用是显著减少剪枝结构组合数使自动搜索变得可行。这一步非常关键。因为 ABC 算法虽然能做启发式搜索但如果搜索空间无限大或过大仍然很难有效找到好结构。4.4 Artificial Bee Colony Algorithm 是什么ABC 算法是一种群智能优化算法模拟蜜蜂寻找食物源的过程。在 ABCPruner 中可以这样对应一个食物源 一个候选剪枝结构 C 食物源的蜜量 该剪枝结构对应模型的验证精度 / fitness 蜜蜂搜索 修改候选结构中的某些层通道数 最优食物源 最优剪枝结构ABC 算法中通常有三类蜜蜂Employed Bee: 围绕当前食物源做局部搜索。 Onlooker Bee: 根据食物源质量选择更好的方向继续搜索。 Scout Bee: 如果某个食物源长期没有改进就放弃它重新随机探索。ABCPruner 把这三类机制移植到剪枝结构搜索中。论文 Algorithm 1 明确包含 Employed Bee、Onlooker Bee 和 Scout Bee 三个阶段。4.5 Employed Bee局部生成新结构对于当前候选结构Employed Bee 会生成一个新候选结构。第 (i) 层的新通道数由下面公式生成这个公式的意义是参考当前结构和另一个结构之间的差异 沿着某个方向扰动当前结构 生成新的候选剪枝结构。如果新结构 (G_j) 的 fitness 更好就替换旧结构 (C_j)否则保留旧结构。论文把这一阶段称为 Employed Bee并用候选结构短训练后的 accuracy 作为 fitness。4.6 Fitness如何评价一个剪枝结构ABCPruner 的 fitness 定义为也就是说一个候选结构的 fitness 是该剪枝模型经过短暂训练后在测试集或验证集上的精度。论文中为了降低搜索成本不会对每个候选结构完整训练到收敛而是给定一个候选结构 ↓ 从预训练模型中随机选择对应数量的 filters 作为初始化 ↓ 短暂训练几个 epoch ↓ 用精度作为 fitness论文实验设置中每个候选结构只训练 2 个 epochs 来获得 fitness最终选出的最佳结构再进行更长时间 fine-tuning。这和 EagleEye、AMC 有相似之处AMC: 用未 fine-tuning 精度作为 reward。 EagleEye: 用 Adaptive BN 后的精度快速评估候选子网。 ABCPruner: 用短训练后的精度作为候选结构 fitness。三者都在解决同一个问题不能把每个候选结构都完整训练到收敛 所以必须设计低成本评估方式。4.7 Onlooker Bee偏向选择高 fitness 结构Onlooker Bee 会根据当前候选结构的 fitness 选择搜索对象。论文定义选择概率为这个公式表示fitness 越高的结构 越有可能被继续选择和扰动。加上 (0.1) 的原因是避免概率过低让较差结构也有一定机会被探索。如果某个结构被 Onlooker Bee 选中它会继续按照 Employed Bee 类似的方式生成新结构并根据 fitness 决定是否替换。4.8 Scout Bee避免陷入局部最优如果某个候选结构连续多次没有被更新说明它可能陷入了局部最优或没有继续搜索价值。这时 Scout Bee 会重新初始化该结构某个候选结构长时间没有提升 ↓ 放弃该结构 ↓ 随机生成一个新结构 ↓ 继续搜索论文 Algorithm 1 中用计数器 (t_j) 记录每个结构未改进次数如果超过阈值 (M)就重新初始化该结构。这一步保证了搜索过程既有 exploitation也有 explorationEmployed / Onlooker: 在已有好结构附近继续搜索。 Scout: 跳出局部区域重新探索。4.9 ABCPruner 的完整流程ABCPruner 的完整流程可以写成输入 预训练模型 每层原始通道数 C (c1, c2, ..., cL) 通道保留上限 α 候选结构数量 n 搜索轮数 T 停滞阈值 M Step 1: 初始化 n 个候选剪枝结构。 每个结构 C_j 的每一层通道数从 {0.1c_i, 0.2c_i, ..., αc_i} 中随机采样。 Step 2: 对每个候选结构 随机选择预训练模型中的 filters 初始化剪枝模型。 短训练若干 epoch。 计算验证精度作为 fitness。 Step 3: Employed Bee 对每个候选结构生成扰动结构。 如果新结构 fitness 更好则替换。 Step 4: Onlooker Bee 按 fitness 概率选择结构。 对被选中的结构继续扰动和更新。 Step 5: Scout Bee 如果某个结构长期没有提升则重新初始化。 Step 6: 重复搜索 T 个 cycles。 Step 7: 选择 fitness 最高的结构作为最优剪枝结构。 Step 8: 对最优结构进行正式 fine-tuning。论文实验中设置 (T2)、候选结构数 (n3)、停滞阈值 (M2)并对每个候选结构短训练 2 个 epochs 来计算 fitness。五、关键公式5.1 原始网络结构5.2 剪枝网络结构5.3 最优剪枝结构搜索目标含义是寻找一个剪枝结构 (C)使得对应剪枝模型经过训练或微调后精度最高。5.4 搜索空间缩小每层候选通道数限制为5.5 Employed Bee 生成新结构5.6 Fitness5.7 Onlooker Bee 选择概率六、实验设置ABCPruner 在 CIFAR-10 和 ImageNet ILSVRC-2012 上验证。CIFAR-10 实验包括 VGGNet、GoogLeNet、ResNet-56 和 ResNet-110ImageNet 实验包括 ResNet-18、ResNet-34、ResNet-50、ResNet-101 和 ResNet-152。论文使用 SGD 进行 fine-tuningmomentum 为 0.9batch size 为 256CIFAR-10 上 fine-tuning 150 epochsImageNet 上 fine-tuning 90 epochs。论文使用的压缩指标包括Channel number FLOPs Parameters Top-1 accuracy Top-5 accuracy其中 CIFAR-10 报告 Top-1 accuracyImageNet 报告 Top-1 和 Top-5 accuracy。官方代码仓库提供了 CIFAR-10 和 ImageNet 的剪枝脚本包括bee_cifar.py、bee_imagenet.py和get_flops_params.pyREADME 中也列出了 VGG16、ResNet56、GoogLeNet、ResNet18、ResNet34、ResNet50 等模型的剪枝结果和预训练模型链接。七、实验结果解读7.1 VGGNet-16 / CIFAR-10大幅压缩参数和 FLOPs精度略升在 VGGNet-16 / CIFAR-10 上baseline accuracy 为 93.02%。ABCPruner-80% 保留的总通道数为 1639剪掉 61.20% channels、73.68% FLOPs 和 88.68% parameters最终 accuracy 为 93.08%比 baseline 略高 0.06%。这说明VGGNet 存在较强结构冗余 只要每层保留通道数分配合理 大幅减少参数和 FLOPs 也可以保持精度。这里的重点不是某个通道重要性指标多准确而是搜索出的层级结构比较合适。7.2 GoogLeNet / CIFAR-10紧凑网络也能压缩GoogLeNet 本身已经是较紧凑的多分支网络。ABCPruner-30% 在 CIFAR-10 上剪掉 22.19% channels、66.56% FLOPs 和 60.14% parametersaccuracy 从 95.05% 降到 94.84%只下降 0.21%。这说明 ABCPruner 不只是适合 VGG 这种冗余很大的网络也能用于更紧凑的结构。不过需要注意GoogLeNet 的分支结构比较复杂实际工程中剪枝时要处理 concat 分支通道对齐问题。7.3 ResNet-56 / CIFAR-1054.13% FLOPs reduction几乎不掉点在 ResNet-56 / CIFAR-10 上baseline accuracy 为 93.26%。ABCPruner-70% 剪掉 27.07% channels、54.13% FLOPs 和 54.20% parametersaccuracy 为 93.23%只下降 0.03%。这个结果说明即使是带 residual connection 的 ResNet 自动结构搜索也能找到较好的每层通道分配。7.4 ResNet-110 / CIFAR-10更深模型冗余更多在 ResNet-110 / CIFAR-10 上baseline accuracy 为 93.50%。ABCPruner-60% 剪掉 33.28% channels、65.04% FLOPs 和 67.41% parametersaccuracy 为 93.58%比 baseline 高 0.08%。论文也指出从 ResNet-56 到 ResNet-110剪枝率在 channels、FLOPs 和 parameters 上都有提升原因是更深网络通常更过参数化存在更多冗余。7.5 ResNet / ImageNet深层网络上压缩率更高在 ImageNet 上ABCPruner 测试了 ResNet-18、ResNet-34、ResNet-50、ResNet-101 和 ResNet-152。论文表 2 显示ResNet-50 的 ABCPruner-80% 将 FLOPs 从 4135.70M 降到 1890.60M参数从 25.56M 降到 11.75MTop-1 从 76.01% 到 73.86%Top-5 从 92.96% 到 91.69%。ResNet-152 的 ABCPruner-70% 将 FLOPs 从 11605.91M 降到 4309.52M参数从 60.19M 降到 24.07MTop-5 仅下降 0.51%。论文进一步分析认为在 ImageNet 上精度下降比 CIFAR-10 更明显一方面因为 ResNet 本身是比较紧凑的结构另一方面 ImageNet 有 1000 类任务难度更高同时越深的 ResNet 通常冗余越多ABCPruner 可以获得更高剪枝率和较小精度下降。7.6 和 ThiNet、GAL、MetaPruning 等方法比较在 ResNet-50 / ImageNet 上论文将 ABCPruner 与 ThiNet、SSS、GAL、CP 和 MetaPruning 进行比较。例如ABCPruner-30%: FLOPs 0.94G Top-1 70.29% Epochs 102 ThiNet-30: FLOPs 1.10G Top-1 68.42% Epochs 244 ABCPruner-50%: FLOPs 1.30G Top-1 72.58% Epochs 102 MetaPruning-0.75: FLOPs 2.26G Top-1 72.17% Epochs 160论文认为 ABCPruner 的优势来自两个方面第一它直接搜索剪枝结构而不是只做通道重要性选择第二它是一阶段设计不需要像 MetaPruning 那样额外训练一个 PruningNet。八、方法优点8.1 从“通道选择”转向“结构搜索”ABCPruner 最大的贡献是把通道剪枝的重点从哪些通道重要转为每一层应该保留多少通道这个转变非常重要。因为层间通道数分配往往比单层内部通道排序更影响最终模型结构。8.2 自动搜索减少人工设定剪枝率传统方法需要人工指定每层剪枝比例。ABCPruner 用 ABC 算法自动搜索层级通道数减少了人工经验依赖。例如不再需要手动决定conv1 剪 10% conv2 剪 30% conv3 剪 50%而是让搜索过程自己找出每层保留通道数。8.3 搜索空间经过离散化效率更高ABCPruner 不是在无限或巨大空间里搜索而是先把每层候选通道数限制为10%, 20%, ..., α%这显著降低了搜索复杂度。论文明确把这种设计称为组合空间缩小使结构搜索更高效。8.4 不需要额外 PruningNet相比 MetaPruningABCPruner 不需要先训练一个大型 PruningNet 来预测候选结构权重。论文强调 ABCPruner 是 one-stage 设计候选结构的 fitness 直接在目标剪枝网络上测量。这使流程更直观候选结构 ↓ 构建剪枝网络 ↓ 短训练评估 fitness ↓ ABC 搜索更新结构8.5 与其他剪枝准则兼容ABCPruner 主要决定每层保留多少通道。至于某层内部具体选择哪些 filters论文中采用从预训练模型随机选择 filters 初始化候选结构并通过短训练评估结构 fitness。从方法思想上看它可以和其他通道选择准则结合例如L1 FPGM HRank CHIP Gate Decorator也就是说ABCPruner 更像是外层结构搜索器而不是单一 filter importance criterion。九、方法局限9.1 搜索仍有训练成本虽然每个候选结构只短训练几个 epoch但仍然需要构建多个候选结构并反复训练评估。论文实验中每个结构训练 2 个 epochs 来获得 fitness并最终对最佳结构进行完整 fine-tuning。因此ABCPruner 不是 zero-cost pruning。9.2 Fitness 估计可能不完全可靠ABCPruner 使用短训练后的精度作为结构 fitness。这存在一个潜在问题短训练表现好的结构 不一定完整 fine-tuning 后仍然最好。这个问题和 AMC、EagleEye、LeGR 都有关。EagleEye 后来特别指出候选子网的快速评估需要更可靠的校准方式比如 Adaptive BN。9.3 搜索空间仍由 α 和离散粒度决定ABCPruner 的搜索空间由下面集合决定[{0.1c_i, 0.2c_i, \dots, \alpha c_i}]这意味着它只能搜索 10% 粒度的通道比例。如果最优结构需要更细粒度的通道数比如 43% 或 57%这个空间可能无法表达。此外(\alpha) 本身仍然是超参数。论文分析了 (\alpha) 的影响并在 ResNet-56 / CIFAR-10 上选择 (\alpha70%) 来平衡精度和复杂度。9.4 对真实硬件延迟考虑不足ABCPruner 主要优化的是结构搜索后的 accuracy、FLOPs 和参数量。它没有像 NetAdapt 那样直接在目标平台上测量 latency也没有像 AMC 那样把真实移动端延迟作为 reward。因此对于部署场景仍需要进一步验证FLOPs 降低是否真的带来 latency 降低尤其在 GPU、NPU、移动端 CPU 上不同通道数对实际 kernel 效率的影响可能并不线性。9.5 对 Transformer / LLM 不直接适用ABCPruner 原文面向 CNN channel pruning。对于 Transformer、ViT、LLM、VLM结构变量可能变成每层 attention heads 保留数 每层 MLP hidden dimension 每层 token 数 每层 block 是否保留 KV cache 压缩比例ABCPruner 的思想可以迁移为把每层压缩配置编码成一个结构向量 ↓ 用群智能 / 进化算法搜索最优结构 ↓ 用快速评估指标计算 fitness但原始 CNN 通道结构和 filter 选择方式不能直接照搬。十、后续影响ABCPruner 的影响主要体现在三个方面。第一它强化了optimal pruned structure这一观点。也就是说通道剪枝的核心不只是判断哪个通道重要而是找到合适的层级通道配置。第二它将人工蜂群算法引入通道剪枝结构搜索为自动剪枝提供了一条不同于 RL、NAS、PruningNet 的路线。第三它和 AMC、MetaPruning、NetAdapt、LeGR、EagleEye 形成了自动剪枝方法谱系AMC: 用强化学习搜索每层压缩率。 NetAdapt: 用平台实测逐步适配结构。 MetaPruning: 用 PruningNet 生成候选结构权重。 EagleEye: 用 Adaptive BN 快速评估候选子网。 LeGR: 学习全局 filter ranking一次生成多预算模型。 ABCPruner: 用人工蜂群算法搜索每层保留通道数。十一、一句话总结《Channel Pruning via Automatic Structure Search》提出 ABCPruner把通道剪枝从“选择重要通道”转化为“搜索每层保留通道数”的结构优化问题并用人工蜂群算法在缩小后的结构空间中自动寻找最优剪枝结构它的核心价值不在于新的 filter 重要性指标而在于用群智能搜索实现自动层级通道配置优化。