老周的工位像个小图书馆:三排书架,塞满深度学习笔记、模型权重文件和训练日志。可每次去现场部署边缘设备,他都只带一个 20 寸登机箱。这次要装的是“垃圾分类识别”模型,float32 权重足有 1.2GB——像一套精装百科全书。设备端内存小、算力弱,就像这只登机箱,根本装不下图书馆。老周开始练一门手艺:把书“抄”成速记卡。float32 一个数占 4 字节,好比一整页精装书;INT8 只占 1 字节,是一张索引卡;INT4 更省,半张卡片,只记关键词。字迹潦草了些,但核心思想还在。这就是量化(Quantization):用精度换体积、换速度,让大模型能在小设备上跑起来。老周把经验总结成六个问题:量化怎么定义?训练后量化(PTQ)与量化感知训练(QAT)怎么选?校准数据怎么挑?精度掉了怎么评估?又怎么补救?这篇出差笔记,就是答案。

岗位关联

量化是边缘 AI 落地的“必修课”——掌握 INT8/INT4 量化、PTQ/QAT 与精度补偿,是部署模型到设备端的核心技能,直接决定推理引擎工程师的交付质量与效率。

目录
  1. 可视化演示
  2. 量化基本原理
  3. 训练后量化
  4. 量化感知训练
  5. 校准数据选择
  6. 精度损失评估
  7. 精度补偿方法
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示模型量化完整流程:FP32模型分析、校准数据分布、量化映射、精度评估与部署优化,支持量化位数与校准集参数调节。

本节配有交互动效(进入视口后自动加载,约 3KB)。

FP32原始模型 浮点权重矩阵可视化,32位精度 每个块代表一个浮点权重值

量化基本原理

老周翻开一本《园艺百科全书》——这就是 float32 权重的世界。每一页都印着密密麻麻的小数:0.3164728、-0.0042918……精确得让人安心,但也重得离谱。一个 float32 值占 4 字节,一亿个权重就是 400MB。而登机箱里全是这样的书,他根本搬不动。他开始琢磨:这些小数真的要精确到七位吗?能不能只记“大概”?

量化的本质,就是把连续浮点数映射到有限的整数集合。它不改变网络结构,只换一种更省空间的“记数法”。要做到这一点,需要两把钥匙:缩放因子 scale(记作 \(s\)),决定一格刻度代表多大的浮点范围;零点偏移(记作 \(z\)),决定整数尺子的起点放在哪。有了它们,任何一个浮点数都能被“读”成整数,推理时再“翻译”回近似浮点值。

于是,量化的核心公式浮出水面:

老周在笔记本上画下这把“尺子”:量化的过程,就像给每本书贴编号、抄索引卡。索引还在,但原书里那些细腻的措辞,已经被取整磨平了棱角——好在量化的设计目标,就是让这些棱角不影响“阅读”。

xint=round ⁣(xs)+z,xdequant=s×(xint−z)\displaystyle x_{int} = \text{round}\!\left(\frac{x}{s}\right) + z, \qquad x_{dequant} = s \times (x_{int} - z)
\(s\) 是“尺子刻度”,\(z\) 是“尺子起点”。量化就是先按刻度取整,再通过 \(s\) 和 \(z\) 把整数翻译回近似浮点值。
  1. 缩放因子(尺子刻度)把一个浮点取值范围等分成 \(2^b - 1\) 个格子,格子越细,量化越精确。
    s=xmax−xmin2b−1\displaystyle s = \frac{x_{max} - x_{min}}{2^{b} - 1}
  2. 除法归位(读数划格)把浮点数 \(x\) 除以 \(s\),算出它落在尺子的第几格附近。
    xs\displaystyle \frac{x}{s}
  3. 取整与零点偏移(落格)round 把结果就近归到整数刻度,再加零点 \(z\) 平移到非负整数区间。
    xint=round ⁣(xs)+z\displaystyle x_{int} = \text{round}\!\left( \frac{x}{s} \right) + z
  4. 反量化(读回近似值)推理时把整数权重“翻译”回浮点近似值,再参与矩阵运算。
    xdequant=s×(xint−z)\displaystyle x_{dequant} = s \times (x_{int} - z)

训练后量化

第一次出差,老周把书一本本仔细打包好,到了机场才发现登机箱超尺寸。他只好蹲在值机柜台旁,把整箱书硬塞进去——词典压弯了书角,画册皱了几页。这就是训练后量化(PTQ)最真实的写照:模型已经在 GPU 上训练完毕,权重全是 float32,你直接拿一把尺子把它们“量”成 INT8,全程不碰训练。

PTQ 的流程分三步:先跑几百张校准图片,统计每一层权重和激活值的取值范围;再根据范围算出每层的缩放因子 \(s\) 和零点 \(z\);最后把整个模型的浮点权重替换成整数权重。这个过程不需要反向传播,也不需要重新训练,一台普通电脑几分钟就能完成。所以 PTQ 特别适合“模型已训好、急着上线”的场景,比如智能摄像头、工业盒子。

但硬塞有代价。当权重分布里存在离群值(个别值特别大)时,\(s\) 会被这些离群值拉大,正常细节被挤到很小的整数区间里,误差剧增。PTQ 的映射公式如下:

老周把 PTQ 记成“事后补救”:最快的路,但不一定是最稳的路。模型越小越规整,硬塞的成功率越高;模型越大、分布越极端,越容易在量化后“水土不服”。

wint=clip ⁣(round ⁣(wfp32s)+z,  0,  2b−1)\displaystyle w_{int} = \text{clip}\!\left( \text{round}\!\left( \frac{w_{fp32}}{s} \right) + z, \; 0, \; 2^{b} - 1 \right)
PTQ 用一批校准数据“试装”出每层的 \(s\) 和 \(z\),再把所有权重一次性压成整数。clip 把超出整数范围的极端值硬截断。
  1. 统计权重范围扫描整个权重张量,记下最小值和最大值,作为尺子的两端。
    wmin=min⁡(W),wmax=max⁡(W)\displaystyle w_{min} = \min(W), \quad w_{max} = \max(W)
  2. 计算缩放因子把浮点范围映射到 \(2^b - 1\) 个整数格子上。
    s=wmax−wmin2b−1\displaystyle s = \frac{w_{max} - w_{min}}{2^{b} - 1}
  3. 整体映射与截断每个权重除以 \(s\) 取整、加 \(z\),超出 \([0, 2^b - 1]\) 的值被裁剪到边界。
    wint=clip ⁣(round ⁣(wfp32s)+z,  0,  2b−1)\displaystyle w_{int} = \text{clip}\!\left( \text{round}\!\left( \frac{w_{fp32}}{s} \right) + z, \; 0, \; 2^{b} - 1 \right)

量化感知训练

第二次出差,老周改变了策略。他不再等行李全部打包好再发愁,而是把登机箱摆在书架旁边,每装一本书,都先“模拟”压一遍——看看如果抄成卡片,会不会丢掉关键的插图。训练一边进行,一边就让模型适应“被压”的感觉,这就是量化感知训练(QAT)。

QAT 在训练过程中插入“伪量化”算子:前向传播时,先把权重和激活值临时量化成 INT8 再还原,用这个“受过伤”的值去算损失;反向传播时,梯度会引导权重往“即使被取整也不怎么受伤”的方向调整。训练完成后,模型对量化噪声的免疫力大幅提升,最后一步再真正转成 INT8。

但这里有个难题:取整操作 round 的导数几乎处处是 0,梯度传到这里就像撞上一堵墙。研究者用直通估计器(STE)绕了过去——假装墙不存在,让梯度直接穿透:

老周评价 QAT 是“边学边打包”:费电、费算力,但打包出来的模型又稳又准。与 PTQ 相比,QAT 的精度上限更高,代价是需要完整的训练数据和 GPU 资源。

w~=s×round ⁣(ws),∂L∂w≈∂L∂w~\displaystyle \tilde{w} = s \times \text{round}\!\left( \frac{w}{s} \right), \qquad \frac{\partial \mathcal{L}}{\partial w} \approx \frac{\partial \mathcal{L}}{\partial \tilde{w}}
前向传播“故意”用带误差的 \(\tilde{w}\) 计算,反向传播却假装没有取整这回事,让梯度畅通无阻地回到原始权重上。
  1. 前向伪量化前向传播时把权重“试压”成量化值再还原,模拟真实部署时的精度损失。
    w~=s×round ⁣(ws)\displaystyle \tilde{w} = s \times \text{round}\!\left( \frac{w}{s} \right)
  2. 反向直通STE 让梯度直接穿透取整操作,近似的导数为 1,不再中断回传。
    ∂L∂w≈∂L∂w~\displaystyle \frac{\partial \mathcal{L}}{\partial w} \approx \frac{\partial \mathcal{L}}{\partial \tilde{w}}
  3. 更新原始权重梯度回到 float32 原始权重上做更新,量化范围也随之逐步收敛。
    w←w−η×∂L∂w\displaystyle w \leftarrow w - \eta \times \frac{\partial \mathcal{L}}{\partial w}

校准数据选择

老周发现一个有意思的现象:同样的箱子、同样的打包手法,用不同的“试装物品”,结果天差地别。用花盆试装,永远发现不了书脊会被压弯;用重量均匀的哑铃试装,又无法暴露边角的磕碰风险。校准数据集的角色,正是这些“试装物品”。

PTQ 和 QAT 在确定量化范围时,都需要一小批真实数据跑一遍前向推理,收集每一层激活值的动态范围,这批数据就叫校准数据集。它不参与权重更新,只负责“亮出”模型在实际部署时可能遇到的数值分布。校准集选得好,尺子刻度就准;选得差,整个量化范围都是歪的。

选择校准数据的核心原则有三条:一是代表性覆盖,必须贴近真实部署场景,比如做道路监控就不能只用实验室的干净图片;二是数据多样性,每个类别、光照、角度都要有样本,避免某一类分布独大;三是样本数量适中,通常每个类别几十张、总计几百到一千张即可,过多反而会引入与部署无关的分布偏置。更讲究的做法,是用 KL 散度衡量“量化前后的激活分布差异”,从而挑选最优截断阈值:

老周在出差日志里写下:校准集选得好,量化成功一半;选不好,箱子再大也白搭。

DKL(P∥Q)=∑iP(i)×ln⁡P(i)Q(i)\displaystyle D_{KL}(P \| Q) = \sum_{i} P(i) \times \ln \frac{P(i)}{Q(i)}
校准数据的使命是“摸清敌方火力”——用少量样本估计激活值的真实活动范围。KL 散度越小,说明量化后的分布越接近原始分布。
  1. 统计分布桶把激活值按区间分桶,\(P(i)\) 是原始浮点值落在第 \(i\) 桶的占比。
    P(i)=countiN\displaystyle P(i) = \frac{\text{count}_i}{N}
  2. 逐桶求差异对每个桶,计算原始占比与量化后占比的比值,再取对数。
    ln⁡P(i)Q(i)\displaystyle \ln \frac{P(i)}{Q(i)}
  3. 加权求和以 \(P(i)\) 为权重把所有桶的差异累加起来,得到两个分布的“距离”。
    DKL(P∥Q)=∑iP(i)×ln⁡P(i)Q(i)\displaystyle D_{KL}(P \| Q) = \sum_{i} P(i) \times \ln \frac{P(i)}{Q(i)}

精度损失评估

到了目的地,老周第一件事不是开机干活,而是打开箱子逐件检查:这本文集有划痕吗?那本画册的颜色偏了多少?影响大不大?对量化模型而言,这一套“开箱检查”就是精度损失评估。

评估的方法很朴素:让 float32 原模型和 INT8/INT4 量化模型跑同一份验证集,比较关键指标。分类任务看 Top-1 准确率,检测任务看 mAP(平均精度均值),回归任务看 MSE(均方误差)。量化的损失主要来自三处:取整时的舍入误差、clip 截断离群值时的范围误差、以及激活值范围估计不准带来的传播误差。

业内通常把准确率下降 1% 以内视为“质量门禁”——超过这个阈值,就要考虑换用 QAT 或加补偿手段。计算公式如下:

老周总结:量化是一门“以损换快”的生意,先把账算清楚,再决定用哪套打包方案。

Δacc=Accfp32−Accint8,MSE=1N∑i=1N(xifp32−xiint8)2\displaystyle \Delta_{acc} = Acc_{fp32} - Acc_{int8}, \qquad \text{MSE} = \frac{1}{N}\sum_{i=1}^{N} (x_i^{fp32} - x_i^{int8})^2
准确率差值和 MSE 是量化精度的两大“体检指标”:前者看模型最终表现,后者看数值层面的失真程度。
  1. 记录量化前基线用 float32 模型跑验证集,统计正确样本占比。
    Accfp32=正确样本数总样本数\displaystyle Acc_{fp32} = \frac{\text{正确样本数}}{\text{总样本数}}
  2. 量化后重新评测同一份验证集交给 INT8 模型,得到量化后的准确率。
    Accint8=正确样本数总样本数\displaystyle Acc_{int8} = \frac{\text{正确样本数}}{\text{总样本数}}
  3. 求差与求均方差两式相减得到准确率下降幅度;逐样本求平方差再取平均,得到数值层面的失真程度。
    Δacc=Accfp32−Accint8,MSE=1N∑i=1N(xifp32−xiint8)2\displaystyle \Delta_{acc} = Acc_{fp32} - Acc_{int8}, \quad \text{MSE} = \frac{1}{N}\sum_{i=1}^{N} (x_i^{fp32} - x_i^{int8})^2

精度补偿方法

几趟差出下来,老周练就了一套“无损打包秘籍”:用压缩袋把蓬松衣物排空空气(收紧数值范围);把袜子卷起来塞进鞋子(填补空闲区间);怕磕碰的镜头用衣物层层包裹(给敏感层留更高精度)。对应到量化技术上,就是一组精度补偿手段。

最常用的是逐通道量化:不再给整个权重张量配一把尺子,而是给每个卷积通道各配一把独立尺子。这样即使某一个通道里存在大离群值,也不会拖累其他通道的量化精度。其次还有对称量化——把浮点范围对称地映射到正负整数区间,省去零点偏移的计算;以及混合精度量化——对离群值多的敏感层用 INT8,对不敏感层用 INT4,在体积和精度之间折中。

每个通道独立缩放因子的计算公式如下:

老周在培训 PPT 的最后一页写下:量化没有银弹,但每一把尺子、每一种包装技巧,都能把精度损失多挽回一点。

sc=max⁡i∈Cc∣wi∣2b−1−1\displaystyle s_c = \frac{\max_{i \in C_c} |w_i|}{2^{b-1} - 1}
逐通道量化像“分舱打包”:每个舱位单独算尺寸,互不拖累。离群值只影响它所在的那个通道,而不是毁掉整把尺子。
  1. 按通道分组把第 \(c\) 个卷积输出通道内的所有权重收进一个集合。
    Cc={wi∣通道索引=c}\displaystyle C_c = \{ w_i \mid \text{通道索引} = c \}
  2. 求组内最大绝对值找出该通道里权重绝对值的峰值,作为动态范围的边界。
    max⁡i∈Cc∣wi∣\displaystyle \max_{i \in C_c} |w_i|
  3. 换算缩放刻度用整数表示范围的中位容量(\(2^{b-1} - 1\))去除峰值,得到该通道专属的 \(s_c\)。
    sc=max⁡i∈Cc∣wi∣2b−1−1\displaystyle s_c = \frac{\max_{i \in C_c} |w_i|}{2^{b-1} - 1}

AI 应用场景

智能安防摄像头端侧目标检测

阶段:模型压缩与边缘推理部署

解决的问题:传统方案把视频流上传云端识别,来回延迟高、流量费贵;直接部署 float32 模型又装不进摄像头 SoC 的内存。用 INT8 PTQ 可将检测模型压缩 4 倍,嵌入摄像头芯片内实时推理。

具体案例:某智慧工地项目,YOLOv5s 模型由 float32 转为 INT8 后,推理帧率从 15 FPS 提升到 32 FPS,mAP 仅下降 0.8%,昼夜场景实测均满足安全帽佩戴检测需求。

工业设备预测性维护

阶段:QAT 模型重训

解决的问题:振动传感器故障预测模型要部署到 PLC 控制器上,可用内存只有 512KB;直接 PTQ 后精度下降 5%,改用 QAT 让模型在训练时就学会抵抗量化噪声。

具体案例:某工厂风机轴承预测模型,QAT 结合 INT4 量化后,模型体积从 3.2MB 降到 400KB,AUC 仅下降 1.2%,在 PLC 上 7×24 小时稳定运行。

智能语音关键词唤醒

阶段:INT4 量化部署

解决的问题:TWS 耳机芯片要常驻“唤醒词”模型,既要省内存又要低功耗;INT4 量化把模型压到 KB 级,比 INT8 再省一半内存。

具体案例:某耳机“小度小度”唤醒模型,INT4 量化后仅占 180KB,唤醒率 97.2%,相比 INT8 方案功耗降低约 30%,延迟保持在 30ms 以内。

Python 演示

python45 行
import numpy as np  def quantize(w, bits, clip_percentile=None):    # 将浮点权重 w 量化为 bits 位整数, 可选用分位数裁剪离群值    if clip_percentile:        lo = np.percentile(w, clip_percentile)        hi = np.percentile(w, 100.0 - clip_percentile)        w = np.clip(w, lo, hi)    w_min, w_max = w.min(), w.max()    levels = 2 ** bits - 1    scale = (w_max - w_min) / levels if w_max > w_min else 1.0    zero_point = int(round(-w_min / scale)) if scale > 0 else 0    w_int = np.round(w / scale) + zero_point    w_int = np.clip(w_int, 0, levels).astype(np.int32)    return w_int, scale, zero_point  def dequantize(w_int, scale, zero_point):    # 把整数权重还原成浮点近似值    return scale * (w_int - zero_point)  def mse(w_fp32, w_int, scale, zero_point):    # 计算量化前后权重的均方误差    w_approx = dequantize(w_int, scale, zero_point)    return float(np.mean((w_fp32 - w_approx) ** 2))  if __name__ == "__main__":    rng = np.random.default_rng(7)    n = 50000    w = rng.normal(0.0, 0.05, n)    w = np.concatenate([w, rng.uniform(-0.5, 0.5, int(n * 0.01))])     for bits in (8, 4):        w_int, s, z = quantize(w, bits)        print(f"INT{bits}: 内存 {w_int.nbytes} 字节, "              f"压缩比 {32 / bits:.1f}x, MSE {mse(w, w_int, s, z):.2e}")     print()    for pct in (None, 1.0):        tag = "裁剪1%离群值" if pct else "不裁剪"        w_int, s, z = quantize(w, 4, clip_percentile=pct)        print(f"INT4 {tag}: MSE {mse(w, w_int, s, z):.2e}")
目的:用 numpy 演示 INT8/INT4 量化的完整闭环——计算缩放因子、量化取整、反量化还原,并对比“裁剪离群值”这一补偿手段对精度的提升。
  1. scale = (w_max - w_min) / levels if w_max > w_min else 1.0计算缩放因子,把浮点范围等分成 \(2^{bits}-1\) 格
  2. w_int = np.round(w / scale) + zero_point浮点值除以刻度、四舍五入并平移到非负整数
  3. np.clip(w_int, 0, levels).astype(np.int32)防止取整后越界,并转成整数类型
  4. return scale * (w_int - zero_point)反量化,把整数“翻译”回近似浮点值
  5. np.concatenate([w, rng.uniform(-0.5, 0.5, ...)])故意混入 1% 离群值,模拟真实模型中的极端权重
  6. quantize(w, 4, clip_percentile=1.0)演示“先裁剪 1% 离群值再量化”的补偿思路

常见误区

误区“量化就是像 ZIP 一样把模型压小,用的时候解压回来,一点不损失。”

正解量化是“有损压缩”,把 float32 小数按刻度取整,信息在量化那一刻就永久丢失了。它更像把高清照片转成 16 色海报——一眼能认出轮廓,但每个像素的颜色已经不是原来的。ZIP 解压能逐字节还原,量化永远不能。

为何常见:日常接触的 zip/rar 都是无损压缩,容易把“压缩”二字直接套用到量化上,忽略了“取整”的不可逆性。

误区“QAT 就是先把模型量化成 INT8,再在这个整数模型上微调训练。”

正解正好相反,QAT 在训练过程中就“模拟”量化:前向传播先走一遍伪量化,反向传播用 STE 让梯度穿透取整操作,更新的是 float32 原始权重。训练完成后再转成真正的 INT8 部署。

为何常见:字面上“量化感知训练”容易被拆解成“先量化 + 再训练”,而没有理解训练与量化是同时发生的。

误区“既然是统计范围,那校准数据肯定越多越准,最好把整个训练集都跑一遍。”

正解校准数据只需要几百到几千张代表性样本。样本过多不仅耗时,还会把训练集中罕见但无关的分布也统计进来,反而把缩放因子拉偏。校准的目标是“估计分布”,不是“拟合分布”。

为何常见:“数据越多越好”是机器学习里的常见直觉,但校准数据追求的是代表性覆盖,不是数量堆砌。

误区“位宽减半,精度肯定也减半,INT4 没法实用。”

正解位宽只决定量化格子的数量,实际精度还取决于校准质量与补偿手段。配合逐通道缩放、离群值裁剪和混合精度,INT4 在不少任务上能逼近 INT8;反过来,校准不当的 INT8 也可能比精心调校的 INT4 更差。

为何常见:把“位宽”直接等同于“质量上限”,忽略了工程手段对精度的巨大影响。

面试题

Q1. 将 float32 模型量化为 INT8 后,权重内存占用约缩小多少倍?

单选题 · easy

  • A.2 倍
  • B.4 倍← 正确答案
  • C.8 倍
  • D.16 倍

答案:B。float32 占 4 字节,INT8 占 1 字节,因此内存缩小 4 倍。A/C/D 分别对应 2、8、16 倍,均为错误换算。

Q2. 训练后量化(PTQ)最典型的运行流程是?

单选题 · easy

  • A.从零开始重新训练模型
  • B.用校准数据统计范围后转换← 正确答案
  • C.直接丢弃一半网络层
  • D.随机取整所有权重参数

答案:B。PTQ 不重新训练,而是用校准数据统计权重和激活值的分布范围,据此算出缩放因子并完成转换。A 是 QAT 之前的原始训练流程,C 是剪枝,D 是缺少校准的粗暴做法。

Q3. 量化公式中缩放因子 \(s\) 的物理含义是什么?

单选题 · mid

  • A.零点在整数轴的位置
  • B.浮点映射整数的刻度← 正确答案
  • C.模型训练的学习率
  • D.权重矩阵的稀疏程度

答案:B。\(s\) 决定“一格刻度代表多大的浮点范围”,是把连续浮点值翻译成整数的尺子。A 是零点偏移 \(z\) 的作用,C 是训练超参数,D 与量化无关。

Q4. QAT 中 round 操作不可导,业界常用的解决手段是?

单选题 · mid

  • A.梯度随机关闭
  • B.直通估计器 STE← 正确答案
  • C.增加网络深度
  • D.更换损失函数

答案:B。STE 让反向传播“假装”取整函数导数为 1,使梯度直接穿透 round 操作到达原始权重,从而完成 QAT 的训练更新。

Q5. 校准数据集的正确选择原则包括?

多选题 · mid

  • A.覆盖部署场景分布← 正确答案
  • B.各类别保持均衡← 正确答案
  • C.数量尽量越过亿
  • D.与训练集完全无关

答案:AB。校准集像“试装箱的样本”,代表性覆盖和多样性是关键。C 错在样本过多会引入无关分布偏置;D 错在与部署场景无关的数据会误导 range 统计。

Q6. INT4 相比 INT8 的优势主要体现在?

单选题 · easy

  • A.推理精度更高
  • B.内存占用更小← 正确答案
  • C.无需校准数据
  • D.数值范围更大

答案:B。INT4 每权重仅 0.5 字节,内存和带宽比 INT8 再降一半,适合内存极受限的 MCU 场景,但精度风险也更大。

Q7. 权重中存在少量大离群值时,最优的补偿策略是?

单选题 · hard

  • A.增大模型训练轮次
  • B.改使用更高位宽
  • C.裁剪离群值限幅← 正确答案
  • D.改用更大的数据批

答案:C。离群值会拉大全局缩放因子,挤压正常权重的量化档位。先裁剪极端值再量化,能让正常值分到更多整数格子。A/D 与量化无关,B 治标不治本且成本高。

Q8. 下列哪些属于量化精度补偿手段?

多选题 · mid

  • A.逐通道独立缩放← 正确答案
  • B.混合精度量化← 正确答案
  • C.扩大训练数据集
  • D.裁剪权重离群值← 正确答案

答案:ABD。A 每个通道单独算 scale,避免离群值跨通道污染;B 敏感层用 INT8、不敏感层用 INT4;D 防止离群值拉大 scale。C 属于训练阶段范畴,不是量化补偿手段。

Q9. 关于 QAT 与 PTQ 的对比,正确的说法是?

多选题 · hard

  • A.QAT 训练成本高于 PTQ← 正确答案
  • B.PTQ 无需模型重新训练← 正确答案
  • C.QAT 对量化噪声更鲁棒← 正确答案
  • D.PTQ 精度一律高于 QAT

答案:ABC。QAT 需要完整训练流程,成本高;PTQ 直接转换成本低;QAT 训练时见过量化噪声,鲁棒性更好。D 说反了,通常 QAT 精度优于 PTQ。

Q10. 校准中使用 KL 散度选择截断阈值的目的是?

单选题 · extreme

  • A.量化分布接近原始分布← 正确答案
  • B.让模型收敛速度更慢
  • C.减少量化模型的层数
  • D.提升训练数据多样性

答案:A。KL 散度衡量量化前后激活分布的差异,差异最小的截断阈值既能压掉离群值,又能让量化后的分布“长得最像”原始分布。B/C/D 与 KL 散度的用途无关。