神经网络量化

最近在做神经网络的端侧部署,在做端侧部署的时候,为了减少内存压力和加快推理速度,会将单精度(fp32)模型量化成int8或者fp16。

量化计算原理

以线性非对称量化为例,浮点数量化为有符号定点数的计算原理如下:
x i n t = c l a m p ( [ x s ] + z ; − 2 b − 1 , 2 b − 1 − 1 ) x_{int}=clamp([\frac{x}{s}]+z;-2^{b-1},2^{b-1}-1) xint=clamp([sx]+z;−2b−1,2b−1−1)

其中x为待量化的浮点数, x i n t x_{int} xint为量化后的定点数, [ . ] [ . ] [.]代表这四舍五入计算, s s s为尺度因子, z z z代表量化零点, b b b为量化位宽, c l a m p clamp clamp运算定义如下:
c l a m p ( x ; a , c ) = { a , x < a , x , a ≤ x ≤ c , c , x > c , clamp(x;a,c)=\begin{cases}a, & x < a,\\x, & a\leq x\leq c, \\c, & x>c, \end{cases} clamp(x;a,c)=⎩ ⎨ ⎧a,x,c,x<a,a≤x≤c,x>c,

其中最重要的两个参数是尺度因子和zero-point,这两个参数是怎么计算得到的呢?

设待量化的参数范围为 ( q m i n , q m a x ) (q_{min},q_{max}) (qmin,qmax),截断范围为 ( c m i n , c m a x ) (c_{min},c_{max}) (cmin,cmax),则量化因子和zero-point的计算方式如下:
s = q m a x − q m i n c m a x − c m i n = q m a x − q m i n 2 b − 1 − 1 s=\frac{q_{max}-q_{min}}{c_{max}-c_{min}}=\frac{q_{max}-q_{min}}{2^{b-1}-1} s=cmax−cminqmax−qmin=2b−1−1qmax−qmin
z = c m a x − [ q m a x s ] 或 z = c m i n − [ q m i n s ] z=c_{max}-[\frac{q_max}{s}]或z=c_{min}-[\frac{q_{min}}{s}] z=cmax−[sqmax]或z=cmin−[sqmin]

到这里,我们发现一个比较有意思的事情是,这里面有个截断范围,而且这个截断范围根据量化数据类型决定,例如int8的截断范围是 ( − 128 , 127 ) (-128,127) (−128,127)。

量化误差

量化是会造成一定程度的精度丢失。根据上述原理可知,量化误差来源于四舍五入和截断。四舍五入误差的范围为 ( − 1 2 s , 1 2 s ) (-\frac{1}{2}s,\frac{1}{2}s) (−21s,21s)。当浮点数 x x x过大,量化因子 s s s过小时,会导致量化定点数超出截断范围,产生截断误差。理论上,增大量化因子可以减小截断误差,但会增大舍入误差。

量化算法

量化因子和zero-point是影响量化误差的关键参数,同时这两个参数又受限于量化范围,因此关于量化范围的求解又有几种具有代表性的算法。

Normal

Normal算法通过计算浮点数中最大值和最小值确定量化范围的最大值和最小值,Normal算法不会带来截断误差,但是对于异常值很敏感,因为异常值会导致舍入误差过大。
q m a x = m a x V q_{max}=maxV qmax=maxV
q m i n = m i n V q_{min}=minV qmin=minV

KL散度

KL散度算法计算浮点数和定点数的分布,通过调整不同的阈值来更新浮点数和定点数的分布,其中量化范围的确定是通过最小化两个分布的相似性。KL散度算法通过最小化浮点数和定点数之间的分布差异,能够更好地适应非均匀数据分布并减小异常值带来的影响。
a r g m a x q m i n , q m a x ∥ H ( ψ ( V ) , ψ ( V i n t ) ) ∥ \underset{q_{min},q_{max}}{argmax} \left \| H(\psi(V),\psi(V_{int})) \right \| qmin,qmaxargmax∥H(ψ(V),ψ(Vint))∥

相关推荐
AI完全体5 小时前
【AI知识点】偏差-方差权衡(Bias-Variance Tradeoff)
人工智能·深度学习·神经网络·机器学习·过拟合·模型复杂度·偏差-方差
sp_fyf_20245 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
代码骑士9 小时前
【一起学NLP】Chapter3-使用神经网络解决问题
python·神经网络·自然语言处理
管二狗赶快去工作!12 小时前
体系结构论文(五十四):Reliability-Aware Runahead 【22‘ HPCA】
人工智能·神经网络·dnn·体系结构·实时系统
达柳斯·绍达华·宁16 小时前
CNN中的平移不变性和平移等变性
人工智能·神经网络·cnn
技术无疆17 小时前
【Python】Streamlit:为数据科学与机器学习打造的简易应用框架
开发语言·人工智能·python·深度学习·神经网络·机器学习·数据挖掘
浊酒南街17 小时前
吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)2.7-2.8
人工智能·深度学习·神经网络
xiandong201 天前
240929-CGAN条件生成对抗网络
图像处理·人工智能·深度学习·神经网络·生成对抗网络·计算机视觉
橙子小哥的代码世界1 天前
【深度学习】05-RNN循环神经网络-02- RNN循环神经网络的发展历史与演化趋势/LSTM/GRU/Transformer
人工智能·pytorch·rnn·深度学习·神经网络·lstm·transformer
IFTICing1 天前
【文献阅读】Attention Bottlenecks for Multimodal Fusion
人工智能·pytorch·python·神经网络·学习·模态融合