4、量化核心概念:定点数与浮点数、位宽(8-bit/4-bit/2-bit)、量化尺度(scale)与零点(zero-point)

在模型量化压缩技术体系中,理解数值表示的基本原理是掌握一切量化方法的前提。神经网络在训练阶段通常使用32位浮点数(FP32)来存储权重和激活值,以保证梯度传播的精度;但在推理部署阶段,为了降低内存占用、减少计算延迟并提升能效,我们需要将这些浮点数转换为低精度的定点数或整数。这一转换过程并非简单的“四舍五入”,而是涉及定点数与浮点数的数学本质、位宽选择带来的精度与容量权衡,以及量化尺度(scale)与零点(zero-point)两个核心参数的精确计算。本节将系统拆解这些基础概念,帮助你在实际部署中做出合理的量化决策。

量化核心概念关系图 浮点数(FP32) 符号位(1bit) + 指数位(8bit) + 尾数位(23bit) 动态范围:±3.4×10³⁸ 精度:约7位十进制有效数字 训练阶段默认精度 定点数(INT8/INT4) 符号位(1bit) + 整数位 + 小数位 固定小数点位置,无指数 INT8范围:[-128, 127] INT4范围:[-8, 7] 推理部署阶段使用 量化映射公式 r = S × (q - Z) S:量化尺度(scale) Z:零点(zero-point) q:量化后的整数值 r:原始浮点值 位宽选择与精度/容量权衡 8-bit:256个离散值 精度损失小,压缩4× 4-bit:16个值 精度损失中等,压缩8× 2-bit:4个值 精度损失大,压缩16× 量化参数计算流程 ① 确定浮点范围 [r_min, r_max] ② 计算尺度 S = (r_max - r_min) / (q_max - q_min) ③ 计算零点 Z = round(q_min - r_min / S) ④ 量化:q = round(r / S) + Z ⑤ 反量化:r ≈ S × (q - Z)

4.1 定点数与浮点数的本质差异

浮点数(Floating-Point)采用科学计数法的二进制表示,由符号位、指数位和尾数位三部分组成。以FP32为例,其内存布局为1位符号、8位指数、23位尾数,能够表示从极小到极大的动态范围。这种设计使得浮点数在训练过程中能够适应梯度值的剧烈变化,避免数值溢出或下溢。然而,浮点运算需要专门的硬件单元(FPU),且内存占用大、计算功耗高。

定点数(Fixed-Point)则固定了小数点的位置,使用整数部分和小数部分的固定位宽来表示数值。例如,Q7.8格式表示7位整数位和8位小数位。定点数的优势在于硬件实现简单、计算速度快、内存占用小,但其动态范围受限,需要预先确定合适的缩放因子。在神经网络量化中,我们通常直接将浮点权重和激活值映射到整数范围(如INT8的[-128, 127]),此时定点数的“小数点”位置由量化尺度S隐式决定。

核心理解:量化本质上是用定点数(整数)来近似浮点数,而S和Z就是建立两者映射关系的桥梁。S决定了浮点数值到整数步长的缩放比例,Z则确保浮点中的“0”能够被精确映射到整数域,避免因零点偏移导致的精度偏差。

4.2 位宽选择:8-bit / 4-bit / 2-bit 的权衡

位宽直接决定了量化后数值的离散化程度。选择不同的位宽,意味着在模型精度、压缩率和计算效率之间做出取舍。下表对比了常见位宽的关键特性:

位宽 离散值数量 模型压缩率 典型精度损失 适用场景
8-bit (INT8) 256 4× 通常 <1% 通用部署、边缘设备
4-bit (INT4) 16 8× 1%~3% 大模型压缩、内存受限场景
2-bit (INT2) 4 16× 5%~10%+ 极端压缩、需配合微调

选择位宽时,需要综合考虑以下因素:模型冗余度(大模型通常对量化更鲁棒)、任务敏感度(检测/分割任务比分类任务更敏感)、硬件支持(部分NPU不支持INT4运算)、以及部署内存预算。例如,在移动端部署一个100MB的模型,使用INT8量化可降至25MB,而INT4可进一步降至12.5MB,但可能需要额外的量化感知训练来维持精度。

4.3 量化尺度(Scale)与零点(Zero-point)的计算

量化尺度S是一个浮点数,表示整数域中每个单位步长对应的浮点数值范围。零点Z是一个整数,表示浮点值0映射到整数域后的值。两者的计算公式如下:

// 给定浮点范围 [r_min, r_max] 和量化范围 [q_min, q_max]
// 对于INT8非对称量化:q_min = -128, q_max = 127
// 对于INT8对称量化:q_min = -127, q_max = 127(或 -128, 127)

// 1. 计算尺度
S = (r_max - r_min) / (q_max - q_min)

// 2. 计算零点(非对称量化)
Z = round(q_min - r_min / S)

// 3. 量化操作
q = round(r / S) + Z
// 并裁剪到 [q_min, q_max] 范围内

// 4. 反量化操作
r_approx = S × (q - Z)

在实际操作中,确定r_min和r_max有几种常见策略:MinMax(直接取张量的最小最大值,简单但对异常值敏感)、Percentile(取99.99%分位数,过滤极端离群点)、MSE/KL散度(通过优化选择使量化前后分布差异最小的截断范围)。对于权重张量,通常使用对称量化(Z=0),因为权重分布近似关于0对称;对于激活值(经过ReLU后非负),则使用非对称量化以获得更好的精度。

经验建议:在8-bit量化中,权重推荐使用对称量化(Per-channel),激活值推荐使用非对称量化(Per-tensor)。Per-channel量化即为每个输出通道单独计算S和Z,能显著减少量化误差,尤其适用于卷积层和全连接层。

4.4 案例拆解:BERT模型INT8量化部署

我们以一个实际项目为例,展示量化核心概念的应用过程。某NLP团队需要将BERT-base模型(约110M参数,FP32大小约440MB)部署到内存仅256MB的嵌入式设备上。

初始目标:将模型压缩至100MB以内,同时保证GLUE基准测试中MRPC任务的F1值下降不超过1.5%。

关键输入数据:模型权重分布统计显示,各层权重标准差在0.02~0.15之间,存在少量值大于2.0的离群值;激活值经过GELU后范围在[-4.0, 8.0]之间,且分布右偏。

分析判断过程:

  1. 首先尝试全局MinMax INT8量化,发现F1值从88.2%降至84.7%,下降3.5%,超出容忍范围。分析发现,权重中的离群值导致S过大,使得大多数正常权重被映射到相近的整数,精度严重受损。
  2. 改用Per-channel对称量化(权重) + Per-tensor非对称量化(激活),并采用99.99%分位数截断。重新评估,F1值回升至87.4%,下降0.8%,满足要求。
  3. 为进一步压缩,尝试INT4量化。使用Per-channel量化后,F1值降至85.9%,下降2.3%,超出容忍范围。团队决定采用混合精度方案:对敏感层(如Embedding和最后两层)保留INT8,其余层使用INT4。

实际操作步骤:

# 伪代码示例:使用PyTorch进行Per-channel量化
import torch
from torch.quantization import quantize_dynamic

# 加载FP32模型
model = BertModel.from_pretrained('bert-base-uncased')

# 配置量化参数:权重使用Per-channel对称量化
quantized_model = quantize_dynamic(
    model,
    {torch.nn.Linear, torch.nn.Embedding},
    dtype=torch.qint8,
    qconfig_spec={torch.nn.Linear: torch.quantization.default_per_channel_qconfig}
)

# 评估量化后模型
f1_score = evaluate(quantized_model, mrpc_val_dataset)
print(f"Quantized F1: {f1_score:.2f}%")

结果对比:最终混合精度方案将模型压缩至62MB(INT8层占40%,INT4层占60%),F1值为86.8%,下降1.4%,满足部署要求。推理速度提升2.8倍,内存占用降低72%。

风险与代价:混合精度方案需要额外的层敏感度分析,增加了工程复杂度;INT4层在特定硬件上可能不支持原生运算,需要软件模拟或查表加速,带来一定的延迟开销。

复盘经验:量化参数的选择不能一刀切,必须结合数据分布特征和硬件能力进行精细化设计。Per-channel量化是提升精度的关键手段,而截断策略对离群值的处理直接影响最终效果。

4.5 常见误区与总结

误区一:认为量化尺度S越小越好。实际上,S过小会导致量化范围无法覆盖全部浮点值,产生严重的截断误差;S过大则量化步长粗糙,产生较大的舍入误差。需要根据数据分布找到平衡点。
误区二:忽略零点Z的作用。在非对称量化中,如果Z计算错误或直接置0,会导致浮点0无法精确映射,引入系统性偏移,尤其影响BatchNorm层的推理结果。
误区三:对所有层使用相同的量化配置。不同层对量化的敏感度差异巨大,Embedding层和输出层通常需要更高精度,而中间层可以承受更激进的量化。

总结:定点数与浮点数的转换是量化的数学基础,位宽选择决定了压缩率与精度的基本权衡,而S和Z的精确计算则是保证量化质量的核心环节。在实际部署中,建议遵循以下流程:先分析权重和激活值的分布特征,再选择合适的位宽和量化策略(对称/非对称、Per-tensor/Per-channel),最后通过验证集评估精度损失并迭代调优。掌握这些核心概念,你就能为后续的量化训练、推理引擎优化和硬件适配打下坚实基础。