算子量化技术基本概念
INT8量化分为非对称量化与对称量化。对称量化是非对称量化的一个特例, 通常对称量化的性能会优于非对称量化, 而精度上非对称量化更优。
非对称量化
如上图所示, 非对称量化其实就是把[min,max]范围内的数值定点到[-128, 127]或者[0, 255]区间。
从int8到float的量化公式表达如下:
其中r是真实的值, float类型; q是量化后的值, INT8或者UINT8类型;
S表示scale, 是float; Z是零点, 是INT8类型;
当量化到INT8时,
=127,
=-128; UINT8时,
=255,
=0。
反过来从float到int8的量化公式如下:
对称量化
对称量化是非对称量化Z=0时的特例, 公式表达式如下所示:
A)threshold是阈值, 可以理解为张量的范围是[-threshold, threshold];
B)这里
, 通常是激活函数情况;
C)对于weight, 一般
;
D)对于UINT8, Tensor范围是[0, threshold], 此时
。
Scale转换
公式表达:
其中取值是一个非负数
,其中
取值[0.5,1],
是一个非负数。
换个表述来说, 就是浮点数Scale, 可以转换成乘法与rshift, 如下表达:
举例说明:
乘法支持的位数越高, 就越接近Scale, 但是性能会越差。一般芯片会用32位或8位的乘法。
量化推导
可以用量化公式, 对不同的OP进行量化推导, 得到其对应的INT8计算方式。
对称与非对称都用在激活函数上, 对于权重一般只用对称量化。
卷积
卷积的表达式简略为:
代入int8量化公式, 推导如下:
非对称量化特别注意的是, Pad需要填入
。
对称量化时, Pad填入0, 上述推导中
与
皆为0。
在PerAxis(或称PerChannal)量化时, 会取Filter的每个OC做量化, 推导公式不变, 但是会有OC个乘法、rshift。
内积
表达式与推导方式与卷积相同
Add
加法的表达式为:
代入int8量化公式, 推导如下:
加法最终如何用TPU实现, 与TPU具体的指令有关。
这里对称提供的方式是用INT16做中间缓存;
在网络中,输入A、B已经是量化后的结果
、
,因此非对称是先反量化成float, 做加法后再重量化成INT8
平均池化
平均池化的表达式可以简写为: 其中
,其中
代入int8量化公式, 推导如下:
其中
LeakyReLU
LeakyReLU(泄漏ReLU)的表达式可以简写为:
代入int8量化公式, 推导如下:
对称量化时,
, 非对称量化时,
。通过向后校准操作后, , 此时Sx/Sy = 1。
当为对称量化时,
与
均为0。
Pad填充
Pad的表达式可以简写为:
代入int8量化公式, 推导如下:
通过前向校准操作后,
, 此时
/
= 1。
对称量化时,
与
均为0, pad填入 round(value/
), 非对称量化时, pad填入round(value/
+
)。
PReLU
PReLU的表达式可以简写为:
代入int8量化公式, 推导如下:
通过向后校准操作后,
, 此时
/
= 1。
一共有多个乘法与1个rshift。当为对称量化时,
与
均为0。