模型压缩和加速,量化

本质:

1)量化对象: 1、各层特征图 (通过统计其值分布进行量化)   2、每层卷积核(通过参数分布进行量化)

2)bias 可去掉的理论依据: 利用对称量化(卡阈值,令其正负两端都是该值),使其关于中心点对齐。

 

 

1.方案介绍

模型压缩和加速,量化_第1张图片

 

2、总结方法:

量化方式: 二值化网络,三值化网络,深度压缩

深度压缩包括(针对Alexnet ,VGG这种冗余的网络来说效果不错,但对于squeezenet,mobilenet 来说效果不佳):

1) 剪枝: 参数小于阈值的归0

               难点: 由于剪枝是将参数彻底抛弃,因此,剪掉权重不再接受任何的梯度。从而使得网络参数变成一个稀疏矩阵。

                            在训练过程中,由于小参数不断被剪枝,为了持续增大压缩率,阈值的设定必须不断增大(引出了一个算法,基于准确率损失和压缩率上升的公式)

 

2)量化 :将接近的值变成一个数。高度稀疏化后我们还可以对非零参数进行定点压缩。

 

二值化网络:

Float 32 ——> 正负1  : 

浮点型 : 是由一个符号位,8个指数位 和尾数位三个部分组成。运行过程需要大量内存和计算资源 。

 

三值化网络  (正负1 ,0) :

优点:  多权值有更好的泛化能力

理论基础: 权值分布接近正态分布或均匀分布,利用scale参数 最小化 L2距离(三值化前和三值化后)

 

其他加速方法:

1)改变卷积方式

2)channel puring

 

 

CNN加速方法

  1. optimized implementation(e.g. FFT) 就是实现更快的计算方法
  2. quantization(e.g. BinaryNet) 就是将网络中的浮点数二值化
  3. structed simplification 就是将网络结果变简单

structed simplification 方法

  1. tensor factorization 就是将矩阵分解
  2. sparse connection 就是让网络连接变得稀疏
  3. channel pruning 信道裁剪

channel pruning 方法

  1. first k selects the first k channels. 这种方法太简单粗暴了。
  2. max response 也就是选择权值和最大的信道,认为拥有的信息最多。

 

 

3、Int8量化-介绍:

    1) 为何量化有用?

            CNN 对于噪声不敏感

    2)量化作用?

            模型压缩( 由于平坦模型中每层weights 范围基本确定且波动不大),减少访存和计算量。

      3)为何不直接训练低精度模型?

             int 8 不利于反向传播和梯度下降(例如:  学习率一般都是0.00f)

 

4、

什么是int8模型加速?

  • 主流框架采用float32的格式,将float32映射到int8格式就是int8加速。
  • 知乎科普 - Int8量化-介绍(一):https://zhuanlan.zhihu.com/p/58182172
  • 谷歌量化白皮书:Quantizing deep convolutional networks for efficient inference: A whitepaper
  • Nvidia量化PPT:Low Precision Inference On GPU.pdf 
  • 为什么int8加速?

    • 模型压缩(32bit到8bit),推理加速(移动端手机大部分为arm架构,arm架构有int8指令集),每层的weights和激活值范围基本都是确定的,且波动不大,适合量化压缩
  • 怎么做int8加速?

    • 量化pipeline:
      1. 训练好fl32模型 
      2. fine-tuning模拟量化模型
      3. 转成int8模型
      4. 确认int8模型转换成功
      5. 测试benchmark掉点情况
      6. 进行加速比测试
    • 我们已经尝试过的两种理论方法:
      • post-training
      • quantization-aware-training

 

 

 

你可能感兴趣的:(模型压缩和加速,量化)