周末搬家,你面对满地行李,手里的登机箱却只有 20 寸。羽绒服蓬松占地方——把它塞进真空压缩袋;纪念品十年没碰——干脆断舍离;师傅的独门菜谱太厚——请徒弟记住精髓;大衣柜太大——拆成板材运走再组装。这不是生活技巧,而是大模型压缩的四把钥匙:量化、剪枝、知识蒸馏、低秩分解。 大模型也是这样:几十 GB 的参数在云端固然够用,但要塞进手机、汽车、传感器这些“登机箱”,就得用类似的手法——量化(换成小体积的精度格式)、剪枝(删掉不重要的参数)、知识蒸馏(让大模型当老师教出小模型)、低秩分解(把大矩阵拆成两个小矩阵)。你可能会担心:东西“压缩”了,功能会打折吗?好的压缩恰恰在“尽量保留效果”与“体积骤减”之间找到平衡。

岗位关联

学完这本压缩技术全攻略,你就能在资源受限的边缘设备上让大模型跑起来——这是大模型真正落地的关键门槛,也是部署优化工程师的核心竞争力。

目录
  1. 可视化演示
  2. 压缩总览:为什么要“减负”
  3. 量化:把厚重的棉被抽真空
  4. 剪枝:断舍离的艺术
  5. 知识蒸馏:老师傅带高徒
  6. 低秩分解:拆装大师的魔法
  7. 组合策略:定制压缩衣柜
  8. AI 应用场景
  9. Python 演示
  10. 常见误区
  11. 面试题

可视化演示

展示生产者-消费者问题中的信号量同步机制,交互模拟wait/signal操作,可视化临界区访问与缓冲区状态变化。

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

生产者-消费者问题与信号量同步 青色圆点表示缓冲区数据项,生产者(P)放入数据,消费者(C)取出数据 绿色表示空闲状态,橙色表示等待信号量,红色表示互斥锁锁定 三个信号量empty/full/mutex协调生产消费同步 P: wait(empty) -> wait(mutex) -> put -> signal(mutex) -> signal(full) 信号量机制通过wait/signal原语实现进程间同步与互斥,确保临界区安全访问

压缩总览:为什么要“减负”

搬家那天你会发现,飞机只允许你带一个 20 寸登机箱。棉被、吉他、台式主机全都超标。要么换更大的箱子——但航班座位(内存)和运费(算力)都不允许;要么就在源头把东西变小。边缘部署就像这个限重的航班:手机只有 8GB 内存、汽车芯片只有几十瓦功耗预算。一个 7B 参数的模型需要 14GB 以上内存,不压缩根本登不了机。

对机器来说,大模型的一切“智能”都藏在网络参数里:权重矩阵、偏置、激活值。压缩技术就是尽量降低这些参数的存储与计算代价,同时让模型效果不掉队。四大主流方法各有分工:量化降低单个参数的存储位宽,剪枝直接减少参数数量,知识蒸馏用一个结构更小的模型学习大模型,低秩分解挖掘矩阵内部的冗余结构。

衡量压缩效果有两个基本指标:压缩率和加速比。压缩率看参数省了多少,加速比看推理快了多久。

回到行李的场景:压缩率像行李体积占比,加速比像过关安检的速度。好的压缩不只是“塞得下”,还要“走得快”。四大方法正是从存储和计算两条线上同时为模型减负。

压缩率=NcompressedNoriginal×100%,加速比=ToriginalTcompressed\text{压缩率} = \frac{N_{\text{compressed}}}{N_{\text{original}}} \times 100\%, \qquad \text{加速比} = \frac{T_{\text{original}}}{T_{\text{compressed}}}
压缩率越小越省存储,加速比大于 1 才算真变快了。二者要同时看——只变小但变慢的压缩没有实用价值。
  1. 压缩率将压缩后的参数数量除以原始参数数量,得到剩余体积的百分比。例如从 100 亿参数压到 10 亿,压缩率就是 10%。
    NcompressedNoriginal×100%\displaystyle \frac{N_{\text{compressed}}}{N_{\text{original}}} \times 100\%
  2. 加速比用压缩前的推理延迟除以压缩后的推理延迟,衡量速度提升的倍数。
    ToriginalTcompressed\displaystyle \frac{T_{\text{original}}}{T_{\text{compressed}}}

量化:把厚重的棉被抽真空

冬天的棉被蓬松占地方,但用真空压缩袋一抽,厚度只剩原来的四分之一,保暖性却几乎不减。量化就是模型的“真空压缩袋”——不改变参数的“数量”,改变它们存放的“格式”。正常模型参数的存储格式是 32 位浮点数(FP32),每个数占 4 字节;换成 8 位整数(INT8)后每个数只占 1 字节,存储直接降到 1/4,计算也更快。

把浮点数变成整数的核心是两样东西:缩放因子 s 和零点 z。缩放因子决定“一个整数刻度对应多宽的浮点范围”,零点负责把浮点区间和整数区间对齐。给定浮点范围 [r_min, r_max] 和目标位宽 b,先算出缩放因子,再把每个浮点值映射成整数。

推理时再把整数还原成浮点近似值,即反量化:

量化是有损压缩,还原值和原始值之间肯定有误差。误差的大小可以用平方距离来衡量:误差越大,说明“抽真空”把羽绒压得太狠,保暖性损失越多。工程上常用训练后量化(PTQ)直接转换,或用量化感知训练(QAT)在训练时模拟量化误差,让模型自己学会抵抗精度损失。更精细的做法是混合量化:对敏感层(如注意力层)保留 FP16,对不敏感层(如部分全连接层)用 INT8——正如怕皱的西装需要挂袋,T 恤才用压缩袋。

s=rmax⁡−rmin⁡2b−1,q=round⁡(rs)+z\displaystyle s = \frac{r_{\max} - r_{\min}}{2^b - 1}, \qquad q = \operatorname{round}\left(\frac{r}{s}\right) + z
r^=s(q−z)\displaystyle \hat{r} = s(q - z)
  1. 定标求出缩放因子 s,它决定每个整数刻度对应多大的浮点幅度。
    s=rmax⁡−rmin⁡2b−1\displaystyle s = \frac{r_{\max} - r_{\min}}{2^b - 1}
  2. 映射浮点值除以 s 后四舍五入,再加零点 z 得到整数 q。这一步就是“把参数塞进压缩袋”。
    q=round⁡(rs)+z\displaystyle q = \operatorname{round}\left(\frac{r}{s}\right) + z
  3. 反量化推理时用整数 q 乘以 s 再减去 z 的偏移,还原出近似的浮点值。
    r^=s(q−z)\displaystyle \hat{r} = s(q - z)

剪枝:断舍离的艺术

搬家时你会发现,80% 的行李一年都用不上一次。断舍离的诀窍是判断价值:常用之物留下,常年不碰的果断处理。剪枝的原理如出一辙——在训练好的大模型里,并不是每个参数都同样重要。一些参数的绝对值很小,对最终输出的贡献微乎其微,把它们置为零几乎不影响模型表现。

判断重要性的朴素标准就是权重绝对值 |w|:绝对值越大,代表这个连接在持续“发力”;绝对值越接近零,说明它是可有可无的“杂物”。用掩码矩阵 M 标记哪些参数保留、哪些置零:

其中 τ 是剪枝阈值,指示函数 1(·) 在条件成立时取 1、否则取 0。剪枝的正式目标是在稀疏约束下最小化损失:

剪枝按删除粒度分成两类:结构化剪枝整行、整通道地删,硬件实现简单,收益立竿见影;非结构化剪枝在单个参数上动手,稀疏率高但需要专用推理库才能加速。更实用的流程是迭代剪枝:剪掉一部分 → 微调恢复精度 → 再剪再微调,像搬家分轮整理,每轮扔掉一批确认无用之物,避免一次清仓误伤。

W^ij=Wij⋅1(∣Wij∣≥τ)\displaystyle \hat{W}_{ij} = W_{ij} \cdot \mathbb{1}\left( |W_{ij}| \ge \tau \right)
min⁡W L(W⊙M)s.t.∥M∥0≤k\displaystyle \min_{W} \, \mathcal{L}\left( W \odot M \right) \quad \text{s.t.} \quad \| M \|_0 \le k
  1. 重要性打分每个参数的绝对值大小先作为“断舍离”的评分依据。
    ∣Wij∣\displaystyle |W_{ij}|
  2. 阈值掩码设定阈值 τ,得分达标的参数保留,不达标的被标记为 0——指示函数生成掩码。
    1(∣Wij∣≥τ)\displaystyle \mathbb{1}\left( |W_{ij}| \ge \tau \right)
  3. 掩码作用掩码矩阵与权重矩阵逐元素相乘,被标记的参数直接归零。
    W⊙M\displaystyle W \odot M
  4. 稀疏约束所有保留的非零参数个数不能超过预算 k,这就是压缩的“行李配额”。
    ∥M∥0≤k\displaystyle \| M \|_0 \le k

知识蒸馏:老师傅带高徒

老厨师退休前要把毕生手艺传给徒弟。他没有让徒弟逐字背菜谱,而是边做边讲:“火候到七分时就闻到焦糖香,这时候关火刚刚好。”徒弟不需要复制师父的每一个动作,却学到了菜里最精髓的“感觉”。知识蒸馏正是这个传承过程:一个强大但笨重的大模型(老师),把知识浓缩进一个轻快的小模型(学生)。

为什么直接拿真实标签训练小模型不够好?因为真实标签是“硬”的——一张猫图就是“猫”,不会告诉你它长得还有点像狗。但大模型会输出“软”的概率分布:猫 0.8、狗 0.15、狐狸 0.05。这 0.15 就是老师经验的精华,叫暗知识。为了让暗知识显现,蒸馏引入温度系数 T 软化输出分布:

T 越大,分布越平滑,类别间的模糊关系越清晰。蒸馏的最终损失是软标签损失与硬标签损失的加权组合:

在实际工程里,老师往往不只教一个徒弟,还演变出自蒸馏(模型自己教自己)和在线蒸馏(师生共同训练)等变体。无论哪种,精髓都是同一句话:与其让小模型从零摸索,不如让大模型把“火候”直接传给它。

pi=exp⁡(zi/T)∑jexp⁡(zj/T)\displaystyle p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}
L=α T2⋅KL(p(S),p(T))+(1−α)⋅LCE(y,y^(S))\displaystyle \mathcal{L} = \alpha \, T^2 \cdot \mathrm{KL}\left( p^{(S)}, p^{(T)} \right) + (1-\alpha) \cdot \mathcal{L}_{\text{CE}}\left( y, \hat{y}^{(S)} \right)
  1. 温度软化把模型的原始输出(logits)除以温度 T,再进入 softmax。T>1 时分布更平坦,类间差异被放大。
    zi/T\displaystyle z_i / T
  2. 软概率softmax 把软化后的 logits 变成概率分布,这就是“师父的第一手心得”。
    pi=exp⁡(zi/T)∑jexp⁡(zj/T)\displaystyle p_i = \frac{\exp(z_i / T)}{\sum_j \exp(z_j / T)}
  3. KL 散度用 KL 散度度量学生分布与老师分布之间的差距,让学生逼近老师的判断方式。
    KL(p(S),p(T))=∑ipi(T)log⁡pi(T)pi(S)\displaystyle \mathrm{KL}\left( p^{(S)}, p^{(T)} \right) = \sum_i p_i^{(T)} \log \frac{p_i^{(T)}}{p_i^{(S)}}
  4. 加权合并软标签损失和硬标签损失按 α 加权求和,T² 用于平衡两个损失的量纲。
    αT2⋅KL+(1−α)⋅LCE\displaystyle \alpha T^2 \cdot \mathrm{KL} + (1-\alpha) \cdot \mathcal{L}_{\text{CE}}

低秩分解:拆装大师的魔法

大衣柜进不了家门,但拆成桌面、桌腿、隔板就能搬进去,到家再拼装。低秩分解的逻辑也一样:一个大矩阵 W 里往往藏着大量冗余信息,可以用两个小矩阵相乘来近似。

数学上最标准的做法是奇异值分解(SVD)。任何 m×n 矩阵都能分解为 W = UΣVᵀ,其中 Σ 的对角线是奇异值,代表矩阵各个方向的“能量”。奇异值大的方向重要,小的方向基本是噪音。于是可以只保留前 k 个最大奇异值,得到近似矩阵:

其中 U_k 是 m×k 矩阵,V_k 是 n×k 矩阵。存储量从 m×n 变成 k(m+n),当 k 远小于 m 和 n 时,省下来的空间非常可观。

这种方法特别适合嵌入层和全连接层这种大规模矩阵结构。近年大模型微调常用的 LoRA 就是低秩思想的变体——冻结原模型权重,只训练两个低秩小矩阵作为增量,既省显存又保留原模型能力。拆装大师的魔法,在模型压缩家族里同样拥有姓名。

W~=UkΣkVkT\displaystyle \tilde{W} = U_k \Sigma_k V_k^T
  1. SVD 分解将大矩阵拆成 U、Σ、V 三个部分,Σ 对角线上的奇异值从大到小排列。
    W=UΣVT\displaystyle W = U \Sigma V^T
  2. 截断只保留前 k 个最大的奇异值,对应的 U、V 列也一起保留,其余全部丢弃。
    Uk,Σk,VkT\displaystyle U_k, \Sigma_k, V_k^T
  3. 重组近似把截断后的三部分乘回去,得到与原矩阵行为相近的近似矩阵。
    W~=UkΣkVkT\displaystyle \tilde{W} = U_k \Sigma_k V_k^T
  4. 参数量对比原始参数 m×n 变为 k(m+n),压缩比例约为 k / min(m,n)。
    k(m+n)mn≈kmin⁡(m,n)\displaystyle \frac{k(m+n)}{mn} \approx \frac{k}{\min(m,n)}

组合策略:定制压缩衣柜

聪明的收纳师不会只用一个技巧:先断舍离(剪枝)减少总量,再用压缩袋(量化)压缩剩余体积,大件拆开(低秩分解)塞进边角,行李太多时干脆请师傅精简(蒸馏)。模型压缩也一样,单独用一种方法往往不够,要根据精度预算组合使用。

组合的第一原则是“先结构化,后参数级”:先做剪枝和低秩分解这类结构改动,再做量化缩小数值格式,这样能避免量化被剪枝破坏后的权重“浪费”在无效参数上。第二步是每步压缩之后都做微调恢复精度。最终压缩率可以按级联公式估算:

同时必须守住精度底线——压缩模型的精度不能低于可接受阈值:

不同场景适合不同的组合。手机端大语言模型常用“蒸馏 + INT8 量化”双管齐下;边缘端的检测模型适合“结构化剪枝 + 低秩分解”;云端 GPU 推理服务往往用“非结构化剪枝 + 量化”换取吞吐翻倍。没有万能配方,只有对模型、硬件和精度预算的充分理解,才能设计出恰到好处的“收纳方案”。

Sfinal=S0×∏i=1nri\displaystyle S_{\text{final}} = S_0 \times \prod_{i=1}^{n} r_i
Acc(Wcompressed)≥Accmin⁡\displaystyle \mathrm{Acc}\left( W_{\text{compressed}} \right) \ge \mathrm{Acc}_{\min}
  1. 级联压缩率每步压缩后的体积比例 r_i 累乘,得到最终剩余体积。
    ∏i=1nri\displaystyle \prod_{i=1}^{n} r_i
  2. 精度底线任务指标(如准确率、BLEU 分数)必须高于设定阈值,否则压缩方案不被接受。
    Acc≥Accmin⁡\displaystyle \mathrm{Acc} \ge \mathrm{Acc}_{\min}
  3. 微调恢复压缩后的模型需要经过短时间微调,让剩余的参数重新适应新结构。
    min⁡Wcomp L(Wcomp)\displaystyle \min_{W_{\text{comp}}} \, \mathcal{L}\left( W_{\text{comp}} \right)
  4. 迭代评估若不达精度底线,回退到上一步减小压缩力度,重新迭代。

AI 应用场景

手机端大语言模型部署

阶段:模型部署与推理优化

解决的问题:7B 模型原始 FP16 权重占 14GB 内存,手机根本装不下;传统做法是直接上云端,但离线场景、隐私场景都要求模型本地运行。用知识蒸馏先把 7B 模型压缩到 2B 规模,再套用 INT8 量化,内存占用可降到 1.2GB 左右,就能在旗舰手机上流畅对话。

具体案例:某语音助手团队在骁龙平台上部署端侧问答系统,采用“蒸馏 2B 学生模型 + QAT 量化”方案,首字延迟从云端方案的 1.8 秒降到 0.6 秒,同时用户语音数据无需上传,隐私性大幅提升。

推荐系统在线蒸馏

阶段:模型训练与在线推理

解决的问题:推荐系统的大模型(如深度 CTR 预估模型)效果虽好,但线上高并发请求下延迟超标;直接用小模型训练又掉点明显。知识蒸馏让大模型当“老师”,在训练阶段生成软标签,学生模型学到用户偏好的细微分布,线上延迟减半却保持九成以上效果。

具体案例:某电商推荐团队用 300 亿参数的排序大模型蒸馏出一个 1 亿参数的线上小模型,A/B 测试显示 CTR 提升 3.2%,单机 QPS 从 800 提升到 3500,年度 GPU 成本下降 62%。

GPU 推理服务量化加速

阶段:推理服务调优

解决的问题:大模型推理服务按 token 计费,GPU 吞吐量直接决定成本。将 FP16 权重量化为 INT8(配合低秩分解压缩 KV 缓存等结构),在保持输出质量合格的前提下,可让单卡并发量提升 2-3 倍。

具体案例:某 AI 绘画公司对 Stable Diffusion 模型执行“剪枝 20% + INT8 量化”组合优化,出图延迟从 4.5 秒降到 1.8 秒,显存占用从 12GB 降到 5.5GB,原本需要 4 张 A10 的部署方案缩到 1 张。

Python 演示

python50 行
import numpy as np  def quantize(matrix, bits=8):    lo, hi = float(matrix.min()), float(matrix.max())    levels = 2 ** bits - 1    scale = (hi - lo) / levels if hi > lo else 1.0    zero_point = int(round(-lo / scale))    q = np.clip(np.round(matrix / scale) + zero_point, 0, levels)    restored = (q - zero_point) * scale    err = float(np.mean((matrix - restored) ** 2))    return q, restored, err  def svd_compress(matrix, keep_ratio=0.2):    u, s, vt = np.linalg.svd(matrix, full_matrices=False)    k = max(1, int(min(matrix.shape) * keep_ratio))    u_k = u[:, :k]    s_k = s[:k]    v_k = vt[:k, :]    approx = (u_k * s_k.reshape(1, -1)) @ v_k    params = u_k.size + s_k.size + v_k.size    return approx, params  def prune(matrix, threshold=0.6):    mask = np.abs(matrix) >= threshold    pruned = matrix * mask    sparsity = float(1 - np.count_nonzero(pruned) / matrix.size)    return pruned, sparsity  def main():    rng = np.random.default_rng(42)    weight = rng.normal(0, 1, (256, 256))     q, restored, q_err = quantize(weight, bits=8)    svd_mat, svd_params = svd_compress(weight, keep_ratio=0.15)    svd_err = float(np.mean((weight - svd_mat) ** 2))    pruned, sparsity = prune(weight, threshold=0.8)    prune_err = float(np.mean((weight - pruned) ** 2))     print(f"原始参数: {weight.size} 个 float32 -> {weight.size * 4} 字节")    print(f"量化到 INT8: 重建误差 {q_err:.6f}, 存储降为 1/4")    print(f"SVD 截断: {svd_params} 参数, 压缩率 {svd_params / weight.size:.2%}, 误差 {svd_err:.6f}")    print(f"剪枝: 稀疏度 {sparsity:.2%}, 误差 {prune_err:.6f}")  if __name__ == "__main__":    main()
目的:用 NumPy 演示三种压缩方法——INT8 量化、SVD 低秩近似、基于权重绝对值的剪枝,并输出各自的压缩率与重建误差,直观理解“省了多少、损了多少”。
  1. scale = (hi - lo) / levels if hi > lo else 1.0计算量化缩放因子,避免矩阵全等值时除零。
  2. q = np.clip(np.round(matrix / scale) + zero_point, 0, levels)核心量化公式:浮点映射到 0~255 的整数并截断越界值。
  3. restored = (q - zero_point) * scale反量化:把整数还原成浮点近似值,用于计算误差。
  4. u_k = u[:, :k]SVD 截断的第一步:只保留前 k 列左奇异向量。
  5. approx = (u_k * s_k.reshape(1, -1)) @ v_k用低秩矩阵重构原矩阵,体现“两个小矩阵近似大矩阵”。
  6. mask = np.abs(matrix) >= threshold按权重绝对值生成剪枝掩码,重要参数保留、无关参数清零。
  7. if __name__ == "__main__":脚本可执行入口,保证模块导入时不会误跑演示逻辑。

常见误区

误区压缩不就是把模型文件压缩一下吗?像 ZIP 一样,用的时候再解压,效果一样还能省空间。

正解模型压缩不是文件压缩。ZIP 解压后数据一笔不少,而量化、剪枝、低秩分解都是有损操作,模型参数经过处理后不会 100% 恢复原状。真正的压缩是“用更少的参数表达相近的函数”,压缩后的模型直接参与推理,不会“解压回原样”。它需要精心的精度补偿和评估,是一门工程学问。

为何常见:日常使用“压缩包”的体验太深入人心,大家本能地把模型压缩联想成 Ziplib 式无损操作。

误区反正模型参数那么多,随便删掉一部分也能跑,随机删除就行。

正解随机删权重等于盲人装箱,可能刚把承重墙敲了。剪枝必须有重要性标准,最常用的是权重绝对值大小,也可以结合梯度、激活值等更精细的指标。而且剪枝后必须微调恢复精度,否则模型输出质量会迅速崩坏。

为何常见:剪枝的结果看起来只是“某些位置变 0”,容易被误解成随机置零;实际上掩码的生成方式和恢复训练流程才是成败关键。

误区模型训练完正常导出,部署时用工具直接转 INT8 就完事了,精度掉了再说。

正解训练后量化(PTQ)虽然省事,但遇到分布敏感的结构会明显掉点。更可靠的做法是量化感知训练(QAT)——在训练阶段就模拟量化误差,让模型参数提前适应“整数化生存环境”。两种方法各有适用场景,但“部署时一步到位”的想法往往让精度损失超出预期。

为何常见:PTQ 工具的“一键转换”太方便,容易让人忽略量化误差积累的严重性,尤其对注意力层和小数值权重极不友好。

误区四大方法各有各的压缩空间,全叠上去肯定最省钱,压缩率直接相乘。

正解方法之间会相互干扰。剪枝改变稀疏结构后,量化误差的分布也跟着变;低秩分解和剪枝同时进行可能重复破坏同一方向的信息。工程上要设定精度底线,按“先结构化后参数级”的顺序逐步尝试,每步评估、微调、回滚,而不是无脑叠加。

为何常见:直觉上“省得多就是赚得多”,但忽略了模型容错能力有限,压缩收益递减规律在叠加时尤其明显。

面试题

Q1. 下列哪一项不属于模型压缩的四大主流方法?

单选题 · easy

  • A.参数量化
  • B.结构剪枝
  • C.知识蒸馏
  • D.数据增强← 正确答案

答案:D。数据增强是提升训练数据多样性的手段,不改变模型体积与算力;量化、剪枝、蒸馏、低秩分解才是四大主流压缩方法。类比搬家:数据增强是“多买几件新家具”,显然不是让行李变小的办法。

Q2. INT8 量化时,将浮点值 r 映射为整数 q 的基础公式是?

单选题 · mid

  • A.q = round(r / s) + z← 正确答案
  • B.q = round(r + s) - z
  • C.q = round(r × s) + z
  • D.q = round(r - s) + z

答案:A。量化公式中 s 是缩放因子、z 是零点。先把浮点值除以 s 得到“刻度位置”,四舍五入后加 z 对齐偏移——正如先量尺寸再标注零刻度。其他选项把加减乘除放反了,映射关系就错位了。

Q3. 下列属于剪枝技术常见分类的有?

多选题 · mid

  • A.结构化剪枝← 正确答案
  • B.非结构化剪枝← 正确答案
  • C.迭代式剪枝← 正确答案
  • D.蒸馏式剪枝

答案:ABC。剪枝按删除粒度分为结构化(删整行/通道)和非结构化(删单个权重),迭代式剪枝指“剪枝—微调—再剪枝”的循环训练方式;“蒸馏式剪枝”不是剪枝分类,蒸馏是独立的知识迁移方法,相当于请师傅来精简,而不是直接扔东西。

Q4. 知识蒸馏中温度系数 T 的作用是?

单选题 · mid

  • A.控制软标签平滑程度← 正确答案
  • B.调节学习率大小
  • C.改变模型的深度
  • D.决定数据批量大小

答案:A。温度 T 通过除以 logits 来控制 softmax 输出的平滑度。T 越大,分布越平坦,模型对相似类别的“模糊判断”越容易暴露给学生模型——这正是暗知识的来源。T 不参与学习率、网络深度或数据采样。

Q5. 低秩分解技术主要压缩的是模型中的哪部分?

单选题 · easy

  • A.权重矩阵← 正确答案
  • B.激活函数
  • C.损失函数
  • D.优化器参数

答案:A。低秩分解针对权重矩阵做近似,把一个大矩阵拆成两个小矩阵相乘,常用于嵌入层和全连接层;激活函数是计算函数,损失函数是训练目标,优化器参数是训练状态,它们都不是被压缩的对象。

Q6. 关于模型压缩组合策略,下列说法正确的是?

多选题 · hard

  • A.压缩后应微调恢复精度← 正确答案
  • B.压缩率可以无限叠加
  • C.先结构化再参数级压缩← 正确答案
  • D.各方法互不影响且无损

答案:AC。压缩后微调是标准操作,让剩余参数重新适配新结构;“先结构化后参数级”能避免量化浪费在无效参数上。B 错在忽略收益递减,D 错在方法间会相互干扰且总是有损——就像收纳空间有限,越塞越满总要付出代价。

Q7. 与训练后量化(PTQ)相比,量化感知训练(QAT)的主要区别是?

单选题 · hard

  • A.训练时模拟量化误差← 正确答案
  • B.推理时使用双精度
  • C.模型结构会变大
  • D.不需要任何数据

答案:A。QAT 在训练的正向传播中插入伪量化节点,让模型提前适应整数域扰动,因此精度损失显著低于 PTQ。PTQ 是“打包后才发现尺寸不对”,QAT 是“设计时就按行李箱尺寸打样”,需要训练数据和训练时间但效果更稳。

Q8. 结构化剪枝通常指以下哪种删除方式?

单选题 · easy

  • A.删掉整行或整通道权重← 正确答案
  • B.随机删除单个权重参数
  • C.删除所有负值权重
  • D.将权重全部替换为零

答案:A。结构化剪枝按行、列、通道等规则块删除,形状规整,硬件容易加速优化;非结构化剪枝才针对单个权重“点杀”。随机删除和全部置零都是错误做法,删除所有负值更是毫无道理——正负号代表方向,不代表重要性。

Q9. 知识蒸馏的损失函数一般由哪些部分组合?

多选题 · mid

  • A.软标签的 KL 散度损失← 正确答案
  • B.硬标签的交叉熵损失← 正确答案
  • C.权重衰减正则化损失
  • D.完全不需要任何损失

答案:AB。蒸馏损失 = 软标签 KL 散度(学生贴近教师的判断分布)+ 硬标签交叉熵(确保分类正确)。权重衰减是通用正则项,不是蒸馏特有;“完全不需要损失”显然不成立——没有损失就无法优化学生模型。

Q10. 关于 SVD 截断近似参数量变化的说法正确的是?

单选题 · extreme

  • A.随 k 减少而下降← 正确答案
  • B.随 m 增大而下降
  • C.随 n 增大而下降
  • D.始终保持不变

答案:A。SVD 截断后的参数量约等于 k(m+n),k 越小参数量越少,因此“随 k 减少而下降”正确;m 和 n 是原始矩阵维度,只能让参数量上升,不可能下降;“始终不变”与截断压缩的初衷相悖。