概述
这篇通道裁剪论文同样提到,对于权重裁剪在特定硬件上可以获得加速,但是通用性不够。相对的,通道裁剪就没有这样的问题。因此文章聚焦于通道裁剪达到模型压缩(降低参数量)和加速(减少计算 FLOPs)的效果。
同时文章将通道裁剪方法分为两类:
- 一类是基于 CNN 网络内在性质做裁剪,这类裁剪方法不需要修改网络损失,在裁剪后,通过 finetune 恢复模型性能;
- 另一类是自适应重要性排序方法,与前面方法不同的是,这类方法将裁剪方法集成到网络训练损失,然后联合优化一个自适应的裁剪决策。
如果下图所示,提出的方法属于第一类方法,不需要修改训练函数损失,更加直接方便。
方法
方法将特征图分为高秩部分和低秩部分,认为低秩部分包含更少的信息,可以进行裁剪。
因此首先需要计算特征图中各通道秩的情况。对于一个训练好的网络,输入一批图片,然后进行秩的计算。
论文首先证明了,如下图所示,不管输入图片数量多少,各层计算出的秩基本上保持稳定,使得可以在不用输入太多图片的情况下完成秩的估算。在实验中作者最终设置图片数量
g
=
500
g=500
g=500。
在计算出每个通道的秩之后,整个裁剪流程就相对简单了:
- 计算特征图平均秩;
- 对秩值按从高到低排序;
- 找到高秩值对应的特征通道,裁剪低秩值通道;
- 使用高秩值通道作为预训练权重,对裁剪后的模型进行 finetune 训练。
一些裁剪情况如下图所示,其中红线所指向的是发生了裁剪的卷积层:
实验和指标
方法在 Resnet、Densenet 模型的裁剪结果如下图所示。可以看到,相对于原始模型,裁剪后的模型可能精度会有提升,也可能会有降低。
另外作者还提出,在进行 finetune 时,可以冻结一部分高秩通道权重,但是权重的冻结还是影响了模型性能,如下图所示:
为了证明高秩通道确实包含更多的信息量,作者也做了一些实验。在裁剪的时候对高秩或者随机裁剪,相对于裁剪掉低秩通道,如下图所示,都造成了更多的性能损失:
可能的问题
除了方法的效果,可能还存在的一些问题就是:
- 需要对每个层分别设置裁剪系数,但是关于系数的设置论文中似乎没有细讲;
- 关于残差结构的裁剪细节也没有太细讲,需要去看代码实现。