引言

因为之前并没有接触到剪枝相关工作,所以有必要了解一些剪枝知识和先人工作。

剪枝核心思想:核心思想:剔除模型中“不重要”的权重,使模型减少参数量和计算量,同时尽量保证模型的性能不受影响。

结构化剪枝:结构化剪枝和非结构化剪枝的主要区别在于剪枝权重的粒度。结构化剪枝的粒度较大,主要是在卷积核的channel和Filter维度进行裁剪,而非结构化剪枝主要是对单个权重进行裁剪。

Learning Efficient Convolutional Networks through Network Slimming:本文提出了一种channel-level的裁剪方案,可以通过稀疏化尺度因子(BN层的scaling factor)来裁掉“不重要”的channel。具体方案为:

  1. 在训练时,对BN层的scaling factor施加L1L1L1正则化,在训练网络的同时得到稀疏化的尺度因子;
  2. 裁掉低于指定阈值的channel:设定裁剪的百分比;依据百分比找到所有尺度因子的阈值;逐层进行裁剪。
  3. 对得到的模型进行fine-tune以恢复因裁剪损失的精度

CNN中的BN
我们知道BN层是对于每个神经元做归一化处理,而不是对一整层网络的神经元进行归一化。既然BN是对单个神经元的运算,那么在CNN中卷积层上要怎么搞?假如某一层卷积层有6个通道,每个通道的大小是100100,这样就相当于这一层网络有6100100个神经元,如果采用BN,就会有6100*100个参数γγγ、βββ,这样岂不是太恐怖了。因此卷积层上的BN使用,其实也是使用了类似权值共享的策略,把一个通道当做一个神经元进行处理。

卷积神经网络经过卷积后得到的是一系列的特征图,如果min-batch sizes为mmm,那么网络某一层输入数据可以表示为四维矩阵(m,f,p,q)(m,f,p,q)(m,f,p,q),,fff为channel个数,ppp、qqq分别为channel的宽高。我们可以把每个channel看成是一个特征处理(一个神经元),因此在使用Batch Normalization,mini-batch size 的大小就是:m∗p∗qm*p*qm∗p∗q,于是对于每个特征图都只有一对可学习参数:γγγ、βββ。

0. 摘要

神经元结构化剪枝是一种在不影响预测精度的情况下减少神经网络计算量的非常有效的技术。在以往的工作中,结构化剪枝通常是通过对神经元的尺度因子施加L1正则化,对尺度因子低于一定阈值的神经元进行剪枝来实现的。理由是尺度因子越小的神经元对网络输出的影响越弱。接近0的比例因子实际上抑制了一个神经元。但是L1正则化缺乏神经元之间的区分,因为它将所有的缩放因子推向0。更合理的剪枝方法是只抑制不重要的神经元(比例因子为0),同时保持重要神经元的完整(比例因子较大)。为了实现这一目标,我们提出了一种新的比例因子正则化,即极化正则化。理论上,我们证明了极化正则化将一些比例因子推至0,将其他比例因子推至a>0a > 0a>0。实验表明,使用极化正则化的结构化剪枝比使用L1正则化的剪枝获得更好的结果。在CIFAR和ImageNet数据集上的实验表明,我们方法达到了最佳效果。

1. 动机

对于结构化剪枝,一种有前途的方法是将每个神经元与一个比例因子相关联,并在训练中正则化这些比例因子。然后修剪比例因子低于某个阈值的神经元。尺度因子的正则化因子通常选择为L1正则化。然而,L1正则化器试图将所有比例因子推至0。往往很难找到合理的修剪阈值。如下图所示,比例因子密集地分布在阈值周围。阈值处的切割不是很合理,因为阈值周围没有将修剪的神经元与保留的神经元分开的余量。用这个阈值修剪将导致严重的准确性下降。

一个更合理的正则化应该更明显地分离被修剪和保留的神经元,它们之间有更大的余量。为了实现这一目标,我们提出了一种新的正则化称为极化。与将所有比例因子推至0的L1正则化不同,极化同时将比例因子推至0(从而修剪这些神经元),并将其余比例因子推至大于0的值(从而保留这些神经元)。

直觉上,极化不是在修剪中抑制所有神经元,而是试图只抑制一部分神经元,同时保持其他神经元完好无损。极化正则化自然会区分修剪的和保留的神经元。并且所得到的比例因子更容易分离。如图1 (b)所示,极化导致修剪的神经元(橙色部分)和保留的神经元(蓝色部分)的比例因子之间有明显的差异。使用极化进行修剪更合理,因为被修剪的神经元对网络输出的影响比保留的神经元小得多。

2. 贡献

我们的贡献如下:

  1. 我们提出了一种新的正则化方法,即极化,用于神经网络的结构化剪枝。我们从理论上分析了极化正则化的性质,证明了它同时将有些比例因子推至0,将其他的比例因子推至大于0的值。
  2. 我们在广泛使用的CIFAR和ImageNet数据集上验证了极化剪枝的有效性,并获得了最先进的剪枝结果。

3. 模型

3.1 问题定式

我们需要训练一个神经网络f(x;θ)f(x;θ)f(x;θ),其中θθθ表示网络参数。我们为每个神经元引入一个比例因子,并将比例因子表示为向量γ∈Rnγ \in R_nγ∈Rn​,其中nnn是网络中神经元的数量。我们使用BN中的比例因子作为神经元的比例因子。对比例因子进行正则化的网络训练的目标函数是:

其中L()L()L()是损失函数,R()R()R()通常是网络权重的L2正则化,Rs()R_s()Rs​()是神经元比例因子的稀疏正则化。在修剪中,选择阈值,并且修剪比例因子低于阈值的神经元。

3.2 极化正则化

设γ=(γ1,γ2,...,γn)γ = (γ_1,γ_2,...,γ_n)γ=(γ1​,γ2​,...,γn​),和 In=(1,1,,1)∈RnI_n= (1,1,,1) ∈ R_nIn​=(1,1,,1)∈Rn​。设γ−γ^-γ−表示平均值:

我们需要防止比例因子收敛到一个值。所以我们把极化正则化定义为:

在这个公式中,我们增加了一个新项,它的作用是尽可能将比例因子尽可能远离平均值。实际上,当所有γγγ都相等时,该项达到最大值;当γγγ的一半等于0,而另一半等于aaa时,该项达到最小值。我们还使用超参数ttt来控制权重。ttt还控制正则化下等于0的比例因子的比例。

极化正则化有几个很好的性质。第一个性质是置换不变性,这意味着极化正则化子是置换不变的。这个属性确保所有的神经元在修剪时得到平等的对待,没有任何神经元的优先修剪偏差。该正则化的第二个性质是凹度

极化正则化的作用是将比例因子推至0,其余比例因子推至aaa。比例ρρρ分段线性取决于超参数ttt,如下式所示。所以告诉我们比例为0的概率是由ttt决定的。

另外有一个值得注意的是,了完全分离两个极点,比例因子的上限aaa不应太小,理由是对于BN来说,包含 identity transform是很重要的,具体可参考论文(Batch normalization: Accelerating deep network training byreducing internal covariate shift.)

3.3 剪枝策略

在用极化正则化器训练之后,我们获得比例因子的值和分布。我们仍然需要一个阈值来修剪掉具有小比例因子的神经元。我们利用极化效应,提出了一种更合理的自动设置阈值的策略。由于极化效应,分布图总是至少有两个局部最大值(峰值):一个位于0附近的中心,其他的位于较大值的中心,如图2所示。我们的策略是只修剪属于最接近0的峰值的神经元。因此,阈值位于最接近0的峰值尾部。具体来说,当我们绘制分布直方图时,我们将面元宽度设置为0.01。然后我们从左到右扫描直方图中的面元,找到第一个局部最小面元。那么这个水平坐标就是剪枝的阈值。

我们通过调整两个超参数来控制FLOPS:等式(1)中的λλλ和等式(2)中的ttt。给定目标数量的减少的FLOPS,我们的目标是选择λλλ和ttt的值,以便极化修剪将实际上减少目标数量的FLOPS。请注意,减少的FLOPs数量与修剪的神经元数量正相关。

具体搜索算法如下,注意搜索λλλ时使用了二分搜索。

修剪后,我们根据训练数据微调修剪后的网络。

4. 实验结果

在不同数据集和不同模型的实验效果如下:

超参数的影响:如图3所示,我们根据经验研究了超参数ttt和λλλ对减少的浮点运算次数的影响,以及基线和修剪模型之间的精度下降。当ttt变大时,减少的FLOPs也会变大。这是合理的,与此同时,精度下降的总体趋势是变大,但曲线波动更大。这表明精度下降并不是相对于ttt单调增加的。当λλλ变大时,FLOPs减小和精度下降都单调变大。这也是合理的,因为λ是等式(1)中极化正则化的总权重。随着λλλ变大,极化正则化对训练的影响越来越大,导致更多的神经元被修剪,精度下降越来越大。

修剪的可视化:如下图所示。在子图©中,我们可以清楚地看到偏振正则化器逐渐将标度因子推向两个簇,一个簇位于0,另一个簇位于更大的值。这两个集群之间有明显的差距;另一方面,子图(b)表明,L1正则化将标度因子推至位于0.09附近的一个簇。

5. 个人思考

该文章出发的两个动机:

  1. 使剪枝和保留的神经元更加可分
  2. 抑制不重要神经元,保留重要神经元完好。

论文中有一个不太明白的小问题。论文中的实验结果自己枚举(降低不同的FLOPS然后查看性能影响)得到的最好的一个效果吗?

参考链接:https://www.yuque.com/u1267820/ynt2l2/bfv4i4

NeurlPS2020:Neuron-level Structured Pruning using Polarization Regularizer(polarization正则化技术)相关推荐

  1. 论文解读《Structured Pruning for Deep Neural Networks with Adaptive Pruning Rate Derivation Based on Con》

    论文:Structured Pruning for Deep Neural Networks with Adaptive Pruning Rate Derivation Based on Connec ...

  2. 《论文阅读》Structured Pruning Learns Compact and Accurate Models

    Structured Pruning Learns Compact and Accurate Models 文章目录 Structured Pruning Learns Compact and Acc ...

  3. AutoCompress: An Automatic DNN Structured Pruning Framework for Ultra-High Compression Rates

    AutoCompress: An Automatic DNN Structured Pruning Framework for Ultra-High Compression Rates 论文阅读笔记/ ...

  4. 【论文阅读】Structured Pruning Learns Compact and Accurate Models

    本文目录 论文信息 1. 研究背景 2. 方法:结构化剪枝方法CoFi 2.1 粗粒度和细粒度的剪枝 2.2 从原模型到剪枝模型的逐层蒸馏 3. 实验 3.1 模型对比 3.2 消融实验 3.3 剪枝 ...

  5. 【综述】闲话模型压缩之网络剪枝(Network Pruning)

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 来自 | CSDN 地址 | https://blog.csdn.net/jinz ...

  6. Pruning paper 合集

    Network Sparsification (Pruning) 文章目录 Network Sparsification (Pruning) 0 鼻祖论文 1 基于度量标准的剪枝 1.1 Channe ...

  7. 闲话模型压缩之网络剪枝(Network Pruning)篇

    1. 背景 今天,深度学习已成为机器学习中最主流的分支之一.它的广泛应用不计其数,无需多言.但众所周知深度神经网络(DNN)有个很大的缺点就是计算量太大.这很大程度上阻碍了基于深度学习方法的产品化,尤 ...

  8. [文献阅读] Sparsity in Deep Learning: Pruning and growth for efficient inference and training in NN

    文章目录 1. 前言 2. Overview of Sparsity in Deep Learning 2.1 Generalization 2.2 performance and model sto ...

  9. pytorch distiller Weights Pruning Algorithms

    Pruning - Neural Network Distillerhttps://intellabs.github.io/distiller/algo_pruning.html 幅值剪枝: This ...

最新文章

  1. mapreduce编程实例python-使用Python语言写Hadoop MapReduce程序
  2. 集成学习——机器学习面试
  3. php include path pear,关于php:pear include_path数据文件夹不再有效
  4. 埋点用例管理_API管理平台之系统设计篇
  5. 单选不生效为什么_“我这么努力刷题,为什么还是考不过税务师?”
  6. 学python需要什么基础-学习Python需要哪些基础知识?
  7. java复杂的代码做程序_摆脱复杂烧脑的程序代码,利用快速开发平台轻轻松松做软件...
  8. 常见的下载工具有哪些?BT下载软件哪个好
  9. vscode 历史版本1.68.1
  10. nfc pm3 模拟加密门禁卡_手机/手环NFC模拟加密门禁卡电梯卡最全教程之初期判断...
  11. SecureCRT 过期
  12. 深入理解c++之struct构造函数
  13. 在线诱舞坊字体转换FLASH工具 QQ空间专用字体转换器
  14. procdump 抓 dump文件
  15. 我把Github上最牛b的Java教程和实战项目整合成了一个PDF文档
  16. Zotero 和它的朋友们: 一个文献阅读生态
  17. jquery ajax java二级联动_使用Ajax和Jquery配合数据库实现下拉框的二级联动的示例...
  18. 谷歌命令行解析工具gflags的使用
  19. 基于晶体结构算法的函数寻优算法
  20. 自己写的工具:把Evernote(印象笔记)的笔记导入到博客(Blog)中

热门文章

  1. 来了,Github 终于上线收藏夹了
  2. 卸载流氓软件的整个过程
  3. 牛客练习赛31 C 无畏死灵术士莉莲娜与锁链面纱(dfs + 期望dp)
  4. 共享图书APP开发解决方案
  5. java中%3e%3e是什么_python中%3e是什么意思
  6. mysql查询语句speed select
  7. 基于卷积神经网络的口罩佩戴识别与检测
  8. 项目管理:故事12-简单道理
  9. AFEPack 使用 Tutorial(一):解二维泊松方程
  10. layui-icon常用记录