算子量化技术基本概念
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。

浙公网安备 33010602011771号