Altifigence Academy

6 / 24 · 概念

比例因子与零点

sx=0.25、zx=128 时,填充编码和 q=132 的真实值是多少?sw=0.5 时,哪个偏置编码表示 0.75?

真实零对应的编码

仿射量化使用正比例因子 s 和整数零点 z。本课程的整数约定先将 x/s 舍入到最近整数,恰好半值时选偶数,再加上 z,最后饱和到存储范围。反量化将编码近似解释为 s(q−z)。把真实值映射到整数网格通常会丢失信息。

q=clip⁡(roundEven⁡(x/s)+z,qmin,qmax)q=\operatorname{clip}(\operatorname{roundEven}(x/s)+z,q_{min},q_{max})

对于 s=0.25、z=128 的 uint8 输入,真实零对应编码 128。编码 130 和 126 分别表示 0.5 和 −0.5。原始填充编码零反而表示 −32。存储原始编码的缓冲区应使用 z 作为填充值;存储已经中心化的编码时,应填入整数零。在数据通路中标明此转换位置。

点积计算示例

输入编码 [130,126] 减去 128 后,中心化为 [2,−2]。权重 [3,−2] 使用比例 0.5、零点零。累加 2×3+(−2)×(−2)=10。累加器的真实比例为 0.25×0.5=0.125,因此真实结果为 1.25。输出比例 0.25、零点 128 时,得到编码 133。非零的权重零点同样必须在相乘前减去。

逐张量量化共用一个比例因子。逐通道权重量化需要每个通道独立的偏置和输出转换。如果两个输出通道的权重比例为 0.5 和 0.25,累加器编码十分别表示 1.25 和 0.625。软件的灵活性不能证明硬件支持这两种配置。

用比例 0.25 量化 0.625,得到半值 2.5,舍入为二,编码为 130。反量化得到 0.5,误差为 −0.125。输入 0.375 也映射到同一编码。量化网格误差不同于饱和误差:截断超范围输入造成的误差可能超过半个比例步长。可与 ONNX QuantizeLinear比较整数规则。本练习有意只实现小型 int8/uint8 子集。

自己试试

sx=0.25、zx=128 时,填充编码和 q=132 的真实值是多少?sw=0.5 时,哪个偏置编码表示 0.75?

阅读解释

原始填充编码为 128,q=132 表示一。累加器比例为 0.125,因此偏置编码为 0.75/0.125=6。

你的选择适用于此浏览器,可随时在页脚更改。