深度学习减枝基础原理总结

模型减枝(Pruning)

  模型剪枝是不同于量化的一种压缩方式,是通过删除模型中无意义(意义较小)的权重来减少推理计算量的过程。由于学习过程中会产生过参数化导致会产生一些意义并不是很大的权重或者值为0的权重(ReLU),减枝过程会找到这些权重并让硬件skip这些权重的计算。
在这里插入图片描述   减枝过程可以看作上图所示,将Sparse weights转为压缩后的compressed weights以及压缩后的weight对应的原先索引,通过这两部分去除无效的权重值,进行一个密集型计算。如右图所示,减枝完成后接近0的部分权重被忽略,权重分布不再是原先近零为中心的高斯分布。
  减枝流程如下:

  1. 获取已经训练完成的初始模型
  2. 对该模型进行剪枝。 a. 通过训练的方式让DNN去学习可以归零的权重。(L1正则化、BN的scaling factor等) b.通过自定义规则,手动有规律的让某些权重归零。(将权重分为1*4的vector,按照2:4进行权重减枝)
  3. 对剪枝后的模型进行fine-tuning。 a. 减枝初期的网络精度掉点严重。 b. 使用fine-tuning(精调)来恢复精度 c. fine-tuning后的模型可能比之前精度高。
  4. 获取压缩的模型。 若压缩后的模型依然无法满足需求。则需要进入步骤2继续进行减枝。

PS:模型减枝可以配合模型量化一起使用。

模型减枝分类

 &emsp模型减枝按照减枝方法可以分为结构化减枝非结构化减枝。按照减枝粒度可以分为粗粒度减枝细粒度减枝

粗粒度减枝

  粗粒度减枝包括 Channel/Filter Pruning,是一种结构化减枝。即直接把某个卷积核或者卷积核中对应的channel去除,常见的是使用L1 Norm寻找权重中影响度较低的权重。
在这里插入图片描述   粗粒度减枝不依赖硬件,在任何硬件上都可以得到性能提升;但是减枝粒度较大,存在精度掉点风险,并且由于Tensor core使用时channel为8或者16的倍数,减枝后可能导致数据不符合倍数关系,只能在cuda core上运行,反而不能起到硬件加速作用。

细粒度减枝

  细粒度卷积通过对权重的各个元素本身进行分析减枝,包括结构化减枝和非结构化减枝。
结构化减枝:

  • Vector-wise减枝:将权重按照4*1的vector进行分组,每四个中减枝两个的方式减枝权重。
  • Block-wise减枝:将权重按照2*2的block进行分区,block之间进行比较来减枝block。

非结构化减枝:

  • Element-wise减枝: 逐个减枝进行分析,观察影响度情况。
    在这里插入图片描述

  细粒度减枝精度的影响不大;但是需要特征的硬件支持(Tensor Core支持sparse),需要使用额外的memory来存储用于计算的index,memory的访问效率不高,且支持sparse计算的硬件内部会做一些针对sparse的tensor的重编,较为耗时。

channel-level pruning

  channel-level pruning不依赖于硬件的特性,可以实现粗粒度的减枝。可以通过使用BN中的scaling factor与L1-regularization的训练让权重趋于0,找出channel中不重要的channel,实现channel-level的减枝操作。
在这里插入图片描述
scaling factor
  BN一般放在conv之后,对conv的输出进行normalization。
在这里插入图片描述
  假设进行过normalization之后的数据对应上图(a);进行偏移因子后数据分布情况未发生明显变化对应图(b)所示,最后进行scaling factor进行数据的缩放,结果如图(c)所示。
  若conv输出后某个channel的原始数据就如图(c)所示,也就是进行shift和scaling操作对数据分布都没有太大影响,也就是说当前的channel的作用不大。换句话说,也就是当前channel对应的数据需要乘scaling factor才得到最终的特征,若scaling factor值趋近于0,那么最终的特征也必定均趋近于0,当前channel的特征也就显得没有太大意义。

L1-regularization在这里插入图片描述在这里插入图片描述
  此处只使用L1正则化而非L2正则化,由下图来证明:
在这里插入图片描述
  当L1正则化时,由于是菱形,L1损失函数最小时,即与菱形的交点,此时仅存在于4个顶点才行,而4个顶点则必然存在其中的某些权重为0;而L2损失则不同,与圆形的交点可以是任何一个点,此时只能保证w1和w2总和最小,而不能确定哪些值为0。

  channel-wise pruning过程中,损失函数设置如下:
在这里插入图片描述

  将scaling factor γ 作为L1-norm的惩罚项加入loss中,L1-norm参数不是每个权重,而是BN中对于conv中每个channel的scaling factor。在学习过程中将scaling factor趋于0,将趋于0的channel都认为是需要pruning的部分。(减枝的scaling factor阈值可以设为25%、50%、75%的channel pruning)
   当λ取值越大,也就是说整个scaling factor在loss中的占比越大,也就是说趋近0的约束更加强,此时减枝力度更大,得到的模型更加稀疏。
在这里插入图片描述

  将上述channel减枝之后,将当前channel对应的input/output也去除,便得到一个紧凑的网络。但是减枝完成之后由于很多权重信息都没有,因此需要fine-tunin来提高精度(fine-tuning即进行训练,但是训练时只会更新没有被减枝的那部分权重,需要通过mask进行更新);减枝完的channel size可能会让计算密度变低。
PS:1. pruning后的channel尽量控制在64的倍数(此时即可以使用tensor core运行算子,而且精度相对较高)。
   2. 减枝尽量控制在50%之内(防止精度掉点严重)。
   3. 减枝依然需要注意哪些层属于敏感层,敏感层尽量减少减枝。(需要使用sensitive analysis进行逐层分析)

稀疏矩阵核(sparse-tensor-core)

   在Ampere架构中的第三代Tensor core支持带有sparsity的matrix计算,也就是支持细粒度的结构化减枝。
   在进行稀疏化的过程中,一个密集矩阵会以2:4的比例进行减枝(每4个连续权重中最小的两个归零),如下图所示:
在这里插入图片描述在这里插入图片描述
   使用权重压缩减枝会存在一定耗时,如索引的存储、索引筛选activation values的过程。虽然硬件上可以完成,自动将0参与的计算进行skip。因此当模型不是很大时,也就是参与sparse的计算激活值不大,这时稀疏化效果不好。

  • 15
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值