Progressive 剪枝:打破 Train-Prune-Finetune 范式
上午让实验继续跑,顺便整理一下最近在看的剪枝论文思路,把自己对 progressive 剪枝方向的想法梳理一遍。
为什么要打破 Train-Prune-Finetune
目前主流的结构化剪枝流程是 train-prune-finetune:先训一个完整模型,再按某种重要性指标裁掉冗余通道,最后 finetune 恢复精度。这套流程逻辑上清晰,也被大多数论文沿用。
Progressive 剪枝的思路是直接跳过这套流程,改成 train-prune-train 的循环——在训练过程中持续剪枝,让网络边学边被压缩,最终直接得到一个极度压缩的模型,而不需要单独的 finetune 步骤。方法上来说可能会显得简单,但如果能刷出一个很好的效果,还是值得做下去的。
用层间相对统计信息指导非均匀剪枝
一刀切(uniform pruning)是最简单的基线,每层剪同样比例的通道。但不同卷积层对模型能力的贡献是不同的,直接按固定比例一刀切显然不够合理。
我现在考虑的方向是:利用不同卷积层之间的相对统计信息,不只是去找哪些通道不重要,而是先找哪些层相对不重要。相对不重要的层可以多剪一些,关键层保留更多,由此给出一套逐步剪枝的方案——每一步都根据层间的相对重要性来分配剪枝量,而不是对所有层一视同仁。
这套方案最终需要和一刀切做对比实验,直觉上应该会有更好的效果,尤其是在高压缩比的情况下,层间冗余程度的差异会被放大,非均匀方案的优势也应该更明显。
剪掉的 Channel 数类比于学习率
还有一个角度觉得挺有意思:把每步剪掉的 channel 数类比成梯度下降中的学习率。学习率决定每步参数更新的幅度,剪枝步长决定每步结构变化的幅度,两者都需要在”变化太剧烈导致不稳定”和”变化太小导致效率低”之间取得平衡。这个类比也许可以借鉴学习率调度的思路来设计剪枝调度的策略。
接下来的计划是先把实验结果跑出来,再和一刀切基线做系统对比,看看这个方向能走多远。