1.剪枝本身以及背景介绍
为了降低网络模型的计算量,从而减小网络的计算以及训练时间,并使其所占用的内存也随之变小,能够在性能较差的网络器件上也能够使用。一系列的模型简化方法随之而生。网络剪枝(Pruning)、量化(Quantization)、低秩分解(Low-rank factorization)、知识蒸馏(Knowledge distillation)等都是模型简化的方法之一。本文主要介绍网络剪枝这个方法。
网络剪枝能够有上述的优点,自然也会有一定的缺点。最核心的便是精度会有所下降,如果剪枝做的不好,那么精度会下降的非常厉害,如何解决这个问题便是后面学者所研究的方向。当然如果在pruning后精度提高的,这说明原模型过似合(overfit)了,pruning起到了regularization的作用。
网络剪枝分为结构化剪枝(Structured pruning)和非结构化剪枝(Unstructured pruning)两类。由于非结构化剪枝对下层的硬件与计算库要求较高,目前主要以结构化剪枝为主,结构化剪枝又可进一步细分为channel-wise、filter-wise、shape-wise三类。
2.网络剪枝应用方法
网络剪枝最简单的方法即为贪心法,即按照网络中参数(或特征输出)的绝对值大小来评估重要性,删除其中不重要的部分。但为了防止训练出来的权重不利于剪枝,我们还需要在loss上加上正则化项(regularizer,尤其是L1 regularizer)来使得权重稀疏化。一般我们是在BN层加入channel-wise scaling factor并对之加入L1 regularizer 使之稀疏,再裁剪scaling factor值小的部分权重。这个评估也可以针对激活函数的输出来进行。但缺点是只能得到局部的最优解。全局最优解可以通过:
搜索离散空间【将网络的压缩分成两个阶段-layer removal和layer shrinkage,并利用强化学习(Reinforcement learning)分别得到两个阶段】
规划问题【考虑了channel间的依赖关系 ,将channel选取问题形式化为约束下的二次规划问题,再用SQP(Sequential quadratic programming)求解】
Bayesian方法【提出了sparse variational droput。它对variational droput进行扩展使之可以对dropout rate进行调节,最终得到稀疏解从而起到裁剪模型的效果】
基于梯度的方法【用一个连续的分布结合 hard-sigmoid recification去近似它,从而使目标函数平滑,这样便可以用基于梯度的方法求解】
基于聚类的方法【分别用谱聚类和子空间聚类发掘filter和feature map中的相关信息,从而对参数进行简化压缩来进行求解】
3.网络剪枝裁剪量sparsity ratio
网络剪枝还有一个核心问题是裁剪多少即sparsity ratio的确定。这里的sparsity ratio定义为层中为0参数所占比例。可分为预定义(predifined)和自动(automatic)两种方式。Predefined方法由人工指定每一层的比例进行裁剪,因此目标结构是提前确定。而automatic方法会根据所有的layer信息(即全局信息)由pruning算法确定每层裁剪比例,因此目标结构一开始并不确定。
4.精度恢复
模型剪枝后会不可避免的引发精度损失,因此我们在网络剪枝的时候也要考虑精度的恢复问题。现在应用的方法有两类:
inference-time pruning【剪枝后用least-square得到最小化特征重建参数】
one-shot pruning【training后进行剪枝(pruning)再进行fine-tuning,即每次训练时都进行剪枝并进行精度恢复,防止一次损失过多难以有效恢复精度】
5.保留模型capacity
原先的网络剪枝后被裁剪的部分一般会直接丢弃不再使用,但一旦有重要的参数被裁剪,丢掉后便无法恢复。我们可以用SPF(Soft filter pruning)让被裁剪的filter在训练中仍能被更新,这样它仍有机会被恢复回来。或者是在pruning基础上加上splicing操作,避免不合适的pruning的影响。
由于pruning可能会使得模型的capacity损失,所以目前仍有人在对模型capacity的保留进行研究。虽然当今学者已经做到能够保留其capacity,但依旧存在一定的副作用,比如保留后模型的大小也保持了不变,另外也会对硬件的加速造成一定的影响。