2、量化基础:数值表示(定点/浮点)、量化参数(scale/zero-point)、均匀量化与非均匀量化
在TinyML的工程实践中,模型量化本质上是一个数值表示转换问题:将神经网络权重和激活值从高精度的浮点表示(通常是FP32)映射到低精度的定点表示(如INT8、INT16或INT4)。这一转换过程看似简单,却直接决定了模型压缩率、推理速度与精度损失之间的平衡。理解数值表示的本质差异、量化参数的数学含义以及均匀/非均匀量化的适用边界,是进行QAT(量化感知训练)调优的前提。本章将从这三个核心维度展开,帮助读者建立扎实的量化理论基础。
2.1 数值表示:定点与浮点的本质差异
核心原理
浮点数(Floating-Point)采用科学计数法表示实数,由符号位、指数位和尾数位组成。以FP32为例,其布局为1位符号、8位指数、23位尾数,能够表示约±3.4×10³⁸的动态范围,且精度随数值大小动态变化。定点数(Fixed-Point)则使用固定的整数位宽和小数位宽,例如Q7.8格式表示7位整数、8位小数。在TinyML场景中,INT8定点表示是最常见的量化目标,其取值范围为[-128, 127],步长为1。
两者的核心差异在于动态范围与精度分布。浮点数的精度在接近零时极高,在远离零时较低;而定点数的精度在整个数值范围内恒定。神经网络权重通常呈现近似高斯分布,大部分值集中在零附近,这导致浮点表示存在大量“浪费”的精度位。量化正是利用这一统计特性,将有限的定点位宽分配给实际有效的数值范围。
判断方法:选择定点格式的关键指标
- 权重分布范围:统计权重张量的最小/最大值,若范围超过INT8可表示范围,需考虑per-channel量化或非均匀量化。
- 激活值分布形态:ReLU后的激活值非负,适合非对称量化;若激活值近似正态分布,对称量化更高效。
- 精度敏感度:通过逐层量化实验,观察哪些层对量化误差更敏感(通常第一层和最后一层最敏感)。
案例拆解:FP32到INT8的转换过程
假设某层权重张量范围为[-2.5, 2.5],采用对称量化(zero-point=0)。计算scale:S = (2.5 - (-2.5)) / (127 - (-128)) = 5.0 / 255 ≈ 0.0196。将浮点值0.5转换为定点:q = round(0.5 / 0.0196) = round(25.51) = 26。反量化误差为 |0.5 - 26×0.0196| = |0.5 - 0.5096| = 0.0096,相对误差约1.9%。
2.2 量化参数:Scale与Zero-Point的数学映射
核心原理
量化映射的数学本质是仿射变换:r = S × (q - Z),其中r为浮点实数,q为量化后的整数,S为缩放因子(scale),Z为零点(zero-point)。S是浮点数,表示每个量化步长对应的浮点范围;Z是整数,表示浮点0值对应的量化值。这一公式构成了所有均匀量化方案的基础。
对称量化(Symmetric)设定Z=0,适用于权重分布关于0对称的场景,计算更简单且无需存储零点。非对称量化(Asymmetric)允许Z≠0,能够更精确地覆盖非对称分布(如ReLU后的激活值),但需要额外存储和计算零点偏移。
操作流程:确定量化参数的步骤
- 收集统计量:在训练或校准阶段,记录每层权重/激活的最小值r_min和最大值r_max。
- 计算Scale:对于非对称量化,S = (r_max - r_min) / (q_max - q_min);对于对称量化,S = max(|r_min|, |r_max|) / q_max。
- 计算Zero-Point:Z = round(q_min - r_min / S),并确保Z在[q_min, q_max]范围内。
- 量化与反量化:q = round(r / S) + Z,r_hat = S × (q - Z)。
案例拆解:非对称量化在激活值上的应用
某层ReLU激活值范围为[0.0, 6.0],使用INT8非对称量化。S = (6.0 - 0.0) / (127 - (-128)) = 6.0 / 255 ≈ 0.02353。Z = round(-128 - 0.0 / 0.02353) = round(-128) = -128。浮点值3.0对应的量化值:q = round(3.0 / 0.02353) + (-128) = round(127.5) + (-128) = 128 - 128 = 0。反量化:r_hat = 0.02353 × (0 - (-128)) = 3.013,误差约0.43%。
| 量化类型 | Zero-Point | 适用场景 | 存储开销 | 计算复杂度 |
|---|---|---|---|---|
| 对称量化 | 固定为0 | 权重(分布对称) | 低(无需存储Z) | 低(无零点偏移) |
| 非对称量化 | 需存储 | 激活值(ReLU后) | 中(每层多存一个Z) | 中(需零点修正) |
| Per-tensor | 每层一个 | 小模型/简单层 | 最低 | 最低 |
| Per-channel | 每通道一个 | 卷积层/深度可分离层 | 较高 | 较高 |
2.3 均匀量化与非均匀量化
核心原理
均匀量化(Uniform Quantization)将浮点范围等分为2^N个区间,每个区间的步长恒定。其优点是硬件实现简单,乘加运算可以高效映射到整数运算单元。非均匀量化(Non-uniform Quantization)则根据数值分布密度调整步长,常见的有对数量化(Logarithmic)、幂次量化(Power-of-Two)和K-means聚类量化。非均匀量化在相同位宽下能获得更低的量化误差,尤其适合动态范围极大的分布(如Transformer中的注意力分数)。
然而,非均匀量化的硬件支持度远低于均匀量化。大多数TinyML芯片(如Cortex-M系列MCU)只提供整数乘加指令,非均匀量化需要查表(LUT)或特殊解码逻辑,显著增加推理延迟和代码体积。
判断方法:选择量化策略的决策树
- 步骤1:检查目标硬件是否支持非均匀量化指令(如查表加速)。若不支持,直接选择均匀量化。
- 步骤2:分析权重/激活分布。若分布近似均匀或高斯,均匀量化足够;若存在长尾分布(如极端值),考虑非均匀量化。
- 步骤3:评估精度损失。使用KL散度或余弦相似度衡量量化前后张量的分布差异,若差异超过阈值(如余弦相似度<0.99),尝试非均匀量化。
案例拆解:均匀量化在MobileNetV2上的实战
某TinyML项目将MobileNetV2部署到STM32F746(Cortex-M7,无DSP扩展)。初始使用per-tensor对称量化,Top-1精度从71.2%降至64.8%,损失6.4%。分析发现瓶颈在深度可分离卷积层,其权重分布范围差异极大(某些通道范围±0.1,某些±5.0)。
改进方案:采用per-channel非对称量化,为每个输出通道独立计算S和Z。修改后精度恢复至69.7%,仅损失1.5%。代价是模型文件增大12%(需存储每通道的S和Z),推理时间增加8%(零点偏移计算)。
2.4 常见误区与总结复盘
误区一:忽略Zero-Point的符号处理
在非对称量化中,Zero-Point可能为负值。某些简化实现错误地将Z强制设为0,导致激活值(全为正)的量化范围浪费一半。正确做法是确保Z在[q_min, q_max]内,并在推理时正确处理零点偏移。
误区二:混淆Per-tensor与Per-channel的适用场景
Per-tensor量化简单但精度低,尤其当各通道权重范围差异大时。Per-channel量化精度高但计算复杂。经验法则:权重使用per-channel,激活值使用per-tensor(因为激活值在推理时动态计算,per-channel需要额外内存存储多个S和Z)。
误区三:忽视校准数据集的选择
量化参数的确定依赖校准数据集。若校准集与真实数据分布偏差大,量化误差会显著放大。建议使用至少1000张代表性样本,并覆盖各类别和光照条件。
总结复盘
量化基础的核心在于理解数值表示的精度分布特性,掌握Scale和Zero-Point的数学映射关系,并根据硬件约束和分布特征选择合适的量化策略。在QAT调优中,量化参数的可学习化、per-channel粒度的选择、以及校准数据的质量,是影响最终模型精度的三大关键因素。建议读者在动手量化前,先完成本章的数值分布分析和硬件能力评估,再进入后续的QAT训练流程。