深度学习网络模型从卷积层到全连接层存在着大量冗余的参数,大量神经元激活值趋近于0,将这些神经元去除后可以表现出同样的模型表达能力,这种情况被称为过参数化,而对应的技术则被称为模型剪枝。
卷积核的元素可分为 单个像素、行列、通道、卷积核,可分别在 不同元素上实现剪枝,如下图
细粒度剪枝(fine-grained):即对连接或者神经元进行剪枝,它是粒度最小的剪枝。
向量剪枝(vector-level):它相对于细粒度剪枝粒度更大,属于对卷积核内部(intra-kernel)的剪枝。
核剪枝(kernel-level):即去除某个卷积核,它将丢弃对输入通道中对应计算通道的响应。
滤波器剪枝(Filter-level):对整个卷积核组进行剪枝,会造成推理过程中输出特征通道数的改变。
细粒度剪枝(fine-grained),向量剪枝(vector-level),核剪枝(kernel-level)方法在参数量与模型性能之间取得了一定的平衡,但是网络的拓扑结构本身发生了变化,需要专门的算法设计来支持这种稀疏的运算,被称之为非结构化剪枝。
而滤波器剪枝(Filter-level)只改变了网络中的滤波器组和特征通道数目,所获得的模型不需要专门的算法设计就能够运行,被称为结构化剪枝。除此之外还有对整个网络层的剪枝,它可以被看作是滤波器剪枝(Filter-level)的变种,即所有的滤波器都丢弃。
根据 剪枝的处理策略 分为
1.对模型进行稀疏约束然后进行 训练后的剪枝
2.模型 训练中的剪枝
3.训练之前的剪枝
根据 粒度 分为
细粒度的权重连接剪枝
基本处理流程:训练-剪枝-finetune-循环
重点:
1. 如何评价一个连接的重要性
常见思路:
1. 基于连接幅度的方法:如 L1/L2 范数
详细步骤:
1. 训练一个基准模型。
2. 对权重值的幅度进行排序,去掉低于一个预设阈值的连接,得到剪枝后的网络。
3. 对剪枝后网络进行微调以恢复损失的性能,然后继续进行第二步,依次交替,直到满足终止条件,比如精度下降在一定范围内。
2. 基于损失函数的方法:根据剪枝对优化目标的影响来对其重要性进行判断
2. 如何在剪枝后恢复模型性能
粗粒度的通道/滤波器剪枝
常见方法:
1.基于重要性因子,即评估一个通道的有效性
1.通过激活的稀疏性来判断,稀疏性高的可以去除
2.利用重建误差来间接衡量一个通道对模型效果的影响
3.基于优化目标的变化来衡量通道的敏感性
参考资料:
https://zhuanlan.zhihu.com/p/134642289 【AI不惑境】模型剪枝技术原理及其发展现状和展望