当前位置: 首页 > news >正文

Per-Tensor 量化和Per-Channel 量化

1️⃣ 基本概念

量化的目标

量化(Quantization)是将浮点数权重或激活映射到整数表示,从而降低模型存储和计算成本。

量化公式通常为:

q=round(rs) q = \text{round}\left(\frac{r}{s}\right) q=round(sr)

其中:

  • rrr 是浮点数权重或激活
  • qqq 是整数表示
  • sss 是 scale(缩放因子)
  • 对于 非对称量化,还有 zero-point zzz

q=round(rs)+z q = \text{round}\left(\frac{r}{s}\right) + z q=round(sr)+z


Per-Tensor 量化

  • 定义:整个张量使用一个统一的 scale(和 zero-point)进行量化。
  • 公式(对称量化为例):

s=max⁡(∣W∣)2b−1−1 s = \frac{\max(|W|)}{2^{b-1}-1} s=2b11max(W)

其中:

  • WWW 是权重张量
  • bbb 是量化位宽(比如 8-bit)

特点

  • 只用一个 scale,简单高效
  • 所有通道 使用相同 scale
  • 对权重差异较大的通道,会出现精度损失

Per-Channel 量化

  • 定义:对张量的每个输出通道(通常是卷积的 out_channels 或 Linear 的 out_features)使用独立的 scale(和 zero-point)进行量化。
  • 公式(对称量化):对每个通道 ccc

sc=max⁡(∣Wc∣)2b−1−1 s_c = \frac{\max(|W_c|)}{2^{b-1}-1} sc=2b11max(Wc)

特点

  • 每个通道的 scale 不同,更精细,能够保留不同通道权重的动态范围
  • 更高精度,尤其是卷积网络里通道差异大时
  • 实现稍复杂,需要在推理时对每个通道单独反量化

2️⃣ 举例对比

假设有一个 4×3 的卷积权重:

W=[0.10.2−0.13.0−2.51.20.050.1−0.05−1.00.50.2] W = \begin{bmatrix} 0.1 & 0.2 & -0.1 \\ 3.0 & -2.5 & 1.2 \\ 0.05 & 0.1 & -0.05 \\ -1.0 & 0.5 & 0.2 \end{bmatrix} W=0.13.00.051.00.22.50.10.50.11.20.050.2

  • Per-Tensor 量化

    • 找整个张量最大绝对值:3.0
    • scale = 3.0 / 127 ≈ 0.0236
    • 所有元素都用这个 scale 量化 → 小数值会损失较多精度
  • Per-Channel 量化(按行/通道量化):

    • 通道 1 max=3.0 → s1=0.0236
    • 通道 2 max=2.5 → s2≈0.0197
    • 通道 3 max=1.2 → s3≈0.00945
    • 每个通道单独量化 → 精度更高

3️⃣ 优缺点对比

特性Per-TensorPer-Channel
精度较低(通道动态范围不同损失大)较高
实现复杂度简单复杂(每通道独立 scale)
存储开销少(一个 scale)多(每个通道一个 scale)
常用场景激活量化(A8)、小模型权重量化(W8)、大模型

4️⃣ PyTorch 示例

import torch
import torch.nn as nn
import torch.quantization as tq# 假设线性层权重
weight = torch.tensor([[0.1, 0.2, -0.1],[3.0, -2.5, 1.2],[0.05, 0.1, -0.05],[-1.0, 0.5, 0.2]])# Per-Tensor 量化
scale = torch.max(weight.abs()) / 127
q_weight_tensor = torch.round(weight / scale)
print("Per-Tensor Quantized:\n", q_weight_tensor)# Per-Channel 量化 (按行)
scales = torch.max(weight.abs(), dim=1)[0] / 127
q_weight_channel = torch.round(weight / scales[:, None])
print("Per-Channel Quantized:\n", q_weight_channel)

总结

  • Per-Tensor:简单、快速,但精度可能低
  • Per-Channel:复杂、存储略多,但精度更高,特别适合权重量化

2 为什么量化对神经网络精度影响不大?

在这里插入图片描述

http://www.dtcms.com/a/395853.html

相关文章:

  • 执行bat任务栏有图标显示,执行pycharm64.exe就没有是什么原因
  • 【Docker项目实战】使用Docker部署wealth-tracker个人资产分析工具
  • LeapMotion_Demo演示
  • 智慧图书管理|基于SprinBoot+vue的智慧图书管理系统(源码+数据库+文档)
  • 面试技巧第四篇:嵌入式通信机制考点:消息队列、信号量与互斥锁
  • 面试八股:C语言的预处理和类型定义
  • 强化学习1.3 深度学习交叉熵方法
  • 用PowerBI的思想解决QuickBI文本无法动态配色问题
  • 逆向解析 1688 商品详情接口:自主构建 Sign 签名算法实战
  • SpringCloud项目阶段六:feign服务降级处理以及基于DFA算法的自管理敏感词审核和tess4j图片文字识别集成
  • 跨行业安全合规文档协同平台:重塑制造企业的质量管理与合规运营新范式
  • 线性代数 · SVD | 奇异值分解命名来历与直观理解
  • Qt 控件与布局
  • TDengine 聚合函数 SPREAD 用户手册
  • 4090 云服务器租赁:高性能与灵活性的算力融合方案​
  • 阿里云服务器ECS上安装anaconda(jupyter)和OpenCV教程
  • CVE-2025–3246 本地提权
  • Chat API和Chat SDK
  • 爱奇艺技术实践:基于 StarRocks 释放天玑买量数据价值
  • 突破传统文本切分桎梏!基于语义理解的智能文档处理革命——AntSK-FileChunk深度技术解析
  • Git常用的使用方法
  • IDEA集成Claude Code (win系统)
  • MySQL执行计划:索引为何失效?如何避免?
  • 【附源码】基于SpringBoot的校园防汛物资管理平台的设计与实现
  • PyTorch 核心工具与模型搭建
  • ARM--时钟管理单元与定时器
  • Unity-动画基础
  • 逻辑回归中的决策边界解析与应用实例
  • 设计模式——结构型模式(下)
  • CANoe中封装SeedKey安全解锁函数的完整指南