量化:激活离群值与校准策略

量化:激活离群值与校准策略

Charles Lv7

量化常被简化成“把 FP16 换成 INT8/INT4”,但真正决定成败的,往往是激活分布。权重量化出问题,你通常还能通过更好的编码方式补救;激活一旦出现离群值(outliers),低比特下的动态范围就会被极少数大数值“占满”,导致大部分普通值的分辨率骤降。理解激活离群值和校准策略,是把量化从实验室指标变成稳定线上收益的关键。

难点解释:为什么少数大值会伤到多数普通值

量化 scale 要覆盖数值范围。如果极少数激活特别大,scale 会被迫变粗,结果大多数普通激活只能落到很少的格点上。于是平均误差可能不夸张,但关键通道的细节已经丢了。

有趣例子:拍合影时有人拿强光手电

相机为了不让手电过曝,会把整体曝光压暗,结果其他人的脸都看不清。激活离群值也是类似问题:少数极端值占住动态范围,大量正常值被压得分不细。

1. 量化误差从哪里来

设连续值张量 xx 经量化映射到整数 x^\hat{x},常见的均匀量化形式可写为

x^=clip(xs+z),qmin,qmax),\hat{x} = \mathrm{clip}\left(\left\lfloor \frac{x}{s} \rceil + z \right), q_{\min}, q_{\max}\right),

其中 ss 是 scale,zz 是 zero-point。反量化后得到

x~=s(x^z).\tilde{x} = s(\hat{x} - z).

误差来自两个方面

  1. 截断误差:超出量化范围的值被裁掉;
  2. 舍入误差:落在范围内但被映射到有限格点。

当激活分布长尾明显时,截断和舍入都可能变糟。

2. 什么是激活离群值

激活离群值指张量中极少数数值远大于主体分布。例如某层大多数值集中在 [2,2][-2,2],但少数值达到 20 或 30。若使用统一 scale 覆盖全范围,则量化步长变大,主体区间被粗糙编码。

可以用一个简单比值刻画离群强度:

ρoutlier=maxxmedian(x)+ϵ.\rho_{\text{outlier}} = \frac{\max |x|}{\mathrm{median}(|x|) + \epsilon}.

ρoutlier\rho_{\text{outlier}} 很高,说明长尾严重。

3. 为什么 LLM 和多模态模型里离群值常见

3.1 残差叠加

Transformer 中残差连接会累积不同路径的激活,某些通道可能持续放大。

3.2 LayerNorm / RMSNorm 之后的通道不均衡

虽然归一化能稳定整体尺度,但不同通道对特定 token、特定语义或长上下文位置仍可能表现出极端幅值。

3.3 稀有 token 或模态模式

代码、数学公式、表格、OCR 噪声、图像 patch 异常区域等都可能触发局部大激活。多模态模型因输入分布更复杂,离群值问题往往更明显。

4. 为什么激活比权重更难量化

权重是静态的,可以离线分析;激活是输入相关的,分布随 prompt、图像、长度和任务变化。即使某个校准集上表现正常,上线后遇到更长上下文或更奇怪样本,激活范围也可能骤变。

这也是很多 PTQ 在离线 benchmark 上看着没事,上线后突然掉点或不稳定的原因。

5. 常见的校准目标

校准本质上是在选 scale、zero-point 或其他量化参数,使量化误差对任务最小。常见目标包括:

5.1 最小化均方误差

mins  E[(xx~)2].\min_s \; \mathbb{E}\big[(x-\tilde{x})^2\big].

简单直接,但未必与最终任务损失最相关。

5.2 最小化 KL 散度

适合希望保留分布形状的场景,特别在某些激活直方图匹配方法中常见。

5.3 最小化任务代理损失

如用少量样本最小化层输出差异、logit 差异或 perplexity 变化。这更贴近任务,但成本更高。

6. 对称与非对称量化

若激活分布接近零均值,对称量化常足够;若分布明显偏移,非对称量化可更好利用整数范围。但非对称激活量化在某些 kernel 上实现更复杂,也可能增加推理成本。

因此工程上常会在精度与实现复杂度之间折中。

7. Per-tensor、Per-channel 与 Group-wise

7.1 Per-tensor

整个张量共享一个 scale,最简单,但最怕离群通道。

7.2 Per-channel

不同通道用不同 scale,可显著缓解通道级 outlier 问题。对线性层权重尤其有效,但对激活而言实现和 kernel 支持更复杂。

7.3 Group-wise

在通道组级别共享 scale,是精度和复杂度之间的折中。

离群值往往集中在少数通道,因此更细粒度的量化通常更稳。

8. SmoothQuant 的直觉

SmoothQuant 的核心思想是把激活中的难点“搬一部分到权重里”。若线性层输出为

y=Wx,y = Wx,

可通过引入对角缩放矩阵 DD 改写为

y=(WD)(D1x).y = (W D)(D^{-1} x).

选择合适的 DD,可以让激活 D1xD^{-1}x 的范围更平滑,代价是权重 WDWD 的某些通道被放大。由于权重更容易离线量化处理,这种权衡常有利于整体系统。

9. Outlier Channel Splitting 与保留高精通道

另一类方法会识别离群通道,并采取:

  1. 单独用更高比特保存;
  2. 将离群通道拆分复制,降低单路幅值;
  3. 在混合精度中保留部分关键通道为 FP16。

这背后的逻辑是:不是所有维度都值得同等低比特对待,少数关键维度的高精度保留可能换来大幅整体稳定性。

10. 校准集怎么选

校准不是随机拿几条样本就行。好的校准集应覆盖:

  1. 常见输入分布
  2. 长上下文
  3. 数字、表格、代码、公式等极端模式
  4. 多模态边缘案例,如 OCR 噪声图像、复杂图表

若校准集过于干净,量化参数会过于乐观。实际中常把校准样本看成对上线输入分布的一个压缩近似。

11. 截断阈值不是越大越好

一个常见误区是“为了不裁掉离群值,把范围开大”。这样虽然减少了 clipping error,却会增大量化步长。最优阈值常需要在两者之间平衡:

E(α)=Eclip(α)+Eround(α),\mathcal{E}(\alpha) = \mathcal{E}_{\text{clip}}(\alpha) + \mathcal{E}_{\text{round}}(\alpha),

其中 α\alpha 是裁剪阈值。小一些的阈值有时反而更好,因为它把极少数离群值牺牲掉,换来主体分布更高的分辨率。

12. 激活校准中的动态方案

一些系统采用动态量化:对每个 batch、每个 token block 或每次前向实时估计激活范围。它精度可能更高,但带来:

  1. 额外统计开销
  2. kernel 复杂度上升
  3. 跨请求行为不一致

在线服务是否值得用动态方案,取决于精度收益能否覆盖性能成本。

13. KV Cache 量化里的离群问题

长上下文推理中,KV cache 也是大头。K/V 张量的分布会随层数和序列位置变化,有些位置还会因为长程依赖或异常 token 出现离群。若统一低比特量化 KV,可能导致注意力权重失真,尤其在长文档和代码场景。

因此 KV cache 常采用

  1. 更高比特,如 INT8 而非 INT4;
  2. 分块量化;
  3. 某些层保留高精度;
  4. prefix / hot tokens 单独处理。

14. 评测时该看什么

不要只看总体 perplexity 或准确率,还应分桶看:

  1. 短上下文 vs 长上下文
  2. 自然语言 vs 代码 / 数学 / 表格
  3. 常规模态 vs 多模态复杂输入
  4. 首 token 质量 vs 长生成稳定性

量化往往在平均指标上温和,在特定长尾桶里突然失控。

15. 一个生动例子:财务文档 VLM

假设一个 VLM 需要读发票和报表。多数页面文字清晰、字段规整,激活分布稳定;但少数复杂表格页会触发很大的视觉与文本混合激活。如果校准集没覆盖这类样本,系统上线后就会在最重要的复杂财务页上掉点,而普通页面仍看起来“没问题”。这类问题本质上不是量化算法名字不够新,而是离群值建模不充分。

16. 设计建议

  1. 先分析哪些层、哪些通道、哪些输入最容易出现激活离群。
  2. 校准集必须覆盖长尾输入,不要只用短 prompt 和干净图像。
  3. 对离群严重层优先尝试 per-channel、group-wise、SmoothQuant 或混合精度。
  4. 单独评估长上下文、表格、代码、复杂图像等敏感桶。
  5. 若线上输入分布变化大,考虑引入有限动态校准或保守高精策略。

17. 小结

激活离群值是低比特量化中的核心敌人之一。它让“理论可量化”的模型在实际系统里表现出突发退化、长尾失稳和上线后掉点。校准策略的价值,不只是调一个 scale,而是在理解真实输入分布和数值结构的基础上,为不同层、不同通道和不同场景分配恰当的数值表示能力。

工程收束

激活离群值要按 outlier 位置、校准集、组大小、长度分布和模态分布一起看。最容易踩坑的是校准集太干净、只在短上下文上校准、不同任务分布混在一起;更稳的验收方式是按长度与任务采样校准集,记录激活尾部分布,并把校准策略写进资产元数据。

  • Title: 量化:激活离群值与校准策略
  • Author: Charles
  • Created at : 2026-01-03 09:00:00
  • Updated at : 2026-01-03 09:00:00
  • Link: https://charles2530.github.io/2026/01/03/ai-files-quantization-activation-outliers-and-calibration-strategies/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments