quantization
整数仿射量化把实数区间 映到整数区间 。 量化后的值为 , 反量化后的值为 。数值改用整数存储。激活一并量化时,点积可以改用整数乘加;只量化权重时,点积仍用浮点,省下的是权重的存储和读取。低精度浮点(FP8)和非均匀码本(NF4)用的是别的有限集合,本文推导均匀整数格点。
仿射量化
把 记作 ,
是整数格点的下端,所以 。此时 。把 (1) 代入 (2), 消去:
(1)(2) 是数轴上的缩放 和平移。 是整数 对应的实数,端点按要覆盖的范围来取。 落在 外时, 会落到 外,取较近的边界:
量化误差
不考虑截断、使用 (3) 时,。把取整误差写成 ,,
若把 看成 ,则 。
scale 与 zero point
令实数 对应整数 ,并取 。、 都是整数时,(1)(2) 写成
在 (7) 里消去后,,舍入误差仍是 。
量化粒度
同一组 覆盖多大一块数据,就是量化粒度。整块张量共用一组,是 per-tensor。权重矩阵每一行(一个输出通道)一组,是 per-channel。一行里每 个权重一组,是 per-group, 是 group size。激活按 token 各用一组,是 per-token。块越小,越跟得上局部范围,scale 和 zero point 也越多。
对称量化与非对称量化
对称量化
对称量化把实数区间放成关于 对称,并且 对应整数区间的中心。取
记 ,令 ,。则 ,
可表示的实数是 。
位有符号整数的满区间是 ,中点为 ,落在两个整数之间。取 时,负侧有 个负码,正侧有 个正码。PyTorch 的 qint8 对称 observer 使用 、、,
可表示的实数是 。
非对称量化
非对称量化允许 。先把 放进区间:
在 (6) 下让 映到 ,就要 。再把 限制在整数区间内,
整数点积
激活和权重都写成 (7)。 的一行是一个输出通道, 的一列是一个样本,。、 是对应的整数矩阵, 是全 列向量。
权重的 scale 与 zero point 按输出通道排成 ,激活的按样本排成 。整张量共用一组时,各分量相等,对角矩阵就是标量乘单位阵。
乘开得
是整数矩阵乘。 按行缩放, 按列缩放,两者都在它外面。 由权重行和与各样本的 zero point 组成,权重行和不依赖 。 是各样本的激活和。 是两个 zero point 向量的外积。
时,(10) 的后两项为 ,
输入通道分成若干组。、 是第 组在 中的列和在 中的行。 时,这一组有自己的 ,
留在对组的求和里。 对每一组相同,仍在求和之外。
量化参数的确定
Min-Max
取 ,,再按对称或非对称的公式计算 和 。校准样本都落在 内,截断误差为 。若权重几乎都在 ,只有一个为 ,则 由 决定,其余权重只占少数格点。
分位数
用分位数代替两端的极值。对称时设 的分布函数为 ,
非对称时设 的分布函数为 ,
再取 ,,使 ,这样 (7) 能表示 。比例 、 之外的样本被截断,范围内的 更小。
均方误差
在候选的 上最小化重建误差。 由 (5) 算出,
一部分样本可以被截断,只要平方误差下降。对称量化把搜索收成一个阈值 ,,。
(13) 只含张量自身的坐标。权重误差乘上激活之后,才得到层输出的误差。
KL 散度
先做直方图。每个候选截断阈值对应一个量化后的分布:阈值以外的质量并入端点,区间内按整数格点合并,再映回原来的分桶。 是截断后的直方图, 是量化后映回的直方图。选择使
最小的阈值。(14) 比较的是两个分布,(13) 比较的是逐点平方误差。
推理时量化(PTQ)
PTQ 在模型训练完成后进行,不需要重新训练。先选取少量有代表性的数据作为校准集,运行浮点模型,通过 observer 统计权重和激活的数值范围,据此确定 scale 和 zero point。然后按量化参数将权重转换为整数;对于激活,可以使用校准得到的静态量化参数,也可以在推理时动态统计范围。最后将浮点算子替换为对应的量化算子。常见做法包括只量化权重,以及同时量化权重和激活。
训练时量化(QAT)
QAT 在训练或微调过程中模拟量化效果。先为权重和激活确定初始的 scale 和 zero point,再插入伪量化算子,使前向计算能够感受到量化误差。反向传播时使用直通估计器近似取整操作的梯度,让模型参数在任务损失的驱动下适应量化误差。训练结束后冻结量化参数,将伪量化算子转换为实际的整数算子。