https://arxiv.org/abs/1608.08710
本文提出了一种基于L1的通道裁剪的方法,在VGG16上降低34%的计算量,ResNet-101降低38%计算量
本文说权重裁剪只能稀疏化矩阵,不能降低计算量从而提速,并且稀疏化会需要BLAS稀疏计算库。并且论文提出了不用一层层迭代裁剪,而是直接one-shot一次裁剪,可以节省裁剪、训练时间。最后,作者还发现了即使ResNet这种参数相对VGG来说很少的模型还是可以降低30%的计算量。
图1显示了通道裁剪的示例。kernel matrix就是竖着看算一个filter,比如那个竖着的蓝色就是第4个filter。在裁剪了一个filter后,相应的输出feature map也会少一个通道,还会影响下一个kernel。总的来说,裁剪掉那个蓝色的
所有图中蓝色的都会被裁剪掉。
上图是获得裁剪那个通道的计算流程。不一句句翻译了。简单起见,我画了下面那个图。下面那个图有2个F。第一个F是蓝色的,第二个F是红色的,计算S1的时候就是把那个蓝色的F所有权重的绝对值相加,红色同理,然后裁剪掉S比较小的。那么这一层就算裁剪完成了,当然,这层裁剪了相应的后面那层对应的部分也要移除掉。
图2是各层对裁剪的敏感程度。bc很直白,a图看了半天才看懂,这个图是每个层各个F的S值排序。横坐标是各个F按S值大小从大到小排序,比如那个20对应的是所有F中第20%个F。纵坐标对应S值除以最大值的百分比,用零点几来表示。比如图中的(20,0.4)那个我打箭头的点,我们知道VGG16的CONV1有64个F,排序后第64*0.2=12个F的S值占CONV1最大S值的0.4。这张图其实体现了每个层中,各个F的S值是否悬殊。比如那个红色的CONV1各个F的S值后几名就比第一名差的更多,黄色的CONV12就相对均匀一点。结合3幅图来看,作者发现,那些差距悬殊一点对裁剪更不敏感。比如那个红色的CONV1在右边两幅图中显示出在尽量不降低性能的情况下有更强的裁剪空间。作者还发现,输出的feature map大小一样的层敏感程度差不多。作者实验的时候,对敏感的裁剪比例小,不敏感的裁剪比例大。
作者觉得传统的一层层的裁剪太费时间了,而一次性裁剪可以有一个类似全局最优的效果。可是感觉作者没说清楚具体怎么个一次性裁剪呀
图3作者提出的计算方法。在以往独立计算S值的时候,比如上一层蓝色部分已经裁剪掉了,但是在操作这一层的时候还是认为蓝色部分存在的,这应该是不对的。但是,我们以往裁剪不是一层层裁剪的嘛,那么我们在裁剪完上一层后得到的新模型是没有蓝色部分的,然后再裁剪这一层的时候,怎么会有上面说的那种情况呢?不太懂。奥,对了,本文不是说一层层裁剪太慢了嘛,直接一次裁剪全部的层,所以会有上面这个问题。
图4给出了ResNet的裁剪方法。橘色部分是因为上一个块裁剪的结果,蓝色部分是Xi+1裁剪的结果,然后绿色部分是Xi+2裁剪的,需要注意的是,因为裁剪后的Xi+2和跳跃连接需要维度一样,所以绿色部分到底裁剪多少需要取决于跳跃连接P和Xi+2,又由于跳跃连接的信息比较重要,所以最后绿色裁剪多少取决于跳跃连接。
数据集的话,作者是用VGG16、RestNet-56/110在Cifar-10上,ResNet-34在ImageNet上,具体结果见下面的表
表1给出了实验结果。有个比较有趣的现象就是,裁剪后的模型如果不是继承裁剪前的参数而是自己从头训练的话(表中带scratch-train的),准确率会低一点。
表2是VGG16在Cifar-10上各层的具体信息。注意,这里的VGG16是修改过的VGG模型,和最原始的输入是224的那个VGG不一样。还添加了BN层的。wi*hi是该层的输出featur map大小,maps是输出的通道数。最右边那两列是裁剪后的值
作者发现,根据图2里的曲线,每个层的裁剪空间都很大,裁剪个90%不是梦,一种可能的解释就是在Cifar上feature map很小,那种在4*4、2*2上学不到很多东西。还有就是在Cifar数据集上即使我裁剪了第一层80%的通道,对结果影响也不是很大,好像第一层对裁剪更不敏感,这和我们一般认为的第一层比较重要、对裁剪更敏感的观念不符,可能的解释还是数据集的图片太小第一层学不到什么重要的特征。
图5把滤波器排序了,越前面的值比较大,提取特征的能力越强,越不应该被裁剪掉。