本页章节
QUANTIZATION / INTEGER LINEAR LAYER
量化线性层:整数怎样恢复为同一单位
把输入、权重、累加器和 bias 放在一起,逐项核对零点与 scale。先确认整数算术实现了声明的量化层,再比较它与原始浮点层的误差。
每个数值都有自己的刻度与整数零点
校准区间包含实数零点:low=min(0,min x),high=max(0,max x),s=(high−low)/255,z=clip(round(−low/s),0,255)。全零时规定 s=1、z=0。整数舍入采用半数远离零;输入区间来自独立的两条校准记录,权重范围来自当前层。
输出 scale 由校准记录通过原始浮点层得到,再将量化层输出映射回 uint8。校准与展示输入分离;“输入超出校准范围”场景把展示输入放大八倍,暴露 clipping 的影响。
怎样从原始整数点积补回零点修正?
这条 W8A8 路径用 INT32 可表达的整数进行精确累加,但输出 scale 相乘与重定标仍用实数运算。生产中的纯整数输出常把倍率转换为固定点乘数和移位;本例未模拟该逼近,其误差和舍入需要另行验证。
同一线性层,分别比较实现误差和近似误差
两条输入、两个输出通道
固定校准 · 独立矩阵参考| 位置 | 原始浮点 | 恢复矩阵乘参考 | 当前实现 | 最终输出 |
|---|
整数累加、bias 与输出整数
| i,j | 原始点积 | 零点修正 | C | qBias | sX×sWⱼ | qOutput |
|---|
输入、校准记录、权重与整数编码
权重误差小,输出误差一定也小吗?
算术一致性
恢复后的 X/W/bias 做矩阵乘,与整数累加再恢复应该一致。这个比较可发现零点、轴和单位错误。
模型近似
原始层与正确量化层允许有误差;校准输入上的小误差需要在独立任务与长尾输入上复核。
W4A16 的口径
权重用逐通道 −7…7 对称刻度;输入先舍入到 FP16 可表达值,恢复后的乘加使用 binary64。它展示权重压缩与激活舍入,不执行低位硬件 kernel。
逐通道与分组
本例的 scale 在每次点积内部固定。沿 k 分组时,各组点积需要分别乘 scale 后相加,不能把一个倍率提到整行外。
数值位宽、元数据与耗时分别记账
小矩阵逐元素检查之外,npm run lab:decisions 使用独立 NumPy 整数计算核对零点展开、bias、输出饱和与 W4A16 恢复路径。报告保存所有配置和误差。它不测 GPU kernel、模型准确率或推理吞吐;这些指标应放到目标设备和任务数据上单独实验。
适用范围与一手资料
2×3 输入和 3×2 权重,uint8 仿射量化与 INT32 范围检查;重定标用实数倍率。W4A16 恢复后使用 binary64 乘加,未运行低位 kernel、QAT 或性能测试。
公式与机制的原始依据 · 3 项
- Quantization and Training of Neural Networks for Efficient Integer-Arithmetic-Only Inference (2017)2.2—2.4 节的整数矩阵乘、零点、bias 与重定标;2026-10-28 核对
- PyTorch · Numerical accuracy浮点精度、非结合性、矩阵运算累加与非有限值
- AWQ (2023)激活感知权重量化、校准与部署