模型量化基础知识

it2022-05-05  148

以FP32转INT8为例,记录量化最基本的流程:

首先是量化的公式

INT8 的取值范围为-128 127 FP32的取值范围为 ( 2 − 2 − 23 ) × 2 127 , ( 2 23 − 2 ) × 2 127 (2−2^{-23})×2^{127},(2^{23}−2)×2^{127} (2223)×2127,(2232)×2127 详细见定点和浮点区别定点与浮点

而量化主要就是把FP32的值域压缩到INT8 从上面的取值,我们可以看出来在FP32和INT8的取值范围差异非常大,但是在已有的量化实验中,INT8的模型相比原FP32的模型精度影响并没有想象中那么大。是因为,在实际的神经网路中,网络的权重基本是在-1,1之间。 所以我们在压缩的时候,其实基本是把 -1,1之间的FP32的数给压缩到INT8的范围内。

最基本的转化公式如下: 已知 x f l o a t ∈ [ x f l o a t m i n , x f l o a t m a x ] x_{float}\in[x_{float}^{min}, x_{float}^{max}] xfloat[xfloatmin,xfloatmax] 需要量化到的区间范围为: [ x q u a n t i z e d m i n , x q u a n t i z e d m a x ] [x_{quantized}^{min}, x_{quantized}^{max}] [xquantizedmin,xquantizedmax] x s c a l e = x f l o a t m a x − x f l o a t m i n x q u a n t i z e d m a x − x q u a n t i z e d m i n x_{scale} = \frac{x_{float}^{max} - x_{float}^{min}}{x_{quantized}^{max} - x_{quantized}^{min}} xscale=xquantizedmaxxquantizedminxfloatmaxxfloatmin 这里 x s c a l e x_{scale} xscale为量化区间的压缩比 因为有时候的量化前后的区间不应定都是对称的,类似采用无符号的INT8即:[0, 255]就需要重新确定0点即: x z e r o _ p o i n t = x q u a n t i z e d m a x − x f l o a t m a x ÷ x s c a l e x_{zero\_point}= x_{quantized}^{max}-x_{float}^{max}\div{x_{scale}} xzero_point=xquantizedmaxxfloatmax÷xscale 确定转换之后的权重 x q u a n t i z e d = i n t ( x f l o a t ÷ x s c a l e + x z e r o _ p o i n t ) x_{quantized}=int(x_{float}\div{x_{scale}+x_{zero\_point}}) xquantized=int(xfloat÷xscale+xzero_point)

根据以上公式,我们就能简单把一个FP32的模型转换成INT8的,但是可以很明显的发现,如果模型是面对分类等任务,即输出只要是一个概率值的时候,因为softmax的原因,只有有一个比较小的精度损失。 但是,当模型要遇到一个回归任务的时候,在转换之后还需要进一步操作。下面先以简单的线性回归作为一个例子 假设: 线性回归函数是 y = 0.5 x 1 + 0.2 x 2 − 1 x 3 y=0.5x_{1}+0.2x_{2}-1x_{3} y=0.5x1+0.2x21x3 权重的范围是[-1, 0.5] 需要量化到的范围任然定义为INT8即是[-128,127] 则 x s c a l e = 1.5 255 x_{scale}=\frac{1.5}{255} xscale=2551.5 x z e r o _ p o i n t = 127 − 255 ÷ 3 = 42 x_{zero\_point}=127-255\div{3}=42 xzero_point=127255÷3=42 新的权重就是127,76,-128 INT8的公式 就是 y q u a n t i z e d = 127 x 1 + 76 x 2 − 128 x 3 y_{quantized}=127x_{1}+76x_{2}-128x_{3} yquantized=127x1+76x2128x3 x 1 = x 2 = x 3 = 1 时 x_{1}=x_{2}=x_{3}=1时 x1=x2=x3=1 y = − 0.3 y=-0.3 y=0.3 y q u a n t i z e d = 33 y_{quantized}=33 yquantized=33

因为工作原因 暂时没有空继续深入这块工作了 有兴趣的伙伴可以自行深入研究


最新回复(0)