鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读


鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读

一、论文背景

深度学习发展之后,为了让计算机视觉任务的性能,大趋势就是不断的加深加重网络的深度。但复杂模型的同时,带来了高额的存储空间、计算资源消耗,使其很难落实到各个硬件平台。而在在深度卷积网络中,存在着大量冗余地节点,仅仅训练小部分参数就可以达到和原来网络相近的性能(本文的理论依据)。因此压缩模型以最大限度地减小模型对于计算空间和时间的消耗。该方法就是为了有效地裁剪模型且最小化精度的损失。

二、算法优势分析

现有两种信道剪枝策略:
1、基于从头训练的通道剪枝策略:添加稀疏正则化,训练困难
2、 基于最小化特征映射的重建误差:容易忽视通道特征的鉴别力,错误的保留冗余的信道。
因此,本文提出鉴别力感知的通道剪枝策略,考虑到特征映射的附加损耗和重构误差,分别在fine-tune与剪枝阶段引入鉴别力感知的辅助loss,能够增强剪枝后所保留特征的鉴别能力。

三、算法思路

该算法均匀地插入P个识别感知损失层(p的大小由神经网络的深度决定),因此整个算法共分为p+1个阶段(因为插入的p层将整个网络分割成立p+1个段):

  • 在每个阶段中,首先计算该层Lp的辅助误差,然后结合前一层剪枝的模型与预处理模型之间的重构误差计算联合误差(构建识别感知损失),以最小化该误差为目标,来更新前一层Lp-1层的剪枝后的网络和辅助层的参数,以起到微调前一阶段的模型的作用(补偿了剪枝带来的精度损失,提升了特征鉴别力)。
  • 然后在对该Li层和Li-1层之间的层,逐层进行通道选择,从而完成该阶段的剪枝。
  • 在进行通道选择时,本文采用贪心策略,首先设置一个空集A,再按迭代方式选择最重要的通道索引加入到集合A中。在每次迭代时,首先计算上面计算出的联合误差L对Wj的梯度(第j 输入通道的卷积核参数),然后选择对梯度响应最大的通道加入到集合A中。由于联合loss中包含了鉴别力感知的辅助loss,因此所选择的输入特征通道具有较强的鉴别力。每往A中加入一个通道索引,便更新一次集合A中的参数,并驱使A补集中的参数为零。
    鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读

四、识别感知损失的构建

鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读
对于第p阶段,每一个损失使用Lp的输出特征Op作为输入特征,为了使损失的计算更容易,本文在特征图上使用平均池化,为了加速收敛,在平均池化前使用batchnorm和ReLU,最终计算对于在Lp层输入特征图的损失 。则Lp层的识别感知损失为:
鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读

五、最小化结合误差

计算剪枝后模型输出特征与baseline特征之间的均方根误差(重构误差):
鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读

最小化重建误差与辅助误差L相结合的联合loss:
鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读

六、终止条件

由于L是凸函数,L(Wt)将随着算法2中的迭代索引t单调下降。因此可以采取如下停止条件:
鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读

七、实验结果

在实验部分,对比了ThiNet、Channel Pruning(CP)、Network Slimming、WM、WM+,对于提出的方法其他几个变体也做了比较,包括DCP(使用裁剪率n的识别感知信道裁减),DCP-Adapt(使用停止条件的DCP),Random DCP(随机选择信道代替基于梯度测策略)。评估数据集为Cifar10、ILSVRC-12以及LFW。
相关设置:

  • 在ResNet-50中插入3个损失,在VGG和ResNet-18中插入2个损失。
  • 使用添加nesterov的SGD作为优化器,momentum和权重衰减设置为0.9和0.0001。
  • 在CIFAR-10,使用大小为128的mini-batch微调400个epochs。学习率初始化为0.1,在epoch160和240处除以10。
  • 在ILSVRC-12,微调60个epochs,mini-batch为256,学习率从0.01开始,在epoch36,48,54处除以10。
  1. 在CIFAR-10上的比较:
    鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读
    本文提出的方法在相同加速率上有最好的表现,DCP-Adapt裁剪的VGG网络比原与训练模型降低了0.58%的测试误差,并获得了15.58倍的尺寸减少。

  2. 在ILSVRC-12上的比较:
    鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读
    本文使用该方法在ILSVRC-12数据集ResNet-50网络中实现2倍加速。本文方法比ThiNet在top-1中低0.81%误差,在top-5中低0.51%误差。对比channel pruning,降低了0.79%的top-5误差。

  3. 在LFW上的比较:
    鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读
    在修剪率为50%的情况下,该方法将SphereNet-4提高了0.1%。与FaceNet[37]、DeepFace[44]和VGG[31]等大型网络相比,精度没有明显的优势,但是其参数量较小。

八、代码测试

1、安装环境:anaconda、python3.5、tensorflow1.0、pytorch0.4、prettytable、pyhocon

2、测试resnet_56_pruned0.5.pth在CIFAR-10数据集上的准确率以及FLOPs。
鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读
要下载完整的代码,我一开始就是下载了不完整的代码,导致我一直运行不了,设置配置文件test.hocon:
鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读
要注意这里面的depth还有nettype不是随便设置的:
nettype和数据集要匹配,可以看main.py里的代码:
鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读

depth决定了插入的感知层,源码在"\DCP-master\DCP-master\dcp\models\pruned_resnet.py"中有预先的设置(当然是在哪个文件取决于你选择的网络类型):
鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读
修改train.py里面的forward函数计算计算复杂度:
鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读
运行结果:
鉴别力感知的通道剪枝——Discrimination-aware Channel Pruning论文解读

九、个人理解

对于信道裁剪,最简单的思路就是将所有信道按重要性进行排序,然后留下重要的,裁剪掉不重要的。目前已知的几种方法都是体现在衡量其重要性上。可见本篇论文提出的方法其实本质并没有改变,只是将信道选择问题归结为稀疏优化问题,并引入了额外的loss进一步提高精度。

本文的方法是基于考虑对特征输出的可重建性的影响这一思想提出的变体。最小化裁剪后网络对于特征输出的重建误差就是如果对当前层进行裁剪,如果它对后面输出还没啥影响,那说明裁掉的是不太重要的信息,反之就是重要的信道。

而本文的方法是通过求得一个损耗,然后计算该损耗对参数梯度的响应。响应越大就证明这个参数对模型影响越大,所以越应该保留下来。

然后就是要计算这个损耗函数,如果只使用重构误差,可能结果会比较依赖于预训练的模型,这样会出现很多冗余的无用的信道没被裁剪,而且也没有解决信道裁剪带来的精度下降的问题。因此本文在中间层添加额外的discrimination-aware loss,另一方面也考虑特征重建误差的loss,综合这两方面进行计算损失函数,从而在某些训练集上达到了不错的效果。

对于该方法,我觉得还是属于非结构化剪枝的一种方法,它没有在本质上解决稀疏化后带来的与软硬件相关的一系列问题;其次,该方法是基于贪心算法进行剪枝,因为它忽略了参数之间的关系,所以可能知道的只是局部最优解;最后,该类方法都是基于“存在信道冗余”这一基本假设,所以对于某些稀疏网络,可能冗余的信道没有那么多,所以该类方法作用可能就不大,还有就是从这个角度想,能不能从一开始就着手于构建简单的或者易于计算的网络,真正的实现简单有效。

论文地址:https://papers.nips.cc/paper/7367-discrimination-aware-channel-pruning-for-deep-neural-networks.pdf
代码地址:https://github.com/SCUT-AILab/DCP
预训练模型:https://github.com/SCUT-AILab/DCP/releases

参考博客:
深度学习网络模型压缩剪枝详细分析https://blog.****.net/nature553863/article/details/83822895
鉴别力感知的通道剪枝https://www.cnblogs.com/wujianming-110117/p/12702802.html
深度学习模型压缩算法综述https://blog.****.net/wspba/article/details/75671573