量化基础:定点与浮点表示、量化参数(scale/zero-point)、对称与非对称量化

在Edge AI项目中,QAT(量化感知训练)的首要任务是在训练阶段就模拟量化带来的信息损失,使模型权重和激活值在部署到低精度推理引擎(如INT8、INT16)之前完成精度适应。要理解QAT的图构建逻辑,必须先厘清量化最底层的三个概念:数值表示体系(定点与浮点)、量化映射参数(scale与zero-point)、以及量化策略(对称与非对称)。这三者决定了量化误差的分布形态、硬件指令的匹配效率以及反量化过程的计算开销。本节将从数值表示的本质出发,逐步拆解量化参数的计算逻辑,并给出在Edge AI项目中如何选择量化策略的工程判断依据。

浮点表示 (FP32/FP16) 符号位(S) + 指数位(E) + 尾数位(M) 动态范围大,精度高 硬件开销大,功耗高 Edge设备部署成本高 例:0.15625 = 1.25 × 2⁻³ 定点表示 (INT8/INT16) 固定整数位宽,无指数位 动态范围有限,需量化映射 硬件指令高效,吞吐量大 Edge NPU/DSP原生支持 例:int8 范围 [-128, 127] 量化参数 scale (缩放因子) : 浮点步长 zero-point (零点) : 浮点0的映射 公式: r = scale × (q - zero_point) 决定量化误差与动态范围 QAT中需模拟舍入误差 量化策略对比 对称量化 zero_point = 0 范围: [-max_abs, max_abs] 适合权重(分布近似对称) 非对称量化 zero_point ≠ 0 范围: [min, max] 完整利用 适合激活(ReLU后非负分布)

核心原理:从浮点到定点的信息压缩

浮点表示(如FP32)采用科学计数法的二进制形式,由符号位、指数位和尾数位组成,能够以极高的动态范围表达从极小到极大的数值。然而在Edge AI场景中,浮点运算单元占用芯片面积大、功耗高,且内存带宽受限。定点表示(如INT8)仅用固定位宽的整数表达数值,硬件实现简单、计算速度快,但动态范围受限。量化的本质就是寻找一种映射关系,将浮点张量压缩到定点整数域,同时尽量保留原始信息的分布特征。

在QAT中,这种映射不是简单的截断或四舍五入,而是通过可学习的参数(scale和zero-point)建立仿射变换。训练过程中,前向传播使用伪量化节点模拟舍入误差,反向传播则通过直通估计器(STE)绕过不可导的舍入操作,使梯度能够正常流动。理解这一点是后续构建QAT计算图的基础——量化参数不是事后统计的,而是在训练中逐步优化的。

关键认知:量化不是简单的精度损失,而是一种有损压缩。QAT的目标是让模型在训练阶段就适应这种压缩,使网络权重分布主动调整到对量化误差不敏感的区域。

量化参数:scale与zero-point的数学定义

给定浮点张量 r,量化后的整数 q 满足:

r ≈ scale × (q - zero_point)

其中 scale 是浮点缩放因子,表示每个整数步长对应的浮点间隔;zero_point 是浮点0值映射到整数域的偏移量。反量化时,通过该公式将整数还原为浮点近似值。scale 的计算取决于量化范围的选择:

  • 对称量化:取浮点张量的最大绝对值 max_abs,令量化范围对称分布于0两侧。此时 zero_point 固定为0,scale = max_abs / 127(对于INT8)。计算简单,硬件友好,但若张量分布偏斜(如ReLU后的激活值全为正),会浪费一半的量化区间。
  • 非对称量化:取浮点张量的实际最小值 min 和最大值 max,令量化范围完全覆盖数据分布。此时 zero_point = round(-min / scale),scale = (max - min) / 255。能充分利用全部量化区间,但需要额外存储和计算 zero_point,且反量化时多一次减法运算。
对比维度对称量化非对称量化
zero_point恒为0非0整数
计算开销低(无需偏移)略高(需减法)
动态范围利用可能浪费区间完全利用
适用场景权重(分布近似对称)激活(ReLU后非负)
硬件支持多数NPU原生支持部分DSP需额外指令

判断方法:如何为不同张量选择量化策略

在Edge AI项目的QAT图构建中,并非所有张量都采用同一量化策略。工程上需要根据张量的数据分布特征和硬件指令集支持情况做差异化选择:

  1. 权重张量:通常训练良好的权重分布近似于高斯分布,均值接近0,对称性较好。优先选择对称量化,以简化计算并匹配多数NPU的乘加指令。
  2. 激活张量:经过ReLU等激活函数后,激活值非负且分布偏斜。若使用对称量化,负半轴区间完全浪费。此时应使用非对称量化,并让zero_point落在整数域内。
  3. 偏置项:一般保持FP32精度,不量化。因为偏置的数值范围较小,量化误差会直接影响输出精度。
  4. 硬件约束:部分Edge芯片(如某些MCU级DSP)仅支持对称量化指令,此时即使激活分布偏斜,也只能采用对称量化,但可通过在量化前对激活做平移预处理来缓解。
工程经验:在QAT训练初期,建议先使用校准数据集统计各层激活的min/max,观察分布形态。若发现某层激活的min远大于0,则非对称量化可显著降低量化误差;若min接近0,则对称量化即可满足需求。

案例拆解:MobileNetV2在Cortex-M55上的QAT量化策略选择

某智能穿戴设备项目需要在Cortex-M55内核(支持Helium DSP指令)上部署MobileNetV2图像分类模型,目标INT8量化后Top-1精度损失不超过2%。初始使用PTQ(训练后量化)时,精度损失达到4.5%,因此决定引入QAT。

关键输入数据:模型权重分布近似对称(均值0.002,标准差0.05),而第3层、第5层、第8层激活值经ReLU6后分布在[0, 6]区间,min值分别为0.0、0.0、0.35。硬件上,Cortex-M55的DSP指令支持对称量化的乘加运算,非对称量化需要额外的偏移修正指令。

分析判断过程:权重层全部采用对称量化(scale = max_abs/127),激活层中min接近0的层(第3、5层)也采用对称量化以简化指令;第8层激活min=0.35,若用对称量化则负半轴完全浪费,量化步长增大,误差显著。因此对该层采用非对称量化,并接受额外的偏移修正开销。

实际操作步骤:在QAT训练图中,为第8层激活插入伪量化节点,设置quant_min=0、quant_max=255,scale=(6-0.35)/255≈0.0222,zero_point=round(-0.35/0.0222)≈-16。训练时冻结scale和zero_point,仅更新网络权重。训练50个epoch后,该层量化误差从对称量化时的0.35降低到0.02。

结果对比:最终模型Top-1精度损失1.8%,满足要求。推理时,第8层多执行一次减法指令,整体推理时间增加3%,在可接受范围内。

风险与代价:非对称量化增加了部署代码的复杂度,且若zero_point计算不准确(如校准集分布偏移),会导致精度下降。复盘时发现,若在训练中动态更新scale和zero_point(而非冻结),精度可进一步提升至1.5%,但训练稳定性下降,需要更精细的学习率调度。

常见误区:不要对所有层统一使用对称量化或非对称量化。层间数据分布差异极大,统一策略会导致部分层量化误差过大。QAT的核心价值之一就是逐层感知并适应这种差异。

常见误区与总结复盘

在Edge AI项目的QAT实践中,以下误区需要特别警惕:

  • 误区一:认为scale越小越好。实际上scale过小会导致量化整数溢出,过大则步长增大、误差增大。正确做法是让scale匹配数据的实际动态范围。
  • 误区二:忽略zero_point的舍入误差。zero_point必须是整数,round操作会引入额外偏差,尤其在非对称量化中,该偏差会被scale放大。
  • 误区三:在QAT训练中频繁更新scale和zero_point。这会导致训练不稳定,建议在训练初期校准后冻结,或使用指数移动平均(EMA)平滑更新。
  • 误区四:忽视硬件指令差异。某些NPU对非对称量化的支持不完整,部署时可能退化为对称量化,导致精度与训练时不一致。