深度学习量化技术全景解析:从校准算法到量化算子的完整指南

文章目录

    • 一、量化技术的三层架构
    • 二、第一层:校准算法(Calibration)
    • 三、第二层:量化策略(Strategy)
    • [四、第三层:量化算子(Quantization Scheme)](#四、第三层:量化算子(Quantization Scheme))
      • [1. asymmetric_affine(非对称仿射量化)](#1. asymmetric_affine(非对称仿射量化))
      • [2. dynamic_fixed_point(动态定点量化)](#2. dynamic_fixed_point(动态定点量化))
      • [3. perchannel_symmetric_affine(逐通道对称仿射量化)](#3. perchannel_symmetric_affine(逐通道对称仿射量化))
    • 五、三层关系总结
    • [六、完整数值示例:FP32 → INT8](#六、完整数值示例:FP32 → INT8)
      • 示例设定
      • 各层选择
      • [Step 1:校准(normal)](#Step 1:校准(normal))
      • [Step 2:计算 scale 和 zero_point](#Step 2:计算 scale 和 zero_point)
      • [Step 3:量化计算(FP32 → INT8)](#Step 3:量化计算(FP32 → INT8))
      • [Step 4:反量化(INT8 → FP32)](#Step 4:反量化(INT8 → FP32))
    • 七、总结

本文系统梳理神经网络量化中的核心概念,并通过一个完整的数值示例,展示从 FP32 到 INT8 的完整转换过程。


一、量化技术的三层架构

神经网络量化是一个系统工程,可以分为三个递进的层次:

复制代码
校准算法(怎么定范围)
        ↓
量化策略(怎么用)
        ↓
量化算子(怎么映射)

二、第一层:校准算法(Calibration)

校准算法解决的核心问题:"如何确定最优的量化范围?"

算法 核心思想 适用场景
normal 直接使用 min/max 线性映射 快速部署、数据分布均匀
kl_divergence 最小化 FP32 与 INT8 的 KL 散度 高精度要求、TensorRT
moving_average 训练中用滑动平均统计范围 量化感知训练(QAT)

三、第二层:量化策略(Strategy)

量化策略定义整个网络的量化方式

常规量化

  • 全模型统一位宽(如全 INT8)
  • 优点:实现简单、硬件友好
  • 缺点:某些层精度损失较大

混合量化

  • 不同层使用不同位宽或量化方式
  • 例如:Conv 用 INT8,Attention 用 FP16
  • 优点:精度更高
  • 缺点:实现复杂、调度开销大

四、第三层:量化算子(Quantization Scheme)

量化算子是具体的数学映射方法

1. asymmetric_affine(非对称仿射量化)

复制代码
q = round(x / scale) + zero_point
  • ✅ 支持非零 zero_point
  • ✅ 最适合激活值
  • ❌ 硬件实现稍复杂

2. dynamic_fixed_point(动态定点量化)

  • 小数点位置动态调整
  • 适合 RNN/LSTM
  • 推理时可转为静态定点

3. perchannel_symmetric_affine(逐通道对称仿射量化)

  • 每个通道独立 scale
  • 无 zero_point
  • ✅ 最适合权重量化
  • ✅ 硬件友好、精度高

五、三层关系总结

复制代码
量化策略
├── 常规量化
│   └── 校准算法(normal / KL / moving_average)
│       └── 量化算子(asymmetric_affine 等)
└── 混合量化
    ├── 权重:perchannel_symmetric_affine
    ├── 激活:asymmetric_affine
    └── RNN:dynamic_fixed_point

六、完整数值示例:FP32 → INT8

示例设定

某层激活值:

复制代码
x = [-0.5, 0.2, 1.3, 2.0]

各层选择

层级 选择
校准算法 normal(min/max)
量化策略 常规量化
量化算子 asymmetric_affine

Step 1:校准(normal)

复制代码
x_min = -0.5
x_max = 2.0

Step 2:计算 scale 和 zero_point

INT8 范围:0, 255

复制代码
scale = (x_max - x_min) / (255 - 0)
      = 2.5 / 255
      ≈ 0.009804

zero_point = round(-x_min / scale)
           = round(0.5 / 0.009804)
           = 51

Step 3:量化计算(FP32 → INT8)

公式:

复制代码
q = clip(round(x / scale) + zero_point, 0, 255)
FP32 计算过程 INT8
-0.5 round(-0.5/0.009804) + 51 0
0.2 round(0.2/0.009804) + 51 71
1.3 round(1.3/0.009804) + 51 184
2.0 round(2.0/0.009804) + 51 255

Step 4:反量化(INT8 → FP32)

复制代码
x̂ = (q - zero_point) × scale
INT8 反量化结果 误差
0 -0.500 0.000
71 0.196 -0.004
184 1.304 +0.004
255 2.000 0.000

最大误差 < 0.01


七、总结

  1. 校准算法决定量化范围
  2. 量化策略决定网络级方案
  3. 量化算子决定具体映射方式

三者共同决定了量化模型的精度、速度和硬件兼容性


相关推荐
JXJD20041 小时前
【无标题】
人工智能·ai·自动化
怕浪猫1 小时前
用了两年 AI 编程工具后,我重新理解了什么是「资深工程师」
算法·面试·架构
LONGZETECH2 小时前
低空经济背景下:五组核心数据拆解无人机职业教育的机遇与实训破局
大数据·人工智能·系统架构·无人机
aichitang20242 小时前
希尔伯特空间中的正交性
人工智能·学习·机器学习·ai·泛函分析
aiqianji2 小时前
功能全面的教AI短篇小说写作的软件都有哪些?
人工智能·python
hetao17338372 小时前
2026-08-27~29 hetao1733837 的刷题记录
c++·算法
格林威2 小时前
C# 相机Burst模式图像采集:使用相机内存配合OpenCvSharp和Halcon实现短时间的高速采集的方法
开发语言·人工智能·数码相机·计算机视觉·c#·视觉检测·工业相机
轮到我狗叫了2 小时前
Slurm如何使用
人工智能·python·深度学习·机器学习
AI创界者2 小时前
【开源硬核】comfyUI MiniMax H3 融合模型本地部署一键整合包!单卡撬动 2K 影音全模态输出,附避坑指南
人工智能·aigc
云淡风轻~窗明几净2 小时前
宇宙管理学猜想
算法·图论