2、量化基础:什么是模型量化、量化类型(PTQ/QAT)、定点与浮点表示、位宽概念

TinyML 场景下的视觉模型部署,面临的首要矛盾是:神经网络模型在训练时通常使用 32 位浮点数(FP32)存储权重和激活值,而微控制器(MCU)的 Flash 通常只有几百 KB 到几 MB,RAM 往往不足 1 MB,且缺乏 FPU(浮点运算单元)或仅有性能较弱的 FPU。模型量化正是为了解决这一矛盾而生的核心技术。它通过将连续取值的浮点参数映射到离散的整数或低精度浮点空间,在尽量不损失精度的前提下,显著压缩模型体积并加速推理。本章将系统讲解量化的数学本质、两种主流量化流程(PTQ 与 QAT)、定点与浮点的表示差异,以及位宽选择对精度与资源的影响。

模型量化核心概念关系图 浮点表示 (FP32/FP16) 符号位 + 指数位 + 尾数位 动态范围大,精度高 存储开销大,计算慢 训练阶段标准表示 定点表示 (INT8/INT16) 整数 + 缩放因子 scale 动态范围有限,精度较低 存储小,推理速度快 推理阶段高效表示 量化映射 (scale + zero_point) 位宽 (Bit-width) 8-bit: 256 个离散级别 4-bit: 16 个离散级别 2-bit: 4 个离散级别 位宽越低 → 压缩率越高,精度损失越大 量化类型 PTQ: 训练后量化 ├ 无需重新训练 └ 需要校准数据集 QAT: 量化感知训练 └ 训练中模拟量化误差 核心权衡:精度 ↔ 资源 TinyML 部署需根据硬件约束选择最优量化策略

2.1 模型量化的数学本质与工程意义

模型量化本质上是一个数值映射过程:将浮点实数域中的张量值,映射到一组有限的离散整数集合上。以最常见的 8 位线性量化为例,其数学表达式为:

q = round(r / scale) + zero_point

其中,r 为原始浮点值,q 为量化后的整数值,scale 是缩放因子(浮点数),zero_point 是零点偏移(整数),用于保证浮点中的 0 在量化后仍能精确表示为整数。反量化过程则为:r ≈ (q - zero_point) × scale。这一映射关系是理解所有量化技术的基础。

从工程角度看,量化的收益体现在三个维度:存储压缩(FP32 转 INT8 可减少 75% 的模型体积)、内存带宽降低(每次内存访问可读取更多参数)、计算加速(整数乘加运算在 MCU 上比浮点运算快 2-4 倍,且无需 FPU 支持)。对于视觉模型而言,第一层卷积的输入通常是 RGB 图像(本身为 8 位整数),因此输入量化几乎不损失信息;而深层特征的分布范围更广,量化误差会逐层累积,这是精度下降的主要来源。

关键认知:量化不是简单的“四舍五入”,而是涉及动态范围裁剪、缩放映射和零点对齐的系统工程。优秀的量化方案会针对每一层张量的实际分布(而非理论范围)来动态确定 scale 和 zero_point,从而最大化利用有限的整数表示空间。

2.2 量化类型:PTQ 与 QAT 的对比与选择

根据量化过程发生在训练前、训练中还是训练后,业界将量化分为两大类:训练后量化(Post-Training Quantization, PTQ)和量化感知训练(Quantization-Aware Training, QAT)。两者在流程、精度表现和适用场景上有显著差异。

对比维度 PTQ(训练后量化) QAT(量化感知训练)
是否需要重新训练 否,直接对预训练模型量化 是,需在训练过程中模拟量化
所需数据 少量校准数据(100-500 张) 完整训练数据集
精度表现 大模型(>10MB)损失较小;小模型损失明显 精度损失通常 <1%,接近原始模型
部署周期 数小时至数天 数天至数周(需重新训练)
计算资源需求 普通 CPU 即可完成 需要 GPU 训练环境
适用场景 快速原型验证、模型较大、数据敏感 小模型(<5MB)、精度要求高、部署硬件固定

PTQ 的操作流程通常包含四个步骤:首先,加载预训练的 FP32 模型;其次,准备校准数据集(从训练集或验证集中随机采样,覆盖典型场景);然后,逐层统计激活值的分布范围(通常使用 MinMax、Percentile 或 KL 散度方法确定最优裁剪阈值);最后,根据统计结果计算每层的 scale 和 zero_point,完成权重和激活的量化映射。PTQ 的优势在于无需训练环境,但缺点是对小模型或分布极不均匀的张量,精度损失可能超过 5%。

QAT 的核心思想是在训练过程中插入“伪量化”节点(fake quantization),前向传播时模拟量化-反量化过程(即先量化再反量化,使梯度能够通过),反向传播时使用直通估计器(STE, Straight-Through Estimator)将量化函数的梯度近似为 1,从而让模型参数适应量化带来的扰动。QAT 的典型流程为:在预训练模型基础上,以较低学习率(通常为原学习率的 1/10 至 1/100)继续训练若干 epoch,使权重分布逐渐“对齐”到量化网格上。QAT 的精度优势明显,但代价是训练时间和计算资源的大幅增加。

实战建议:在 TinyML 视觉项目中,如果模型参数量小于 1MB(如 MobileNetV1 0.25 倍宽度),强烈建议直接采用 QAT。因为小模型的冗余度低,PTQ 的精度损失往往不可接受。反之,若模型较大(如 EfficientNet-Lite0),可先尝试 PTQ,若精度损失在 2% 以内则无需 QAT。

2.3 定点与浮点表示:从硬件视角理解差异

浮点数(FP32)由 1 位符号位、8 位指数位和 23 位尾数位组成,能够表示约 10⁻⁴⁵ 到 10³⁸ 的动态范围,且精度随数值大小动态变化。这种表示适合训练阶段,因为梯度值可能跨越多个数量级。然而,在 MCU 上执行浮点运算需要调用软件浮点库(如 soft-fp),每条指令需要数十个 CPU 周期,效率极低。

定点数(Fixed-point)则是将数值表示为“整数 × 2⁻ᶠ”的形式,其中 f 为小数位宽。例如,Q7.8 格式表示 1 位符号、7 位整数、8 位小数。定点数的优势在于:硬件实现简单(只需整数乘加再加移位操作)、计算速度快、功耗低。但定点数的动态范围固定,需要开发者根据数据分布手动选择小数位宽,否则容易溢出或精度不足。

在神经网络量化中,我们通常不直接使用传统定点格式,而是采用均匀对称量化或非对称量化。对称量化将浮点范围 [-a, a] 映射到 [-127, 127](INT8),zero_point 固定为 0;非对称量化则将 [min, max] 映射到 [0, 255],zero_point 不为 0。对于 ReLU 激活函数输出的非负分布,非对称量化能更好地利用表示范围,减少量化误差。

常见误区:初学者常误以为“INT8 量化就是简单地将浮点值除以 255”。实际上,正确的做法是:先统计张量的实际数值范围(如 -3.2 到 6.7),再计算 scale = (6.7 - (-3.2)) / 255 ≈ 0.0388,zero_point = round(-(-3.2) / 0.0388) ≈ 82。忽略 zero_point 会导致 0 值无法精确表示,进而引起推理偏差。

2.4 位宽概念:精度与资源的权衡艺术

位宽决定了量化后每个数值占用的比特数,直接影响模型大小、内存占用和计算复杂度。当前 TinyML 领域常见的位宽包括:INT8(主流标准)、INT4(极端压缩)、INT16(高精度场景)以及混合位宽(不同层使用不同位宽)。

选择位宽时需考虑三个关键因素:硬件支持能力(多数 MCU 的 DSP 指令集原生支持 INT8 乘加,但对 INT4 需要额外的解包操作)、精度敏感度(视觉模型的第一层和最后一层对量化最敏感,建议保留较高位宽)、内存带宽瓶颈(若模型受 Flash 大小限制,则优先降低权重位宽;若受 RAM 限制,则需同时考虑激活值位宽)。

一个实用的位宽选择策略是:权重用 INT8,激活用 INT8,但第一层和最后一层保持 FP16 或 INT16。这种“混合精度”方案在保持整体压缩率的同时,将量化误差集中在网络中间层(这些层对误差的鲁棒性更强)。例如,一个 500KB 的 FP32 模型,全 INT8 量化后约 125KB;若首尾层保留 INT16,则体积约为 130KB,但精度可提升 1-3%。

案例拆解:某工业视觉缺陷检测项目,使用 MobileNetV2 作为特征提取器(参数量 2.2M,FP32 大小约 8.8MB),部署于 Cortex-M7 内核 MCU(Flash 2MB,RAM 512KB)。初始 PTQ INT8 量化后模型 2.2MB,Flash 勉强放下,但检测精度从 98.2% 降至 91.5%,无法满足生产要求。分析发现:第一层卷积的权重分布存在长尾(最大值是 3σ 的 5 倍),MinMax 校准导致大量小权重被裁剪。解决方案:① 改用 Percentile 校准(99.99% 分位),精度回升至 94.8%;② 对第一层和最后一层采用 INT16 量化(增加 40KB 存储),精度进一步提升至 96.7%;③ 最后采用 QAT 微调 5 个 epoch,精度达到 97.9%,满足 ≥97% 的验收标准。整个调优过程耗时 3 天,其中数据校准分析占 60% 时间。

2.5 常见误区与总结复盘

在量化实践中,以下误区值得特别注意:

  • 误区一:校准数据集越大越好。实际上,校准数据应覆盖典型部署场景,而非盲目追求数量。使用 1000 张与部署环境差异很大的图片,不如 200 张高度相关的图片效果好。
  • 误区二:忽略 zero_point 的影响。对于非对称量化,zero_point 的微小误差会导致整体偏移,尤其在 BatchNorm 层融合后,误差会被放大。
  • 误区三:所有层使用相同的量化参数。不同层的激活值分布差异巨大(如 ReLU 后分布偏斜,而全连接层分布近似高斯),应逐层独立计算 scale 和 zero_point。
  • 误区四:量化后不做任何验证。量化模型的精度评估必须在目标硬件或模拟器上进行,因为不同硬件的整数运算实现(如舍入模式)可能不同。