模型量化是一种压缩网络参数的方式,它将稠密神经网络的参数(weight)、特征图等(activation)原本用浮点表示的量值换用定点(整型)表示,最后将定点数据反量化回浮点数据得到结果。模型能够加快模型推理速度,减少模型内存占用。模型量化实现建立在深度网络对噪声具有一定的容忍性上,模型量化相当于对深度网络增加了一定的噪声(量化误差),如果量化位数合适,模型量化基本不会造成较大的精度损失。工业界使用的较为成熟的量化方案有w8a8和w8a16等,这里w8指模型权重用int8的数值来表示,a16指模型的特征图用int16的数值来表示,有时也可以混用两种量化方案,即混合精度量化。

根据量化函数是否为线性,量化可以分为线性量化和非线性量化。我们这里主要讨论线性量化。在线性量化中,模型量化和反量化的公式可以简单的表示为:

Q=round(\frac{r}{s})+Z

r=s(Q-Z)

其中Q表示量化后的整数值,r表示量化前的浮点值,s表示量化的scale,Z表示浮点中的0值经量化后对应的整数:

s=\frac{r_{max}-r_{min}}{Q_{max}-Q_{min}}

Z=Q_{max}-round(\frac{r_{max}}{s})

r_{max}r_{min} 通过统计得到, Q_{max}Q_{min}则是整型数能表示的最大值和最小值。

根据模型量化的精度损失程度,量化方式可以分为:
L1:data free,直接将浮点参数转换成整型参数,精度较低
L2:PTQ(post training quantization),基于实际使用的数据对模型量化过程进行校准,可能伴有模型权重的缩放,精度较高
L3:QAT(quantization aware training),在量化的同时使用反向传播对模型权重进行调整,精度高

根据零点Z是否为0,即 r_{max}r_{min}是否关于Z对称,量化可以分为对称量化和非对称量化。

根据量化粒度,量化可以分为逐层量化和逐通道量化,逐层量化整个卷积层或者特征图使用一组参数进行量化,逐通道量化则每个通道使用一组参数进行量化。

目前量化的难点包括但不限于:
1、一些特殊层支持的不是很好,量化损失较大。如concat层,当两个不同分布范围差异较大的数据合并到一起后,由于使用同一套量化参数,分布范围小的数据很容易损失精度。
2、模型任务越复杂,模型越小,量化损失越大,量化越难。
3、一些特殊的数据分布难以被量化模型较好的表示。


引用:

1.神经网络量化入门--基本原理 - 知乎 (zhihu.com)

2.模型量化了解一下? - 知乎 (zhihu.com)

3.模型量化详解_WZZ18191171661的博客-CSDN博客

 

内容中包含的图片若涉及版权问题,请及时与我们联系删除