神经网络量化----吐血总结

量化技术是连接学院派和工程派之间的桥梁,效果再好的网络速度不快,那么也不会在工业上普及,因此量化技术还是很有发展潜力的。
摘要由CSDN通过智能技术生成

 神经网络量化----吐血总结


目录

 神经网络量化----吐血总结

1. 前言

1.1 量化是什么?

1.2 量化会带来什么?

2. 量化具体介绍

2.1 非对称量化

2.2 对称量化

2.3 随机量化

2.4 量化感知训练

3. 经典量化论文解读

3.1 Google 8-bit Integer-Arithmetric-Only Inference



1. 前言

本文主要借鉴于Google关于量化的白皮书,Quantizing deep convolutional networks for efficient inference: A whitepaper
并感谢666DZY666大佬的开源项目:https://github.com/666DZY666/model-compression 
能力有限,若有描述不当的地方,请大佬勿喷,仅为学习使用,若侵权,请告知,立删。

1.1 量化是什么?

量化是模型压缩的一种方式。量化就是把高位宽(例如32float)表示的权值或者激活值用较低位宽来近似表示(int8),在数值上的体现就是将连续的值离散化。

1.2 量化会带来什么?

量化主要用在边缘计算等硬件限制较大的场景下,即工业应用上(总不能在边缘上都带着GPU吧)。现有很多先进的神经网络(例如resnet,densenet)在分类、识别上都取得了较好的效果,但其普及程度远不及效果稍差但模型小、运算快的mobilenet,而mobilenet就是在权衡速度、识别率下产物。当然了,mobilenet不是量化模型,只是用来举个例子,用于说明量化的潜力。

以下为量化所带来的一些影响:

  • 优点1:加快运算速度。当把32float转变为int8表示时,在不考虑系统有浮点加速模块时,定点运算要比浮点运算快,感兴趣的可查阅定点数和浮点数运算的区别
  • 优点2:减少存储空间。若将32浮点数转变为8位表示时,存储空间减小到了1/4大小。
  • 缺点1:在用低带宽数值近似表示时,会造成一些精度损失。值得高兴的是,神经网络的参数大多是冗余的(或者说是对噪声的容忍度),所以当在近似变换时对精度的影响不是特别大

下面用图来说明量化是怎么带来损失的,A为实际的浮点值,量化后近似为B,但其表示的值为C点,缩放因子越大,A和C的距离就越远,误差就越大,所以在量化时引入的近似会带来一些精度上的损失。(后面会具体讲解如何设置最值,来找到合适的缩放因子)
 

图片1


2. 量化具体介绍

2.1 非对称量化

本文都以量化到8-bit为例
1)首先,设置浮点数的最大值x_max,最小值x_min

  • 对于权重:权重在训练后大小都是固定的,一般直接求出权重的最大值和最小值。
  • 对于激活值:会随着输入值的改变而改变,所以不能直接求其最值,google使用了滑动均值平均的方法,TensorRT使用KL散度,Easyquant使用cos相似度,后面会具体介绍。

2)其次,设置要量化的范围x_q_max,x_q_min,在非对称量化下为[0,255]。
3)之后,计算缩放因子Scale(float32)和平移因子Zero_point(int8):      
                                                           ,  
4)最后进行量化和解量化:图中的N_levels-1为255,round为四舍五入
         
然而为什么是在量化时使用先放缩再移位,解量化时先移位再放缩呢?可不可以反过来呢?答案是否定的,主要从效果和运算两个方面考虑:


       在运算上,主要考虑如何使用整形运算代替浮点运算,可以参考google论文(后面会有详细介绍)
      在效果上,主要考虑关键数0,浮点中的0的关键用法主要在于补零padding和激活Relu上,所以为了保证量化效果,需要将浮点0无偏差的使用整形来代替。可以参考这里,详细解释如下:

两种解量化方法如下:
    (讨论的解量化)
  (本文中的解量化,先移位再放缩,上下文移位的正负号一致性请忽略)
对于第一种,让real_value为0,得到的zero_point如下,很难保证zero_padding为整形,因为缩放因子为浮点数。
 

  • 32
    点赞
  • 155
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值