模型压缩综述:剪枝、量化、知识蒸馏

参考综述文章
* 2017-A Survey of Model Compression and Acceleration for Deep Neural Networks
* 2018-Recent Advances in Efficient Computation of Deep Convolutional Neural Networks
参考博客: https://www.sohu.com/a/232047203_473283 https://www.jianshu.com/p/e73851f32c9f

一、概述

  1. 目的: 最大程度的减小模型复杂度,减少模型存储需要的空间,也致力于加速模型的训练和推测。
  2. 主要方法分为:
    模型压缩综述:剪枝、量化、知识蒸馏_第1张图片

二、低秩近似

对于二维矩阵运算来说SVD奇异值分解是非常好的简化方法,对于高维矩阵的运算往往会涉及到 Tensor分解方法,主要是CP分解、Tucker分解、Tensor Train分解和Block Term分解等工作。但现在低秩近似不再流行的一个重要原因是现在越来越多网络中采用1×1的卷积,而这种小的卷积使用矩阵分解的方法很难实现网络加速和压缩。而且在大型网络上低秩近似的表现不太好。

三、剪枝

网络剪枝的主要思想就是将权重矩阵中相对“不重要”的权值剔除,然后再重新fine tune 网络进行微调。随机剪枝方法对硬件非常不友好,往往在硬件实现的过程中不一定能够很好地对网络起到加速和压缩的效果,而且一些标准化模块conv2d可能都不能用。后来就使用成块出现的结构化剪枝,包括Filter Pruning,梯度Pruning等方法。

  • 广义上的修剪包括:

    1. 正则化regularization:修改目标函数/学习问题,所以优化后可能会得到一个参数较少的神经网络
    2. 修剪pruning:面向大规模神经网络,并删除某些意义上冗余的特征或参数
    3. 增长growing:从小型网络开始,按某种增长标准逐步增加新的单元*
  • 剪枝的基本流程

    1. 衡量神经元的重要程度
    2. 移除一部分不重要的神经元
    3. 对网络进行微调
    4. 返回第一步,进行下一轮剪枝

3.1 剪枝的粒度变化

  • 细粒度剪枝(属于非结构化剪枝): 局部调整比较精细,保留模型精度

  • 粗粒度剪枝 (直接剪去filter或channel)
    filter pruning
    ICML2017. Combined Group and Exclusive Sparsity for Deep Neural Networks
    首先使用Group Sparsity(组稀疏)的方法对分组特征添加稀疏正则来修剪掉权重矩阵的一些列,然后通过Exclusive Sparsity增强不同权重之间特征的竞争力来学习更有效的filters,两者共同作用取得了很好的Pruning结果。
    channel pruning
    ICCV2017. Learning effective convolutional networks through network slimming
    通过给每个通道channel添加一个尺度因子scaling factor,然后对这些尺度因子添加sparsity regularization,最后根据尺度因子大小对相应的通道进行修剪,将一些尺度因子比较小的通道剪掉,实现对整个网络的瘦身效果。
    梯度pruning
    ICML2017. meProp
    对网络训练过程中的梯度信息做了分析,通过去掉幅值比较小的梯度来简化网络的反向传播过程,从而加快网络的训练过程。仅仅更新1%-4%的权重就可以实现和原有网络相当的效果。
    滤波器级别剪枝
    2017-Pruning filters for efficient convnets,基于滤波器权重本身的统计量。

  • 特例:直接剪网络分支结构(粒度最大)
    2017-Driven Sparse Structure Selection for Deep Neural Networks
    总体:引入Gate控制分支,数据驱动,动态剪枝,端到端
    具体实现:为CNN模型训练和剪枝提出了一个统一的框架。通过在某些CNN结构上引入缩放因子和相应的稀疏正则化,将其定义为联合稀疏正则化优化问题。
    局限性:应用于宽网络结构,在某些网络上不能用。

3.2 剪枝的方法

  • 权重衰减法
    通过在网络目标函数中引入表示结构复杂性的正则化项来使训练的网络权重趋向稀疏化。缺点是正则化参数/权重剪枝阈值对剪枝结果影响很大。
  • 灵敏度计算方法——数据驱动
    • 1.利用Loss对权重的二阶导数(Hession 矩阵)计算权重重要性
      2017-Learning to Prune Deep Neural Networks via Layer-wise Optimal Brain Surgeon||pytorch实现
      本文将二阶导数的计算限制在单层网络中,以减小计算量,并证明了剪枝后预测性能下降是每层重构误差的线性组合
    • 2.损失近似
      该方法通过观察损失函数的变化来判断对应枝的重要性。例如:
      2017-Pruning convolutional neural networks for resource efficient inference||Pytorch实现
      特点:* 滤波器级别剪枝,计算每个滤波器对于损失函数的影响程度
      *基于交替贪婪准则并且需要fine tune
    • 3.根据相关性剪枝
      类似于特征工程中的PCA,如
      2017-Combined Group and Exclusive Sparsity for Deep Neural Networks
      特点:* 探究了特征之间的正负相关关系,在神经元节点上剪枝
      *具体实现:(1)exclusive sparsity regularization ——使上层特征尽可能地由不同底层特征构成
      *(2)group sparsity regularization——允许某些重要的底层特征在上层共享

3.3. 剪枝与训练的结合

  • 迭代式剪枝
    训练权重——剪枝——训练权重
  • 动态剪枝,剪枝与训练同时进行,一般指稀疏约束的方法
    具体做法是在网络的优化目标中加入权重的稀疏正则项,使得训练时网络的部分权重趋向于0,而这些0值正是剪枝对象。
  • 不在训练时剪枝,只对单个样本推理阶段剪枝

四、网络量化

量化可以分为Low-Bit Quantization(低比特量化)、Quantization for General Training Acceleration(总体训练加速量化)和Gradient Quantization for Distributed Training(分布式训练梯度量化)。也可以分为二值量化,三值量化,多值量化
1. 二值量化( binary quantization)

思想是将权值矩阵中的单精度浮点数用两个值来表示,一般考虑使用符号函数或者加入线性化的符号函数来近似。对权重量化:如使用哈希把二值权重量化,再通过哈希求解对feature map量化:如将量化分为两步,第一步先对feature map进行量化,第二步再对权重量化,从而能够将两个同时进行很好的量化。
2. 三值量化(ternary quantization)

在分布式计算过程中有一个很大问题,每一个分布式服务器都和中心服务器节点有大量的梯度信息传输过程,从而造成带宽限制。NIPS2017. TermGrad采取把要传输的梯度信息量化为三值的方法来有效加速分布式计算。
3. 多值量化

对原来的模型取rounding model,round的方法有round-to-nearest和stochastic rounding
4. 其他量化

在训练过程中量化:英特尔在NIPS2017提出的Flexpoint方法。在32位浮点和16位浮点存储的时候,第一位是符号位,中间是指数位,后面是尾数。他们对此提出了把前面的指数项共享的方法,这样可以把浮点运算转化为尾数的整数定点运算,从而加速网络训练。

五、知识蒸馏

  1. 2015-Distilling the knowledge in a neural network
  • 作者Hinton认为是有办法将深度网络中所学到的知识转移到另一个相对简单的网络中去的。
  • 提出用改造的原始模型的softmax输出(加入一个温度常数T控制预测概率的平滑程度)作为一个软目标(soft target),加权结合真实标签(hard target)来计算小网络训练时的损失函数,权重经验值推荐为9:1。
  • 这种方法对于没有标签的数据集也可以拿来训练。另外大模型的输出相较于GTlabel来说包含更多信息,如类间距和类内方差等,所以这也可以作为数据增广的一种手段。
  1. FSP方法,它实际上将原始网络中feature map之间的相关度作为知识transfer到student network中,同时使用了L2损失函

  2. ICLR2017的工作在feature map中定义了attention,使用了三种不同的定义方法,将attention作为知识transfer到student network中。

六、紧凑模型设计

1. Mobilenet系列
MobileNets V1和MobileNets V2,其中使用了depthwise的1x1卷积。MobileNets V1是一个在网络非常精简情况下比较高性能的网络,MobileNets V2开始于通道比较少的1×1的网络,然后映射到通道比较多的层,随后做一个depthwise,最后再通过1x1卷积将它映射回去,这样可以大幅减少1×1卷积计算量。

2. shufflenet
把1×1的卷积通过分组来减少计算的方法,由于分组以后存在不同通道之间信息交流非常少的问题,他们又在卷积层之间增加channel shuffle过程进行随机扰乱,增加了不同通道之间的信息交流。

你可能感兴趣的:(模型压缩综述:剪枝、量化、知识蒸馏)