2、深度学习模型量化基础:量化定义、定点与浮点、量化参数(scale/zero-point)、对称与非对称量化、量化误差来源
在进入RKNN模型量化的实战之前,必须先建立扎实的理论地基。量化本质上是一种数值表示与计算精度之间的工程权衡。瑞芯微NPU(如RK3588、RK3576内置的NPU)为了在有限的功耗和算力预算内实现高吞吐推理,默认采用INT8甚至INT4定点运算。理解量化定义、定点与浮点差异、量化参数(scale/zero-point)、对称/非对称策略以及误差来源,是后续进行精度调优、混合量化、校准数据集设计的前提。本章将系统拆解这些核心概念,并给出可直接指导实践的判断方法。
上图展示了本章的核心知识框架:浮点与定点的本质差异、量化参数的作用、对称/非对称策略的适用场景,以及误差来源的四大类型。下面逐一展开。
2.1 量化定义与定点/浮点本质
量化(Quantization)是指将连续取值的浮点张量(通常为FP32或FP16)映射到有限离散取值的定点张量(如INT8、INT16)的过程。在深度学习推理中,量化不仅压缩了模型体积,更重要的是将高开销的浮点运算转换为高效的整数运算,从而适配NPU、DSP等硬件加速器。
浮点与定点的核心差异体现在三个方面:
- 数值范围:FP32动态范围约1e-38到3e38,而INT8仅能表示-128到127(或0到255)。
- 精度粒度:浮点在小数值附近有高分辨率,定点在整体范围内均匀分布,小数值容易被“抹平”。
- 硬件代价:浮点运算单元面积大、功耗高;整数运算单元面积小、速度快,且支持并行流水线。
在瑞芯微NPU上,默认的推理路径是FP32权重+INT8激活或全INT8。RKNN工具链负责将训练好的浮点模型转换为NPU可执行的RKNN格式,其中就包含量化参数的自动计算。
2.2 量化参数:scale与zero-point
量化映射的数学表达式为:
q = round(r / scale) + zero_point
其中:
- r:原始浮点值
- q:量化后的整数值
- scale:缩放因子,浮点数,表示每个量化步长代表的浮点范围
- zero_point:零点偏移,整数,表示浮点0对应的量化值
反量化的公式为:
r ≈ (q - zero_point) × scale
scale的计算通常基于张量的数值范围:
scale = (r_max - r_min) / (q_max - q_min)
zero_point则根据是否对称量化决定:对称量化时zero_point=0;非对称量化时,zero_point = round(q_min - r_min / scale)。
| 参数 | 含义 | 典型值 | 影响 |
|---|---|---|---|
| scale | 量化步长 | 0.001 ~ 0.1 | 过大会丢失精度,过小会溢出 |
| zero_point | 零点偏移 | 0(对称)或 128(非对称) | 影响零点映射和偏置处理 |
| bit-width | 量化位宽 | 8bit / 16bit | 位宽越高精度越高,但算力下降 |
2.3 对称量化与非对称量化
对称量化将浮点范围映射到关于原点对称的整数范围,即zero_point=0。其映射关系简化为:
q = round(r / scale)
对称量化的优势在于实现简单,不需要额外的零点偏移计算,硬件友好。但缺点是当浮点分布不对称时(例如ReLU后的激活值全为非负),会浪费一半的量化范围。
非对称量化允许zero_point不为0,将浮点范围映射到完整的整数范围。对于激活值(通常经过ReLU后分布在[0, +∞)),非对称量化能更充分地利用量化精度。
在RKNN工具链中,默认策略是:权重使用对称量化,激活使用非对称量化。这是因为权重分布通常近似对称(正负值都有),而激活值往往偏向正值。
2.4 量化误差来源与影响分析
量化误差主要来自四个方面,理解这些来源有助于在精度调优时快速定位问题:
- 舍入误差(Rounding Error):浮点值映射到最近整数时产生的误差,范围在±0.5个量化步长内。这种误差是随机的,通常不会累积。
- 截断误差(Clipping Error):当浮点值超出量化范围时被截断到边界值。这种误差是系统性的,会导致大数值被“压平”,对精度影响较大。
- 精度损失(Precision Loss):由于scale分辨率有限,小数值之间的差异被抹平。例如scale=0.1时,0.01和0.02都映射到同一个量化值。
- 累积误差(Accumulation Error):多层网络的误差逐层传递和放大,最终导致输出偏差。某些敏感层(如检测头、分割头)对误差特别敏感。
在RKNN模型量化中,误差的严重程度通常通过余弦相似度(Cosine Similarity)或欧氏距离来评估。当量化后模型的精度下降超过1%时,就需要考虑混合量化或调整校准数据集。
2.5 案例拆解:一个典型的量化参数计算过程
假设我们有一个卷积层的权重张量,其浮点分布范围为[-2.5, 3.5],需要量化为INT8(范围[-128, 127])。
步骤1:计算scale
scale = (3.5 - (-2.5)) / (127 - (-128)) = 6.0 / 255 ≈ 0.02353
步骤2:确定zero_point(对称量化)
zero_point = 0
步骤3:量化映射
q = round(r / 0.02353)
例如,r=1.2时,q = round(1.2 / 0.02353) = round(51.0) = 51。反量化后r' = 51 × 0.02353 = 1.20003,误差极小。
但如果r=-3.0,超出了范围,会被截断到-128,反量化后为-3.0118,误差较大。
复盘要点:这个案例展示了量化参数的计算逻辑。在实际RKNN工具链中,这个过程是自动完成的,但理解其原理有助于你判断:当模型精度下降时,是截断误差主导还是舍入误差主导,从而决定是否需要调整校准数据集或使用混合量化。