一句话定义:逐通道量化(Per-channel AI 词典:Quantization">Quantization)是在把浮点权重压成整数时,为每一个通道(通常是输出通道,也就是权重矩阵的一行)单独计算一个缩放因子(scale),而不是整个张量共用同一个。
要理解它,先得理解量化的本质。整数运算便宜、内存占用小,所以我们想把 FP32 的权重存成 INT8:同样是 0.0123 这样的小数,用整数存就得先约定“1 个整数单位代表多少”,这个换算比例就是缩放因子。量化误差几乎全从这里来:比例定粗了,本来有区别的数会被压成同一个整数。
打个比方:你要把十几个国家的物价统一换算成一种货币。逐张量量化(Per-tensor Quantization)是查一次汇率,所有国家都按它算。如果其中某个国家通胀严重,物价数值比别国大两个数量级(这就是异常值,outlier),为了让最大数不溢出,汇率会被它一个人撑大,结果其他国家的物价换算完全挤在 0 和 1 之间,细节全丢了。逐通道量化的做法是:每个国家单独查自己的汇率,谁也不拖累谁。
神经网络里这种“某个通道数值特别大”的现象非常普遍。权重的每一行对应一个输出通道,不同通道的数值范围可能相差几十倍。全张量共用一个比例时,小通道的有效位数被大通道吃掉了;逐通道各配一把尺,每个通道都用自己的满量程,分辨率立刻回来了。
和相邻概念的区别:
| 方案 | 缩放因子粒度 | 典型用途 | 代价 |
|---|---|---|---|
| 逐张量 Per-tensor | 整个权重张量 1 个 | 早期硬件、算子不支持细粒度时 | 精度损失最大 |
| 逐通道 Per-channel | 每个输出通道 1 个 | 权重量化的常见默认做法 | 几乎为零,scale 随权重一起存 |
| 逐组 Per-group | 每 64/128 个元素 1 个 | 大模型低比特(如 4bit)权重 | 元数据变多 |
| 逐 token Per-token | 每个 token 的激活 1 个 | 激活(Activation)侧量化 | 需运行时统计 |
注意区分:逐通道主要用在权重上,因为权重训练完就固定了,可以离线把每个通道的 scale 算好存下来;而激活值随输入变化,范围是动态的,所以激活侧更常用逐 token 或动态量化。两者不冲突,可以同时用。
对从业者的实际意义:第一,模型量化后精度掉得厉害,先别急着怀疑位宽——很可能只是尺子太粗,换成逐通道往往就能救回来,尤其是通道间差异大的结构(深度可分离卷积、部分注意力层)。第二,逐通道的额外成本极低,scale 就是个长度为通道数的小向量,推理时按通道乘一下即可,所以它基本是免费午餐;只有极少数推理引擎或算子对细粒度 scale 支持不好时,才被迫退回逐张量,具体支持情况以所用推理框架的官方文档为准。
一句话记住:量化掉精度,常常不是“位数不够”,而是“所有通道共用了一把尺”。
