pdf code

Channel Pruning for Accelerating Very Deep Neural Networks

这篇文章介绍了一种实现channel pruning的算法。其核心算法代码在该库的./lib/net.py -> R3方法中。

对pretrained的模型,要进行模型的修剪,本文提到有三种方法,第一种是sparse connection, 第二种是tensor factorization,第三种是channel pruning.

sparse connection由于引入了不规则的模型结构,会导致在GPU上的执行效率下降(尽管flops下降了)。tensor factorization本质上是对权重矩阵的分解,对于现代的Res-Connect效果不佳。channel pruning不改变结构,不改变并行运行情况,仅仅改变channel数量。三种方式的图示如下:

image

算法介绍

这个算法分为两步迭代,分别为channel selection 以及 reconstruction.第一步找到最有信息量的channel,修剪冗余的channel,这里使用的是Lasso regression, 第二步reconstruct with Linear least square.

令输入的feature map的channel数为, 卷积核的权重为 ,卷积核每次卷积会在一个像素点上生成一个的输出矩阵,其中为batch_num,这里暂时不考虑bias项。要将修剪为.同时最小化reconstruction error,这个优化问题是

其中为二阶范数,是一个的矩阵裁剪自输入,是长度为的矢量参数。

求解这个问题是NP难的,这里首先将问题用l1范数松弛为

同时限制然后在以下两个步骤中迭代

子问题

首先锁定,求解作为channel selection问题,这变成了零范数的LASSO regression,代码中可以知道作者是使用sklearn的Lasso regression函数做的。

子问题

锁定,问题变为,这里的 (), 形状为, ,之后再令,这里本质上是一个线性回归。

优化过程

从已经训练好的模型中初始化W,.逐渐增加,对于每一个,迭代两个子问题的求解直到稳定,逐渐增加直到满足.后来又发现这样太慢,于是执行子问题(1)多次,直到满足,然后仅执行一次子问题(2)

全模型修建

在修剪时,每一个层单独处理,需要注意的是最优化问题中的需要使用的是原模型的输出作为目标,输入则是修剪后的模型的,这样可以避免误差的累积。

处理多分支模型

这里主要讨论ResNet.

image

这里一共有三个卷积层,由于ResNet需要保持不同层之间channel数的稳定,所以只有中间的bottlenect也就是的输入层可以如前文一样正常修剪。

最后一层的修剪

这里将优化目标从改为,这里是前面层修剪后输出的feature map,

第一层的修剪

增加一个sampler层,正常减少卷积层的输入channel数,注意这个sampler不改变short-connection路径上的