量化网络的注意事项

二,量化算术

模型量化过程可以分为两部分:将模型从 FP32 转换为 INT8,以及使用 INT8 进行推理。本节说明这两部分背后的算术原理。如果不了解基础算术原理,在考虑量化细节时通常会感到困惑。

2.1,定点和浮点

定点和浮点都是数值的表示(representation),它们区别在于,将整数(integer)部分和小数(fractional)部分分开的点,点在哪里。定点保留特定位数整数和小数,而浮点保留特定位数的有效数字(significand)和指数(exponent)

绝大多数现代的计算机系统采纳了浮点数表示方式,这种表达方式利用科学计数法来表达实数。即用一个尾数(Mantissa,尾数有时也称为有效数字,它实际上是有效数字的非正式说法),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。具体组成如下:

  • 第一部分为 sign 符号位 s,占 1 bit,用来表示正负号;
  • 第二部分为 exponent 指数偏移值 k,占 8 bits,用来表示其是 2 的多少次幂;
  • 第三部分是 fraction 分数值(有效数字) M,占 23 bits,用来表示该浮点数的数值大小。

基于上述表示,浮点数的值可以用以下公式计算:

                                 

值得注意是,上述公式隐藏了一些细节,如指数偏移值 k 使用的时候需要加上一个固定的偏移值。

比如 123.45 用十进制科学计数法可以表示为 1.2345×102 ,其中 1.2345 为尾数,10 为基数,2 为指数。

单精度浮点类型 float 占用 32bit,所以也称作 FP32;双精度浮点类型 double 占用 64bit

量化浮点

32-bit 浮点数和 8-bit 定点数的表示范围如下表所示:

数据类型 最小值 最大值
FP32 $-1.2\times 10^{-38}$ $3.4\times 10^{38}$
int8 -128 128
uint8 0 255
值 2127 大约等于 1038。

神经网络的推理由浮点运算构成。FP32 和 INT8 的值域是 [(2−223)×2127,(223−2)×2127] 和 [−128,127] ,而取值数量大约分别为 232 和 28 。FP32 取值范围非常广,因此,将网络从 FP32 转换为 INT8 并不像数据类型转换截断那样简单。但是,一般神经网络权重的值分布范围很窄,非常接近零。

根据偏移量 Z是否为 0,可以将浮点数的线性量化分为两类-对称量化和非对称量化。

当浮点值域落在 (−1,1) 之间,权重浮点数据的量化运算可使用下式的方法将 FP32 映射到 INT8,这是对称量化。其中  ​ 表示 FP32 权重, 表示量化的 INT8 权重, 是缩放因子(映射因子、量化尺度(范围)/ float32 的缩放因子)。

对称量化的浮点值和 8 位定点值的映射关系如下图,从图中可以看出,对称量化就是将一个 tensor 中的内的 FP32 值分别映射到 8 bit 数据的 [-128, 127] 的范围内,中间值按照线性关系进行映射,称这种映射关系是对称量化。可以看出,对称量化的浮点值和量化值范围都是相对于零对称的。

量化网络的注意事项_第1张图片

因为对称量化的缩放方法可能会将 FP32 零映射到 INT8 零,但我们不希望这种情况出现,于是出现了数字信号处理中的均一量化,即非对称量化。数学表达式如下所示,其中 表示量化零点(量化偏移)。

大多数情况下量化是选用无符号整数,即 INT8 的值域就为 [0,255] ,这种情况,显然要用非对称量化。非对称量化的浮点值和 8 位定点值的映射关系如下图:

量化网络的注意事项_第2张图片

量化网络的注意事项_第3张图片

你可能感兴趣的:(c++,矩阵,人工智能)