量化基础:定点与浮点表示、量化参数(scale/zero-point)、对称与非对称量化
Edge AI设备(如手机NPU、MCU、FPGA、端侧GPU)的算力与内存带宽有限,部署神经网络模型时通常需要将32位浮点(FP32)权重与激活值转换为低比特整数表示,这一过程称为量化(Quantization)。量化并非简单截断,而是涉及数值表示体系的选择、缩放与偏移参数的确定,以及对称/非对称策略的权衡。本章从定点与浮点表示的本质差异出发,系统讲解量化参数scale与zero-point的数学定义、对称与非对称量化的适用场景,并给出工程判断方法与常见误区。
定点与浮点表示的本质差异
浮点表示法(如FP32)由符号位、指数位和尾数位组成,能够以动态范围覆盖从极小到极大的数值,但硬件实现需要指数对齐与尾数运算,功耗和面积开销显著。定点表示法则将数值视为整数与固定小数位的组合,硬件只需整数乘加运算,延迟和能耗大幅降低。在Edge AI场景中,INT8定点运算相比FP32通常可带来2~4倍的吞吐率提升和60%~80%的功耗下降,但代价是数值范围与精度受限。
以FP32的典型范围为例,其最大可表示约3.4×10³⁸,最小正规格化数约1.18×10⁻³⁸;而INT8仅能表示-128~127的整数。若直接将浮点权重截断为INT8,精度损失将不可接受。因此,量化需要建立从浮点域到整数域的映射关系,这正是scale与zero-point存在的意义。
量化参数:scale与zero-point的数学定义
给定浮点张量r的取值范围[rmin, rmax]和量化位宽b(如8位),整数表示范围[qmin, qmax] = [-2^(b-1), 2^(b-1)-1](有符号)或[0, 2^b-1](无符号)。量化参数定义如下:
- scale(缩放因子):浮点范围与整数范围的比值,即 scale = (rmax - rmin) / (qmax - qmin)。scale为浮点数,表示每个整数步长对应的浮点间隔。
- zero-point(零点):浮点值0映射到整数域的数值,即 zp = qmin - round(rmin / scale)。zero-point为整数,用于校正浮点0在整数域中的位置。
量化与反量化公式为:
// 量化:浮点 → 整数
q = round(r / scale) + zero_point
// 反量化:整数 → 浮点(用于推理输出或误差分析)
r_dequant = (q - zero_point) × scale
实际工程中,scale通常采用逐张量(per-tensor)或逐通道(per-channel)两种粒度。逐张量使用整个张量的全局范围,实现简单但精度较低;逐通道为每个输出通道独立计算scale,精度更高,但硬件支持要求也更高。
| 参数 | 定义 | 典型取值 | 影响 |
|---|---|---|---|
| scale | 浮点范围/整数范围 | 0.001~0.1(常见) | 决定量化分辨率,过大会导致精度损失 |
| zero-point | 浮点0对应的整数 | 0(对称)或非0(非对称) | 影响偏移校正,非对称时需额外存储 |
| 量化位宽 | 整数表示位数 | 8/16/4 | 位宽越低,硬件效率越高,但精度风险越大 |
对称量化与非对称量化
对称量化强制zero-point=0,即浮点0映射到整数0,量化公式简化为 q = round(r / scale)。此时scale = max(|rmin|, |rmax|) / qmax,整数范围对称分布于0两侧。对称量化的优势在于实现简单,无需存储zero-point,且卷积运算中无需额外的偏移校正;缺点是若浮点分布不对称(如ReLU后的激活值全为正),则一半整数范围被浪费,量化分辨率下降。
非对称量化允许zero-point≠0,能够将浮点范围完整映射到整数范围,充分利用所有整数编码。对于分布偏移明显的张量(如激活值范围[0, 6]),非对称量化可将scale缩小近一半,显著降低量化误差。代价是需要在推理时额外处理zero-point的偏移,且硬件需要支持zero-point的融合运算。
案例拆解:MobileNetV2在Cortex-M7上的INT8量化
某智能穿戴设备需在Cortex-M7内核(主频400MHz,RAM 512KB)上部署MobileNetV2图像分类模型。原始FP32模型大小为13.5MB,远超RAM限制,且推理延迟高达2.3秒/帧,无法满足实时性要求。目标是将模型压缩至INT8并部署,要求精度损失<2%,推理延迟<100ms。
初始现象与约束:FP32模型精度92.3%,但资源占用过高;设备无GPU/NPU,仅依赖MCU的DSP扩展指令。量化方案需兼容CMSIS-NN库,该库对对称量化支持较好。
关键输入数据:使用500张验证图像统计每层激活值的分布,发现:第1层卷积输出范围[-1.2, 5.8],第3层深度卷积输出范围[0, 8.4],全连接层权重范围[-0.15, 0.12]。
分析判断过程:若全部采用对称量化,第3层激活值范围[0, 8.4]映射到[-128, 127],实际有效整数范围仅[0, 127],浪费约50%编码空间,量化步长增大至0.066,导致精度损失预计达3.5%。若采用非对称量化,该层scale可缩小至0.033,精度损失可控制在1.2%以内。
实际操作步骤:
- 使用逐通道对称量化处理所有权重,scale按输出通道独立计算。
- 对激活值采用逐张量非对称量化,zero-point按层统计。
- 在CMSIS-NN中实现非对称激活的偏移融合:将zero-point预先合并到卷积偏置中,避免推理时额外计算。
- 使用PTQ校准集(200张图像)统计激活范围,采用百分位法(99.99%)截断异常值。
结果对比:量化后模型大小降至1.7MB,推理延迟82ms,精度90.8%(损失1.5%),满足要求。若全部采用对称量化,精度仅88.9%(损失3.4%),不符合指标。
风险与代价:非对称量化增加了zero-point的存储与运算开销,但通过偏置融合技术消除了额外延迟;逐通道量化使权重存储增加约10%的元数据,但精度收益显著。
复盘经验:激活值分布偏移是选择非对称量化的核心依据;逐通道量化对权重分布不均匀的层(如深度卷积)收益最大;百分位截断比min/max更鲁棒,可避免异常值主导scale。
常见误区与总结复盘
- 误区1:所有层使用相同量化参数。不同层的数值范围差异可达数十倍,统一scale会导致部分层精度崩溃。应逐层或逐通道统计范围。
- 误区2:对称量化一定优于非对称。对称量化实现简单,但遇到单侧分布时分辨率减半。需根据实际张量分布选择。
- 误区3:忽略zero-point的运算开销。非对称量化在卷积中需要额外的偏移校正,若硬件不支持融合,可能抵消精度收益。
- 误区4:使用min/max直接确定范围。极端异常值会拉大范围,导致正常数值分辨率下降。推荐使用百分位或KL散度方法。
总结而言,定点与浮点表示的选择是Edge AI部署的第一步,而scale与zero-point的确定则是量化的核心数学基础。对称量化适合权重,非对称量化适合激活,逐通道策略可进一步提升精度。实际工程中,需结合硬件能力、张量分布和精度目标综合决策,并通过校准集统计与截断方法获得稳健的量化参数。