浅谈 - GPTQ为啥按列量化
前言
曾在游戏世界挥洒创意,也曾在前端和后端的浪潮间穿梭,如今,而立的我仰望AI的璀璨星空,心潮澎湃,步履不停!愿你我皆乘风破浪,逐梦星辰!
先说结论
GPTQ 按列量化 W,是因为 Transformer 中的每一列权重只跟输入向量 x 的一个元素相乘,按列量化可以最小化量化误差对输出的影响,同时兼容高效的矩阵乘法实现。
一、从矩阵乘法角度看本质
我们来看 Transformer 中最核心的操作:
y = W × x
设:
-
W 是
n × d
的权重矩阵 -
x 是
d × 1
的输入 token 的 embedding 向量(列向量) -
输出 y 是
n × 1
展开乘法的过程是:
y = ∑ (x[i] * w_i) # w_i 是 W 的第 i 列
每个 x[i]
只影响 w_i
这一列
每列 w_i
决定了 x[i]
如何影响输出
所以重点是:
误差在每列 w_i 上的放大会被 x[i] 直接乘进去。
如果不按列量化,而是按行或整层,误差的影响就更不可控了。
二、按列量化有什么优势?
原因类别 | 说明 |
---|---|
数学合理性 | 每列权重只与输入向量的一个分量相乘,逐列控制精度可单独抑制误差传播 |
量化误差可控 | 每列都有自己 min/max、scale、zero_point,不受其他列值影响 |
支持动态 range | 某些列的权重值范围可能在 [-0.1, 0.1],有的可能在 [-5, 5],统一 scale 会损精度 |
工程并行性 | 多数矩阵乘法库(比如 CUDA kernel)天然按列访存,可以直接用 INT4 SIMD 并行 |
与 Hessian 局部估计配合好 | GPTQ 使用列级 Hessian 估计每列误差影响,逐列量化刚好配套 |
三、如果按行量化或者整层量化,会发生什么?
❌ 整层统一 scale:
- scale 被极端值主导;
- 某些列权重值过于集中(如 -0.01 ~ 0.01),会被压成几个重复值;
- 误差大,模型崩了。
❌ 按行量化:
- 每行影响了多个输出维度;
- 行量化会破坏 “单列 × x[i]” 的清晰数学结构;
- 与 GPTQ 的误差补偿思路不符。
四、类比解释
可以把 W
看成一个表格,每一列代表一个“输入维度”,比如:
列1:处理“价格”输入;
列2:处理“温度”输入;
列3:处理“时间”输入;
每列的取值范围、分布都不一样:
- 价格:100~1000
- 温度:-10~40
- 时间:0~24
不可能用一个统一的量尺(scale)来压缩这三列!
否则会让温度、时间精度全毁掉。
总结
GPTQ 按列量化权重矩阵 W,是一种对 Transformer 结构极度贴合的压缩策略,既能保留推理精度,又能用低位计算加速推理。因为:
- 每列权重 w_i 只乘以 x[i],误差局部控制;
- 每列可以用自己的 scale 适配分布;
- 配合 GPTQ 的逐列误差估计与补偿策略(Hessian);
- 高效、稳定、误差最小。