2、深度学习模型量化基础:量化定义、定点与浮点、量化参数(scale/zero-point)、对称与非对称量化、量化误差来源

在进入RKNN模型量化的实战之前,必须先建立扎实的理论地基。量化本质上是一种数值表示与计算精度之间的工程权衡。瑞芯微NPU(如RK3588、RK3576内置的NPU)为了在有限的功耗和算力预算内实现高吞吐推理,默认采用INT8甚至INT4定点运算。理解量化定义、定点与浮点差异、量化参数(scale/zero-point)、对称/非对称策略以及误差来源,是后续进行精度调优、混合量化、校准数据集设计的前提。本章将系统拆解这些核心概念,并给出可直接指导实践的判断方法。

量化核心概念关系与误差来源链路 浮点表示 (FP32/FP16) 动态范围大,精度高 硬件开销大,功耗高 NPU算力利用率低 定点表示 (INT8/INT16) 动态范围有限,精度损失 硬件高效,低功耗 NPU算力利用率高 量化 量化参数 scale (缩放因子) zero-point (零点) bit-width (位宽) 对称量化 (Symmetric) zero-point = 0,范围 [-127, 127] 适合权重 (分布近似对称) 实现简单,硬件友好 激活值分布偏移时精度差 非对称量化 (Asymmetric) zero-point ≠ 0,范围 [0, 255] 适合激活值 (ReLU后非负分布) 精度更高,但计算稍复杂 RKNN默认对激活使用非对称 量化误差来源 (Error Sources) 舍入误差 浮点→定点取整 round-to-nearest 截断误差 超出动态范围被截断 clip到[-128,127] 精度损失 scale分辨率不足 小数值被抹平 累积误差 多层误差逐层放大 敏感层需特殊处理

上图展示了本章的核心知识框架:浮点与定点的本质差异、量化参数的作用、对称/非对称策略的适用场景,以及误差来源的四大类型。下面逐一展开。

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格式,其中就包含量化参数的自动计算。

关键认知:量化不是简单的“四舍五入”,而是一个带参数的映射过程。每个张量(权重或激活)都有自己独立的scale和zero-point,这些参数决定了浮点值到定点值的映射关系。

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工具链中,默认策略是:权重使用对称量化,激活使用非对称量化。这是因为权重分布通常近似对称(正负值都有),而激活值往往偏向正值。

实战建议:当你在RKNN的量化配置中看到“symmetric”或“asymmetric”选项时,不要随意修改默认值。除非你通过可视化工具确认了权重或激活的分布特性,否则默认配置通常是最优的。

2.4 量化误差来源与影响分析

量化误差主要来自四个方面,理解这些来源有助于在精度调优时快速定位问题:

  1. 舍入误差(Rounding Error):浮点值映射到最近整数时产生的误差,范围在±0.5个量化步长内。这种误差是随机的,通常不会累积。
  2. 截断误差(Clipping Error):当浮点值超出量化范围时被截断到边界值。这种误差是系统性的,会导致大数值被“压平”,对精度影响较大。
  3. 精度损失(Precision Loss):由于scale分辨率有限,小数值之间的差异被抹平。例如scale=0.1时,0.01和0.02都映射到同一个量化值。
  4. 累积误差(Accumulation Error):多层网络的误差逐层传递和放大,最终导致输出偏差。某些敏感层(如检测头、分割头)对误差特别敏感。

在RKNN模型量化中,误差的严重程度通常通过余弦相似度(Cosine Similarity)或欧氏距离来评估。当量化后模型的精度下降超过1%时,就需要考虑混合量化或调整校准数据集。

常见误区:很多开发者认为“量化误差只影响精度,不影响速度”。实际上,如果量化参数设置不当(如scale过小导致溢出),NPU可能触发异常处理,反而降低推理速度。此外,过度追求精度而使用FP16混合量化,会损失NPU的INT8算力优势。

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工具链中,这个过程是自动完成的,但理解其原理有助于你判断:当模型精度下降时,是截断误差主导还是舍入误差主导,从而决定是否需要调整校准数据集或使用混合量化。