6 / 24 · 概念
比例因子与零点
sx=0.25、zx=128 时,填充编码和 q=132 的真实值是多少?sw=0.5 时,哪个偏置编码表示 0.75?
课时内容可免费阅读,选课后可保存学习进度。
真实零对应的编码
仿射量化使用正比例因子 s 和整数零点 z。本课程的整数约定先将 x/s 舍入到最近整数,恰好半值时选偶数,再加上 z,最后饱和到存储范围。反量化将编码近似解释为 s(q−z)。把真实值映射到整数网格通常会丢失信息。
对于 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。