模型加速与压缩 | 剪枝乱炖
剪枝是模型压缩的一个子领域,依据剪枝粒度可以分为非结构化/结构化剪枝,依据实现方法可以大致分为基于度量标准/基于重建误差/基于稀疏训练的剪枝,并且逐渐有向AutoML发展的趋势。由于实现方法在剪枝粒度上是有通用性的,本文主要从实现方法进行展开,康康近年来关于剪枝的有的没的,从个人角度对近几年经典的剪枝方法以及其拓展进行一下梳理。
基于度量标准的剪枝
这类方法通常是提出一个判断神经元是否重要的度量标准,依据这个标准计算出衡量神经元重要性的值,将不重要的神经元剪掉。在神经网络中可以用于度量的值主要分为3大块:Weight / Activation / Gradient。各种神奇的组合就产出了各种metric玩法。
这里的神经元可以为非结构化剪枝中的单个weight亦或结构化剪枝中的整个filter。
Weight:基于结构化剪枝中比较经典的方法是Pruning Filters for Efficient ConvNets(ICLR2017),基于L1-norm判断filter的重要性。Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration(CVPR2019) 把绝对重要性拉到相对层面,认为与其他filters太相似的filter不重要。
Activation:Network trimming: A data-driven neuron pruning approach towards efficient deep architectures 用activations中0的比例 (Average Percentage of Zeros, APoZ)作为度量标准,An Entropy-based Pruning Method for CNN Compression 则利用信息熵进行剪枝。
Gradient:这类方法通常从Loss出发寻找对损失影响最小的神经元。将目标函数用泰勒展开的方法可以追溯到上世纪90年代初,比如Lecun的Optimal Brain Damage 和 Second order derivatives for network pruning: Optimal Brain Surgeon 。近年来比较有代表性的就是Pruning Convolutional Neural Networks for Resource Efficient(ICLR2017),对activation在0点进行泰勒展开。原作者也很好的向我们展现了如何优雅地进行方法迁移 Importance Estimation for Neural Network Pruning(CVPR2019),换成weight的展开再加个平方。类似的方法还有 Faster gaze prediction with dense networks and Fisher pruning,用Fisher信息来近似Hessian矩阵。SNIP: Single-shot Network Pruning based on Connection Sensitivity(ICLR2019)则直接利用导数对随机初始化的权重进行非结构化剪枝。相关工作同样可以追溯到上世纪80年代末Skeletonization: A Technique for Trimming the Fat from a Network via Relevance Assessment(NIPS1988)。历史总是惊人的相似:
还有一些考虑实际硬件部署并结合度量标准进行剪枝的方法,对网络层的剪枝顺序进行了选择。Designing Energy-Efficient Convolutional Neural Networks using Energy-Aware Pruning(CVPR2017)利用每层的energy consumption来决定剪枝顺序,NetAdapt: Platform-Aware Neural Network Adaptation for Mobile Applications(ECCV2018)建立了latency的表,利用贪心的方式决定该剪的层。
基于重建误差的剪枝
这类方法通过最小化特征输出的重建误差来确定哪些filters要进行剪裁,即找到当前层对后面的网络层输出没啥影响的信息。ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression 采用贪心法,Channel Pruning for Accelerating Very Deep Neural Networks(ICLR2017) 则采用Lasso regression。NISP: Pruning Networks using Neuron Importance Score Propagation(CVPR2018) 通过最小化网络倒数第二层的重建误差,并将反向传播的误差累积考虑在内,来决定前面哪些filters需要裁剪。
基于稀疏训练的剪枝
这类方法采用训练的方式,结合各种regularizer来让网络的权重变得稀疏,于是可以将接近于0的值剪掉。Learning Structured Sparsity in Deep Neural Networks 用group Lasso进行结构化稀疏,包括filters, channels, filter shapes, depth。 Data-Driven Sparse Structure Selection for Deep Neural Networks(ECCV2018)通过引入可学习的mask,用APG算法来稀疏mask达到结构化剪枝。A Systematic DNN Weight Pruning Framework using Alternating Direction Method of Multipliers(ECCV2018) 的思想类似,用约束优化中的经典算法ADMM来求解。由于每个通道的输出都会经过BN,可以巧妙地直接稀疏BN的scaling factor,比如 Learning Efficient Convolutional Networks through Network Slimming(ICCV2017) 采用L1 regularizer,Rethinking the Smaller-Norm-Less-Informative Assumption in Channel Pruning of Convolution Layers(ICLR2018) 则采用ISTA来进行稀疏。MorphNet: Fast & Simple Resource-Constrained Structure Learning of Deep Networks(CVPR2018) 也是直接利用L1 regularizer,但是结合了MobileNet中的width-multiplier,加上了shink-expand操作,能够更好的满足资源限制。
Random and Rethinking
有采用各种剪枝方法的就有和这些剪枝方法对着干的。Recovering from Random Pruning: On the Plasticity of Deep Convolutional Neural Networks 就表明了度量标准都没啥用,随机赛高。Rethinking the Value of Network Pruning(ICLR2019) 则表示剪枝策略实际上是为了获得网络结构,挑战了传统的 train-prune-finetune的剪枝流程。Pruning from Scratch 则直接用Network Slimming的方法对训练过程中的剪枝结构进行了一波分析,发现直接采用random初始化的网络权重能够获得更丰富的剪枝结构。
走向NAS的自动化剪枝
从AMC: AutoML for Model Compression and Acceleration on Mobile Devices[ECCV2018]开始将强化学习引入剪枝,剪枝的研究开始套上各种Auto的帽子,玩法更是层出不穷。AutoSlim: Towards One-Shot Architecture Search for Channel Numbers先训练出一个slimmable model(类似NAS中的SuperNet Once for All: Train One Network and Specialize it for Efficient Deployment),继而通过贪心的方式逐步对网络进行裁剪。
Network Pruning via Transformable Architecture Search(NIPS2019) 则把NAS可导的一套迁移过来做剪枝。Approximated Oracle Filter Pruning for Destructive CNN Width Optimization(ICML2019)平行操作网络的所有层,用二分搜索的方式确定每层的剪枝数。Fine-Grained Neural Architecture Search 把NAS的粒度降到了通道,包含了空的操作即剪枝。还有各种拿进化来做的也就不提了。
此外,还有基于信息瓶颈的方法Compressing Neural Networks using the Variational Information Bottleneck(ICML2018),聚类的方法Centripetal SGD for Pruning Very Deep Convolutional Networks with Complicated Structure(CPVR2019),等等等等等......
剪枝之外
提升精度: 利用剪枝的方式来提升模型精度,比如DSD: Dense-Sparse-Dense Training for Deep Neural Networks(ICLR2017)利用非结构化剪枝,阶段性的砍掉某些权重再恢复。稀疏训练Sparse Networks from Scratch: Faster Training without Losing Performance在训练过程中保持网络的稀疏率不变,动态调整层间的稀疏率。
动态结构:不同的输入图片可以走网络中的不同结构。BlockDrop: Dynamic Inference Paths in Residual Networks(CVPR2018)引入一个Policy Network,以Block为单位进行选择。Dynamic Channel Pruning: Feature Boosting and Suppression(ICLR2019)引入SEBlock,以Channel为单位进行选择。Improved Techniques for Training Adaptive Deep Networks采用截断式的选择,简单的图片采用靠前的网路层解决,复杂的加入后面得网络层。
总结
一脉梳理下来感觉做纯的剪枝感觉很难了,对比人工设计的结构和准则,NAS出来的模型可以又小巧精度又高,剪枝也逐渐受其影响快、准、狠地寻找结构。这些效果好的结构和权重背后到底还藏着些什么,请勇士们冲吧。