一刀切的陷阱

4-bit量化模型,MMLU得分下降3.2%。但如果你仔细看,你会发现一个有趣的现象:模型在"美国历史"子类别上只下降了0.5%,但在"抽象代数"子类别上下降了8.7%。

这就是"一刀切"量化的问题——把所有层都量化到同一个精度,忽略了不同层对量化的敏感度差异。混合精度量化(Mixed-Precision Quantization)通过给不同层分配不同的量化精度,在保持整体压缩率的同时,大幅提升了对量化敏感的层的精度。

为什么不同层对量化的敏感度不同?

这涉及到Transformer模型的内容结构。一个标准的Transformer模型由多个"层"组成,每层包含注意力机制和FFN(前馈网络)。

注意力层中的QKV投影负责计算token之间的关系,它们对量化的精度非常敏感。研究者发现,注意力层的量化误差会导致模型"注意力分散"——它开始关注不相关的token,忽略真正重要的token。

FFN层的中间投影(从hidden_dim到intermediate_dim再回到hidden_dim)相对鲁棒,因为FFN有大量的冗余参数。

嵌入层(embedding)和输出层(lm_head)对量化也非常敏感,因为它们直接决定了token的表示和生成。

混合精度策略

策略一:层级别混合精度。 最简单的策略是给注意力层和输出层保留8-bit精度,给FFN层使用4-bit精度。这种策略在大多数模型上可以将4-bit的精度损失从3.2%降低到1.8%左右,而整体压缩率只从75%降到70%。

策略二:通道级别混合精度。 更精细的策略是给每个通道分配不同的精度。这需要分析每个通道的"重要性"(通常通过权重幅值或激活值来评估),然后给重要通道分配更高精度。这种方法效果最好,但实现复杂度也最高。

策略三:动态混合精度。 2026年的最新研究方向是"动态混合精度"——在推理时根据输入动态调整量化精度。对于简单输入,使用更激进的量化;对于复杂输入,使用更保守的量化。这种方法还在早期研究阶段,但潜力巨大。

实战:用llama.cpp实现混合精度

llama.cpp在2026年已经支持了"K-quant"系列的混合精度量化。Q4_K_M是一个典型的混合精度方案——它给大多数权重使用4-bit量化,但给关键权重使用5-bit或6-bit量化。

在llama.cpp中,你可以通过选择不同的量化类型来实现不同级别的混合精度:

  • Q4_K_S:激进压缩,适合内存极度受限的场景
  • Q4_K_M:平衡方案,推荐在大多数场景使用
  • Q5_K_M:保守方案,精度优先

量化不是越统一越好

混合精度量化的核心启示是:量化不是越统一越好。花时间分析你的模型对不同层、不同通道的量化敏感度,然后针对性地分配精度,比一刀切地全部量化到4-bit要有效得多。

如果你正在做模型量化,考虑花一些时间做"量化敏感度分析"——逐层量化,观察每层对精度的影响。这个分析通常只需要几个小时,但能帮你设计出效果更好的混合精度方案。