QAT(量化感知训练)
一句话定位:把量化的误差在训练阶段就暴露给模型,让模型主动学会适应量化噪声——精度保留最好,但要付出训练资源与数据的代价。
1. 机制:伪量化节点 + STE
1 伪量化(Fake Quantization)
- 在训练图中插入伪量化节点:对权重/激活执行”量化→反量化”(
quantize后立刻dequantize)。 - 前向计算因此带上了量化后的数值误差(数值等价于低精度推理),但张量仍以浮点存储、训练照常进行。
- 于是模型在训练过程中”看得见”量化噪声,会自发把权重调整到对量化更鲁棒的区域(如避免产生极端 outlier)。
2 STE(Straight-Through Estimator)近似梯度
- 问题:
round()的导数几乎处处为 0,梯度无法回传,训练会停滞。 - STE 的做法:反向传播时直接把梯度”穿过”取整操作(视其导数为 1,通常配合对截断范围外的梯度置零)。
- 这是一个有偏但极其有效的近似,使量化网络可用标准 SGD/Adam 训练。
2. 优势与代价
- 优势:精度保留更好。尤其在低位宽(INT4 及以下)、小模型、或对精度极敏感的任务上,QAT 明显优于 PTQ(4.2)——因为模型参数本身已针对量化优化过。
- 代价:
- 需要训练资源(GPU 时长,接近一次微调的成本);
- 需要训练数据(且要有代表性;对只拿到开源权重、没有原始数据的场景不可行);
- 需要改动训练流程与代码,工程链路更长,迭代慢。
3. 适用场景
- 精度敏感且量化收益必须拿到的场景(如端侧部署、极低位宽需求);
- PTQ 已尝试且精度不达标;
- 具备训练数据与算力,且模型会长期稳定使用(一次投入长期摊销)。
反之,若追求快速上线、无训练数据、INT8 即可满足 → 直接用 PTQ。
参考:PyTorch 官方文档 Quantization(QAT 章节)