论文品读:Pruning Convolutional Neural Networks for Resource Efficient Inference

 

模型裁剪系列相关论文品读博客:

1.论文品读:Learning both Weights and Connections for Efficient Neural Networks https://blog.csdn.net/hsqyc/article/details/83421061

2.论文品读:Network Trimming: A Data-Driven Neuron Pruning Approach towards Efficient Deep Architectures

https://blog.csdn.net/hsqyc/article/details/83651795

3.论文品读:Pruning filters for efficient convents

https://blog.csdn.net/hsqyc/article/details/84029360

 

针对通道裁剪提出了一种新的基于泰勒展开式的通道重要程度评价方式

 

图1还是老一套,迭代裁剪流程。

公式1提出了一种我在别的论文里没看到过的思路,通过裁剪前后的cost值来看,就是裁剪的过程就是看作是找到一个原始参数W的子集W'的过程,理想是找到的子集得出的cost和原本一样,也就是说这里用cost改变量作为衡量裁剪结果好坏的手段。但是一般的如果我们一个通道一个通道的都去裁剪一遍然后比对前后cost然后判断这个通道要不要裁剪是不太现实的,因为太费时间了,要2的w次单通道裁剪比对,w是网络通道总数。所以这里我们用如图1所示的迭代裁剪方式。

 

公式2中z表示feature map,*代表卷积操作,公式中右下角标代表layer层数,右上角标k代表通道数。这个R不知道什么意思。g不是1就是0,代表当前l层的第k个通道是否需要被裁剪。

oracle pruning。还是就是公式1的问题,只不过作者又提到那个差要不要加绝对值的问题。但是这种oracle评价通道重要性的方式操作起来太费时,所以作者自己提出了基于泰勒展开的新的评价方式。

TODO:泰勒展开如何应用在通道评价上

 

一些评价方法最后返回的通道重要值的大小会跟其所在的网络层数有关,应该把他们都归一化到同一层中,即排除层数对评价返回值的影响。所以作者用了下属公式进行层归一化。其中\theta(z_{l}^{k})代表评价标准给出的第l层第k个通道的重要程度值。

同时还要考虑到不同计算量对通道重要值的影响,作者添加了FLOPs正则化如下,作者用的\lambda是10-3.

注:卷积层FLOPs:(2\times C_{i} \times K^{2}-1)\times H\times W\times C_{o}.Ci=input channel, k=kernel size, HW=output feature map size, Co=output channel.

理解上面这个公式分两步,括号内是第一步,计算出output feature map的一个pixel,然后再乘以HWCo拓展到整个output feature map。括号内的部分又可以分为两步, (2 \cdot C_{i}\cdot K^{2}-1)=(C_{i}\cdot K^{2})+(C_{i}\cdot K^{2}-1) ,第一项是乘法运算数,第二项是加法运算数,因为n个数相加,要加n-1次,所以不考虑bias,会有一个-1,如果考虑bias,刚好中和掉,括号内变为 2 \cdot C_{i}\cdot K^{2}

全联接层FLOPs: (2\times I-1)\times O

I=input neuron numbers, O=output neuron numbers.

2是因为一个MAC算2个operations。

不考虑bias时有-1,有bias时没有-1。

分析同理,括号内是一个输出神经元的计算量,拓展到O了输出神经元

作者:chen liu
链接:https://www.zhihu.com/question/65305385/answer/451060549
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

图2显示了用oracle rank(就是看删除通道前后cost值变化的大小排序)每个层所有通道的排名的最低、最高、平均名词。排名越小越重要。可以看出,1、基本是越前面的层越重要。2、还有就是带池化层的要更重要(2、4、7 、10 、13层)。3、最小值曲线显示每个层都有比较重要的通道。由上作者鼓励平衡被裁剪掉的通道在各层之间的分布。图3显示的是两种计算cost变化的方式,可以看出采用变化绝对值作为评价方式的效果更好一点。

作者说自己每次迭代只裁剪一个通道,这样每次重新进行评价排序是考虑到参数之间可能存在依赖性(感觉就像倒数第一名会连累他的同桌倒数第9名,如果一次裁剪10个名额,那么同桌也会被裁剪掉,如果先把倒数第一名裁剪掉,那么他同桌可能不受影响变成倒数第30名,就不用被裁剪掉了)

表1给出了用各种评价方式排序的结果和Oracle排序结果的相似程度,作者用斯皮尔曼相关系数来量化这种相似程度,斯皮尔曼相关系数的范围是[-1,1],其中-1表示负相关,1应该表示完全相关。其中Per layer表示排序是在各个层内所有通道的排序,All layers一栏是所有层的通道的排序,其中上面是参数没有l2正则,下面是有l2正则的。可以看出泰勒展开的排序方式与oracle最接近,而且加了l2正则要比没有效果要好。下面给出了斯皮尔曼相关系数的计算方式,N是通道总数

图4和5还是那句话:我最牛逼。顺带OBD也挺牛逼的。

有一点就是按照裁剪后的模型从头训练的结果是不太好的。作者在图4裁剪完一个通道后的微调训练采用的是:30 minibatch SGD,batch-size 32, momentum 0.9, learning rate 10 −4 ,and weight decay 10 −4.在图5的微调采用10 mini-batchSGD。

图6图8的横坐标是模型计算量或者参数,其实也就是反应裁剪了多少,最左边是完全没裁剪,最右边是全部裁剪掉了。图6不同曲线代表微调阶段不同训练次数。确实微调阶段迭代次数越多效果越好,代价就是训练时间会变长。

图7说是裁剪后经过精度下降很多了,然后通过fine-turning又恢复到很接近的水平。但是这个曲线的每个点不都是在裁剪后经过fine-turning微调得到的么?为什么这个图7里有专门一个绿色的fine-turing?不太懂。自己回答:应该是平时裁剪微调的时候是10次迭代或者100次迭代,最后得到结果后再弄一个多次迭代fine-turning。

图9不多讲。迭代中微调参数是learning rate 10-4, momentum 0:9, weight decay 10-4, batch size 32, and drop-out 50%.

表2给出了实际加速效果。

总结:

1.网络可以裁剪 2.泰勒展开效果很好 3.层的norm效果很好

图10显示出了参数正则化的重要性。上面3个是没有加l2正则,各层的通道重要程度序号排列没有显示出前面层比后面层跟重要(oracle方法测出来是这样的),也就是说排序出来的结果尺度没有缩放到一个全局排序效果。下面3个加了l2正则就有这种趋势了,所以l2很重要。但是有个问题,这个l2正则就是我们平时说的对参数进行正则么?如果是的话为什么正则后就有这种全局排序效果呢?

表3再次显示了l2norm的重要性。而且一层层排序的话可以观察到中间5到10层的关联度比较差一点。

根据图11得出了3个结论:1.有些通道去掉后loss居然下降了,证明某些通道本来就是帮倒忙的 2.有些通道作用很小,去掉前后loss基本不变 3.每一层都有一些通道对cost影响很大

图12与用l2值作为评价标准作了比较,图标中的γ是代表l2方法的不同阈值。右图很简单,左图的横坐标没看懂。

图13作者尝试了联合评价标准,作者把taylor和别的联合,可以看出,还是不要联合效果最好。真嘲讽

 

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值