背景:模型压缩包括:模型量化、模型剪枝、权值共享等压缩技术,知识蒸馏等配合模型压缩使用的恢复压缩后小模型精度的常用算法
一 概念
模型剪枝-细粒度划分: 根据修剪的最小单位区分方法
非结构性剪枝:权重剪枝、向量剪枝、kernel剪枝,这类剪枝会造成模型结构不规则化,所以需要特殊的硬件设计来支持稀疏操作,但是剪枝较为精细,所以剪枝后精度较高。
- 权值剪枝:把权重矩阵中的单个权重值设置为0。
- 神经元剪枝:把权重矩阵中某个神经元节点去掉,则和神经元相连接的突触也要全部去除。相当于同时去除权重矩阵中的某一行和列。
结构性剪枝:卷积核剪枝、通道剪枝和层级剪枝,只需改变网络中卷积核和特征通道的数目,所得到的模型就可以运行,无需特殊的算法设计。
- filter-wise:filter-wise剪枝是对完整的卷积核(kxkxc)进行剪枝;
- channel-wise:channel-wise是对所有卷积核中相同layer进行剪枝。
- shape-wise:shape-wise的剪枝颗粒度相对而言则更小一些。剪枝对象是所有卷积核中相同位置的部分权重的剪枝。
- stripe-wise pruning (SWP):针对每个卷积核的depth维度整体剪枝。但是不同卷积核剪枝的位置和数量不相同。
注意区别:卷积核剪枝与滤波器剪枝,即kernel剪枝与filter剪枝一般不做区分。
二 实战
yolo v5 prune使用卷积核剪枝和通道剪枝:
1 卷积核剪枝使用:FPGM(不是SFP,两者区别是重点,排序方式,是否做特征选择,是否需要重新训练,复杂度、效率),设置剪枝率,得到剪枝结果,【配图https://zhuanlan.zhihu.com/p/391045703】
SFP(Soft Filter Pruning)论文(代码),FPGM(Filter Pruning via Geometric Median)论文(代码) 两者区别:
都是基于过滤器剪枝(ilter pruning)的算法。
- 剪枝选择:SFP根据filter的L1/L2正则化参数选择少量的重要filter进行保留,其余filter全部剪枝。FPGM根据channel的重要性对filter中的各个channel进行排序,只剪枝排名较低的channel,保留重要的channel。FPGM的剪枝选择更加精确。
- 是否使用特征选择:SFP直接根据正则化参数选择filter,没有利用特征选择方法。而FPGM使用了基于channel之间相关性的特征选择方法(几何中位数)Geometric Median来选择重要的channel,这可以更好地捕捉到特征之间的关系,进行更准确的剪枝。
- 选择filter进行剪枝的策略不同。SFP是基于 filter 的重要性 ranking,选择低重要性 filter 进行剪枝,FPGM 是基于 filter 的 geometrical median,选择与其他filter的距离最大的filter进行剪枝。 FPGM 可以保留更多有用信息。
- SFP 只考虑了每个filter的重要性,FPGM 考虑了所有filter之间的关系,可以做到更精确、更合理的filter选择。
- SFP 是一个简单易用的算法,FPGM 的计算比较复杂,需要借助K-Means聚类来辅助计算距离加权平均值。
- 剪枝粒度:FPGM的剪枝粒度更细粒度,可以更加精细地剪枝。
- SFP算法主要是一种软剪枝方法,通过动态地减少卷积核数量来实现模型压缩;而FPGM算法则是一种硬剪枝方法,通过减少滤波器数量来实现模型压缩。
- 剪枝后调优:SFP的剪枝后只使用训练好的模型进行简单的调优。而FPGM的剪枝后,需要从零开始重新训练整个模型以适应剪枝后的新结构,可以更好地恢复精度。
- SFP算法通过聚类的方式将滤波器分为若干个类别,然后对每个类别中的滤波器进行剪枝,而FPGM算法则是通过计算几何中心的方式来判断滤波器的重要性,然后根据阈值进行剪枝.
-
SFP算法是一种基于权重稀疏化的剪枝方法,在训练过程中通过对卷积核的权重进行惩罚,使得一些冗余的卷积核的权重趋近于零,然后将这些权重很小的卷积核进行剪枝。FPGM算法则是一种基于几何中位数的剪枝算法,通过计算每个卷积核的几何中位数,将离中位数较远的卷积核进行剪枝。
总的来说,相比于SFP,FPGM的剪枝更加精细和准确,剪枝后的模型调优也更加全面,所以FPGM通常可以获得更高的剪枝比例和更好的精度恢复效果。但FPGM的计算复杂度也更高,训练时间更长。两者都是很有效的filter pruning方法,可以根据实际需求进行选择。
2 通道剪枝