动态剪枝方向文献笔记:Feature Boosting and Suppression, Runtime Neural Pruning

写在笔记之前的话

   博主是一名刚刚进入大三的本科生,正在做一项关于模型压缩的科研项目。之前一直是在ipad在notebility上做笔记,但实在无法忍受自己丑陋的书写和繁琐的latex公式插入,于是尝试用csdn自带的markdown编辑器进行笔记记录。
  以公开博客形式记录笔记一是分享知识,二是希望各位读者(希望有读者吧哈哈哈哈哈)能够指出笔记中的错误,相互探讨。





文章1:Dynamic Channel Pruning: Feature Boosting and Suppression

摘要:

问题:想要提升深度卷积神经网络的精度,势必会引起计算量和内存的增加。
基于事实:本文利用卷积核输出的特征图的重要性是高度依赖于输入数据的。
解决措施:feature boosting and suppression(FBS),预测下一层卷积通道的显著性,在程序运行时跳过不显著的通道。不像静态剪枝一样彻底剪掉不重要的通道,动态剪枝是保留所有通道,并在程序运行过程中动态跳过不重要的通道。另外,用了FBS方法的网络仍然是用传统的SGD进行训练,所以FBS适配于各种sota CNN模型。
得到结果:在VGG16上减小五倍计算量,在ResNet18上减小两倍计算量,并在top-5 accuracy上只损失了0.6%的精度。

存在的问题:

基于显著性的(静态)剪枝有三个主要问题:

  1. 删除的通道是永久消失的,对于一些数据较为复杂的输入(difficult input)无法达到很好的精度。因为可靠的通道已经被永久剪掉了。
  2. 需要精心设计需要剪枝的通道,不然无法有效减少计算资源。
  3. 神经元的重要性(或者说 显著性)并不是静态的,而且神经元的重要性很大程度上依赖于输入数据。(这也是本文最重要的假设,立足点)

    下面这张图就展示了这个“假设”,每个channel neuron的输出是非常不同的。图a、b下面的数字代表加上激活函数之前channel中的最大值。图c则是前20个channel激活后的最大值的分布。(虽然我觉得这个证据有点不大合适…)

第三点的证据
这里提到了channel neuron,也没做太多解释,我猜测就是某个卷积核的某个channel。

同样,动态剪枝也存在一些问题:

  1. 之前有方法通过强化学习来实现动态剪枝,但在训练过程中要消耗非常多的运算资源。
  2. 很多动态剪枝的方法都是通过强化学习的方式来实现的,因为其中的 on/off decisions 就是”阀门的开关“,是不可微的,梯度下降法在这里是用不了的。(文章也提到了一些可微的方法)

具体实现:

就是动态剪枝。在网络工作时,考虑前一层卷积层的稀疏性,只“使能”其中的一部分通道,忽略相关性比较小的通道。

本文提出的方法为FBS,feature boosting and suppression,动态地增强或抑制卷积层的输出通道。直观上可以理解为图像数据的信息流通过一个”阀门“来控制。阀门的开关是通过上一层的特征图来预测的。

具体的实现过程
  动态剪枝部署的公式很简单: f ^ ( x , ⋯   ) = f ( x , θ , ⋯   ) ⋅ π ( x , ϕ , ⋯   ) \hat{f}(\mathrm{x}, \cdots)=f(\mathrm{x}, \theta, \cdots) \cdot \pi(\mathrm{x}, \phi, \cdots) f^(x,)=f(x,θ,)π(x,ϕ,)其中 f ( x , θ , ⋯   ) f(\mathrm{x}, \theta, \cdots) f(x,θ,)为卷积操作, x \mathrm{x} x为input data, θ \theta θ ϕ \phi ϕ为权重, π ( x , ϕ , ⋯   ) \pi(\mathrm{x}, \phi, \cdots) π(x,ϕ,)就类似于一个mask,为0的地方就相当于被剪掉的地方。动态剪枝的主要核心指出在于对 π ( x , ϕ , ⋯   ) \pi(\mathrm{x}, \phi, \cdots) π(x,ϕ,)的设计。本文的mask并不是施加在features或是filters的参数上,而是加在BN上的。 最终的卷积公式如下: f ^ l ( x l − 1 ) = ( π l ( x l − 1 ) ⋅ ( norm ⁡ ( conv ⁡ l ( x l − 1 , θ l ) ) + β l ) ) + \hat{f}_{l}\left(\mathrm{x}_{l-1}\right)=\left(\pi_{l}\left(\mathrm{x}_{l-1}\right) \cdot\left(\operatorname{norm}\left(\operatorname{conv}_{l}\left(\mathrm{x}_{l-1}, \theta_{l}\right)\right)+\boldsymbol{\beta}_{l}\right)\right)_{+} f^l(xl1)=(πl(xl1)(norm(convl(xl1,θl))+βl))+

  其中, π l ( x l − 1 ) = wta ⁡ ⌈ d C l ⌉ ( g l ( x l − 1 ) ) \pi_{l}\left(\mathrm{x}_{l-1}\right)=\operatorname{wta}_{\left\lceil d C_{l}\right\rceil}\left(g_{l}\left(\mathrm{x}_{l-1}\right)\right) πl(xl1)=wtadCl(gl(xl1))
   wta ⁡ ⌈ d C l ⌉ ( z ) \operatorname{wta}_{\left\lceil d C_{l}\right\rceil} \left(\mathrm{z}\right) wtadCl(z)函数返回的是 z \mathrm{z} z 的前 ⌈ d C l ⌉ \lceil dC_l\rceil dCl<

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值