想象你要出差,把所有衣物塞进一个 20 寸的随身登机箱。模型原本的参数就像蓬松的羽绒服——占地方、精度高;量化就是把它压缩成一袋真空压缩包——体积骤减、速度飞快,但压完之后你发现衣服皱了、帽子变形了,甚至拉链都快绷开。这就是「量化后精度掉点」问题。幸运的是,行李打包有自己的手艺:校准就像重新测量每件衣服的尺寸、选有代表性的样本试装、调整裁剪线,让压缩包恰好贴合衣服形状;精度恢复则像把压缩后的衣物重新叠放规整,让它们互相迁就。本文就用这套「行李箱打包术」带你搞懂量化校准与精度恢复的全流程:从精度为什么掉、校准数据怎么选、参数怎么调,到量化感知微调救回精度、最后怎么验收效果。
掌握量化校准与精度恢复技术,你就能在模型部署的最后一公里把掉点的精度救回来——这是端侧 AI 工程化中必须啃下的硬骨头,也是模型压缩岗位面试的高频考点。
可视化演示
展示PTQ校准参数优化、QAT量化感知微调恢复精度与多维度效果评估,切换模式观察量化后精度恢复全流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
PTQ校准参数优化流程 FP16模型经量化后精度下降,校准数据集确定每层缩放因子s和零点z MinMax与SmoothQuant方法搜索最优参数,减少异常值激活影响 q = round(x/s) + z 校准数据质量直接决定量化参数准确性与最终精度
精度下降成因
先讲个场景。你的登机箱内部分成 256 个均匀小格子(对应 INT8 的 256 个档位),每件物品必须正好放进某个格子里。正常情况下,把衣服、洗漱包按格子大小分配好毫无问题。可偏偏行李箱里躺着一根 2 米长的滑雪板(离群值)——为了容纳它,箱子必须把格子尺寸调大,结果所有小件物品全被塞进同一个大格子里,取出时完全认不出谁是谁。这就是量化后精度暴跌的头号元凶:离群值把量化步长(格子大小)撑大,让主体小数值的精度全部退化。
技术上,量化是把连续浮点值映射到有限整数档位的过程,映射可以写成:
其中 \(\Delta\) 是量化步长。每一次「取整到最近格子」都会引入舍入误差,误差大小和步长成正比。
1. 量化映射算子:将连续值 \(x\) 除以步长 \(\Delta\) 后四舍五入、乘回 \(\Delta\),再从 \(q_{\min}\) 到 \(q_{\max}\) 范围内裁掉越界值。这一步就是「把物品按格子尺寸归整」。
2. 误差定义:量化前后的数值差 \(\varepsilon\),正值表示低估、负值表示高估。它对应「物品被放进格子后的大小偏差」。
3. 均匀噪声近似:在步长较小时,量化误差近似于区间 \(\left[-\frac{\Delta}{2}, \frac{\Delta}{2}\right]\) 上的均匀分布,方差为 \(\frac{\Delta^2}{12}\)。步长越大,噪声地板越高,精度损失越严重。
4. 离群放大效应:离群极值迫使范围 \([x_{\min}, x_{\max}]\) 拉大,\(\Delta = \frac{x_{\max} - x_{\min}}{q_{\max} - q_{\min}}\) 随之变大。在可视化演示中可以看到,红色离群尖峰把整条分布拉扁,蓝色主体区域几乎失去区分度。
除离群值外,舍入误差还会在深层网络中逐层累积:每层的小误差经过非线性激活和矩阵乘被放大,最终体现在输出层的分类置信度偏移上。另外,若激活值(每层的输出)分布极不均匀——比如大多数神经元饱和在 0 附近——量化档位也会被大量浪费。裁剪截断则是另一个隐性杀手:一旦数值越过阈值被硬切,那一部分信息不是「变模糊」而是「整个消失」,相当于滑雪板直接折断丢弃。找到这些破绽,才能对症下药。
校准数据选样
打包前,你需要蹲在衣橱前估算各类衣物的尺寸比例:几件 T 恤、几条牛仔裤、一件羽绒服、一双靴子。如果只拿最厚的一件羽绒服去量身定做压缩袋,袋子套到 T 恤上松松垮垮、浪费空间;如果只拿 T 恤去定做,羽绒服直接塞不进去。校准数据集就扮演着「行李抽样样本」的角色——我们用一小批样本跑一遍模型,统计各层激活值的分布,以此决定压缩袋(量化范围)做多大。
校准集选样的首要原则是与部署场景同分布。模型部署后面对的是真实用户上传的图片、语音、文本,如果校准全用训练集里的精美高清图,部署时遇到暗光、模糊、遮挡等场景,激活分布立刻「货不对板」。因此要尽量从真实业务日志、线上采样池里抽数据。其次是类别多样性:分类任务要覆盖所有类别,检测任务要覆盖不同物体大小、姿态、光照条件,避免某一类把分布带偏。数据量上,一般 500~2000 张(条) 就够——校准只是统计分布,不需要训练,量太大反而拖慢流程,量太小则统计不稳定。一句话:样本要像一次真正的出行,把春夏秋冬各拿几件,而不是拿一件代表全部。
1. 目标函数:在所有候选校准集里,选一个使「真实数据上的量化误差期望最小」的子集。\(D^{*}\) 是最优校准集,\(p_{\mathrm{real}}\) 是真实部署时的输入分布。
2. 量化误差度量:把量化模型 \(Q(x)\) 与原始模型 \(f(x)\) 的输出向量做二范数距离,衡量的是「压缩后输出偏差了多少」。它要求校准集能代表真实分布,否则这个期望就是空算。
3. 实践折中:由于真实分布未知,我们用「分层抽样」近似:按类别、场景、难度分层,每层随机抽固定数量样本,合并成校准集。
选样原则落地的常见做法是:用验证集的一个子集做校准,再用另一个子集做评估,保证「量体」和「验收」互不干扰。记住,校准数据选样决定了精度恢复的上限——样本选歪了,后面所有参数调优都是在错误的尺子上绣花。
校准算法调参
衣橱量完了,接下来是「如何定尺寸」。同一个衣橱,三位裁缝有三套量法:第一位裁缝把最长最宽的衣服都量进去,箱尺码最大——这叫 MinMax;第二位裁缝说「那件一米九的大衣一年穿一次,忽略它」,把 0.01% 的极端尺寸去掉再量——这叫百分位法;第三位裁缝最较真,她把各种裁剪方案都试一遍,看哪种方案让整柜衣服的「合身程度」损失最小——这叫 KL 散度 / MSE 寻优。
MinMax 的做法是直接用整个张量的最大值和最小值框定范围:范围 = \([x_{\min}, x_{\max}]\),步长 = 范围 ÷ 255。它实现最简单、速度最快,但正如之前所述,一旦遇到离群值就全线崩溃。百分位法取 \(P_{0.01}\) 和 \(P_{99.99}\) 作为截断点,主动丢掉极端样本,让压缩袋贴合 99.98% 的「正常人」。KL 散度更进一步:它把量化看作「用 256 个档位重新描述原始分布」,找出使两个分布信息损失最小的裁剪阈值 \(\lambda\)。MSE 方法则以「量化前后数值差的平方和最小」为直接目标,数学上更贴近最终损失。
1. KL 校准目标:遍历候选裁剪阈值 \(\lambda\),把超出 \(\pm\lambda\) 的值裁掉、剩余范围均匀分成 256 档,计算量化后分布与原始分布的 KL 散度,选散度最小的 \(\lambda^{*}\)。KL 散度衡量的是「用量化分布描述原始分布时多花了多少信息量」。
2. MSE 校准目标:不同的缩放系数 \(s\) 对应不同的档位间距,遍历候选 \(s\),使全部样本的「量化误差平方和」最小。\(Q_s(x_i)\) 表示用缩放 \(s\) 量化第 \(i\) 个样本。
3. 两种方法的取舍:KL 散度对分布形状更敏感,适合激活值这种「长尾分布」;MSE 更偏向压制大误差的极端样本,适合权重这种「近似高斯分布」。实际工程常用 KL 校准激活、MinMax 或 MSE 校准权重。
在 PyTorch 的 torch.ao.quantization 中,observer 参数可以直接指定 MinMaxObserver 或 HistogramObserver(内部实现 KL),TensorRT 默认走 KL 校准,ONNX Runtime 则提供 MinMax/熵/MSE/SQNR 多种选项。选量法就是选尺子:MinMax 是皮尺(简单粗暴)、百分位是去掉特体的皮尺、KL/MSE 是 3D 扫描仪(精细但费时)。
校准执行细节
尺寸定好了,裁缝开始逐件量体:上衣量胸围、裤量腰围、靴子量筒高。模型也是一样——每一层都要独立校准。Conv 层的激活分布和全连接层完全不同,ResNet 的 block 输出和 Embedding 层更是天差地别。如果全局共用一个量化范围,就像用裤子的尺寸去裁上衣,必然四处漏风。所以实际操作是:逐层插入 observer(观察器),前向推理时记录每层的激活统计量,推理结束各层再用自己的统计量算出专属 scale 和 zero-point。
校准执行有四个细节决定成败。第一,校准批量大小(batch size)建议 8~32:batch 太大一次性统计分布容易把显存撑爆,batch 太小单批统计波动大、算出的范围忽大忽小。第二,数据只需前向跑一遍(单轮):校准不是训练,不需要反向传播,更不需要多个 epoch——重复跑同样数据只会让统计偏向重复样本。第三,缩放系数用统计值初始化后必要时可再调优:先用校准集统计出初始 scale,再在验证集上微调 scale,让精度损失进一步下降。第四,校准过程必须关掉 BN 层的参数更新,否则统计口径就乱了。
1. 逐层缩放系数:第 \(l\) 层的缩放系数 \(s_l\) 由该层激活张量 \(X_l\) 的绝对最大值决定,\(q_{\max}\) 是量化档位最大值(INT8 为 127)。每层独立计算,对应「每件衣服各量各的尺寸」。
2. 校准总损耗:把每一层量化权重 \(Q_{s_l}(W_l)\) 与浮点激活 \(X_l\) 相乘的结果,和浮点权重乘的结果做 Frobenius 范数平方差,逐层求和。它衡量「整套量化方案在每一层造成的总偏离」。如果某层误差特别大,说明该层是校准盲区,需要单独调它的裁剪阈值。
校准执行完,你手里的数据是:每层的 scale、zero-point 和量化前后误差热力图。这一步就像裁缝把所有衣物的尺寸记录装订成册——每个数字背后都是一次对细节的较真,是后续微调与诊断的基础。
量化感知微调
箱子做出来了,可还是有几件衣服怎么都塞不平。这时你换了一种思路:不再让箱子迁就衣服,而是让衣服迁就箱子——把每一件衣服都照着箱子的隔断形状重新叠一遍,叠到刚好塞进去为止。这就是量化感知微调(QAT,Quantization-Aware Training):在训练时提前把「量化噪声」注入模型里,逼着权重适应压缩后的误差,从而在推理量化时精度不掉。
QAT 的工程实现分三步:第一,前向传播时插入伪量化节点——权重和激活先走一遍量化再反量化(即让数值经过「取整-复原」的模拟压缩),这样损失函数就能感知到量化噪声;第二,反向传播用直通估计器(STE)——因为取整操作的导数几乎处处为 0,梯度无法传播,STE 的做法是「假装取整不存在」,让梯度直接穿透伪量化节点传给浮点权重;第三,调低学习率、做少量 epoch 微调——通常学习率取原训练的 1/10,训练 1~3 个 epoch 即可,目的是微调而非从零学习。
1. 总损失组成:任务损失 \(L_{\mathrm{task}}\) 保证模型原本的性能不掉,量化正则项 \(\sum \| Q(W_l) - W_l \|\) 约束权重不要偏离量化档位太远,\(\lambda\) 控制两者的平衡。\(\hat{y}\) 是伪量化模型输出,\(y\) 是真实标签。
2. STE 直通梯度:量化算子 \(Q(\cdot)\) 不可导,STE 用「恒等映射」代替其导数,即梯度绕过取整操作直接传到浮点权重上。效果是:权重更新方向仍由任务损失主导,但每次前向都经历了量化噪声的「毒打」。
3. 权重量化约束:\(\sum \| Q(W_l) - W_l \|\) 把权重「拉向」最近的整数档位,让伪量化误差在训练过程中越来越小,最终收敛到「量化友好」的状态。
微调时注意数据配比:尽量用与任务分布一致的数据,若只有少量真实数据,可以先在合成数据上预校准,再用小批量真实数据微调。QAT 是「精度恢复的核武器」,但它不是万金油——它需要标注数据和训练算力,属于最后一搏的攻坚手段,而非日常首选。
精度效果评估
打包完毕,登机前你必须做两件事:把箱子放上称重台(量化前后精度对比),再拉开拉链抽查几件衣服有没有压坏(逐层误差检查)。效果评估不是走流程,而是决定这套压缩方案能否交付的验收关。
最直观的指标是准确率回退幅度:
一般业务要求 \(\mathrm{Accuracy\_drop} < 1\%\)。除了整体准确率,还要看验证集损失曲线:损失对数值小波动比准确率更敏感,能提前捕捉到「看似准确率没掉、但置信度分布已经偏移」的隐患。逐层误差定位则是诊断工具——把每层量化前后的输出误差单独打印出来,误差最大的前几个层就是「最不合适的衣服」,可以专门为它们调大 bit 数或改用更精细的校准方法。最后一定不要忘掉端侧实测:同样的模型在 GPU 上量化效果很好,但搬到手机 NPU 后可能因为激活函数实现差异而精度骤降,必须真机验证准确率、延迟、功耗三项指标。
1. 准确率回退:量化后准确率与原始浮点模型准确率之差,是部署方最关心的一级指标。
2. 验收阈值:通常要求回退不超过 1%,若超过则回到校准参数调整或 QAT 环节。
3. 逐层误差定位:第 \(l\) 层的累计相对误差,\(\hat{Y}_l\) 为量化层输出、\(Y_l\) 为浮点层输出。它帮助定位「哪一层把误差放得最大」。
评估是一个循环:发现问题 → 调整校准 → 重新评估,直到指标达标。这就像出行前反复开关行李箱:每次压一压、挪一挪,直到所有物品在颠簸中也不会移位。
恢复技术选型
如果整了一套评估后发现精度掉得惨不忍睹,别慌,按顺序排查。整个过程像修一件压皱的西装:先用挂烫机(校准调参)蒸汽熨平——调整校准算法、换校准数据、调裁剪阈值;熨完还皱,再上手缝(QAT 微调)——带着量化噪声重新叠放;最后实在不行,就得考虑换面料(混合精度)或放弃登机箱改托运(部分层回退浮点)。
补救流程讲究顺序,不要一上来就 QAT。 第一步先检查是不是校准环节的问题:校准数据集是否与部署分布偏差太大?是不是被离群值带偏?换成百分位或 KL 校准能不能救回来?如果校准调到极致仍达不到目标,再考虑第二步:无数据场景下用离线校准兜底——用统计知识(比如权重近似高斯分布)人工预设范围,或用少量合成数据做校准,虽然精度修复有限,但至少比裸量化强。第三步是「攻坚」:有数据场景直接转 QAT,用训练数据的子集做量化感知微调,把权重一点点「掰」回量化友好的形态。第四步是组合策略:先用 KL 校准把「底」打好,再在 QAT 时把校准统计的 scale 固定成常量(防止微调把 scale 带偏),最后用验证集评估,形成闭环。
1. 分阶段决策:根据准确率回退是否超过阈值 \(t\)(通常 1%)判断是否需要补救;超过阈值时按是否有标注数据选择不同路径。
2. 有数据走 QAT:标注数据齐全时,QAT 是最强补救手段,用伪量化噪声让模型重新适应压缩。
3. 无数据深度校准:只能用更精细的统计校准方案,比如 KL 散度寻优配合百分位裁剪,尽量压榨离线方案的潜力。
在实际项目中,这条决策链会被固化成部署流水线脚本:先自动量化并跑评估集,掉点超阈值则自动触发校准参数搜索,再评估;仍不达标则报警通知人工介入 QAT 训练。了解这条救火路径,你就能在项目里「不慌不乱、按图索骥」。记住:先量体再裁剪,先熨烫再缝补,实在不行才换布料。
AI 应用场景
手机端图像分类模型的 INT8 部署校准
阶段:部署优化 / 模型压缩
解决的问题:某 App 的人像分类模型 FP32 版本 120MB、推理 80ms,超出端侧内存与实时性要求。直接粗暴转 INT8 后准确率从 92% 跌到 81%,无法上线。通过校准数据选样与 KL 校准调参,把掉点收回 1% 以内。
具体案例:算法工程师从线上日志随机抽取 800 张真实用户图片(覆盖室内、室外、夜景、逆光等场景),用 HistogramObserver 做 KL 校准,并针对第一层卷积独立调大裁剪阈值,最终 INT8 模型 92.3% → 91.5% 准确率,体积降至 31MB,推理提速至 18ms,顺利通过验收。
边缘服务器上 LLM 部署的激活校准
阶段:推理优化 / 精度恢复
解决的问题:7B 大模型要部署在单卡边缘服务器上,KV Cache 和权重都需压缩。权重量化后困惑度(PPL)从 5.2 恶化到 8.7。原因是激活值存在少量极端离群维度,且校准数据全部来自通用语料,与业务代码生成场景不匹配。
具体案例:先用 1000 条业务代码数据重新校准(替换通用语料),再用百分位法(P99.99)裁剪激活离群维度,PPL 从 8.7 降至 5.6;随后用 2 万条代码数据做 QAT 微调,PPL 最终 5.3,逼近浮点水平。
工业质检模型的 QAT 精度救火
阶段:模型微调 / 上线保障
解决的问题:某质检模型在 GPU 上 INT8 量化后 mAP 降了 4.5%,远超 1% 红线。校准参数已调到最优仍不达标,现场有充足的历史缺陷标注数据,于是启动 QAT 方案。
具体案例:在训练框架中开启伪量化节点,冻结 BN 层统计,以 1/10 学习率微调 2 个 epoch,并在损失函数中加入 \(\|Q(W)-W\|\) 量化正则项。微调后 mAP 回退收窄至 0.8%,模型在半年的时间里稳定运行于产线边缘盒子。
Python 演示
import numpy as np rng = np.random.default_rng(42) # 1. 模拟权重: 主体小值 + 少量离群大值weight = np.concatenate([ rng.normal(0.0, 0.05, 500), rng.normal(2.0, 0.3, 5), rng.normal(-2.0, 0.3, 5),]) def quantize(x, scale, qmin=-127, qmax=127): q = np.clip(np.round(x / scale), qmin, qmax) return q * scale def mse(a, b): return float(np.mean((a - b) ** 2)) # 2. 三种校准方法def calib_minmax(x): return (np.max(x) - np.min(x)) / 254.0 def calib_percentile(x, p=0.01): lo = np.percentile(x, p * 100) hi = np.percentile(x, (1 - p) * 100) return max((hi - lo) / 254.0, 1e-9) def calib_kl(x, trials=200): best_scale, best_kl = None, float("inf") lo, hi = np.percentile(x, 0.5), np.percentile(x, 99.5) for s in np.linspace(lo, hi, trials): if s <= 0: continue xq = quantize(x, s) hist_p, _ = np.histogram(x, bins=30, range=(lo, hi)) hist_q, _ = np.histogram(xq, bins=30, range=(lo, hi)) p = hist_p / hist_p.sum() + 1e-9 q = hist_q / hist_q.sum() + 1e-9 kl = np.sum(p * np.log(p / q)) if kl < best_kl: best_kl, best_scale = kl, s return best_scale for name, fn in [ ("MinMax", calib_minmax), ("Percentile", calib_percentile), ("KL", calib_kl),]: s = fn(weight) err = mse(weight, quantize(weight, s)) print(f"{name}: scale={s:.4f}, MSE={err:.6f}") # 3. QAT 模拟: 线性回归 + 伪量化 + STE 直通梯度X = rng.normal(0, 1, (200, 16))w_true = rng.normal(0, 0.5, 16)y = X @ w_true + rng.normal(0, 0.05, 200) w = w_true.copy()b = 0.0qscale = np.max(np.abs(w_true)) / 127.0lr = 0.01 for step in range(300): wq = quantize(w, qscale) # 前向走量化权重 yhat = X @ wq + b loss = np.mean((yhat - y) ** 2) dw = 2 * (X.T @ (yhat - y)) / len(X) # STE: 梯度直通回浮点 db = 2 * np.mean(yhat - y) w -= lr * dw b -= lr * db if step % 50 == 0: print(f"QAT step {step}: loss={loss:.6f}")
weight = np.concatenate([...])构造带离群点的模拟权重:500 个小值、10 个极值,模拟真实模型中「少数神经元值特别大」的情况。np.clip(np.round(x / scale), qmin, qmax)量化核心:除以步长、四舍五入、裁剪到 INT8 档位,最后乘回步长得到量化近似值。calib_percentile(x, p=0.01)百分位校准:用 0.01% 分位点替代全局极值,直接避开离群干扰。wq = quantize(w, qscale)QAT 前向:每次更新都用量化后的权重做推理,让损失「看见」压缩损失。dw = 2 * (X.T @ (yhat - y)) / len(X)STE 梯度:按浮点权重路径计算梯度并直通回w,绕开不可导的取整操作。
常见误区
误区校准就是拿模型训练时的数据跑一遍统计分布,训练集数据最干净、最现成,直接取一部分就行。反正都是真实数据,效果差不多。
正解训练集分布和部署时的真实输入分布往往不一样。训练数据是精心清洗过的、类别均衡的,而线上数据充满噪声、模糊、极端场景。用训练集校准就像按模特身材做衣服,穿在真实用户身上必然不合身。正确做法是从线上日志、真实业务场景采样,保证校准集与部署分布一致。
为何常见:初学者接触校准最早看到的教程都拿训练集或验证集举例,容易形成「数据哪来都一样」的错觉,忽视了分布匹配才是校准的灵魂。
误区校准集越大,统计出的分布越准确,量化误差越小。反正校准只是前向推理,多跑几千张也无所谓。
正解校准只需捕获分布形状,500~2000 个样本已足够。样本过多不仅拖慢流程,还会让统计被重复的常见样本淹没,反而稀释了稀有但关键的长尾分布。更重要的是校准集只是「量体」,反复跑同分布数据不会带来新信息。如果真要提升效果,优先换更分散的数据,而不是堆量。
为何常见:「数据越多越好」是机器学习训练的直觉惯性,但校准不是训练,它是统计估计,边际收益和成本完全不成正比。
误区MinMax 校准覆盖了数据的真实上下限,没有丢弃任何信息,所以应该是最准确的校准方法;百分位裁剪掉了真实数据,属于「作弊」。
正解MinMax 被离群值牵着鼻子走。一个极端值就能把量化步长拉大 10 倍,让 99% 的主体数值挤在少数几个档位里,信息量反而严重压缩。百分位法故意丢弃极端值,用少量信息损失换取主体分布的高分辨率,总信息损失通常更小。可视化演示中,红色离群尖峰让蓝色主体全部挤在一起,就是 MinMax 的典型失败案例。
为何常见:直觉上「覆盖全范围 = 保留全信息」,但量化是均匀格子,范围越宽、每个格子的分辨率就越低。没有认识到「均匀量化下的资源竞争」。
误区QAT 就是在量化后的模型上继续用训练集跑几个 epoch,和普通迁移学习没什么区别,只是为了「再训一下」。
正解QAT 的关键在于训练流程中前向必须走「伪量化」路径——权重要经历「量化-反量化」的模拟压缩,让梯度通过 STE 感知量化噪声;同时要冻结 BN 统计、调低学习率、加量化正则。如果只是对浮点模型做普通微调再量化,模型根本没有适应压缩环境,精度依旧会掉。QAT 的本质是「让模型在模拟考试中备战」,而不是「考完再补课」。
为何常见:从代码上看 QAT 只是多了几行 torch.ao.quantization 的配置,容易让人误以为和普通 fine-tune 等价,忽略了前向通路和训练策略的实质差异。
面试题
Q1. 量化后精度暴跌的最常见元凶是?
- A.存在极端离群值← 正确答案
- B.权重全部为零
- C.偏置设置过大
- D.校验样本太少
答案:A。离群值会拉大量化步长,主体数值挤在少数档位里,精度全面退化。全校准流程都是在与「离群值破坏量化分辨率」作斗争。
Q2. 百分位校准相比 MinMax 的核心优势?
- A.计算速度更快一些
- B.忽略极端离群值干扰← 正确答案
- C.完全避免舍入误差
- D.不需要任何校准数据
答案:B。百分位法用 0.01% 分位点截断,主动丢掉极端样本。它不是避免舍入误差,而是通过缩小范围、提高主体分布的分辨率来间接减少量化噪声影响。
Q3. KL 散度校准的本质目标是什么?
- A.使模型参数量更小
- B.消除所有量化噪声
- C.让量化前后分布接近← 正确答案
- D.加快推理速度提升
答案:C。KL 散度遍历候选裁剪阈值,找到使原始分布与量化后分布信息损失最小的点。它不追求消除噪声(做不到),也不关心参数大小与速度,只关心分布形态的保真度。
Q4. 校准数据集选样的首要原则是?
- A.样本越多效果越好
- B.与部署场景同分布← 正确答案
- C.全部使用难样本
- D.必须使用训练全集
答案:B。校准统计的是部署输入下的激活分布,只有与部署场景同分布,量化范围才贴合真实数据。难样本或大样本量都不是首要原则,分布匹配才是。
Q5. QAT 中直通估计器(STE)的作用是什么?
- A.直接跳过损失计算
- B.降低学习率大小
- C.增加校准数据量
- D.让梯度穿过量化算子← 正确答案
答案:D。量化取整操作导数几乎处处为 0,梯度传不过去。STE 的做法是「假装取整不存在」,让梯度以恒等映射方式穿透伪量化节点,浮点权重才能正常更新。
Q6. 校准完成后最首要的验收指标是?
- A.模型文件的大小
- B.准确率回退幅度← 正确答案
- C.训练轮数的多少
- D.数据集规模大小
答案:B。校准做得好不好,直接看 INT8 模型相对 FP32 的准确率回退。文件大小和训练轮数是过程指标,准确率回退才是决定能否上线的核心验收标准。
Q7. QAT 微调时推荐的学习率策略是?
- A.约原训练的十分之一← 正确答案
- B.与预训练保持完全一致
- C.逐轮指数放大学习率
- D.关闭学习率衰减机制
答案:A。QAT 是微调不是训练,只需把权重「掰」向量化友好形态。学习率过大(与预训练一致)会破坏已学到的特征,通常取原训练的 1/10,微调 1~3 个 epoch 即可。
Q8. 精度效果评估应包含哪些手段?
- A.对比量化前后准确率← 正确答案
- B.查看验证集损失曲线← 正确答案
- C.只求部署速度提升
- D.逐层定位误差贡献← 正确答案
答案:ABD。准确率回退、损失曲线对比、逐层误差定位都是评估量化质量的必要手段。只追求速度而忽略精度验收是本末倒置。
Q9. 量化感知微调(QAT)的关键要素包括?
- A.前向插入伪量化节点← 正确答案
- B.使用直通估计器传播梯度← 正确答案
- C.采用极小学习率微调← 正确答案
- D.必须重训全部参数从头
答案:ABC。QAT 需要伪量化节点模拟压缩噪声、STE 让梯度穿过不可导的取整、小学习率避免破坏特征。它是在预训练权重上微调而非从零重训,D 错误。
Q10. 精度恢复补救的正确顺序是哪几项?
- A.先调校准参数观察回退← 正确答案
- B.再补数据重新校准← 正确答案
- C.无效则转量化感知微调← 正确答案
- D.直接回退全浮点部署
答案:ABC。正确流程是先校准调参(最廉价),不行再换校准数据或深度校准,最后才上 QAT 攻坚。直接回退浮点等于放弃量化收益,是最后一个兜底而非首选补救。