想象边境要塞外有一座著名的“整数关”:守关卫兵只认整数人数。3.7个斥候想要通行,卫兵大手一挥——3人过,0.7人被挡在关外;3.2个斥候过,同样只放3人。这座关卡的规矩,就像深度学习里的“量化”:把连续的浮点数(float32)映射到离散的整数格子(int8),换取更小的存储和更快的速度。 然而问题来了。军队操练(训练)时,将军需要知道“多派0.2人战力涨多少”,好决定调兵方向。可卫兵的回答永远是:“我看不出任何变化,影响是0。”——这正是量化函数的梯度:几乎处处为零。梯度为零,反向传播的军报就传不回去,权重接收不到任何更新信号,模型寸步难行。 危急时刻,军师献上一枚“直通令牌”(Straight-Through Estimator,STE):过关时卫兵依然按整数点兵(前向真实量化),但军师的账本上这样记——“多0.2人就按0.2人记账”(反向把梯度近似为1)。令牌一分为二:严格的门规留给前向,畅通的军报送给反向。模型从此既守得住整数关的规矩,又练得动一身筋骨。这篇文章,就把令牌的前世今生讲给你听。
掌握 STE,你就握住了量化感知训练(QAT)的核心钥匙:让模型在 int8 约束下照样训练、精度不崩,这是把大模型塞进手机和边缘设备的必备技能。
目录
可视化演示
展示STE量化感知训练:前向传播经量化、反向传播STE近似梯度绕过阶梯、QAT相比PTQ的训练收敛,通过交互理解量化梯度不可导的解决之道。
本节配有交互动效(进入视口后自动加载,约 3KB)。
前向传播:量化运算 输入经量化函数映射 量化输出用于前向计算 Y=Q(X) 前向保持量化特性
量化基本概念:整数关的规矩
要塞的“整数关”不是天生就有的。早先部队都用“精兵”——浮点数,每个士兵都能表达3.14159这样的精细战力,但一个 float32 要占32位内存,一万个士兵就得备一万份粮草。后来军需官发明了“整编”:把战士按 int8 编队,每人只占8位,换来四倍的粮草压缩、四倍的急行速度。代价是:队伍不再支持零头,3.7人只能算3人。这座整数关,就是量化函数。
量化在AI里,就是把模型的权重和激活从32位浮点映射到低比特整数。最常见的是“对称量化”:先算出缩放因子 scale,把浮点数除以 scale 归一到整数刻度附近,四舍五入后再乘回 scale。这样得到的值看似浮点、实则已经落在离散格子上,因此称为“伪量化”(fake quantize)——它模拟了量化误差,但为了训练方便仍以浮点表示。
阶梯状的输出曲线暴露了量化的本质:一段水平线对应一个整数输出,任意微小的输入变化都会被抹平。float32 时代的“精兵”想表达多少就表达多少;int8时代的“整编部队”只认整数格子,精度损失因此而生。整数关的规矩很简单:不管你来3.1还是3.9个斥候,过关人数都按3记。省了粮草、快了行军,但变化也被一并抹平——而抹平带来的麻烦,下一节就让将军头疼了。
- 符号约定x 是原始浮点权重,s 是缩放因子,\hat{x} 是量化后的权重
- 归一化除法把浮点数除以缩放因子,归一到整数刻度附近,为取整做准备
- 取整操作round 四舍五入,产生阶梯效应,这是量化函数“抹平变化”的根源
- 乘回尺度将整数刻度乘回 s,得到与原尺度一致的伪量化值
梯度消失困境:传令兵为何全军覆没
将军很快发现了整数关的诡异之处。他派出一队传令兵——反向传播——去打听“我多派0.2个斥候,过关人数能多几个?”传令兵沿着台阶逐级探查,发现站在任何一级台阶的水平段上,迈出一小步还是收回一小步,过关人数都纹丝不动。卫兵摊手:“变化是0。”
传令兵把这个“0“一路传回大营。损失函数对量化权重的梯度,乘上量化函数的导数0,得到对原始权重的梯度也是0。结果就是:权重收到指令”原地不动“,训练陷入死锁。你也许觉得奇怪:量化后数值不变,梯度为0,不是挺合理吗?问题在于——我们要更新的恰恰是”被抹平之前”的原始浮点权重,而它们唯一的更新信号被阶梯函数拦腰截断了。
更麻烦的是,反向传播靠链式法则接力。损失 L 对权重 w 的梯度,等于 L 对量化权重 \hat{w} 的梯度乘以量化函数的导数;中间这个“×0“让整个乘积归零。如果我们跳过量化函数、直接用浮点权重算梯度,得到的更新方向又会和”真实量化后的模型“脱节——相当于将军不看整数关的实际情况凭空调兵,部署时照样崩盘。这就是 QAT 要解决的核心矛盾:前向必须守整数关,反向又必须拿到梯度。传令兵在整数关前全军覆没,部队训练陷入停滞。要么放弃整数关的粮草优势退回浮点,要么找一种方法让军报”绕过”关卡送出去——军师的办法,就是下一节的直通令牌。
- 梯度定义衡量 x 微小变化引起 \hat{x} 变化的比率
- 阶梯水平段量化函数是一段段水平线,水平线上任意点的斜率为0
- 链式法则损失对原始权重的梯度经过量化函数时被乘以0,信号彻底中断
STE核心思想:一块直通令牌
军师的办法说来也简单:既然卫兵看不见0.2人的变化,那就由军师在账本上“假装看见”。他颁布令牌:前向过关,卫兵照旧按整数点兵(严格量化);反向记账,军师按“1比1直通”记录——多0.2人就记0.2人的战力变化。也就是说,把量化函数的导数从0改成1。
这就是 Straight-Through Estimator(直通估计器)。STE 最朴素的版本只有一个思想:前向用真实量化函数,反向把它的导数近似为1。于是梯度信号像穿过透明玻璃一样,从损失一路“直通”到原始浮点权重,权重得以更新。用公式表示:
直觉上,这有点“睁一只眼闭一只眼”:账本和实际兵力并不完全一致。但正是这种近似,给了优化器一个合理的下落方向。权重更新公式变成 w ← w − η·∂L/∂ŵ,这里的 w 是始终以浮点保存的“影子权重”——它从不被真正量化,只是每次前向时被“临时整编”成整数参与运算,更新时又回到浮点。这就是量化感知训练的核心循环。令牌的奥义在于“直通”二字:军报不必被关卡拦截,而是按1比1直接送到大营。梯度有了方向,部队重新动了起来——不过令牌并非万能,它只管传递、不管“传递得对不对”,这才是前向反向分离要解决的事。
- 近似记号竖线右下角的 STE 下标,表示这是 STE 自己定义的“假导数”
- 梯度值把几乎处处为0的真实导数替换为常数1
- 更新公式原始浮点权重按近似梯度下降方向移动
前向反向分离:令牌的两副面孔
令牌之所以管用,在于它有两副面孔,而且绝不同时出场。正面朝卫兵,写着“按整数放行”——前向传播时,权重老老实实走量化函数,得到离散的 \hat{w};背面朝军师,写着“梯度按1记账”——反向传播时,军师假装量化函数是可导的恒等函数,让梯度原样穿过。这种“前向严格、反向直通”的非对称处理,正是 STE 的精髓。
用计算图的语言说:前向走的是“有台阶的路”,反向走的是“无障碍的捷径”。两套账本互不干扰:守关(量化约束)保证了训练时模型“预演”部署时的离散行为;直通(梯度近似)保证了优化器有信号可用。损失对原始权重的梯度,近似等于损失对量化权重的梯度——中间那一步“乘1”,就是令牌的背面。
值得注意的是,这个“1“并不是唯一的写法。实践中更常见的是”截断式 STE“:当 |x| 超过某个阈值 c 时,梯度被截断为0,防止权重”冲出关卡跑丢“。这相当于给令牌加了一道保险:在关卡内畅行无阻,出了关卡立刻失效。这也是为什么很多 STE 实现里会同时出现”直通“和”截断“——它们服务同一个目标:让权重既学得动,又不至于学飞了。门规归门前,军报归账后。前向和反向各走各的路,模型在”离散的约束“与”连续的优化”之间找到了平衡。有了这副令牌,接下来就能排兵布阵,设计完整的 QAT 训练流程了。
- 链式法则损失对原始权重的梯度可分解为两步之积
- 代入直通把量化函数的导数替换为1
- 通路结果反向梯度等于损失对量化权重的梯度,信号畅通、方向可信
QAT训练流程:带令牌的整编练兵
光有令牌还不行,军队得有一套完整的练兵流程。量化感知训练(QAT)就像一次“带令牌的整编练兵”:先让部队在开阔地带练熟战术(浮点预训练),再发下整数关的令牌(插入伪量化节点),然后在“随时可能被点数成整数”的压力下接着练(STE 微调),最后正式整编成 int8 部队(导出权重)。
第一步,预训练一个浮点模型,让模型先学会任务——就像新兵先在无约束环境下掌握基本功。第二步,在需要量化的位置(权重、激活)插入伪量化节点:前向经过“量化+反量化”模拟离散误差,反向由 STE 放行梯度。第三步,正常训练若干 epoch,影子权重持续以浮点更新,量化值跟随变化。伪量化节点的输出在训练时仍是浮点数值,相当于“临时整编”——部队按整数编制操练,但花名册上仍记着每个人的精确功勋。
第四步,训练结束后,把浮点影子权重真正量化成 int8 并序列化到统一模型格式(如 ONNX)。这一步极其关键:训练时伪量化节点输出的还是浮点数,如果直接拿它部署,整数关的规矩就白守了。QAT 的完整链路是“训练即预演,部署即整编”——训练阶段把量化误差纳入损失,部署阶段模型已经在离散状态下“生活”过,精度损失自然小得多。整编练兵最大的好处是“以战代练”:模型在训练时就已经习惯整数关的约束,真到了部署那天,不会因为突然被“砍掉零头”而精度崩盘。这场练兵里,令牌、账本、关卡各司其职,缺一不可。
- 影子权重w_real 全程以浮点保存、不参与量化,是真正被优化的对象
- 近似梯度梯度来自量化权重参与前向计算得到的损失,经 STE 直通
- 更新步长学习率 \eta 控制每步走多远,配合梯度方向完成一次迭代
实践技巧改进:军师修订令牌规则
令牌用久了,军师发现三个新问题。第一,学习率太大,一步跨出去,权重直接冲出量化范围,就像士兵跑出关卡,梯度截断后便再也拉不回来;第二,数据里的离群值会让某些权重梯度巨大,训练剧烈抖动;第三,一上来就上低比特(int4/int8),模型适应不了,损失骤升。
于是军师修订令牌规则。规则一:调低学习率,配合 warmup(学习率预热),让权重在量化区间内“小步慢走”。规则二:梯度截断——把超出量化范围的梯度直接置0,防止权重被推飞。规则三:渐进式量化——先从 float32 逐步降到 int16、int8 甚至 int4,让模型分阶段适应离散约束,而不是一步到位。截断式 STE 的梯度规则可以写成:
除此之外,学界还发展出不少 STE 变体:用可导的软量化函数(如 tanh 近似)替代硬取整,让梯度在边界处平滑过渡;或者给量化后的权重注入均匀噪声,模拟量化误差的同时保持梯度通路。这些变体的目标殊途同归:在“梯度的真实性”和“梯度的可达性”之间找平衡——梯度太“真实”(硬取整)就不存在,太“平滑”(完全替换成连续函数)又会偏离部署时的真实行为。令牌从一块铁牌变成了一套军规:学习率像粮草配给,截断像关卡护栏,渐进量化像分期整编。这些修订没有改变 STE 的核心思想,却让它从“能用”变成了“好用”。
- 分段梯度用分段函数重新定义 STE 的导数,区间边界由 c 划分
- 区间内直通权重在量化范围内,梯度保持为1,学习不受阻碍
- 区间外截断权重越界,梯度置0,防止离群值被继续外推
部署互操作意义:整编部队驰援各方
整编练兵的最后目的,是让部队能以 int8 的轻装编制驰援各方战区。可各战区的军制不同:有的用 PyTorch 练兵,有的用 TensorFlow 布防,还有 ONNX Runtime、TensorRT 等各类推理引擎。若每支军队都按自家番号编组,互相之间根本没法调度。解决之道,是成立“联军司令部”——统一模型格式。
QAT 训练得到的量化模型,连同缩放因子、零点等量化参数,一起序列化进标准格式(如 ONNX),形成一份“通用军令”。任何框架只要读懂这份军令,就能加载并运行同一个 int8 模型。这就是“模型格式与序列化”在量化链路中的角色:STE 让训练产出“可靠的离散权重”,序列化让这些权重“可搬运、可互操作”。
压缩带来的收益立竿见影:存储空间缩小到 1/4,内存带宽消耗同比下降,推理延迟显著降低。在手机、摄像头、汽车芯片等资源受限的边缘设备上,这是把大模型“塞进去”的关键一步。而这一切的前提,是训练阶段 STE 把权重训练成了“天生适合离散”的样子——否则直接后量化,精度往往断崖式下跌。从整数关的令牌,到联军司令部的统一军令,一个量化模型完成了它从训练到部署的完整旅程。STE 像是整个链条上最不起眼却最关键的一环:没有它,前向再守规矩,反向也无路可走。守规矩的前向,畅行无阻的反向——这枚小小的令牌,就是量化时代的通行证。
- 位宽对比32 是 float32 的位数,b 是量化后的位数
- 存储收益权重文件大小与位宽成正比,压缩率即存储缩减倍数
- 推理收益更少的内存搬运带来更低延迟与能耗,推理速度近似反比于位宽
AI 应用场景
场景1:安防摄像头的目标检测模型端侧部署
阶段:模型压缩与部署推理
解决的问题:传统方式下,训练好的 YOLO 检测模型是 float32,约120MB,边缘摄像头设备只有2GB内存,推理一帧要30ms。若直接训练后量化(PTQ),精度从 mAP 0.72 掉到 0.58,无法商用。QAT 用 STE 在训练阶段就让模型适应 int8,精度几乎无损。
具体案例:某安防公司用 PyTorch 对 YOLOv5 做 QAT:在权重和激活后插入伪量化节点,反向用 STE 直通梯度,微调5个 epoch 后导出 int8 ONNX。模型从120MB压缩到30MB,单帧推理从30ms降到12ms,mAP 仅下降0.02。算法工程师把同一份 ONNX 部署到海思、瑞芯微等多个平台,无需重训。
场景2:端侧大语言模型的4bit权重量化
阶段:模型训练与微调
解决的问题:7B 大语言模型的 fp16 权重占14GB,手机端根本放不下。把权重压到4bit(压缩4倍)后,若不做 QAT,模型生成质量严重退化;用 STE 微调让注意力层权重在4bit约束下继续学习,困惑度显著回稳。
具体案例:某团队对端侧对话模型做4bit QAT:只有“注意力层+全连接层”的权重走伪量化,其余层保持浮点;学习率降到原值的1/10,训练3个 epoch 后导出。最终模型从14GB压到3.5GB,能在手机本地运行,首token延迟从云端往返的800ms降到本地120ms,回答质量与 fp16 基本持平。
场景3:跨框架模型互操作的统一格式
阶段:模型序列化与交付
解决的问题:传统方式下,算法团队用 PyTorch 训练,部署团队用 TensorRT,双方常因框架差异反复转换模型,量化参数(scale/zero-point)在转换中丢失,精度莫名下降。QAT 产出的模型把量化参数一并写入 ONNX,任何框架按标准解析即可。
具体案例:某云厂商建立“训练→序列化→推理”流水线:PyTorch 中完成 QAT,导出带 QDQ 节点的 ONNX(内含量化参数描述),ONNX Runtime 与 TensorRT 都能直接加载。模型交付周期从两周缩到两天,跨框架数值误差从5%降到0.1%以内。
Python 演示
import numpy as np np.random.seed(42) def quantize_round(x, bits=8): """对称量化: 浮点 -> int -> 浮点""" scale = np.max(np.abs(x)) + 1e-8 xq = np.clip(np.round(x / scale), -(2 ** (bits - 1)), 2 ** (bits - 1) - 1) return xq * scale def fake_quantize(x, bits=8): """STE 伪量化层: 前向=量化值, 反向梯度直通为1""" xq = quantize_round(x, bits) return x + (xq - x) # PyTorch 中写作 x + (xq - x).detach() def train(X, y, use_ste=True, bits=8, epochs=150, lr=0.05): """用梯度下降训练带量化约束的线性模型""" w = np.random.randn(X.shape[1]) b = 0.0 losses = [] for _ in range(epochs): if use_ste: wq = fake_quantize(w, bits) else: wq = quantize_round(w, bits) y_pred = X @ wq + b loss = np.mean((y_pred - y) ** 2) losses.append(loss) grad_w = (2 / len(y)) * X.T @ (y_pred - y) grad_b = (2 / len(y)) * np.sum(y_pred - y) if use_ste: w -= lr * grad_w else: w -= lr * np.zeros_like(grad_w) b -= lr * grad_b return losses if __name__ == "__main__": d = 4 X = np.random.randn(300, d) true_w = np.array([0.5, -1.2, 2.3, 0.8]) y = X @ true_w + 0.1 * np.random.randn(300) loss_ste = train(X, y, use_ste=True) loss_naive = train(X, y, use_ste=False) print("STE 训练后损失: %.4f" % loss_ste[-1]) print("无STE 训练后损失: %.4f" % loss_naive[-1]) assert loss_ste[-1] < loss_naive[-1] print("STE 让量化模型真正学会了任务")
scale = np.max(np.abs(x)) + 1e-8动态计算缩放因子,加极小值防止除零xq = np.clip(np.round(x / scale), -(2 ** (bits - 1)), 2 ** (bits - 1) - 1)归一、取整、截断三步完成整数化return x + (xq - x)STE 的核心一行:前向数值等于 xq,反向导数等于1if use_ste: wq = fake_quantize(w, bits)STE 模式下用“伪量化”前向,模拟部署时的离散约束grad_w = (2 / len(y)) * X.T @ (y_pred - y)均方损失对权重的解析梯度,数学上与无量化时一致if use_ste: w -= lr * grad_wSTE 下影子权重正常更新,这是训练能继续的关键else: w -= lr * np.zeros_like(grad_w)无 STE 时量化导数为0,权重冻结,模型学不动assert loss_ste[-1] < loss_naive[-1]用断言验证 STE 确实让量化模型学会了任务
常见误区
误区我看到 STE 公式里导数是1,以为它就是“把 round 换成 y=x”——训练时不再量化,部署时再偷偷量化一次,反正训练时没约束。
正解前向依然是严格的量化/取整操作,只有反向传播时把导数近似为1。前向的量化约束确保模型“习惯”离散取值;反向的直通只是让梯度信号能流过去。二者缺一不可:缺了前向量化,训练时的权重分布和部署时的离散状态完全脱节,精度会崩。
为何常见:STE 的公式只写了“导数=1”,初学者容易把“导数”误解为“函数本身”,于是以为整个函数都变成恒等映射。
误区“把梯度每一层都乘1,那梯度不就越传越大?训练一定不稳,数学上肯定有 bug。”
正解梯度系数1是“乘法系数”而不是“加法项”,它不会自我放大。乘以1只是让梯度“原样通过”,既不放大也不衰减。真正危险的是输入离群导致损失本身的梯度巨大,所以实践中会配合梯度截断、学习率调小等技巧来保护训练。
为何常见:混淆了“梯度的传播系数”与“梯度的数值大小”两个概念,把系数1误当成每层都在给梯度加1。
误区“训练完了模型还是浮点权重,我直接拿它部署不就行了?反正它已经学过量化了。”
正解训练结束后必须把浮点影子权重真正量化为 int8 并序列化到统一格式(如 ONNX),推理时加载的是整数权重。训练时伪量化节点输出的只是“模拟量化”的浮点值,STE 只是让训练过程预演量化损失,部署环节的真实量化与格式转换一步都不能省。
为何常见:伪量化节点输出的数值看起来还是浮点,初学者误以为“量化”只是训练时做做样子,没意识到部署时的整数表示才是终点。
误区“STE 号称直通,怎么又截断?截断不就是把梯度又变成0了吗?那直通还有什么意义?”
正解不矛盾。截断式 STE 是“区间内直通(梯度1)、区间外截断(梯度0)”:权重落在合法量化范围内时梯度畅通,只有跑到量化范围外才把梯度置0,防止权重被推到部署时根本用不上的取值区域。截断是保护机制,不是推翻 STE。
为何常见:把 STE 的各种变体当成“另起炉灶的方法”,没有理解它们都是在 STE 框架内对梯度规则做的局部改良。
误区“QAT 不就是模型训练完再压缩一下吗?我早就做过 PTQ,一回事。”
正解训练后量化(PTQ)是后处理,权重不再更新,直接拿浮点模型去量化,精度损失不可控;QAT 则把量化误差融入训练目标,用 STE 让权重在离散约束下持续更新,训练出的模型“天生适合”量化。QAT 精度通常显著优于 PTQ,代价是需要重训或微调。
为何常见:两者名字里都有“量化”,且 PTQ 流程更简单、接触得更早,初学者容易把 QAT 想成“PTQ 的另一个名字”。
面试题
Q1. STE 在反向传播中如何近似量化函数的梯度?
- A.让梯度保持为零
- B.让梯度近似为一← 正确答案
- C.把梯度设为无穷大
- D.把梯度设为学习率
答案:B。量化函数是阶梯函数,真实导数几乎处处为0;STE 的核心正是把中间导数“替换”为1,让梯度信号直通回原始浮点权重。A 是无 STE 时的困境,C 会破坏数值稳定,D 混淆了学习率与梯度的概念。
Q2. 量化函数 round(x) 在绝大多数输入点上的导数是?
- A.该处梯度为零← 正确答案
- B.该处梯度为一
- C.该处梯度为半点
- D.该处梯度无定义
答案:A。阶梯函数的水平段斜率处处为0,只在整数跳变点不可导;单个跳变点的测度为0,可以忽略。B 是 STE 的近似值而非真实导数,C 没有依据,D 只说对了孤立点、不构成“绝大多数”。
Q3. STE 中,前向传播使用的是哪个操作?
- A.使用恒等映射
- B.真实量化取整← 正确答案
- C.使用线性插值
- D.用随机舍入法
答案:B。STE 的“直通”只发生在反向,前向仍是严格的量化/取整操作,模型才能在训练时预演部署约束。A 把 STE 误当成完全恒等,C 和 D 属于变体或正则手段,不是标准 STE 的前向行为。
Q4. STE 训练中“影子权重”指的是?
- A.量化后的整数权重
- B.浮点保存更新的原权重← 正确答案
- C.梯度历史的缓存副本
- D.损失函数的计算数值
答案:B。影子权重就是始终以 float32 保存、接收 STE 梯度更新的原始权重;每次前向时它被临时量化成整数参与运算,更新时回到浮点。A 是量化值本身,C 和 D 与影子权重的定义无关。
Q5. 为防止 STE 训练中权重被推出量化范围,常用手段是?
- A.梯度截断防越界← 正确答案
- B.增大学习率数值
- C.移除所有量化层
- D.重新随机初始化
答案:A。截断式 STE 在 |x|>c 时把梯度置为0,相当于给权重加护栏,防止越界外推。B 会让越界更严重,C 违背量化初衷,D 与防止越界无关。
Q6. 关于截断式 STE,下列说法正确的是?
- A.区间内为零区间外为一
- B.区间内为一区间外为零← 正确答案
- C.任意位置梯度都为一
- D.任意位置梯度都为零
答案:B。截断式 STE 对 |x|≤c 的权重直通梯度1,对越界权重截断为0,防止离群权重被继续推远。A 把条件写反了,C 是纯 STE 而非截断式,D 等于完全没有 STE。
Q7. QAT 训练结束导出模型时,对权重的正确处理是?
- A.直接导出浮点权重
- B.真实量化并序列化← 正确答案
- C.丢弃权重重新预训练
- D.只导出梯度不导权重
答案:B。训练中的伪量化只是“模拟”,权重仍是浮点;部署前必须真正量化为 int8,连同 scale/zero-point 序列化进统一格式(如 ONNX)。A 会导致部署仍耗浮点资源,C 和 D 没有工程意义。
Q8. “前向量化 + 反向直通”的 STE 会产生哪些效果?
- A.前向模拟部署离散约束← 正确答案
- B.反向保留梯度更新信号← 正确答案
- C.训练损失必然收敛零
- D.权重适应量化后分布← 正确答案
答案:ABD。前向量化让模型“预演”离散行为(A),反向直通让梯度可达(B),长期微调让权重适应离散分布(D)。C 过于绝对,STE 只保证梯度通路,不保证损失必然收敛到零。
Q9. 关于 QAT 标准流程,下列说法正确的有?
- A.先在浮点模型上预训练← 正确答案
- B.训练时插入伪量化节点← 正确答案
- C.训练完无需真实量化
- D.部署转统一格式序列化← 正确答案
答案:ABD。先预训练(A)再插入伪量化节点(B)是 QAT 的常见顺序;训练结束后必须把影子权重真实量化为 int8(C 错误),并序列化为统一格式(D)供各推理框架加载。
Q10. 下列哪些属于实践中改进 STE 的常见手段?
- A.调整学习率适配量化噪声← 正确答案
- B.使用梯度截断防止越界← 正确答案
- C.放弃量化改回浮点训练
- D.渐进量化逐步降低位宽← 正确答案
答案:ABD。调低学习率、梯度截断、渐进式量化都是 QAT 实践中的成熟技巧,它们让 STE 从“能用”变“好用”。C 等于放弃整个量化方案,与题目问的“改进 STE”背道而驰。