原文链接:https://proceedings.neurips.cc/paper/2018/file/55a7cf9c71f1c9c495413f934dd1a158-Paper.pdf 发表:NIPS2018
code: https://github.com/SCUT-AILab/DCP
编辑:牛涛
本文给出了一种基于鉴别力的通道剪枝。
首先给出了卷积的公式,如下

其中O代表output,X代表input,W代表权重,i为第i个sample,j为第j个filter,k为两个矩阵的第k维,*表示卷积操作

通道剪枝意在剪掉那些W中冗余的通道,为此引入关于W的约束,如上式。(比较好奇的是为啥要先对j求和?不就变成了希望不同滤波器的某些通道为0?还是说本文的channel pruning指的就是去掉filter中的某些channel 好的指的就是这些)
通常用剪枝前后特征图的重构误差进行评估,如下式:

论文给出了用这种评估的两个弊端,一个是如果原网络效果就不好,会限制剪枝后的网络;另一个是仅通过重构误差可能会导致一些不该保留的channel被保留了(为了尽可能使误差减小,稀疏度就得不到保障)。
至此,文章给出了一种新的剪枝方式,如下图:

除了最终的分类损失Lf与特征图重构损失Lm外,还加入了鉴别力损失L(p,s),定义如下:
其中,

至此,channel selection的总损失为:


总伪代码如上:
对于每个stage-p,构建鉴别损失并结合Lf训练网络M,使得全连接层有参数的同时,stage-p的卷积参数得到微调;
对于到
间的layer,做channel selection
channel selection:根据总损失计算梯度,找到A的补集中梯度F范数最大的channel并加入到子集A中;(个人理解是模型收敛后,如果梯度仍然很大说明权重的轻微改变就会造成总loss的变化,因此这些channel对loss是很重要的应该保留 初始状态因为要优化下式,需要将补集的channel置零,一开始全是0,训练的时候梯度大说明这个方向更利于loss降低,所以认为这个channel很重要,就把它)

A确定后,将不在A中的channel都置零并训练网络至L(W)收敛。贪婪的方式,一次向A中加入一个channel,每加入一个就对其梯度下降训练到最优,然后对补集中的channel继续筛选。
稀疏率参数很难人为确定,你不知道要保留多少filter就达到了最优,再加上L(W)随着t的增加而单调减小,因此设置如下的终止条件。
终止条件:算法2中while语句有个stopping condition,按理说应该按照剪枝率来判断,达到后就停止。但是很难人为确定剪枝率的大小,因此采用自动的方式,当L(W)收敛后就不再剪了,给出的公式如下:

可以看出,一旦相邻两个iteraion的L(W)变化很小,就满足停止条件。
实验结果:
消融实验两个地方比较有意思,一个是损失函数中lambda的值越大,剪枝后精度越高,但是光有Lp效果反而不太好,说明损失的两项都很重要,是互相促进的关系。
第二个就是可视化结果,可以看出保留的channel有更多信息,说明这个Lp损失确实能帮助辨别有用的通道。
