量化后精度下降通常不是模型被改坏,而是量化配置与模型结构、校准数据之间的关系没有对齐。处理 LingBot-Depth 2.0 的精度回退,建议先通过对比实验确认下降来源,再调整量化方式;不要一上来就重新训练。
面对量化后精度下降,核心思路是先用同一评估脚本确认下降是否来自量化本身,再检查量化粒度、校准集分布与校准指标。优先尝试激活保持浮点、敏感层跳过量化或 per-channel 权重量化;若仍不达标,再用量化感知训练。整个过程应保持单一变量,并逐次记录对比结果。
先确认精度下降是否真实
开始调参数前,先用量化前的 float 模型运行与量化后完全相同的评估脚本。常见误差来源是评估脚本里预处理或后处理不一致,例如输入正则化参数变化、输出归一化被移除。需要核对训练时的预处理流程和输出层之后是否有额外操作。
如果量化模型在某个输入区间误差集中,通常与数据分布有关;如果整体飘移,则更可能来自量化策略。验证方式:同一份测试集,分别跑 float 与量化模型,并记录每个指标的差值。注意此时也不要随意修改评估脚本。
检查量化配置与校准集
精度下降常见于三个位置:权重量化粒度、激活量化方式、校准集与真实分布不一致。
- 权重量化:若当前使用 per-tensor,可尝试 per-channel。对回归输出层或注意力层,量化敏感度较高,需要单独观察。
- 激活量化:静态激活依赖校准集统计范围;动态量化在推理时计算范围,精度更高但速度更慢。根据部署场景取舍。
- 校准集:校准集应覆盖真实输入分布,而不是只选容易样本。样本过少会让范围估算偏移,过多则可能被极端值带偏。
可以用验证集子集做一次诊断性校准,判断是否来自校准集偏差。但这样做只能用于定位,不能当作最终方案,否则会让验证集信息间接泄漏到量化配置中。
从低代价策略开始调整
适用场景是校准集检查后仍无法解释精度下降,且部署环境允许少量额外计算开销。推荐按代价从低到高依次尝试:
- 激活保留浮点,只量化权重。这能快速判断精度损失是否主要由激活量化引起。
- 对敏感层跳过量化。通常回归头的输出层、注意力层可放入白名单。
- 切换 per-channel 权重量化,或把激活校准从 KL 散度换成 MSE。
- 增加校准样本数量,或改用百分位截断等更稳健的校准方法。
每次只改一个变量,并用同一评估脚本记录结果。只有单一变量时,才能确认具体哪一项改动带来了恢复。注意这些调整可能带来少量内存或延迟变化,需要结合部署目标取舍。
适度引入量化感知训练
当 PTQ 仍无法满足精度要求时,量化感知训练 QAT 可以作为一种恢复手段。QAT 在训练前向中模拟量化噪声,让权重和激活适应量化边界。对深度估计这类任务,建议使用预训练权重初始化,先冻结 batch normalization 统计量,再以较小学习率微调少量轮次。
操作流程:插入伪量化算子后先做一次前向检查,确认数值范围合理;然后只在最后几层做短时间微调;最后重新导出量化模型。注意 QAT 之后的 checkpoint 不能直接当作整型模型部署。
风险边界:量化感知训练不是万能方案,如果 float 模型本身已经接近过拟合,QAT 能恢复的空间也有限。训练时仍需保留原 float 模型作为回滚点。
记录对比结果,形成回滚依据
建议维护一个简单实验记录表,至少包含四列:实验编号、float 基线精度、量化配置描述、量化后精度。每次改动一行。这样既能回溯哪一步有效,也能在调参失败时回到上一个稳定版本。对模型部署来说,可复现比一次性调通更重要。