设想一位刚从法国学成归来的米其林大厨,他的招牌菜在专业厨房里能拿 99 分。某天他受邀去街边露营厨房出摊——没有电子秤,只有刻度模糊的量勺;没有恒温烤箱,只有火候难控的炭火炉。厨艺没变,工具却粗糙了,同一道菜只剩 85 分。这个“工具变粗糙”的过程,在 AI 世界里叫模型量化。而量化感知微调(QAT)要回答的问题是:怎样让大厨在露营厨房里练习几天,把出品分拉回 96 分以上。 这篇故事贯穿全文:预训练模型是大厨,浮点权重是专业厨房,INT8 量化是露营厨房。QAT 不是从头再训练,而是让大厨在“模拟粗糙环境”里做少量适应性练习。他会保留大部分基本功(冻结不敏感层),只针对受工具影响最大的环节(量化敏感层)重点磨合,并通过“手感直通”(STE 技术)绕过破损的反馈链路,用最小练习成本换回接近原版的出品。读完这篇,你就拿到了这条精度恢复路线的完整地图。

岗位关联

对 AI 从业者而言,QAT 是模型部署前最后一道“精度救生索”,是 AI 编译器与推理优化工程师把模型安全送上生产环境的必修技能。

目录
  1. 可视化演示
  2. QAT原理基础
  3. 量化模拟机制
  4. STE梯度传递
  5. 敏感层定位
  6. 微调训练策略
  7. 部署效果评估
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示量化感知微调分层冻结策略(冻结/敏感/训练)、STE直通估计器前向fake量化与反向梯度传递机制及精度恢复曲线(PTQ到QAT渐进恢复)。

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

'+CAPTIONS[0]+'

QAT原理基础

大厨在露营厨房的第一天发现了三个问题:量勺刻度太粗、炉火温度不稳、砧板不够快。他没有慌,而是先冷静分析:这三样分别影响哪些菜、哪些环节?他很快判断出,真正影响招牌菜口感的,主要是调味精度和火候控制,刀工反而是次要的。这个“问题定位”思路,正是 QAT 的第一步——先搞清楚量化到底伤在哪里。

预训练模型以 32 位浮点(FP32)保存权重,好比大厨常用的精密工具。为了在手机和嵌入式设备上运行,业界把权重压缩为 8 位整数(INT8),模型体积缩小到原来的四分之一,推理速度大幅提升。但代价是大量“精细刻度”被四舍五入丢掉,输出精度随之下滑。QAT(Quantization Aware Training,量化感知微调)就是在量化模拟环境中对预训练模型做少量训练,让模型适应这种粗糙工具。它与 PTQ(训练后量化)最大的区别是:PTQ 量化完直接部署,QAT 则先用少量训练步骤把精度换回来——好比大厨先练两天再出摊。

QAT 的优化目标可以写成一个带约束的优化问题:模型权重应尽量贴近预训练时的值,同时适应量化后的参数分布。它优化的是量化模拟模型在原任务上的损失,外加一个正则项防止权重偏离原始值太远:

这个公式翻译成大厨的语言就是:你可以在露营厨房里微调手法,但菜的配方(核心知识)不能推翻重来。正是这种“保留底子、适应环境”的思路,让 QAT 能用极小的训练成本,把量化后的精度拉回高位。

min⁡θ  L(fQ(x;θ),y)+λ∥θ−θ0∥2\displaystyle \min_{\theta} \; \mathcal{L}\big(f_Q(x;\theta), y\big) + \lambda\|\theta-\theta_0\|^2
公式含义:第一项要求量化模拟后的模型仍然能完成原任务,第二项让权重别偏离预训练起点太远——大厨可以调整手法,但不能把菜谱彻底换掉。
  1. 量化模拟模型$f_Q(x;\theta)$ 表示训练过程中对权重和激活执行伪量化后的模型
    fQ(x;θ)=f(x;quant⁡(θ))f_Q(x;\theta) = f\big(x;\operatorname{quant}(\theta)\big)
  2. 任务损失$\mathcal{L}(\cdot,\cdot)$ 是与原任务一致的损失函数
    L(fQ(x), y)\mathcal{L}\big(f_Q(x),\, y\big)
  3. 防偏离正则$\lambda\|\theta-\theta_0\|^2$ 惩罚权重离预训练值 $\theta_0$ 太远
    λ∥θ−θ0∥2\lambda\|\theta-\theta_0\|^2

量化模拟机制

大厨要练习,首先得有一个和露营厨房一模一样的训练场。他不能等到出摊那天才第一次摸到粗刻度量勺,那太冒险了。于是他把量勺、炭火炉原样搬进练习室,每天都在完全一致的模拟环境里做菜。QAT 里的这个“训练场”,就叫伪量化(Fake Quantization)。

伪量化的思想很直接:训练前向传播时,真实模拟量化-反量化的全过程——先把浮点权重按缩放因子缩放到整数域并四舍五入,再缩放回浮点域。这样模型在训练时能“亲身感受”量化误差。但要注意,训练时权重仍以浮点保存,并没有真正变成整数,否则梯度就无法更新了。

伪量化中最常用的是对称量化。给定一个浮点张量 $x$,先根据它的最大绝对值算出缩放因子 $s$,然后执行缩放、取整、截断、反缩放:

伪量化训练场最重要的特点就是“逼真”:训练时就让你在粗刻度量勺下做菜,出摊时才不会手忙脚乱。但这个训练场有个大麻烦——四舍五入函数像一架坏掉的秤,数学上不可导,梯度根本传不过去。这就引出了 QAT 最关键的 STE 技术。

x^=s⋅clamp⁡(round⁡(xs),  −2b−1,  2b−1−1),s=max⁡∣x∣2b−1\displaystyle \hat{x} = s \cdot \operatorname{clamp}\Big(\operatorname{round}\big(\tfrac{x}{s}\big),\; -2^{b-1},\; 2^{b-1}-1\Big), \qquad s=\frac{\max|x|}{2^{b-1}}
$s$ 是“量勺的刻度”:$s$ 越小工具越精细,但溢出风险越高;$s$ 越大覆盖范围越广,但每格精度越粗。
  1. 缩放因子$s=\max|x|/2^{b-1}$ 把浮点范围映射到 $b$ 位整数范围
    s=max⁡∣x∣2b−1s=\frac{\max|x|}{2^{b-1}}
  2. 缩放取整$\operatorname{round}(x/s)$ 模拟整数化时的四舍五入误差
    round⁡(xs)\operatorname{round}\left(\tfrac{x}{s}\right)
  3. 截断操作$\operatorname{clamp}(\cdot,-2^{b-1},2^{b-1}-1)$ 把超出范围的值压回边界
    clamp⁡(⋅, −2b−1, 2b−1−1)\operatorname{clamp}\big(\cdot,\,-2^{b-1},\,2^{b-1}-1\big)
  4. 反缩放乘以 $s$ 回到浮点表示的“量化版本”
    s⋅round⁡(xs)s \cdot \operatorname{round}\left(\tfrac{x}{s}\right)

STE梯度传递

大厨遇到了一架“坏掉的秤”:它能告诉你食材的重量范围(前向结果),却给不出精确的手感反馈(梯度)。深度学习的反向传播依赖精确梯度来更新参数,而量化里的四舍五入函数处处是台阶,在台阶上求导处处为零——梯度传到这里就断了。

STE(Straight-Through Estimator,直通估计器)的想法非常朴素:既然秤给不出精确反馈,那就按“手感估算”传个方向感回去。具体做法是,前向传播照常走量化的台阶,反向传播则把梯度直接透传过舍入函数,仿佛它根本不存在。这个近似在经验上极其有效,成为 QAT 的基石。

在数学上,STE 对 $\operatorname{round}$ 的梯度近似为 1,同时配合一个截断条件:

大厨把这套方法总结为“手感直通”:秤虽然坏了,但做菜的大方向心里有数。遇到刻度太粗的地方,用手背感受大致重量,照样能把调料加对。不过方向感也不是处处可靠——如果食材重量远超量程,他会果断丢弃这次反馈,这就是梯度截断存在的意义。

∂L∂x  ≈  ∂L∂x^⋅1{∣x∣≤τ}\displaystyle \frac{\partial \mathcal{L}}{\partial x} \;\approx\; \frac{\partial \mathcal{L}}{\partial \hat{x}} \cdot \mathbf{1}_{\{|x| \le \tau\}}
公式含义:当输入落在量化范围内时,梯度近似透明通过;超出范围($|x|>\tau$)时,梯度被截断为 0。
  1. 透传梯度$\partial \mathcal{L}/\partial \hat{x}$ 是反量化输出端的梯度
    ∂L∂x^\frac{\partial \mathcal{L}}{\partial \hat{x}}
  2. 直通近似舍入函数的梯度被近似为 1,梯度跳过台阶
    ∂x^∂x≈1\frac{\partial \hat{x}}{\partial x} \approx 1
  3. 梯度截断$\mathbf{1}_{\{|x|\le\tau\}}$ 是示性函数,条件不满足时置 0
    1{∣x∣≤τ}={1,∣x∣≤τ0,∣x∣>τ\mathbf{1}_{\{|x|\le\tau\}} =\begin{cases}1, & |x|\le \tau \\0, & |x|>\tau\end{cases}

敏感层定位

大厨练习了几天发现:有的环节换个粗勺子就完全不是味儿,有的环节闭着眼做都不会出差错。不同环节对工具的敏感程度天差地别,他决定把精力集中在最敏感的环节上,这就是“时间花在刀刃上”。

神经网络也有同样的特点。Transformer 模型的某些层对量化极其敏感,比如注意力层的 QKV 投影、LayerNorm 后的输出;而另一些层(如部分 MLP 层)量化后几乎无损。QAT 实践中,工程师会先做敏感度分析:逐层单独量化,观察每一层造成的精度损失。损失大的层就是“敏感层”。

敏感度可以用量化前后的损失差异来度量:

定位敏感层后,大厨的训练计划一下子清晰了:刀工完全不用重练(冻结不敏感层),全力打磨调味和火候(重点训练敏感层)。这正是 QAT 能省下大量训练成本的根本原因——每一分钟练习都花在最影响出品的地方。

Sl=∣L(W)−L(Wq(l))∣\displaystyle S_l = \big|\mathcal{L}(W) - \mathcal{L}(W_q^{(l)})\big|
$S_l$ 是第 $l$ 层的敏感度,值越大,说明这一层越经不起量化,越需要重点训练。
  1. 原始损失$\mathcal{L}(W)$ 是全精度模型在当前数据上的损失
    L(W)\mathcal{L}(W)
  2. 单层量化损失$\mathcal{L}(W_q^{(l)})$ 表示只把第 $l$ 层量化后模型的损失
    L(Wq(l))\mathcal{L}\big(W_q^{(l)}\big)
  3. 差值绝对值$|\cdot|$ 取两个损失差的绝对值,衡量量化造成的恶化幅度
    ∣L(W)−L(Wq(l))∣\big|\mathcal{L}(W)-\mathcal{L}(W_q^{(l)})\big|

微调训练策略

练习营正式开营。大厨给自己定下几条规矩:每天只练两个钟头,绝不熬夜加练;每次只动最关键的环节;每次练习都对照原版菜谱校对,防止走偏。这些规矩看似简单,却暗含了 QAT 的三大训练策略。

第一,小学习率。预训练阶段的学习率通常是 $10^{-3}$ 量级,QAT 微调一般降到 $10^{-5}$ 到 $10^{-4}$,防止大幅扰乱已有权重。第二,训练步数控制。QAT 只需几百到几千步,太多反而会遗忘预训练学到的通用知识。第三,数据选择。用与目标任务分布一致的少量数据即可,无需海量数据,因为模型早已学会了任务本身。

还有一个容易被忽视的技巧是“防遗忘刹车”——训练参数不是全量,而是由敏感度阈值决定的子集:

两周后,大厨把训练成本一算:总练习时长还不到原先学艺的百分之一,但出品分数已经从 85 分回到了 95 分。这靠的不是苦练,而是“精准练习 + 保护底子”的策略组合。

θtrain={θl∣Sl>δ},θfrozen={θl∣Sl≤δ}\displaystyle \theta_{\text{train}} = \{\theta_l \mid S_l > \delta\}, \qquad \theta_{\text{frozen}} = \{\theta_l \mid S_l \le \delta\}
敏感度高于阈值 $\delta$ 的层参数参与训练,其余冻结。这样既保住不敏感层的成熟特征,又把训练成本压到最低。
  1. 训练参数集$\theta_{\text{train}}$ 是敏感度超过阈值 $\delta$ 的层参数集合
    θtrain={θl∣Sl>δ}\theta_{\text{train}}=\{\theta_l \mid S_l>\delta\}
  2. 冻结参数集$\theta_{\text{frozen}}$ 是敏感度不达标的层参数集合
    θfrozen={θl∣Sl≤δ}\theta_{\text{frozen}}=\{\theta_l \mid S_l\le\delta\}
  3. 阈值判定$\delta$ 是人工设定的敏感度门槛
    Sl>δS_l > \delta

部署效果评估

练习结束,真正的大考来了:大厨要在露营厨房里出摊,接受客人的实际检验。客人关心的只有三件事——快不快、贵不贵、好不好吃。对应到量化部署,就是推理速度、内存占用和精度。三者缺一不可。

QAT 的效果最终要在真实部署中验证。精度方面,把 QAT 微调后的模型与 PTQ 模型在验证集上对比准确率;性能方面,测 INT8 模型与 FP32 模型的推理时延、吞吐和内存占用。常见的两个指标是推理加速比和模型压缩率:

除了数值指标,部署还要看硬件兼容性。同一份 INT8 模型,在支持 Tensor Core INT8 加速的 GPU 和支持 DOT 指令的移动端 NPU 上,加速效果可能截然不同。工程师需要分别记录各硬件平台的时延和精度,形成一张“精度-性能”对照表,这也是 QAT 在 AI 编译器与系统软件栈中的重要价值——一份经过 QAT 的模型,能被多种推理引擎安全承接。

大厨收摊后盘点:同样的菜,出餐时间减少 60%,露营厨具的购置成本只有专业厨房的三成,客人的满意度从 85 分回到了 95 分。他感慨:练习两天的投入,换来长期出摊的底气。这正是 QAT 让无数量化模型安心走向生产环境的理由。

Speedup=TFP32TINT8,Compression=SizeFP32SizeINT8\displaystyle \text{Speedup} = \frac{T_{\text{FP32}}}{T_{\text{INT8}}}, \qquad \text{Compression} = \frac{\text{Size}_{\text{FP32}}}{\text{Size}_{\text{INT8}}}
Speedup 衡量推理提速倍数,Compression 衡量体积缩小倍数。INT8 体积理论上是 FP32 的四分之一,加速比则取决于硬件对 INT8 指令的支持程度。
  1. 加速比$T_{\text{FP32}}/T_{\text{INT8}}$ 是 FP32 与 INT8 推理时延之比
    TFP32TINT8\frac{T_{\text{FP32}}}{T_{\text{INT8}}}
  2. 压缩率$\text{Size}_{\text{FP32}}/\text{Size}_{\text{INT8}}$ 是两版本模型文件大小之比
    SizeFP32SizeINT8\frac{\text{Size}_{\text{FP32}}}{\text{Size}_{\text{INT8}}}

AI 应用场景

手机端人脸识别模型的精度急救

阶段:模型压缩与端侧部署

解决的问题:人脸识别模型 FP32 版本 500MB,无法在手机上实时运行;直接 PTQ 到 INT8 后准确率从 98% 掉到 88%,用户投诉识别失败。传统做法是换更大的模型或砍功能,成本都很高。

具体案例:算法团队用 QAT 在 5 万张脱敏人脸数据上微调 3 个 epoch,准确率恢复到 96.8%,模型体积降至 125MB,端侧时延从 210ms 降到 60ms。过程完全复用现有训练框架,只增加了伪量化层和 STE 逻辑,两周内完成上线。

大语言模型低成本推理服务

阶段:模型优化与推理服务

解决的问题:7B 参数大模型的 FP16 权重占 14GB 显存,单卡并发受限;量化到 INT8 可降低一半显存,但生成质量明显下降。QAT 能以极低成本恢复大部分质量损失。

具体案例:推理优化团队对 7B 模型做 QAT,只训练注意力相关层,困惑度(PPL)从量化后的 9.8 恢复至 8.9,接近 FP16 的 8.7;显存占用从 14GB 降至 7.5GB,吞吐提升约 1.8 倍,推理服务成本显著下降。

跨框架模型格式转换的精度修复

阶段:模型格式转换与互操作

解决的问题:PyTorch 模型转 ONNX 再转 TensorRT INT8 引擎时,算子迁移叠加量化误差,导致精度链式下跌。传统排查流程漫长且难以定位是哪一步出了问题。

具体案例:自动驾驶团队在转 TensorRT 前先做 QAT,使 nuScenes 数据集上的 mAP 从 0.42 恢复到 0.45(FP32 为 0.47),同时保证转换后的引擎在车规级芯片上稳定运行。QAT 成为模型压缩流水线中不可或缺的一环。

Python 演示

python55 行
import torchimport torch.nn as nnimport torch.optim as optim  class FakeQuantize(torch.autograd.Function):    """伪量化: 前向模拟INT8舍入误差, 反向用STE直通梯度"""    @staticmethod    def forward(ctx, x, scale, bits=8):        n = 2 ** (bits - 1) - 1        x_q = torch.clamp(torch.round(x / scale), -n, n) * scale        ctx.save_for_backward(x, scale)        ctx.n = n        return x_q     @staticmethod    def backward(ctx, grad_output):        x, scale = ctx.saved_tensors        mask = (x.abs() <= ctx.n * scale).float()        return grad_output * mask, None  class QuantLayer(nn.Module):    """带伪量化的线性层, 模拟量化后模型的精度变化"""    def __init__(self, in_f, out_f, bits=8):        super().__init__()        self.fc = nn.Linear(in_f, out_f)        self.bits = bits        self.scale = 0.05     def forward(self, x):        w_q = FakeQuantize.apply(self.fc.weight, self.scale, self.bits)        return nn.functional.linear(x, w_q, self.fc.bias)  def qat_finetune(model, x, y, steps=60):    opt = optim.SGD(model.parameters(), lr=0.005)    loss_fn = nn.MSELoss()    for i in range(steps):        opt.zero_grad()        loss = loss_fn(model(x), y)        loss.backward()        opt.step()        if (i + 1) % 20 == 0:            print("step %d loss %.4f" % (i + 1, loss.item()))    return loss.item()  if __name__ == "__main__":    torch.manual_seed(0)    model = QuantLayer(4, 1)    x = torch.randn(128, 4)    y = x.sum(dim=1, keepdim=True)    final_loss = qat_finetune(model, x, y)    print("QAT final loss:", round(final_loss, 4))
目的:演示 QAT 最核心的两个部件——伪量化前向与 STE 反向,在一个最小回归任务上完成量化微调并观察损失收敛。
  1. class FakeQuantize(torch.autograd.Function)自定义一个可参与反向传播的伪量化算子,核心是同时定义前向与反向逻辑。
  2. x_q = torch.clamp(torch.round(x / scale), -n, n) * scale伪量化核心四步:缩放、取整、截断、反缩放,完整模拟 INT8 误差。
  3. mask = (x.abs() <= ctx.n * scale).float()生成梯度截断掩码:超出量化范围的输入不给梯度。
  4. return grad_output * mask, NoneSTE 的实现:梯度近似直通,同时返回 None 表示 scale 不接收梯度。
  5. w_q = FakeQuantize.apply(self.fc.weight, ...)对权重做伪量化后再参与线性运算,模拟部署时的 INT8 权重。
  6. opt = optim.SGD(model.parameters(), lr=0.005)用很小的学习率做微调,避免破坏预训练权重。

常见误区

误区以为 QAT 要把模型从头到尾重新训练一遍,需要和海量预训练数据一样多的数据,还要几百个 GPU 跑几周,成本根本不可接受。

正解QAT 只需要少量训练步数(通常几百到几千步),在预训练权重基础上做“适应式”微调。模型绝大部分知识已经写在权重里,QAT 只是让它适应量化噪声。好比大厨不需要重新学做菜,只需要练习用露营厨具几天。实际工程中,几万张图片、单卡几小时就能完成。

为何常见:把“训练”二字看得太重,忽略了“微调”这个前缀,误以为恢复精度等于重新学习任务。

误区QAT 微调之后,模型精度应该 100% 恢复,甚至超过原来的浮点模型,否则就说明 QAT 失败了。

正解QAT 的目标是“接近”原精度,而不是超越。量化本身就是信息有损压缩,那些被四舍五入丢弃的尾数无法凭空找回。能恢复大部分(比如从 80% 回到 96%)已经是优秀表现,极限取决于量化位宽和任务本身的信息冗余度。

为何常见:对信息论下限没有概念,把“恢复精度”误解成“无损修复”,期望脱离理论边界。

误区STE 很简单,就是把梯度原封不动地透传,不做任何处理,照着公式抄就能工作。

正解标准 STE 是近似直通,但实践中通常配梯度截断:当输入超出量化范围时梯度置 0,避免失控的梯度破坏参数。此外还要处理 scale 的尺度匹配问题。好比大厨发现手感已超出量勺量程时,会果断放弃这次反馈而不是硬猜。

为何常见:只记住了“直通”两个字,忽略了边界处理细节,写出的代码在饱和区会产生大量无效更新。

误区QAT 应该让所有层都参与训练,反正梯度都能算,参与层越多恢复效果越好。

正解冻结不敏感层、只训练敏感层是核心策略。全部层参与不仅让训练成本翻倍,还可能破坏已成熟的特征表达,造成“灾难性遗忘”。像大厨不会重练刀工,只练受厨具影响的调味和火候,效果反而更好。

为何常见:陷入“训练得越多越好”的直觉,忽略了过拟合和遗忘风险。

面试题

Q1. QAT 微调的主要目的是什么?

单选题 · easy

  • A.消除模型全部训练数据
  • B.恢复量化造成的精度损失← 正确答案
  • C.大幅增加模型参数量
  • D.替换原有网络结构

答案:B。QAT 字面意思就是“量化感知的微调”,核心目的是让模型在量化模拟环境下接受少量训练,把因量化损失的精度补回来。A 与目的无关,C、D 更是背道而驰——QAT 不增加参数量,也不替换网络结构。

Q2. QAT 中的 STE 技术指的是什么?

单选题 · easy

  • A.标准训练编辑器加速
  • B.直线估计器用于梯度直通← 正确答案
  • C.高效调参优化算法
  • D.大规模数据预训练思想

答案:B。STE(Straight-Through Estimator,直线估计器)解决量化中 round 函数不可导的问题:前向照常走量化,反向把梯度近似为 1 直接透传。标准训练编辑器、调参算法、预训练都是捏造的干扰项。

Q3. QAT 中“伪量化”最准确的理解是什么?

单选题 · easy

  • A.彻底删除所有浮点权重
  • B.只量化输出不做梯度更新
  • C.前向模拟量化反向保留梯度← 正确答案
  • D.使用双精度替代量化计算

答案:C。伪量化的关键在于“模拟”:前向用舍入加缩放模拟 INT8 计算的误差,但权重仍以浮点保存以支持梯度回传。A 说彻底删除浮点权重,B 说不做梯度更新,D 说用双精度替代,都违背了“伪”的本质。

Q4. 量化舍入函数不可导时,STE 的典型做法是什么?

单选题 · mid

  • A.反传时把舍入梯度设为 0
  • B.反传时把舍入梯度近似为 1← 正确答案
  • C.反传时放弃更新所有层参数
  • D.反传时对梯度加入随机噪声

答案:B。round 函数的导数几乎处处为 0,梯度传到这里会直接消失。STE 的解法是用 1 近似其梯度,让梯度“直通”过去。把梯度设为 0 会导致量化层以下全部无梯度,放弃更新或加噪声也都不是标准做法。

Q5. QAT 中冻结不敏感层的主要好处是什么?

单选题 · mid

  • A.提高模型参数量以扩大表达能力
  • B.降低训练成本防止遗忘已有知识← 正确答案
  • C.避免使用任何训练数据加速部署
  • D.让量化噪声均匀传播到每一层

答案:B。不敏感层量化后几乎不损失精度,参与训练只会增加计算量,还可能破坏已有特征。冻结它们是 QAT 省成本的关键。增加参数量、不用数据、传播噪声都不符合 QAT 的设计目标。

Q6. 敏感层分析的典型做法是什么?

单选题 · mid

  • A.逐层单独量化后观察精度损失← 正确答案
  • B.将所有层同时量化后观察效果
  • C.根据层名字的长短判断重要性
  • D.随机选择若干层作为敏感层训练

答案:A。敏感层分析的核心是控制变量——只把某一层量化,其余保持浮点,观察损失变化。所有层一起量化无法定位具体是哪层拖了后腿;按层名长短、随机选择更不可靠。

Q7. QAT 微调的学习率通常与预训练相比如何?

单选题 · hard

  • A.完全相同数值保证训练稳定性
  • B.更大数值快速逼近新的最优点
  • C.小一至两个数量级防止破坏权重← 正确答案
  • D.随机选择数值无需特别设计

答案:C。QAT 的目标是“微调”而非“重新训练”,学习率通常比预训练小 1-2 个数量级,避免大步长把预训练权重彻底冲走。与预训练相同甚至更大,都会破坏已有知识;随机设置则带来不可控的训练波动。

Q8. 关于 QAT 训练步数的正确观点有哪些?

多选题 · mid

  • A.仅需少量步数即可恢复精度← 正确答案
  • B.步数越多精度恢复效果一定越好
  • C.步数过少可能导致恢复不充分← 正确答案
  • D.步数过多可能发生灾难性遗忘← 正确答案

答案:ACD。QAT 只需几百到几千步就能恢复大部分精度;步数过少恢复不足,过多则可能陷入对量化噪声的过拟合,甚至遗忘原有知识。B 说“越多越好”是常见的直线思维误区。

Q9. QAT 微调流程包含哪些环节?

多选题 · mid

  • A.对权重与激活执行伪量化模拟← 正确答案
  • B.使用 STE 技术完成梯度反向传递← 正确答案
  • C.冻结全部参数不做任何梯度更新
  • D.在少量标注数据上做小步训练← 正确答案

答案:ABD。完整 QAT 流程包括:对权重和激活做伪量化模拟,用 STE 完成反向传播,在少量数据上做小步训练。C 说冻结全部参数,那就不叫微调了,精度不会有任何恢复——这正是“冻结所有层”的误区。

Q10. 关于 QAT 量化参数与精度的关系,正确的说法有哪些?

多选题 · extreme

  • A.缩放因子决定量化步长的粗细← 正确答案
  • B.步长过大信息损失严重精度低← 正确答案
  • C.舍入误差无法完全消除只能适应← 正确答案
  • D.训练步数越多量化比特位数越低

答案:ABC。缩放因子就是量化步长,步长越大信息损失越严重;舍入误差是信息有损压缩的固有结果,QAT 只能让模型“适应”它。D 错误——QAT 不改变量化位宽,位宽是部署前设定的常数。