【学习体会】INT8定点数和模型量化

定点,就是约定机器中数据的小数点位置固定不变。 

在计算机中,通常将数据的小数点固定在数据的最高位之前或者最低位之后。前者称为定点小数,后者称为定点整数

 

定点小数是纯小数:

约定的小数点位置在符号位之后、有效数值部分最高位之前。若数据 x 的形式为 x = x0.x1x2…xn ( 其中x0为符号位,x1~xn是数值的有效部分,也称为尾数, x1为最高有效位 ),则在计算机中的表示形式为:

一般说来,如果最末位 xn = 1,前面各位都为 0 ,则数的绝对值最小,即 |x|min = 2^(-n) 。如果各位均为 1,则数的绝对值最大,即 |x|max =1-2^(-n) 。所以定点小数的表示范围是:

 

定点整数是纯整数:

约定的小数点位置在有效数值部分最低位之后。若数据 x 的形式为 x = x0 x1x2…xn ( 其中x0为符号位,x1~xn 是尾数, xn 为最低有效位 ),则在计算机中的表示形式为:

定点整数的表示范围是:

当数据小于定点数能表示的最小值时,计算机将它们作0处理,称为下溢;大于定点数能表示的最大值时,计算机将无法表示,称为上溢,上溢和下溢统称为溢出

(https://www.jianshu.com/p/43830cdcca30)

举个例子:

我们用8位定点数,1个符号位,4个整数位,3个小数位,则其可表示范围是-16.00~15.875,最大精度0.125。 

(https://blog.csdn.net/niaolianjiulin/article/details/82764511)

 这里INT8定点数也可以用于表示数学中的小数,但是存在最大精度、表示范围的限制,

反过来说,定点数的本质:在某个精度下,用8位二进制数序列(256种排列),表示某个范围的小数。

从这个本质出发,我们可以用INT8的256种排列,表示特定范围内的float32小数。

(https://www.cnblogs.com/sdu20112013/p/11960552.html)

说回量化的本质是:找到一个映射关系,使得float32与int8能够一一对应

那问题来了,float32能够表达值域是非常广的,而int8只能表达[0,255]。怎么能够用255个数代表无限多(其实也不是无限多,很多,但是也还是有限个)的浮点数?

幸运地是,实践证明,神经网络的“权重”和“偏置”往往是集中在一个非常狭窄的范围,如下:

【学习体会】INT8定点数和模型量化_第1张图片

所以这个问题解决了,即我们并不需要对值域-2^128 ~ +2^128的所有值都做映射。但即便是一个很小的范围,比如[-1,1]能够表达的浮点数也是非常多的,

所以势必会有多个浮点数被映射成同一个int8整数,从而造成精度的丢失。

另外,通过BN层的归一化作用,每一层的特征图的数据分布也是在(-1,1)之间,因此激活函数的激活值也可以被量化

 

 

 

float32和int8之间的相互映射:

【学习体会】INT8定点数和模型量化_第2张图片

 

量化的乘法:

【学习体会】INT8定点数和模型量化_第3张图片

 

量化的加法:

【学习体会】INT8定点数和模型量化_第4张图片

 

 

 

 

 

你可能感兴趣的:(学习体会,模型量化,定点数)