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

文章目录

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

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


相关推荐
xywww1682 小时前
大模型 API 选型实战:GPT、Gemini、Claude 接入时该看哪些指标?
运维·服务器·人工智能·python·gpt·langchain
私人珍藏库7 小时前
[Android] PeakFinder AR v4.8.89 (山峰全景识别+增强现实山峰查看器)
android·人工智能·智能手机·ar·工具·软件
月疯7 小时前
CNN卷积和反卷积输出的计算方法
深度学习·神经网络·cnn
CS创新实验室8 小时前
算法、齿轮与硅基大脑:数值计算发展简史
人工智能·算法·数值计算
能有时光8 小时前
PyTorch KernelAgent 源码解读 ---(4)--- ExtractorAgent
人工智能·pytorch·python
直接冲冲冲8 小时前
鱼书-PH4-类的作用
深度学习
fthux8 小时前
GitZip Pro 源码解析:一个 GitHub 文件/文件夹下载扩展是如何工作的(一)整体架构与扩展入口
人工智能·ai·开源·github·open source
aqi008 小时前
15天学会AI应用开发(十七)使用LangGraph实现会话记忆功能
人工智能·python·大模型·ai编程·ai应用
xixixi777779 小时前
三大 AI 安全里程碑:Akamai 高危风险预警、智能体水印强制落地、PQC 量子安全全产业链统一
大数据·人工智能·安全·ai·大模型·智能体·政策
海石9 小时前
1563分的简单题,可能就简单在能被暴力AC
算法·leetcode