一句话定义
量化(Quantization)就是用更少的比特数来表示模型里的数字:把常见的 16 位浮点(FP16)权重和激活值,压成 8 位整数(INT8)甚至 4 位整数(INT4)。核心是牺牲一点数值精度,换更小内存、更快速度和更低功耗。
打个比方
16 位精度像用毫米尺量身高,能记录 173.2cm;4 位精度像只分“矮、中、高、很高”四档,173.2cm 和 173.8cm 可能都被记成“高”。记录省地方、搬运快,但细节变粗。
原理不复杂
模型里的数原本是浮点数,有符号、指数、尾数。量化要找一个缩放因子(scale)和零点(zero-point),把真实值映射到整数区间:
q = round(x / scale) + zero_point
反量化时再近似还原:x ≈ (q - zero_point) * scale。4 位整数只有 16 个格子,能表示的档位很少;8 位有 256 个格子,就细一些。为了减少误差,通常不会全模型共用一个 scale,而是按通道(per-channel)或按组(per-group)分别量化。
按时机分,常见有训练后量化(PTQ)和量化感知训练(QAT)。PTQ 快,但激活值动态范围大、异常值多时容易掉点;QAT 让模型在训练时“习惯”低精度,效果更稳,但成本更高。
省下了什么
- 内存和显存:16 位到 4 位,理论上参数占用约为原来的四分之一。
- 带宽:权重从内存搬到计算单元的次数没变,但每次搬的字节少了。
- 算力和功耗:低比特整数运算通常比浮点更快、更省电。
- 部署门槛:大模型更有机会跑在消费级显卡、手机、边缘设备上;长上下文的 KV Cache 也能量化。
损失了什么
损失的是“表示精度”。量化误差、舍入误差会累积;异常值(outlier)会把 scale 拉大,让正常值挤在很小的范围里。激活值比权重更难压,所以常见做法是权重 4 位、激活 8 位或 16 位的混合精度。
实际表现上,低比特版可能在这些地方变差:长尾知识、数学推理、代码生成、多语言、指令遵循稳定性,幻觉也可能增加。校准数据选得不好,效果会更差。通常首尾层、嵌入层、输出层更敏感,需要保留更高精度。
和相邻概念的区别
| 概念 | 做什么 | 参数量变吗 |
|---|---|---|
| 量化 | 降低每个参数的比特数 | 基本不变 |
| 剪枝(Pruning) | 删掉不重要的连接或结构 | 变少 |
| 蒸馏(Distillation) | 让小模型学大模型 | 换模型 |
| 低秩分解 | 把大矩阵拆成小矩阵相乘 | 变少 |
量化不是 zip 压缩,它改变的是计算时的数值表示,不只是存储格式。
对从业者和普通人的意义
对从业者:部署前先测基线,再试 PTQ,不行再考虑 QAT;重点关注校准集、异常值处理、按通道/按组量化,以及端到端指标,而不是只看模型体积。具体支持哪些量化格式、精度如何,以官方页面和实测为准。
对普通人:量化让手机、笔记本能跑更强的本地模型,也可能降低云端推理成本。但同一个模型的不同量化版本,体验可能明显不同;选型时别只看“4 位”这个标签。
