【知识扫描】量化中的零点

在量化(尤其是深度学习模型量化)中,零点(Zero Point) 是一个关键概念,用于解决整数表示中没有直接对应浮点数0的问题。它是整数域中与浮点数0最接近的整数值,主要作用是确保浮点数到整数的映射能正确处理负值和零点偏移。
举个例子:如何将[-0.8, 1.2]映射到[0,255]的整数范围内,以便Uint8能够表示?

一、为什么需要零点?

在低精度量化(如8位整数INT8)中,整数范围通常是有符号的[-128, 127]或无符号的[0, 255]。而浮点数范围可能包含负值(如[-1.0, 1.0]),且零点是浮点数中的关键参考点(零点前后区分正负数)。直接将浮点数映射到整数时,如果不进行特殊处理,可能导致:

  1. 浮点数0无法精确表示:例如,无符号INT8的范围是[0, 255],负数无法直接表示0.0。
  2. 映射不对称:浮点数范围可能不对称(如[-0.8, 1.2]),直接线性映射时,数据的线性范围不在[0,255]之内,直接操作会导致精度损失。

零点(Zero Point)就是为了解决这些问题而引入的偏移量

二、零点的数学定义

零点(Zero Point,简称ZP)是一个整数值,代表浮点数0在整数域中的映射位置。在量化过程中,浮点数与整数的转换关系通常表示为:

  1. 从浮点数到整数的量化公式
    q = round(f / scale) + zero_point
    其中:

    • q 是量化后的整数,
    • f 是原始浮点数,
    • scale 是缩放因子(将浮点数范围映射到整数范围的比例),
    • zero_point 是零点。
  2. 从整数到浮点数的反量化公式
    f = (q - zero_point) * scale

关键点:当 f = 0 时,q = zero_point,即零点是整数域中对应浮点数0的位置。

三、零点的计算方法

零点的计算依赖于浮点数范围和整数范围的对齐方式。常见的计算步骤:

  1. 确定浮点数的动态范围
    通过校准数据统计激活值或权重的最小值(min_float)和最大值(max_float)。

  2. 计算缩放因子(Scale)
    scale = (max_float - min_float) / (max_int - min_int)
    其中,max_intmin_int 是整数域的上下界(如INT8有符号时为127和-128)。

  3. 计算零点候选值
    zero_point_candidate = -min_float / scale
    这个候选值可能是小数,但零点必须是整数。

  4. 将零点候选值舍入为整数
    zero_point = clamp(round(zero_point_candidate), min_int, max_int)
    其中 clamp 确保零点在整数范围内。

四、示例

假设我们要将浮点数范围[-0.8, 1.2]量化为无符号INT8(范围[0, 255]):

  1. 计算缩放因子
    scale = (1.2 - (-0.8)) / (255 - 0) = 2.0 / 255 ≈ 0.00784

  2. 计算零点候选值
    zero_point_candidate = -(-0.8) / 0.00784 ≈ 102.04

  3. 舍入为整数
    zero_point = round(102.04) = 102

验证映射关系

  • 浮点数0.0 → 整数 round(0.0 / 0.00784) + 102 = 102
  • 浮点数-0.8 → 整数 round(-0.8 / 0.00784) + 102 ≈ 0
  • 浮点数1.2 → 整数 round(1.2 / 0.00784) + 102 ≈ 255

通过零点102,我们成功将包含负值的浮点数范围映射到了无符号整数域,且确保了浮点数0的正确表示。

五、零点在不同场景下的特性

  1. 无符号整数量化
    零点通常是正数(如上述例子中的102),用于将浮点数负值映射到整数域的低位部分。

  2. 有符号整数量化
    零点可能为0或接近0的值,因为有符号整数本身可以直接表示负数。例如,浮点数范围[-0.5, 0.5]量化为INT8([-128, 127])时,零点可能为0。

  3. 对称量化 vs 非对称量化

    • 对称量化:假设浮点数范围关于0对称(如[-1.0, 1.0]),此时零点通常为整数域的中心(如有符号INT8的零点为0)。
    • 非对称量化:浮点数范围不对称时(如[-0.8, 1.2]),零点会偏移以适应这种不对称性。

六、零点的实际影响

  1. 精度与性能
    合理的零点计算能减少量化误差,尤其是对包含负值或非对称分布的数据

  2. 计算开销
    零点会增加量化和反量化的计算复杂度(每次计算需加减零点),但现代硬件通常能高效处理这种偏移。

  3. 框架实现差异
    不同深度学习框架(如TensorFlow、PyTorch、ONNX Runtime)对零点的计算和处理方式可能略有不同,使用时需注意其API文档。

你可能感兴趣的:(量化,零点,对称量化,非对称量化)