在裁缝铺里,老师傅有一把刻着厘米的旧木尺。给顾客量体时,读到 83.6 厘米,他会记成 84;遇到肩宽 120 的体校生,他不得不把整个刻度看成更大的格子,于是普通人的 40 厘米反而变得模糊。更麻烦的是,量错一厘米,裁剪、缝合、上领口都会跟着歪,最后整件衣服变了形。大模型做量化部署,和这个过程惊人地相似:模型权重和中间激活原本是连续浮点数,量化就像用一把刻度更稀疏的尺子去量它们,于是产生截断误差、舍入误差;个别异常值还会把整把尺子的刻度拉大,让普通数值变得更粗糙。误差还会在一层层网络里传播,越传越明显。聪明的部署工程师会先做量化误差分析,找出哪些层最怕误差,然后给这些层配更精密的“游标卡尺”(高比特),其余层用普通尺子(低比特)。这套思路,就是模型压缩中混合精度量化的起点。本文用这把尺子,带你走一遍量化误差分析的完整旅程。

岗位关联

掌握量化误差分析,能帮你在手机、边缘设备或高并发服务中安全压缩大模型,把显存和延迟降下来,同时守住模型精度——这是部署工程师最值钱的能力之一。

目录
  1. 可视化演示
  2. 量化误差来源
  3. 误差度量指标
  4. 逐层误差传播
  5. 层敏感度评估
  6. 混合精度策略
  7. 部署权衡
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。

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

系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T

量化误差来源

老裁缝量体时,尺子最小刻度是 1 厘米。看到 83.6 厘米,他可能记成 83 或 84。前者叫“截断”,总是把数切向一边,量出来的尺寸系统性地偏小;后者叫“舍入”,靠近哪个刻度就记哪个,误差有正有负。更麻烦的是,店里来了一位肩宽 120 厘米的巨人,为了能量他,老师傅不得不把整条尺子的刻度范围拉宽,结果普通人 40 厘米的肩宽只能对应更粗糙的格子,误差一下子变大。这就是“异常值敏感性”:一个离群点,毁了整把尺子的分辨率。

大模型量化也是同一回事。网络权重和激活原本是连续浮点数,量化把连续值映射到有限个离散等级。设原始值为 \(x\),量化后的值为 \(Q(x)\),误差就是二者之差。均匀量化把数值范围 \([\min, \max]\) 分成 \(2^b-1\) 个间隔,步长 \(\Delta\) 越大,精度越差。如果某个通道出现异常大的权重,\(\max\) 被拉高,所有普通权重都要忍受更大的 \(\Delta\)。这正是低比特量化后模型精度骤降的常见原因。

回到裁缝铺:一段袖子究竟差多少,取决于你“怎么读刻度”(截断还是舍入),更取决于“尺子本身多粗”(异常值是否拉大步长)。误差分析的起点,正是先把这两类问题分开。

e=Q(x)−x,Δ=max⁡(x)−min⁡(x)2b−1\displaystyle e = Q(x) - x, \qquad \Delta = \frac{\max(x) - \min(x)}{2^b - 1}
误差是量化值与原始值的差;步长由数据范围和比特数共同决定。
  1. 量化误差定义量化把连续值 \(x\) 变成有限集合中的 \(Q(x)\),两者相减就是单点误差。
    e=Q(x)−x\displaystyle e = Q(x) - x
  2. 量化步长计算均匀量化把最小值和最大值之间的范围均匀切成 \(2^b-1\) 份,每一份的宽度称为步长。
    Δ=max⁡(x)−min⁡(x)2b−1\displaystyle \Delta = \frac{\max(x) - \min(x)}{2^b - 1}
  3. 误差界初判若采用舍入量化,误差被限制在半步长内;若采用截断量化,误差可达一个完整步长且方向固定。
    ∣e∣≤Δ2(舍入)\displaystyle |e| \le \frac{\Delta}{2} \quad \text{(舍入)}

误差度量指标

一件衣服合不合身,不能只看一个点。老师傅会量肩宽、胸围、袖长、腰围,再把各处的偏差综合起来判断。如果只盯着领口差 2 厘米,可能忽略了袖子的整体变形。量化误差也一样,需要一组“尺子上的尺子”——误差度量指标。

最常用的是均方误差(MSE),它把每个样本的误差平方后取平均。平方运算让大偏差被放大,因此 MSE 对“偶尔错得离谱”的情况非常敏感。另一个常用指标是量化信噪比(SQNR),用信号能量除以噪声能量再取对数,以分贝为单位。它回答的问题是:量化引入的“噪声”相对原始信号有多大。逐层对比时,这两项指标能帮我们发现哪一层退化最严重。

对裁缝来说,MSE 像“所有部位偏差的总体评分”,SQNR 像“这身衣服整体做工相对瑕疵有多好”。指标选对了,才知道该夸哪件衣服、该改哪块布料。

MSE=1n∑i=1n(xi−Q(xi))2,SQNR=10log⁡10∑i=1nxi2∑i=1n(xi−Q(xi))2\displaystyle \mathrm{MSE} = \frac{1}{n}\sum_{i=1}^{n}\left(x_i - Q(x_i)\right)^2, \qquad \mathrm{SQNR} = 10\log_{10}\frac{\sum_{i=1}^{n} x_i^2}{\sum_{i=1}^{n}\left(x_i - Q(x_i)\right)^2}
MSE 给出平均误差的能量;SQNR 用分贝描述信号相对噪声的强度。
  1. 均方误差计算对每个样本求误差平方,再对所有样本取平均,得到整体平均误差能量。
    MSE=1n∑i=1n(xi−Q(xi))2\displaystyle \mathrm{MSE} = \frac{1}{n}\sum_{i=1}^{n}\left(x_i - Q(x_i)\right)^2
  2. 信号能量计算原始信号的平方和表示携带的信息能量。
    ∑i=1nxi2\displaystyle \sum_{i=1}^{n} x_i^2
  3. 噪声能量计算误差的平方和表示量化引入的噪声能量。
    ∑i=1n(xi−Q(xi))2\displaystyle \sum_{i=1}^{n}\left(x_i - Q(x_i)\right)^2
  4. 信噪比取分贝信号能量除以噪声能量后取 \(10\log_{10}\),得到便于比较的分贝值。
    SQNR=10log⁡10∑xi2∑(xi−Q(xi))2\displaystyle \mathrm{SQNR} = 10\log_{10}\frac{\sum x_i^2}{\sum (x_i - Q(x_i))^2}

逐层误差传播

量体时偏差 1 厘米,也许看不出来;但裁布、缝合、上领、收边,每一道工序都保留着前一步的误差,最终整件衣服可能歪到穿不出去。误差不会乖乖待在一层等待被发现,它会在神经网络里一路“接力”。

考虑一个全连接层 \(y = Wx + b\)。如果前一层激活被量化,输入会带上扰动 \(\delta x\);如果本层权重被量化,权重会变成 \(W + \Delta W\)。两者都会让输出产生偏差 \(\delta y\)。用泰勒一阶展开,忽略高阶小量后,输出扰动近似等于“权重放大输入扰动”加上“权重误差乘以激活”。这个扰动继续进入下一层,在多层网络中不断累积。某些层像放大镜,把误差越放越大;另一些层像海绵,会把误差吸收掉一部分。逐层追踪,就能画出误差传播路径。

裁缝师傅的经验是:别只盯着第一刀,要顺着线头一路查到最后一针。哪道工序把误差放大最多,哪里就是改造的重点。

δyl≈Wl δxl+ΔWl xl\displaystyle \delta y_l \approx W_l\,\delta x_l + \Delta W_l\,x_l
一阶近似表明:输出误差来自输入误差被权重放大,以及权重自身量化误差被激活放大。
  1. 全连接层差分对 \(y=Wx+b\) 做扰动分析,输出扰动近似为两部分之和。
    δyl=Wl δxl+ΔWl xl+ΔWl δxl\displaystyle \delta y_l = W_l\,\delta x_l + \Delta W_l\,x_l + \Delta W_l\,\delta x_l
  2. 输入误差项上一层误差 \(\delta x_l\) 经过当前层权重 \(W_l\) 的线性放大,变成当前层输出的一部分。
    Wl δxl\displaystyle W_l\,\delta x_l
  3. 权重误差项权重量化误差 \(\Delta W_l\) 与当前输入 \(x_l\) 相乘,直接把噪声注入输出。
    ΔWl xl\displaystyle \Delta W_l\,x_l
  4. 忽略高阶项\(\Delta W_l\,\delta x_l\) 是两个小量相乘,通常远小于前两项,因此在一阶近似中被舍去。
    δyl≈Wl δxl+ΔWl xl\displaystyle \delta y_l \approx W_l\,\delta x_l + \Delta W_l\,x_l

层敏感度评估

怎么找出最“娇气”的工序?老师傅会做个实验:故意在每道工序上多扯偏一点,看成品走样多少。领口歪一格,整件衣服就不能见人;下摆歪一格,几乎看不出来。神经网络里也有类似的实验,叫做层敏感度评估。

做法并不复杂:保持其他层不变,只对目标层注入模拟量化噪声,再测量模型输出相对于原始输出的变化幅度。变化越大,说明该层对量化误差越敏感,越需要保留高比特。把每一层的敏感度都算出来,按从大到小排序,就得到了“关键层排行”。这一步是混合精度量化的决策依据:敏感度高的层多给一点精度,敏感度低的层大胆压缩。

敏感度评估是裁缝在每块布料上做的“破坏性试验”。付出的代价是几次前向计算,换来的是对整件衣服哪里能省料、哪里必须下功夫的全局地图。

Sl=Ex[∥f(x)−fl(x)∥2∥f(x)∥2]\displaystyle S_l = \mathbb{E}_{x}\left[\frac{\|f(x) - f_l(x)\|_2}{\|f(x)\|_2}\right]
层敏感度表示注入量化扰动后,输出向量相对变化量的期望,越大越需要高精度。
  1. 扰动注入对第 \(l\) 层做低比特量化,得到扰动后的模型 \(f_l\),其余层保持不变。
    fl(x)=f(x;quantize(Wl))\displaystyle f_l(x) = f(x; \text{quantize}(W_l))
  2. 输出变化范数用二范数衡量扰动前后模型输出向量的差异长度。
    ∥f(x)−fl(x)∥2\displaystyle \|f(x) - f_l(x)\|_2
  3. 相对归一化除以原始输出范数,把绝对变化转成相对变化,方便跨层比较。
    ∥f(x)−fl(x)∥2∥f(x)∥2\displaystyle \frac{\|f(x) - f_l(x)\|_2}{\|f(x)\|_2}
  4. 期望聚合对所有输入样本求期望,得到稳定可重复的敏感度分数。
    Sl=Ex[∥f(x)−fl(x)∥2∥f(x)∥2]\displaystyle S_l = \mathbb{E}_{x}\left[\frac{\|f(x) - f_l(x)\|_2}{\|f(x)\|_2}\right]

混合精度策略

既然知道了哪些工序最怕误差,老师傅就不必全程都用游标卡尺。领口、袖口这些讲究线条的地方用精密量具,裤缝、里衬这些不起眼的位置用普通卷尺。最后做出来的衣服既合身,又没有多花工具钱。

混合精度量化就是这个思路。模型有 \(L\) 层,每一层可以被分配到不同的比特数 \(b_i\)。敏感度高的层给 8 bit、甚至 16 bit,敏感度低的层给 4 bit、2 bit。问题变成:在总比特预算 \(B\) 的限制下,如何选择每一层比特,使“敏感度加权的量化误差总和”最小。这是一个带约束的优化问题,工程上常用贪心或启发式搜索求解。

这就像给不同部位分配不同的测量精度:预算有限时,先保最影响穿着的部位,再考虑边角料。混合精度量化的精髓,是用最少的比特,买到最大的合身度。

min⁡bi∑i=1LSi MSEi(bi)s.t.∑i=1Lni bi≤B\displaystyle \min_{b_i} \sum_{i=1}^{L} S_i\, \mathrm{MSE}_i(b_i) \quad \text{s.t.} \quad \sum_{i=1}^{L} n_i\, b_i \le B
混合精度量化把误差分析结果变成明确的比特分配目标:让最容易出错的层获得更多精度预算。
  1. 目标函数目标是让所有层敏感度加权误差之和最小,\(S_i\) 越大,该项越重要。
    ∑i=1LSi MSEi(bi)\displaystyle \sum_{i=1}^{L} S_i\, \mathrm{MSE}_i(b_i)
  2. 单层误差函数\(\mathrm{MSE}_i(b_i)\) 表示第 \(i\) 层在第 \(b_i\) 比特下产生的均方误差。
    MSEi(bi)\displaystyle \mathrm{MSE}_i(b_i)
  3. 内存预算约束第 \(i\) 层有 \(n_i\) 个参数,总比特数不能超过硬件能承受的预算 \(B\)。
    ∑i=1Lni bi≤B\displaystyle \sum_{i=1}^{L} n_i\, b_i \le B
  4. 决策变量\(b_i\) 是每层整数比特数,取值范围通常是 2 到 16 的整数。
    bi∈{2,3,…,16}\displaystyle b_i \in \{2,3,\dots,16\}

部署权衡

衣服做得再合身,如果用料费、工期长,客户也未必满意。部署大模型同理:量化误差分析最终要为“更快的推理、更低的成本”服务。在手机、传感器、实时 API 这些资源受限场景里,每一点显存和带宽都很贵。

模型权重从 FP32 压到 INT8,内存占用直接降到约四分之一;如果敏感层保持 8 bit、非敏感层降到 4 bit,还能进一步逼近理论下限。内存变少,意味着缓存命中率更高、显存搬运更少,推理延迟和能耗也随之下降。当然,过度压缩会伤害精度,因此部署工程师要在精度和成本之间找“甜点”。误差分析的价值,就是让你在压缩前就知道甜点大概在哪。

老师傅最后交付的,不是一把最精密的尺子,而是一件合身、省料、准时完成的衣服。量化误差分析帮我们算清楚:在哪个位置省一点精度,能在多大程度上换来速度和成本,最终做出值得上线的部署方案。

rmem=1−∑i=1Lni bi32∑i=1Lni=1−bavg32\displaystyle r_{\mathrm{mem}} = 1 - \frac{\sum_{i=1}^{L} n_i\, b_i}{32\sum_{i=1}^{L} n_i} = 1 - \frac{b_{\mathrm{avg}}}{32}
内存节约比例取决于平均比特位宽相对原始 32 位浮点的下降幅度。
  1. 量化后总比特数所有层参数乘以各自比特数后求和,得到压缩后的总存储。
    ∑i=1Lni bi\displaystyle \sum_{i=1}^{L} n_i\, b_i
  2. 原始 32 位总比特数原始 FP32 模型每参数 32 位,总和为 \(32\sum n_i\)。
    32∑i=1Lni\displaystyle 32\sum_{i=1}^{L} n_i
  3. 平均位宽总比特数除以总参数数,得到整个模型的平均位宽 \(b_{\mathrm{avg}}\)。
    bavg=∑nibi∑ni\displaystyle b_{\mathrm{avg}} = \frac{\sum n_i b_i}{\sum n_i}
  4. 节约比例1 减去压缩后与原始比特数的比值,就是节省的内存比例。
    rmem=1−bavg32\displaystyle r_{\mathrm{mem}} = 1 - \frac{b_{\mathrm{avg}}}{32}

AI 应用场景

移动端大模型 APP 部署

阶段:模型量化与推理优化

解决的问题:手机上运行 7B 对话模型,原始 FP16 权重接近 14GB,远超手机内存。传统做法是全部压成 INT8,但某些层一压缩就答非所问。量化误差分析逐层定位关键层,再用混合精度把整体压到 6GB 以内。

具体案例:某端侧助手 App 对“数学推理”类型问题掉点严重,工程师对每层注入量化噪声后计算敏感度,发现注意力层比 FFN 层敏感度高 5 倍。于是注意力层保留 8 bit,FFN 层降到 4 bit,结果内存减少 55%,答题准确率只下降 0.8%。

云端 LLM 推理服务降本

阶段:服务部署与吞吐优化

解决的问题:高并发问答 API 的 GPU 显存被权重和 KV cache 占满,导致批处理量小、响应慢。量化误差分析帮助识别对回答质量影响最大的层,用更小比特数换取更大吞吐。

具体案例:某云厂商对 Llama-3-8B 做混合精度部署,经过误差传播分析后,将 70% 的层降到 6 bit,30% 的层保持 8 bit。显存占用下降 35%,单卡吞吐提升 1.6 倍,在客服场景的 GPT-4 评测分仅下降 1.2%。

边缘语音设备唤醒词优化

阶段:边缘设备模型压缩

解决的问题:智能音箱的语音模型长期驻留内存,FP32 版本体积大、唤醒延迟高。量化误差分析在裁剪前先评估每层敏感度,防止误唤醒率因压缩而上升。

具体案例:嵌入式团队对 3 层 CNN + 2 层 LSTM 的语音模型做逐层扰动测试,发现第一层和最后一层对误唤醒率贡献最大。最终第一层与最后一层保留 8 bit,中间层降到 4 bit,模型体积减少 62%,唤醒延迟从 210ms 降到 130ms,误唤醒率保持稳定。

Python 演示

python66 行
import numpy as np def quantize(x, bits):    # 均匀量化到 [-1, 1] 区间    levels = 2 ** bits    step = 2.0 / levels    q = np.clip(np.round(x / step) * step, -1, 1)    return q class QuantErrorAnalyzer:    def __init__(self, n_layers=6, n_samples=1000):        self.n_layers = n_layers        self.n_samples = n_samples        self.outputs = []        self.mse_list = []        self.sensitivity = []        self.bits = []     def generate_data(self):        rng = np.random.default_rng(42)        x = rng.standard_normal(self.n_samples)        for l in range(self.n_layers):            # 第 2 层加入异常值,模拟敏感层            if l == 2:                x = x * 5 + 0.1            self.outputs.append(x.copy())            x = np.tanh(0.7 * x + 0.1 * rng.standard_normal(self.n_samples))     def evaluate(self, bits):        self.bits = bits        self.mse_list = []        for l, x in enumerate(self.outputs):            q = quantize(x, bits[l])            self.mse_list.append(np.mean((x - q) ** 2))     def rank_sensitivity(self):        mse = np.array(self.mse_list)        self.sensitivity = mse / (mse.sum() + 1e-12)     def allocate_bits(self, high=8, mid=6, low=4):        if len(self.sensitivity) == 0:            raise ValueError("请先调用 evaluate 和 rank_sensitivity")        s = np.array(self.sensitivity)        bits = [low] * self.n_layers        order = np.argsort(s)[::-1]        for idx in order[:2]:            bits[idx] = high        for idx in order[2:4]:            bits[idx] = mid        self.bits = bits        return bits     def report(self):        for l in range(self.n_layers):            print(f"Layer {l}: MSE={self.mse_list[l]:.6f}, sens={self.sensitivity[l]:.3f}, bits={self.bits[l]}") def main():    analyzer = QuantErrorAnalyzer()    analyzer.generate_data()    analyzer.evaluate([8] * analyzer.n_layers)    analyzer.rank_sensitivity()    analyzer.allocate_bits()    analyzer.report() if __name__ == "__main__":    main()
目的:模拟多层网络的激活量化过程,计算每层 MSE,归一化为敏感度,并按敏感度分配混合精度比特。
  1. q = np.clip(np.round(x / step) * step, -1, 1)这是均匀量化的核心:先按步长取整,再裁剪到合法范围。
  2. if l == 2: x = x * 5 + 0.1人为制造异常值,模拟“某一层对量化格外敏感”的真实情况。
  3. analyzer.evaluate([8] * analyzer.n_layers)先用统一的 8 bit 量化跑一遍,得到每层初始误差。
  4. self.mse_list.append(np.mean((x - q) ** 2))用均方误差衡量该层量化损失。
  5. mse = np.array(self.mse_list)将列表转成数组,方便做归一化和排序。
  6. self.sensitivity = mse / (mse.sum() + 1e-12)把每层误差除以总误差,得到和为 1 的敏感度分布。
  7. order = np.argsort(s)[::-1]找出敏感度从高到低的层索引顺序。
  8. for idx in order[:2]: bits[idx] = high敏感度最高的两层分配到 8 bit。
  9. bits = [low] * self.n_layers先默认全部使用 4 bit,再按敏感度局部升级。
  10. analyzer.report()打印每一层的 MSE、敏感度和最终比特数,直观看到混合精度分配结果。

常见误区

误区量化误差就是四舍五入引入的误差,既然四舍五入有正有负,整体误差会抵消,所以不用太担心。

正解量化误差至少包含两类:舍入误差和截断误差。截断误差方向固定、是系统性的,它不会随样本增多而抵消,反而会在逐层传播中持续累积。就像裁缝每刀都裁短 1 毫米,几十道工序后,衣服必然小了一圈。异常值还会进一步放大误差,所以“抵消”只是理想化幻觉。

为何常见:大家熟悉四舍五入,却很少关注定点数中的截断操作,而且直觉上认为随机误差会平均化,忽略了深度网络的链式放大效应。

误区既然不确定哪层重要,干脆整层模型都用一样的量化比特数,这样公平也省事。

正解不同层对量化误差的敏感度差异巨大。注意力层、靠近输出的层往往非常敏感,而某些冗余层用 4 bit 也几乎不掉点。统一低比特会拖垮关键层,统一高比特又浪费内存。敏感度评估就是用来打破“均码”思维,实现量体裁衣的混合精度。

为何常见:统一量化在工程上最简单,工具链支持也最成熟,容易让人误以为它是精度和性能的最优解。

误区只要模型最终准确率达标,中间哪层误差大无所谓,反正结果是对的。

正解最终准确率只是“结果指标”,无法告诉你哪里还有压缩空间。如果关键层已经掉了很多点,最终精度只是勉强达标,再压一次就会崩盘。逐层敏感度分析给出“过程指标”,让你知道谁在扛事、谁在摸鱼,从而为下一步深度压缩留下依据。

为何常见:部署时大家最关注的是上线后的精度,模型内部像黑盒,缺少逐层诊断的习惯。

误区每层误差加起来就是模型总误差,误差传播分析就是把各层误差做个累加。

正解误差传播不是简单加法,它会被权重矩阵放大或衰减,经过激活函数还会产生非线性变形。同一误差在某一层被放大 10 倍,在另一层可能被压缩到十分之一。泰勒展开能帮助理解一阶影响,但实际分析必须通过前向扰动实验来做,才能得到准确的全模型影响。

为何常见:线性思维容易让人忽略矩阵乘法对误差的缩放作用,也忽略了层间非线性的复杂性。

误区模型一量化就掉点,立刻判定“这个模型不能量化”,退回 FP16 或继续用更大显存。

正解量化掉点往往不是均匀分布,而是集中在少数敏感层。只要用误差分析定位这些层,给它们保留更高比特,再用校准集微调,通常能挽回大部分精度。真正不适合部署的模型很少,多数情况是没找对需要“加码”的位置。

为何常见:很多团队直接套用现成量化工具,失败后没有进一步做逐层诊断,于是把“工具不兼容”误当成“模型不可压缩”。

面试题

Q1. 均匀量化中,若只做向下取整(截断),误差的典型特征是:

单选题 · easy

  • A.始终为负且可能接近一个步长← 正确答案
  • B.始终为正且可能接近一个步长
  • C.正负交替且平均为零
  • D.大小与步长完全无关

答案:A。截断总是把数往一个方向切,因此误差方向固定、不会正负抵消,量级最大可接近一个完整步长。舍入才可能出现正负交替;步长是误差的上界,不能说无关。

Q2. 量化误差分析中,MSE 表示:

单选题 · easy

  • A.绝对误差的最大值
  • B.误差平方的平均值← 正确答案
  • C.误差绝对值的总和
  • D.信号与噪声的比值

答案:B。MSE 先对每个误差求平方,再取平均,所以它是误差平方的平均值。最大值、绝对值总和、信号噪声比分别是其他指标,不是 MSE 的定义。

Q3. 以下哪些是量化误差的主要来源?

多选题 · mid

  • A.舍入误差← 正确答案
  • B.截断误差← 正确答案
  • C.异常值敏感性← 正确答案
  • D.激活函数类型

答案:ABC。舍入和截断是刻度读数方式带来的误差,异常值会拉大均匀量化步长,它们都是量化误差的核心来源。激活函数类型会影响误差传播,但不是量化误差本身的来源。

Q4. 逐层误差传播中,权重量化误差 ΔW 主要影响:

单选题 · mid

  • A.当前层输入的传递函数
  • B.当前层输出的线性变换← 正确答案
  • C.训练数据的标签分布
  • D.模型参数量的大小

答案:B。全连接层输出是 \(Wx+b\),权重误差 \(\Delta W\) 直接作用于当前层的线性变换,产生 \(\Delta W x\) 项。它不改变输入传递函数,也不影响数据和参数量。

Q5. 关于异常值敏感性,下列说法正确的是:

多选题 · hard

  • A.异常值会拉大量化步长← 正确答案
  • B.小数值区域误差变大← 正确答案
  • C.使用均匀量化可消除异常值
  • D.异常值对低比特量化影响更大← 正确答案

答案:ABD。异常值拉大最大值后,均匀量化的步长变大,普通数值被切得更粗。比特数越低,等级越少,异常值对步长的污染越严重。均匀量化只是映射方式,不能消除异常值本身。

Q6. 混合精度量化的核心优化目标是:

单选题 · hard

  • A.降低所有层误差平方和
  • B.内存约束下最小化加权误差← 正确答案
  • C.尽量增加每层量化比特数
  • D.让每一层误差完全相同

答案:B。混合精度量化把敏感度作为权重,在总内存预算约束下最小化敏感度加权误差,而不是无脑降低总误差或均匀分配比特。让每层误差完全相同既无必要也不可行。

Q7. 原始 FP32 权重全部换成 8 比特量化,理想情况下权重内存降为原模型的约:

单选题 · mid

  • A.百分之五十
  • B.四分之一← 正确答案
  • C.八分之一
  • D.三十二分之一

答案:B。FP32 每参数 32 位,8 比特是 32 位的四分之一,所以理想内存为原来的 1/4。二分之一对应 16 比特,八分之一对应 4 比特,三十二分之一对应 1 比特。

Q8. 量化误差逐层泰勒近似分析中,哪种情况最可能让一阶近似失效?

单选题 · extreme

  • A.权重矩阵条件数极大← 正确答案
  • B.激活函数在线性区工作
  • C.量化步长等于零附近
  • D.扰动为对称分布

答案:A。条件数极大意味着误差会被显著放大,高阶项不再可忽略,一阶近似失效。激活函数线性、步长趋近于零、扰动对称分布时,一阶近似仍然可靠或足够准确。

Q9. 关于舍入误差与截断误差,下列说法正确的是:

单选题 · easy

  • A.舍入误差有偏,截断误差无偏
  • B.舍入无偏,截断有偏← 正确答案
  • C.两者分布完全相同
  • D.两者与量化级数无关

答案:B。舍入按距离取最近刻度,正负误差大致对称,可视为无偏;截断总朝一个方向切,误差均值不为零,因此有偏。两者都和量化级数密切相关,级数越多误差越小。

Q10. 量化误差分析在部署中的价值包括:

多选题 · mid

  • A.识别需要高精度的关键层← 正确答案
  • B.指导混合精度量化策略← 正确答案
  • C.降低推理成本和延迟← 正确答案
  • D.完全消除所有精度损失

答案:ABC。误差分析通过敏感度排序识别关键层,随后指导混合精度比特分配,最终降低内存、带宽和延迟。它只能控制误差,不能完全消除精度损失,所以 D 不正确。