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

文章目录

    • 一、量化技术的三层架构
    • 二、第一层:校准算法(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. 量化算子决定具体映射方式

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


相关推荐
Lei活在当下7 小时前
【AI手记系列-2026/6/18】iSparto & Harness,Caveman 以及AI时代的生存指南
人工智能·llm·openai
JieE2128 小时前
LeetCode 226. 翻转二叉树|JS 递归超详细拆解,二叉树入门经典题
javascript·算法
JieE2128 小时前
LeetCode 104. 二叉树的最大深度|递归思路超详细拆解
javascript·算法
冬奇Lab9 小时前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
冬奇Lab9 小时前
Agent 系列(22):Context Engineering 深度——三种上下文管理策略的量化对比
人工智能·agent
hboot9 小时前
AI工程师第二课 - 数据处理
人工智能·python·数据分析
程序员cxuan9 小时前
DeepSeek 杀入多模态,识图功能正式上线!
人工智能·后端·程序员
米小虾11 小时前
告别单打独斗:2026年多Agent协作架构实战指南
人工智能·agent
IT_陈寒12 小时前
SpringBoot这个自动配置坑我跳了三次
前端·人工智能·后端