浅谈 - GPTQ为啥按列量化

发布于:2025-05-09 ⋅ 阅读:(20) ⋅ 点赞:(0)

前言

曾在游戏世界挥洒创意,也曾在前端和后端的浪潮间穿梭,如今,而立的我仰望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);
  • 高效、稳定、误差最小。

网站公告

今日签到

点亮在社区的每一天
去签到