设想你明天要坐飞机出差,但航空公司规定:每人只能带一件小登机箱上飞机,大行李箱必须托运且可能延误丢失。大箱子能自由装下所有衣物和书籍,小箱子却只有四分之一的空间。大模型要跑进手机,正面临同样的困境:模型参数原本用 FP32(4 字节)存放,像个大箱子;手机芯片却只给得起 INT8(1 字节),像个小登机箱。一种做法是把东西都装进大箱子,到了安检口才硬塞进小箱子(PTQ),结果衣服皱了、杯子碎了、精度掉了;另一种做法是出发前就拿着小箱子反复演练,每次装包都模拟一遍安检的挤压,让物品学会在受限空间里依然完好(QAT),最后上了飞机一切井井有条。这篇文章将带你完整认识 QAT 量化感知训练:它的核心原理、训练流程、在移动 NPU 上的适配要点、与 PTQ 的精度差距,以及端侧推理的提速技巧——当你面对“端侧 LLM 量化后精度不达标”时,手里便多了一张清晰的修复路线图。

岗位关联

掌握 QAT,你就能在端侧 LLM 精度不达标时,用一条成熟的训练路径把精度抢救回来,从“勉强能部署”走向“部署得又快又准”——这是大模型端侧优化工程师的必修课。

目录
  1. 可视化演示
  2. 量化基础:从大箱子到小登机箱
  3. PTQ 的局限:到了机场才硬塞
  4. QAT 核心原理:带着小箱子练打包
  5. QAT 训练流程:请老手打底再演练
  6. 移动 NPU 适配:读懂安检规则
  7. QAT 与 PTQ 对比:开箱见真章
  8. 端侧推理优化:轻装上阵跑得快
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示QAT伪量化训练流程、QAT与PTQ精度对比,以及Q/DQ算子融合部署优化,揭示量化感知训练如何恢复端侧LLM精度。

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

'+_captions.qat+'

量化基础:从大箱子到小登机箱

旅行打包时,大箱子能装下小登机箱四倍的东西。模型世界同样如此:一个 FP32 浮点数占 4 字节,同样的参数用 INT8 整数只占 1 字节,内存占用直接缩到四分之一。这是量化最直观的收益——你只需要搞懂“怎么把浮点数塞进整数,还要尽量少损失信息”。

装箱需要两样工具:一把刻度尺和一个对齐原点。量化里对应的两个参数叫缩放因子 scale(刻度)和零点 zero_point(原点)。把 0.35 这样的浮点数换算成 3 这样的整数,靠的就是这两个参数。整个过程简单得像“厘米换英寸”:先量出长度,再按刻度取整。理解了这个换算,你就握住了打包小箱子的第一把钥匙。

量化就是用整数去“就近表示”浮点数:q 是量化后的整数,r 是原始浮点值,s 决定每个格子多宽,z 负责把数值范围对齐到整数网格。部署时再反量化回近似值 r̂。r̂ 和 r 之间的差,正是后面所有精度故事的源头——PTQ 的精度损失、QAT 的精度恢复,全部围绕这一小段误差展开。

理解了尺子和原点,你就看清了小登机箱的构造:箱子再小,能装的格子也就 255 个(INT8)。接下来我们会看到,不演练的人(PTQ)会把东西硬塞进去,而演练过的人(QAT)会从一开始就考虑每件物品在格子里的摆放方式。

q=round(r−zs),r^=s×q+zq = \mathrm{round}\left(\frac{r - z}{s}\right),\qquad \hat{r} = s \times q + z
量化就是先用刻度尺把连续的浮点数“钉”到最近的整数格子上,部署时再乘回刻度还原成近似值——注意,还原值 r̂ 并不等于原值 r,中间的差距就是量化误差。
  1. 量化映射 q浮点数 r 先减去零点 z,除以刻度 s,再就近取整——就像把物品按刻度尺压进小箱子的格子里。
    q=round(r−zs)q = \mathrm{round}\left(\frac{r - z}{s}\right)
  2. 反量化还原 r̂部署时把整数 q 乘回刻度 s,再加回零点 z,得到近似浮点数。r̂ 与 r 的偏差就是“装箱挤压”留下的皱痕。
    r^=s×q+z\hat{r} = s \times q + z

PTQ 的局限:到了机场才硬塞

PTQ 的做派,就像那位到了安检口才硬塞箱子的旅行者:模型已经在大箱子(FP32)里训练完毕,权重分布、激活形态全部定型,此时才把它强行压进 INT8 小箱。省事是真省事——不需要训练,只需用少量数据统计数值范围即可完成转换,几乎不消耗算力,所以它成了部署流程默认的第一选择。

但硬塞的代价同样直接:衣服皱了、瓶子碎了。在端侧 LLM 上,PTQ 最常见的“翻车点”是激活值里的离群值——个别特别大或特别小的数。这些离群值会把刻度尺 s 撑得很大,箱子里 255 个格子被拉得极宽,绝大多数正常数值只能挤在寥寥几个粗格子里,量化误差被成倍放大,模型精度自然暴跌。

数学上,这个损伤可以写成量化误差公式:反量化值 r̂ 减去原始值 r。误差的大小主要由格子宽度 s 主导——s 越大,误差越大;而 s 又由数值范围决定,离群值越多,s 越失控。这也是为什么 LLM 这类激活分布“肥尾”的模型,比传统 CNN 更容易在 PTQ 上掉精度。

于是问题清晰了:硬塞不是不能塞,而是塞完之后东西会不会坏。PTQ 图快,QAT 图稳。当端侧精度验收不通过时,你就需要换一种从头到尾都想着“小箱子”的训练方式——下一节的主角 QAT 正式登场。

ε=r^−r=s×round(r−zs)+z−r\varepsilon = \hat{r} - r = s \times \mathrm{round}\left(\frac{r - z}{s}\right) + z - r
量化误差 ε 就是“硬塞”造成的损伤量:round 取整丢掉了余数,而取整的“粒度”正是 s——格子越粗,丢得越多。
  1. 量化误差 ε反量化后拿到的值 r̂ 与原始浮点值 r 之差,是每一次“硬塞”留下的具体损伤。
    ε=r^−r\varepsilon = \hat{r} - r
  2. 误差来源代入反量化表达式后可见,误差来自 round 取整丢掉的余数,取整粒度由 s 决定;离群值把 s 撑大,误差随之放大。
    ε=s×round(r−zs)+z−r\varepsilon = s \times \mathrm{round}\left(\frac{r - z}{s}\right) + z - r

QAT 核心原理:带着小箱子练打包

聪明的旅行者不会到了机场才硬塞,而是出发前就拿着小登机箱反复演练:每次装包都模拟一遍安检挤压,哪个位置容易碎、哪件衣服该卷起来,了然于胸。QAT 就是这个思路——训练时就带上“小箱子”,让模型在权重和激活的每一次前向计算中,都亲身体验 INT8 量化带来的变形。

实现这个“模拟挤压”的装置叫伪量化节点(Fake Quant)。它做的事是:先量化(取整)再反量化(乘回刻度),把“实际会被压坏的样子”呈现在前向传播里。模型看到自己的输出会变成什么样子,就会主动调整参数,让量化后的结果依然可靠。注意:训练阶段它只是“模拟”,并不会真的把权重存成整数,所以叫“伪”量化。

这里冒出一个数学难题:取整函数 round 的导数几乎处处为 0,按标准反向传播,梯度会在伪量化节点处“灭绝”,模型完全无法学习。QAT 用直通估计(STE, Straight-Through Estimator)化解:反向传播时干脆把取整这一步当成恒等映射,让梯度像滑滑梯一样顺畅流过伪量化节点。这是一种近似,但实践中异常有效,是 QAT 能跑起来的基石。

带着小箱子练打包的成果,是模型对“挤压”产生了抗性——这正是 PTQ 模型所欠缺的。但演练讲究方法和顺序,下一节我们就走进完整的 QAT 训练流程。

r^=s×clamp(round(r/s),  qmin⁡,  qmax⁡)\hat{r} = s \times \mathrm{clamp}\big(\mathrm{round}(r / s),\; q_{\min},\; q_{\max}\big)
∂L∂r≈∂L∂r^\frac{\partial L}{\partial r} \approx \frac{\partial L}{\partial \hat{r}}
前向传播经过“量化→限幅→反量化”三连击,模型看清了真实的损伤;反向传播则用 STE 让梯度绕过取整节点,继续更新权重——一个负责“看得清伤”,一个负责“走得通路”。
  1. 前向伪量化先按刻度取整,再用 clamp 限定在 INT8 可表示范围内,最后乘回刻度——前向传播携带的是“真实受损”的数值。
    r^=s×clamp(round(r/s),  qmin⁡,  qmax⁡)\hat{r} = s \times \mathrm{clamp}\big(\mathrm{round}(r / s),\; q_{\min},\; q_{\max}\big)
  2. 反向 STE 直通round 的梯度几乎处处为 0,直接用损失对输出 r̂ 的梯度近似损失对输入 r 的梯度,让训练信号顺畅通过伪量化节点。
    ∂L∂r≈∂L∂r^\frac{\partial L}{\partial r} \approx \frac{\partial L}{\partial \hat{r}}

QAT 训练流程:请老手打底再演练

没有人从零开始学打包:你先请一位打包老手把大部分工作做好,再只针对“小箱子”这个约束做精修。QAT 的第一步正是加载在海量数据上训练好的 FP32 模型——它的知识绝大部分可以直接继承,你不需要从头训练,只需要在量化的约束下做针对性微调。

第二步是在网络中插入伪量化节点,放置位置很有讲究:权重路径要插,激活路径也要插,因为推理时两者都会经历量化,缺一条都会让“演练环境”失真。第三步是用很小的学习率微调——通常取预训练学习率的 1/10 到 1/100。步子必须小,否则演练过程中会把老手的经验(预训练知识)甩丢,出现灾难性遗忘。

第四步是可选但强烈推荐的辅助手段:知识蒸馏。让 FP32 教师模型在旁边“言传身教”,量化学生模型每输出一步都向教师的输出分布对齐。老手逐字纠错,新人在约束下既守住任务指标,又保持生成风格——LLM 场景下,这招对恢复对话质量和文本流畅度尤其有效。整体损失由任务损失和蒸馏损失加权组合而成。

演练完毕,打包技能不再依赖大箱子,但能不能顺利登机,还取决于“航空公司”(移动 NPU 芯片)的规则——这就是下一节要解决的适配问题。

L=α⋅LCE(y, y^)+(1−α)⋅KL(pteacher ∥ pstudent)\mathcal{L} = \alpha \cdot \mathcal{L}_{\mathrm{CE}}\big(y,\, \hat{y}\big) + (1 - \alpha) \cdot \mathrm{KL}\big(p_{\mathrm{teacher}} \,\|\, p_{\mathrm{student}}\big)
训练目标分两路:一路对真实标签负责(交叉熵),一路对教师模型负责(KL 散度)——既盯住任务本身,又跟着老手校准输出风格。
  1. 任务损失学生模型在真实标签上的交叉熵,保证量化后的模型不偏离任务本身。
    α⋅LCE(y, y^)\alpha \cdot \mathcal{L}_{\mathrm{CE}}\big(y,\, \hat{y}\big)
  2. 蒸馏损失用 KL 散度拉近学生与教师输出的概率分布,相当于老手在演练时逐字纠正动作。
    (1−α)⋅KL(pteacher ∥ pstudent)(1 - \alpha) \cdot \mathrm{KL}\big(p_{\mathrm{teacher}} \,\|\, p_{\mathrm{student}}\big)

移动 NPU 适配:读懂安检规则

同样是小登机箱,不同航空公司对尺寸、重量、摆放方式的规定各不相同。移动端 LLM 的“航空公司”是各类 NPU 推理引擎:高通、联发科、昇腾等平台的 INT8 算子在格式要求上各有偏好,QAT 产出的模型如果不按规则打包,到了部署环节就会被拒之门外,或被迫走低效的降级路径。

最常见的规则是对称量化:许多移动 NPU 的整数算子要求零点固定为 0,只保留 scale 一个参数。这意味着训练时插入的伪量化节点最好也用对称形式,否则训练和推理的“模拟挤压方式”不一致,精度对齐会出现偏差。另一个关键规则是统计粒度:权重多用 per-channel(每个通道一把自己的尺子),激活多用 per-tensor(整层共用一把尺子),QAT 训练时必须与推理引擎的粒度保持一致。

此外还有算子融合——把卷积、归一化、激活等一串算子熔成一个算子,减少中间结果反复进出内存。这相当于把随身物品折叠成统一规格的模块,不占额外空间。融合后的模型在 NPU 上不仅能跑得通,更能跑得快。对称量化的公式如下:

读懂安检规则,你的小登机箱才能真正登机。而登机之后的实际表现——和不演练的旅行者相比到底差多少——正是下一节要揭晓的对比环节。

q=round(rs),s=max⁡∣r∣2b−1−1q = \mathrm{round}\left(\frac{r}{s}\right),\qquad s = \frac{\max |r|}{2^{b-1} - 1}
对称量化把零点直接归零,只剩一把刻度尺;刻度 s 由绝对值最大的数决定。芯片只需做一次乘加,硬件最省事,这也是 NPU 偏爱它的原因。
  1. 对称量化零点固定为 0,正负范围对称分布,公式里不再出现 z,硬件实现最简单。
    q=round(r/s)q = \mathrm{round}(r / s)
  2. 刻度 s由所有数值的绝对最大值决定,b=8 时即除以 127,把浮点范围均匀分成 255 格。
    s=max⁡∣r∣2b−1−1s = \frac{\max |r|}{2^{b-1} - 1}

QAT 与 PTQ 对比:开箱见真章

两个旅行者同样拎着小登机箱走下飞机,开箱检查的一瞬间,演练与否一目了然:硬塞者的东西东倒西歪,演练者的物品井井有条。在移动芯片上跑端侧 LLM,PTQ 与 QAT 的精度对比就是这个“开箱瞬间”。实测经验大致是:PTQ 转换快(分钟级到小时级),但 INT8 甚至更低比特下,LLM 精度可能掉 3~8 个百分点,多轮对话、长文本等复杂场景掉得更狠。

QAT 则需要准备少量训练数据、跑一轮针对性微调,成本是 GPU 机时和数小时到数天的时间,但通常能把精度拉回到接近 FP32 的水平——在意图识别、关键词提取等任务上,QAT 相对 PTQ 往往能挽回 5 个点以上。选型指南一句话:先 PTQ 快速试水,验收不达标再上 QAT,省下的训练成本就是你的交付周期。

为什么 QAT 效果更好?可以用一个经典结论解释:在均匀量化假设下,量化噪声的方差约等于 s²/12。也就是说,误差水平与格子宽度 s 的平方成正比。QAT 训练让权重和激活的分布“主动适应”量化格子,离群值被压制、scale 变小且稳定,噪声功率自然下降;而 PTQ 的 s 被离群值绑架,噪声早已失控。

至此选型思路已经清晰:PTQ 是成本优先的“快试”,QAT 是精度优先的“救命招”。最后一步,是让量化后的模型在端侧真正跑出速度——这是我们下一节要谈的推理优化。

E[ε2]=s212\mathbb{E}[\varepsilon^2] = \frac{s^2}{12}
量化噪声的“能量”与格子宽度 s 的平方成正比。QAT 把 s 练小了,噪声能量就显著下降——这就是它精度更高的数学底气。
  1. 量化噪声功率均匀量化假设下,量化误差的方差近似为格子宽度平方除以 12——格子越粗,噪声越大。
    E[ε2]=s212\mathbb{E}[\varepsilon^2] = \frac{s^2}{12}
  2. 噪声与 s 的关系误差的均方根为 s 除以 √12;QAT 让分布贴合量化格子,scale 更小,噪声随之显著下降。
    εrms=s12\varepsilon_{\mathrm{rms}} = \frac{s}{\sqrt{12}}

端侧推理优化:轻装上阵跑得快

小登机箱不仅装得下,还省力:更轻的箱体、统一的轮距,让你在机场一路小跑都不累。INT8 模型在手机上的效果正是如此——体积小、内存压力小、推理速度快,这也是移动 LLM 部署追求的终点。

核心收益来自两个量化红利:一是模型体积降为约四分之一(4 字节变 1 字节),二是内存带宽需求锐减。LLM 是典型的带宽密集型任务,生成每个 token 都要把权重从内存搬进计算单元,权重瘦身直接缩短“搬运”耗时。理论上当推理完全受限于内存搬运时,最大加速比约等于 4 倍;考虑算子开销和碎片化内存访问,端到端通常实测 2~4 倍加速,同时功耗明显下降。

想把这些红利全部拿满,还需要配合优化技巧:算子融合减少中间张量读写、权重重排(按 NPU 偏好的布局排布)提高缓存命中、KV Cache 使用低比特缓存降低显存占用。移动端 QAT 项目最终落地效果,往往取决于这些“最后一公里”的工程细节——演练得好,还要跑得省。

至此,你用 QAT 完成了从“硬塞”到“演练”的转变:模型既小、又快、又准。带着这个高质量的“小登机箱”,端侧 LLM 终于可以在手机上优雅地安家了。

Sint8=Sfp324,Speedupmax⁡≈Mfp32Mint8=4S_{\mathrm{int8}} = \frac{S_{\mathrm{fp32}}}{4},\qquad \mathrm{Speedup}_{\max} \approx \frac{M_{\mathrm{fp32}}}{M_{\mathrm{int8}}} = 4
参数从 4 字节变 1 字节,内存搬运量降为四分之一;在带宽受限的 LLM 推理中,理论上最多获得接近 4 倍的加速。
  1. 体积减四倍每个参数从 4 字节变 1 字节,模型文件大小约为原来的四分之一。
    Sint8=Sfp324S_{\mathrm{int8}} = \frac{S_{\mathrm{fp32}}}{4}
  2. 带宽加速上界内存搬运量降为四分之一,带宽受限场景下加速比理论上最多约 4 倍,实测端到端通常为 2~4 倍。
    Speedupmax⁡≈Mfp32Mint8=4\mathrm{Speedup}_{\max} \approx \frac{M_{\mathrm{fp32}}}{M_{\mathrm{int8}}} = 4

AI 应用场景

端侧语音助手意图识别精度恢复

阶段:模型量化与部署优化

解决的问题:传统做法是直接 PTQ 把 7B 对话模型压成 INT8 部署到手机 NPU,结果意图识别准确率从 92% 掉到 86%,多轮追问场景频繁答非所问。QAT 通过在少量对话数据上插入伪量化节点微调,让模型在量化约束下重新学会判别,精度拉回 91% 以上。

具体案例:某智能助手团队定位到激活离群值放大了量化噪声,采用 QAT + 知识蒸馏组合:FP32 教师模型在线指导量化学生模型,3 天微调后精度恢复至 91.2%,首 token 延迟因 INT8 反而下降 55%,用户投诉率明显回落。

嵌入式端侧内容审核模型误报整治

阶段:数据准备与模型微调

解决的问题:端侧违规文本检测 LLM 运行在低内存设备上,PTQ 后对谐音、变体词的召回率下降,误报率升高。QAT 结合小批量领域数据微调,让量化模型重新学会“在整数世界里识别变体攻击”,显著降低误报。

具体案例:某社区产品的端侧审核模块,用 QAT 对量化后的 3B 模型做了 1 万条难例微调,误报率从 18% 降到 6%,同时每千次推理耗电下降约 40%,审核响应依旧维持在毫秒级。

Python 演示

python47 行
import numpy as np N, DIM = 200, 8np.random.seed(42)X = np.random.randn(N, DIM)w_true = 2.0 * np.random.randn(DIM)y = X @ w_true + 0.05 * np.random.randn(N)  def fake_quant(x, bits=4):    """伪量化: 前向模拟量化误差, 返回反量化后的近似值"""    qmax = 2 ** (bits - 1) - 1    qmin = -2 ** (bits - 1)    s = np.max(np.abs(x)) / qmax    if s == 0:        return x    return np.clip(np.round(x / s), qmin, qmax) * s  def mse(pred, target):    return float(np.mean((pred - target) ** 2))  def train(quantize=False, epochs=80, lr=0.08):    w = np.random.randn(DIM) * 0.1    for _ in range(epochs):        if quantize:            w_q = fake_quant(w)            grad = 2 * (X @ w_q - y) / N            w -= lr * (X.T @ grad)      # STE: 梯度直通伪量化节点        else:            grad = 2 * (X @ w - y) / N            w -= lr * (X.T @ grad)    return w  def evaluate(w, quantize=False):    w_use = fake_quant(w) if quantize else w    return mse(X @ w_use, y)  if __name__ == "__main__":    w_fp = train(quantize=False)    w_qat = train(quantize=True)    print("PTQ(FP32训练后直接量化) MSE: %.4f" % evaluate(w_fp, quantize=True))    print("QAT(训练时模拟量化)     MSE: %.4f" % evaluate(w_qat, quantize=True))    print("FP32基线 MSE: %.4f" % evaluate(w_fp))
目的:用一个小型线性回归复现 QAT 的核心思想——对比“FP32 训练完再量化(PTQ)”与“训练时就模拟量化(QAT)”两种方式在量化后的误差表现,直观展示 QAT 的精度优势。
  1. s = np.max(np.abs(x)) / qmax对称量化的刻度尺:由绝对最大值决定格子宽度,对应正文中的 s 公式。
  2. return np.clip(np.round(x / s), qmin, qmax) * s伪量化核心:取整、限幅、再乘回刻度,前向模拟真实量化误差。
  3. w_q = fake_quant(w)QAT 前向使用伪量化后的权重做预测,让模型“看见”自己在 INT8 下的表现。
  4. w -= lr * (X.T @ grad)STE 直通:梯度绕过取整函数直接更新原始浮点权重,模拟“滑滑梯”效应。
  5. evaluate(w_fp, quantize=True)模拟 PTQ 场景:把 FP32 训练好的权重直接量化后评估,误差通常明显大于 QAT。

常见误区

误区我以为 QAT 是把模型先转成 INT8,再拿数据微调几轮,跟“量化后的模型做后训练”差不多,顺序无所谓。

正解QAT 的关键在于“训练时就模拟量化”,而不是“量化后再训练”。QAT 全程用 FP32 存储权重,只是前向计算走伪量化节点,让模型在假装自己是 INT8 的条件下学习,训练完才真正导出 INT8。顺序完全不同:一个是带着小箱子练习打包,一个是硬塞完再拆开整理——后者已经救不回损伤。

为何常见:QAT 名字里有“量化”二字,容易让人以为量化发生在训练之前;实际上“量化感知”是训练过程中的一种模拟机制。

误区既然 QAT 精度高,那不管什么模型都直接上 QAT,反正稳赚不赔,何必先试 PTQ。

正解QAT 的成本是训练数据、GPU 机时和更复杂的工程链路。很多小模型、分布稳定的任务用 PTQ 就能通过验收,多花几天做 QAT 纯属浪费。正确姿势是先 PTQ 快速试水,量化后精度不达标再上 QAT 抢救——它像手术刀,不该当日常保健品。

为何常见:只看到“QAT 比 PTQ 精度高”的对比结论,忽略了结论成立的前提是“PTQ 已经不够用”。

误区我给模型做量化,只关心权重变成整数后的误差;激活值是前向算出来的,应该不受影响,不用专门处理。

正解端侧推理时,激活值同样要被量化成 INT8 才能喂给整数算子。LLM 的激活离群值经常是精度杀手——它们把 scale 撑大,导致普通 token 的量化噪声剧增。QAT 必须在权重路径和激活路径都插入伪量化节点,缺一不可,否则演练环境失真,部署时照样掉点。

为何常见:许多入门教程以权重量化为例讲解,让人误以为量化只动权重;实际部署中激活量化同样关键。

误区反正 STE 把 round 当成恒等映射,梯度畅通无阻,那学习率保持预训练水平甚至调大,训练收敛更快。

正解STE 只是梯度近似,不代表取整没有代价。伪量化节点在前向引入了真实误差,近似梯度在误差大、学习率大时会震荡甚至发散。实践中 QAT 要显著调小学习率(通常为预训练的 1/10~1/100),必要时配合 warmup,才能稳定收敛。

为何常见:只记住了“直通”二字带来的乐观想象,忽略了伪量化节点“前向有真实误差”这另一半真相。

面试题

Q1. QAT 训练时在前向传播中插入“伪量化节点”的主要作用是?

单选题 · easy

  • A.让推理时真正执行整数算子运算
  • B.在前向模拟量化误差并让模型适应← 正确答案
  • C.在反向传播阶段直接丢弃小数
  • D.用更大量化数据扩充训练集

答案:B。伪量化节点在前向做“量化→限幅→反量化”,让模型提前体验推理时的数值损伤并学会适应,就像出发前用小箱子演练打包。训练阶段并不真正执行整数算子(A 错),丢弃小数的是取整操作本身而非节点作用(C 错),数据扩充与伪量化无关(D 错)。

Q2. 关于 PTQ(训练后量化),下列说法正确的是?

单选题 · easy

  • A.需要完整重新训练模型才能完成
  • B.精度通常优于 QAT 的量化精度
  • C.仅需少量数据校准且无需训练← 正确答案
  • D.只能量化权重而不能量化激活

答案:C。PTQ 只需少量无标签数据统计数值范围即可完成,不涉及反向传播训练,动作快但粗放,如同到了机场才硬塞箱子。它通常不如 QAT 精度高(B 错),也无需重新训练(A 错),推理时激活同样要量化(D 错)。

Q3. STE 直通估计中近似条件 ∂L/∂r ≈ ∂L/∂r̂ 的实际含义是?

单选题 · mid

  • A.梯度在取整处被强制截断为零
  • B.梯度绕过取整函数直通到输入← 正确答案
  • C.梯度被放大为原来的数倍
  • D.梯度只更新激活不更新权重

答案:B。round 的导数几乎处处为 0,若按标准反向传播梯度会“灭绝”。STE 把取整近似为恒等映射,让梯度像滑滑梯一样绕过取整节点继续更新权重(B 对)。A 正是 STE 要避免的情况,C、D 与近似条件无对应关系。

Q4. 对称量化与非对称量化相比,前者最显著的特点是?

单选题 · mid

  • A.零点固定为零且范围对称← 正确答案
  • B.零点由浮点最小值决定
  • C.每个通道都必须单独统计
  • D.只适合激活值不适合权重

答案:A。对称量化强制零点为 0,正负范围对称,公式里只剩 scale 一个参数,硬件实现最省事,因此被多数移动 NPU 采用。B 描述的零点由最小值决定是非对称量化的特征;C 是 per-channel 粒度的特征,与对称性无关;D 说法不成立。

Q5. QAT 微调阶段通常建议采用的学习率策略是?

单选题 · mid

  • A.与预训练阶段完全相同的学习率
  • B.采用预训练学习率的十分之一量级← 正确答案
  • C.关闭学习率调度器不做任何衰减
  • D.学习率逐步上升以加大更新幅度

答案:B。QAT 是在预训练模型基础上的轻量精修,学习率要显著调小(通常 1/10~1/100),避免大步更新把预训练知识“甩丢”,如同演练时不能推翻老手的经验。A、C、D 都会导致收敛不稳或灾难性遗忘。

Q6. LLM 激活值中的离群值为何会让 PTQ 精度骤降?

单选题 · hard

  • A.离群值撑大刻度使普通值量化粗糙← 正确答案
  • B.离群值直接导致存储溢出内存崩溃
  • C.离群值使零点发生不可逆负向偏移
  • D.离群值导致反向传播梯度全部消失

答案:A。刻度 s 由绝对最大值决定,离群值把 s 撑得很大,255 个量化格子变得极宽,绝大多数普通数值只能挤在少数几个格子里,量化噪声放大(A 对)。B 的溢出崩溃不是普遍现象,C 与零点机制不符,D 中 PTQ 根本不反向传播。

Q7. 端侧移动 NPU 对量化模型的常见约束包括?

多选题 · mid

  • A.权重侧通常要求对称量化格式← 正确答案
  • B.激活侧通常要求浮点存储格式
  • C.依赖算子融合减少内存搬运← 正确答案
  • D.强制要求每层使用不同缩放刻度

答案:AC。多数移动 NPU 的 INT8 算子要求权重侧对称量化(A 对),并通过算子融合减少中间张量读写以发挥加速优势(C 对)。激活侧同样要量化成定点(B 错);“每层强制不同刻度”不是通用约束,NPU 上反而常因硬件限制统一为 per-tensor(D 错)。

Q8. 一次完整的 QAT 训练流程通常包含哪些关键步骤?

多选题 · hard

  • A.加载 FP32 预训练模型作为初始化← 正确答案
  • B.在权重和激活路径插入伪量化节点← 正确答案
  • C.采用小学习率进行针对性微调← 正确答案
  • D.将全部权重还原为 FP32 再部署

答案:ABC。QAT 以 FP32 预训练模型打底(A),在权重和激活路径都插入伪量化节点(B),再以小学习率微调(C),最后导出的是 INT8 权重而非还原回 FP32(D 错)。这四步对应“请老手打底、按小箱子演练、小步精修、登上芯片”的完整链路。

Q9. 与 PTQ 相比,QAT 的特点包括下列哪些?

多选题 · easy

  • A.需要训练数据和反向传播微调← 正确答案
  • B.在移动端 LLM 上精度恢复更强← 正确答案
  • C.完全不需要任何额外训练成本
  • D.量化后体积反而大于原始模型

答案:AB。QAT 需要少量训练数据和一轮反向传播微调(A 对),能把端侧 LLM 量化后的精度拉回接近 FP32 水平(B 对)。它显然有额外的 GPU 机时成本(C 错);量化后模型体积同样约减为四分之一(D 错)。

Q10. 端侧 LLM 使用 INT8 量化推理后可能获得哪些收益?

多选题 · hard

  • A.模型文件体积下降至约四分之一← 正确答案
  • B.内存带宽压力显著降低← 正确答案
  • C.所有算子延迟必然降为四分之一
  • D.精度一定比 FP32 基线更高

答案:AB。INT8 让参数从 4 字节变 1 字节,体积降为约四分之一(A 对);LLM 是带宽密集型任务,权重瘦身直接降低内存搬运压力(B 对)。C 的“必然”过于绝对,算子开销使实际加速通常为 2~4 倍而非精确四分之一;D 错,量化本身会带来精度损失,QAT 只是把损失压到很小,并不会让精度“超过” FP32 基线。