想象你准备出国旅行,航空公司只允许携带一件登机箱,但你需要带上四季衣物、相机、洗漱用品和笔记本电脑。摆在面前的难题是:如何在有限的行李箱空间里装下所有必需的东西,同时保证到达目的地后一切都能正常使用? 端侧模型压缩与量化,本质就是一次精密的“行李箱打包工程”。模型参数是衣物,MCU 的存储空间是登机箱,推理速度是安检时间,精度是最后照片的画质。为了解决这个难题,工程师们发明了三件打包利器:量化(把厚实的羽绒服换成轻便的压缩羽绒服)、剪枝(扔掉三件款式重复的白T恤只留一件)、低秩分解(把大衣拆成可折叠的模块重新组装)。而把所有技巧按正确顺序组合、在打包完成后微调行李摆放、最终通过安检上飞机——这正是端云协同推理中端侧模型落地的完整故事。
掌握端侧模型压缩与量化,是 AI 工程师把模型从云端“装入”MCU 等微型设备的核心技能。它是边缘智能落地的“最后一百米”工程能力,直接决定 AI 产品能否在真实物联网场景中大规模部署。
可视化演示
通过交互式动画理解量化压缩、权重剪枝和低秩分解如何将大模型适配到资源受限的端侧设备,观察精度与模型大小的权衡。
本节配有交互动效(进入视口后自动加载,约 3KB)。
量化压缩 FP32→INT8 将模型缩小4倍 位宽越低压缩越大但精度损失增加 q = round(x/s) · s, s = (max-min)/(2^n-1) 拖动滑块调节量化位宽观察精度变化
端侧资源约束
出发前你查看了航空公司的行李规定:登机箱长宽高之和不得超过 115 厘米。这就好比 MCU 设备给出的“硬性边界”——你精心训练的 90MB 模型,在 MCU 上只有 512KB 存储空间、几十毫瓦的功耗预算和远低于服务器 GPU 的算力峰值。如果无视这些约束,模型根本跑不起来。
在端侧 AI 中,资源约束是压缩任务的“出发点”。MCU(微控制器)通常集成在传感器、可穿戴设备和家电中,它们没有富余的 DRAM,也没有散热风扇。模型的每一项资源消耗——权重存储、中间激活、计算单元功耗——都必须在硬件规格内。这就像旅行前必须知道箱子尺寸,否则后面所有的收纳技巧都无从谈起。
具体来说,端侧资源约束包括三个维度。存储容量限制决定了模型权重的总字节数上限;功耗预算约束决定了推理过程中内存访问和乘加运算的能耗上限;算力峰值受限则决定了模型在单位时间内能完成的运算次数。一个典型的 MCU 可能只有 512KB Flash 和 128KB RAM,主频 80MHz,这意味着模型不仅要“装得下”,还要“算得动”。
理解了行李箱的尺寸,我们就明确了打包的边界。接下来,让我们看看第一种收纳技巧——量化压缩,它相当于把厚实的衣物换成超轻的压缩羽绒服。
- 总资源消耗$C_{total}$ 表示模型在端侧运行时的总资源开销,包括存储、功耗和计算三部分。
- 三类分项$C_{storage}$ 是权重和激活值的存储开销,$C_{power}$ 是推理能耗,$C_{compute}$ 是乘加运算量。
- 容量上界$\le C_{MCU}$ 表示所有开销必须被 MCU 的硬件资源上限所容纳,超出则模型无法部署。
量化压缩
想象你的行李箱里塞满了厚厚的羽绒服,每件都蓬松地占据巨大空间。量化做的,就是把这些羽绒服用真空压缩袋压成薄薄的一片——衣物的“保暖功能”还在,但体积骤减。
在深度学习中,模型权重通常用 FP32(32 位浮点数)存储,每个参数占 4 字节。量化将这些浮点数映射到更低比特的整数表示,比如 INT8(8 位整数)。这样一来,每个参数只占 1 字节,模型体积直接缩小到原来的四分之一。对于 MCU 来说,INT8 还有一个额外好处:整数乘法比浮点乘法快得多,功耗也更低。
量化的核心是确定一个映射关系。我们需要找到权重分布的最小值 $x_{min}$ 和最大值 $x_{max}$,然后把浮点区间线性映射到 $[0, 2^B - 1]$ 的整数区间,其中 $B$ 是量化比特数。这个映射过程依赖一个“校准数据集”——它就像你打包前先试穿所有衣服,统计每件衣服的真实体积,从而确定压缩袋的尺寸。
量化后的模型就像真空压缩袋里的羽绒服——体积小了四倍,但“保暖性能”(精度)会有轻微损失。接下来我们看第二种技巧:剪枝,它干脆扔掉那些不常用的衣物。
- 浮点权重输入$x$ 是原始 FP32 权重值,比如 0.7321。
- 归一到 [0,1] 区间$\frac{x - x_{min}}{x_{max} - x_{min}}$ 将 $x$ 按其在权重分布中的相对位置映射到 0 到 1 之间。
- 扩展到整数范围$\times (2^B - 1)$ 将归一化值放大到目标比特数能表示的最大整数,$B=8$ 时即 255。
- 取整得到量化值$\mathrm{round}(\cdot)$ 四舍五入,得到最终的 INT8 整数 $r$。
剪枝压缩
你打开行李箱,发现有五件白 T 恤,其实你整个旅程只穿两件。剪枝就是这个道理:找到神经网络中“冗余”的连接或神经元,把它们删掉,模型变得更小更干净。
在训练完成的神经网络中,并不是每个连接都同等重要。有些权重值非常接近零,对最终输出的贡献微乎其微。剪枝把这些低重要性权重直接置零。如果配合稀疏存储格式,这些零值不占空间,模型体积就能大幅缩小。非结构剪枝逐个删除零散权重,压缩率最高但硬件不友好;结构剪枝整块删除过滤器或通道,虽然压缩率稍低,但能直接在 MCU 上获得加速效果。
剪枝的本质是用一个二进制掩码 $M$ 标记哪些权重保留(1)、哪些删除(0),然后让原权重矩阵 $W$ 与掩码逐元素相乘。这就像你在行李箱里先铺一层“必带物品清单”,清单上打钩的留下,没打钩的直接扔进回收站。
剪枝之后,行李箱里只剩下真正有用的衣物。但有些大件物品(比如大衣)依然占地方,这就需要第三种技巧——低秩分解,它把大衣拆解成可折叠的模块。
- 掩码矩阵定义$M$ 是与权重矩阵同形状的 0/1 矩阵,$M_{ij}$ 表示第 $i$ 行第 $j$ 列的权重是否被保留。
- 保留条件$|W_{ij}| > \tau$ 表示权重绝对值大于阈值 $\tau$ 时保留,$\tau$ 是预先设定的剪枝敏感度。
- 逐元素相乘$\odot$ 是 Hadamard 积,即 $W$ 与 $M$ 逐元素相乘,被标记为 0 的权重变成真正的零。
低秩分解
行李箱里有一件厚重的大衣,直接叠放很占空间。智慧的打包者会把大衣拆成“袖子 + 主体 + 领子”三部分,分别卷起来塞进缝隙。低秩分解正是这种“拆解重组”的数学实现。
在神经网络中,一个全连接层的权重矩阵 $W \in \mathbb{R}^{m \times n}$ 可能非常庞大(比如 $1000 \times 1000$)。低秩分解的核心洞察是:这个矩阵的有效信息往往集中在一个低维子空间中,可以近似表示为两个小矩阵的乘积 $W \approx U \times V$,其中 $U \in \mathbb{R}^{m \times k}$、$V \in \mathbb{R}^{k \times n}$,而 $k \ll \min(m, n)$。这样参数量从 $m \times n$ 降为 $k \times (m + n)$,当 $k$ 很小时压缩效果惊人。
这种分解通常通过奇异值分解(SVD)实现:对权重矩阵做 SVD 后,只保留前 $k$ 个最大的奇异值及其对应的奇异向量,舍弃其余部分。被舍弃的奇异值对应的信息就是“大衣上多余的纽扣”,留着只是装饰,去掉不影响功能。
三种打包技巧都学会了,但真正的挑战在于:应该按什么顺序组合使用它们?就像打包大师有独特的“衣物层叠顺序”,压缩技术的排列组合也有讲究。
- 矩阵维度$W_{m \times n}$ 是原始权重矩阵,$m$ 和 $n$ 分别是输入和输出维度。
- 分解形式$U_{m \times k} \cdot V_{k \times n}$ 将 $W$ 拆成两个低秩小矩阵的乘积,参数从 $mn$ 降至 $k(m+n)$。
- 奇异值加权展开$\sum_{i=1}^{k} \sigma_i \mathbf{u}_i \mathbf{v}_i^\top$ 表示保留前 $k$ 大奇异值 $\sigma_i$ 对应的分量,丢弃较小奇异值以压缩。
组合策略
打包高手不会随意把所有衣服塞进箱子——他们先放大件硬物(鞋子、洗漱包),再填软衣物,最后用袜子塞缝隙。端侧模型压缩同样讲究顺序。经验表明,先剪枝、再量化、最后低秩分解是较为可靠的顺序。
为什么要按这个顺序?剪枝会改变权重分布(让大量权重变成零),而量化需要统计权重分布的范围来设定 $x_{min}$ 和 $x_{max}$。如果先量化再剪枝,量化后的整数分布会被剪枝打乱,导致需要用更大的范围去量化,精度损失加倍。相反,先把冗余权重剔除干净,再做量化,就像先把箱子清空分类,再逐一测量实际需要装的东西,压缩效率最高。
低秩分解通常放在最后,因为它对权重分布做线性变换,如果在量化之前做分解,会破坏已经量化好的整数表示。组合策略的总精度损失可以近似表达为三个阶段损失的叠加(外加交互损失),这个公式揭示了“顺序即精度”的深层逻辑:
打包完成后,箱子是变小了,但里面的物品摆放可能歪歪扭扭,挤压变形。我们需要重新整理——这就是精度恢复微调。
- 总量子化损失$\Delta L_{total}$ 是组合压缩后模型精度的总损失。
- 剪枝损失$\Delta L_{prune}$ 是剪枝阶段引入的精度损失,与剪枝率正相关。
- 量化损失$\Delta L_{quant}$ 是量化阶段的精度损失,与比特数负相关。
- 分解与交互损失$\Delta L_{decomp}$ 是低秩分解的损失,$\Delta L_{interaction}$ 是三种操作相互影响产生的额外损失。
精度恢复微调
压缩后的模型就像刚被暴力塞进登机箱的衣物——虽然进去了,但皱皱巴巴、拿取不便。精度恢复微调做的事情,是把箱子重新打开,温柔地把每件衣服抚平叠好,让一切回归整齐。
微调(Fine-tuning)在压缩场景中的具体做法是:用压缩后的模型作为初始化权重,在原始训练数据(或缩小的子集)上以很小的学习率继续训练几个 epoch。这个过程的目的是让模型权重在压缩后的“新约束”下重新适应数据分布。剪枝移除了部分参数,量化改变了数值精度,低秩分解改变了参数空间的拓扑结构——微调就是在这些新条件下寻找一个精度更高的局部最优解。
更高级的做法是配合知识蒸馏:把压缩前的高精度模型当作“老师”,压缩后的低精度模型当作“学生”,让学生模型学习老师模型的输出分布。这就像让有经验的旅行达人站在旁边指导你重新叠衣服——你不仅知道衣服要放哪,还知道为什么这样放最合理。微调的优化目标可以用下面的损失函数表达:
微调完成,行李箱中的物品焕然一新。现在到了最紧张的时刻——过安检。KB 级部署测试就是端侧模型的“安检通关”。
- 优化目标$\theta^*$ 是微调后找到的最优模型参数,$\arg\min_{\theta}$ 表示在所有可能的参数中找损失最小的。
- 任务损失$\mathcal{L}(f(x; \theta), y)$ 是模型预测与真实标签之间的损失,如交叉熵。这保证压缩后的模型依然“会做题”。
- 蒸馏损失$\mathcal{L}_{distill}(f(x; \theta), f(x; \theta_{teacher}))$ 让学生模型模仿老师的软输出,$\lambda$ 是蒸馏强度。
KB级部署测试
你把整理好的登机箱放到安检传送带上,工作人员会检查:箱子是否超尺寸?重量是否超标?开合是否顺畅?KB 级部署测试同理,当模型被压缩到几百 KB 后,需要在真实的 MCU 环境中逐项验证其可用性。
片上内存验证是第一步:把模型权重加载到 MCU 的 Flash 和 RAM 中,确认没有内存溢出或碎片化问题。延迟功耗评估是第二步:在目标设备上运行推理,测量单次前向传播的耗时和功耗,确保满足实时性要求。推理加速验证是第三步:检查模型是否充分利用了 MCU 的 DSP 指令或 SIMD 扩展,INT8 量化是否真正转化为了推理速度的提升。
这一步就像安检仪扫描行李——模型不能只是“纸面上变小”,必须在物理设备上真正跑得动。端侧部署的验收标准通常可以概括为:模型体积 $S$ 小于存储上限,推理延迟 $T$ 小于实时要求,功耗 $P$ 小于电池预算。
模型通过“安检”,顺利登上飞机。但旅途中你突然发现有些事一个人搞不定——这就是端云协同推理的用武之地。
- 存储约束$S \le S_{flash}$ 表示模型总体积不超过 MCU Flash 容量。
- 延迟约束$T \le T_{deadline}$ 表示单次推理延迟不超过应用允许的截止时间。
- 功耗约束$P \le P_{budget}$ 表示推理平均功耗不超过电池供电预算。
端云协同推理
飞机起飞后,你发现登机箱里的物品基本够用,但如果想拍出专业级的星空照片,还需要向邻座的摄影师借用三脚架。端云协同推理就是这样:端侧 MCU 上的小型压缩模型处理大部分简单任务,遇到复杂的推理请求时,把数据发送到云端的大模型处理,再把结果回传。
端侧初筛是指模型在设备本地快速完成初步判断,比如语音唤醒词检测、手势识别、异常温度预警。这些任务实时性要求高、数据量小,端侧模型完全能胜任。云侧补强则是面向复杂场景:当端侧模型的置信度低于某个阈值时,将数据上传至云端,由完整的大模型进行精细推理。协同调度负责动态决定“哪些任务留在端侧、哪些请求上云”,依据是网络带宽、端侧功耗余量和任务时延要求。
这种分工模式在资源受限和精度需求之间找到了优雅的平衡点。回到我们的比喻:端侧压缩模型是随身行李,云侧大模型是航空公司的托运服务——小件随身带,大件走托运,两者配合,旅途轻松又高效。端侧模型压缩与量化,正是让“随身行李”能装下足够多必需品的核心技艺。
- 端侧执行$\mathrm{conf}(f_{edge}(x)) \ge \gamma$ 表示端侧模型对输入 $x$ 的预测置信度不低于阈值 $\gamma$。
- 端侧决策$a_{t} = a_{edge}$ 表示当置信度足够高时,由端侧模型直接输出结果。
- 云侧兜底否则 $a_{t} = a_{cloud}$,数据上传云端,由大模型完成推理。
AI 应用场景
智能音箱语音唤醒
阶段:端侧推理 + 端云协同调度
解决的问题:智能音箱需要 24 小时监听唤醒词,传统方案如果一直把音频上传云端,网络延迟和功耗都不可接受。通过模型压缩,一个 320KB 的 INT8 唤醒词模型可以直接运行在音箱的 MCU 上,本地实时检测“你好,小X”。
具体案例:某智能家居厂商将 8MB 的 FP32 唤醒词模型依次进行剪枝(去掉 40% 冗余连接)、量化(FP32→INT8)和低秩分解,体积降至 280KB。再通过 10 个 epoch 的蒸馏微调,唤醒率从压缩前的 97.2% 恢复到 96.8%。当用户说出含唤醒词的复杂指令时,端侧模型置信度低于 0.7 的音频才上传云端做语义理解。
工业设备振动异常检测
阶段:模型压缩 + KB 级部署 + 端侧初筛
解决的问题:工厂在每台电机上部署振动传感器,需要实时判断设备是否异常。传统方案将振动波形上传云端分析,一台设备每天产生 200MB 数据,50 台设备的带宽成本极高。
具体案例:工程师在边缘设备上部署了一个压缩后的 1D-CNN 异常检测模型。压缩流程为:结构剪枝删除 30% 的卷积通道 → 8bit 量化 → SVD 低秩分解全连接层,模型从 12MB 压缩到 400KB。部署在 Cortex-M4 MCU 上,推理延迟 38ms,功耗 12mW。端侧模型判定“异常”时才上传原始波形到云端,由大模型进行故障类型细分类。
Python 演示
"""模拟端侧模型压缩:量化 + 剪枝 + 低秩分解联合优化"""import numpy as np class CompressedModel: def __init__(self, in_dim=64, hidden_dim=128, out_dim=10, seed=42): np.random.seed(seed) self.w1 = np.random.randn(in_dim, hidden_dim).astype(np.float32) * 0.1 self.w2 = np.random.randn(hidden_dim, out_dim).astype(np.float32) * 0.1 self.quant_bits = 8 self.calib_min = -0.5 self.calib_max = 0.5 def forward(self, x): h = np.tanh(x @ self.w1) return h @ self.w2 def prune(self, threshold=0.05): mask1 = np.abs(self.w1) > threshold mask2 = np.abs(self.w2) > threshold self.w1 *= mask1 self.w2 *= mask2 return mask1.sum() + mask2.sum() def quantize(self): n_levels = 2 ** self.quant_bits - 1 self.w1 = np.round((self.w1 - self.calib_min) / (self.calib_max - self.calib_min) * n_levels) self.w2 = np.round((self.w2 - self.calib_min) / (self.calib_max - self.calib_min) * n_levels) def low_rank_decompose(self, rank=16): u, s, vt = np.linalg.svd(self.w1, full_matrices=False) self.w1 = (u[:, :rank] * s[:rank]) @ vt[:rank, :] def size_in_kb(self): bytes_total = self.w1.nbytes + self.w2.nbytes return bytes_total / 1024 def train(self, x, y, lr=0.01, epochs=200): for _ in range(epochs): h = np.tanh(x @ self.w1) out = h @ self.w2 loss = 0.5 * np.mean((out - y) ** 2) error = (out - y) / x.shape[0] d_w2 = h.T @ error d_h = error @ self.w2.T * (1 - h ** 2) d_w1 = x.T @ d_h self.w1 -= lr * d_w1 self.w2 -= lr * d_w2 if _ % 50 == 0: print(f" epoch {_:3d} loss {loss:.5f}") def main(): print("=== 端侧模型压缩流水线演示 ===") x = np.random.randn(200, 64).astype(np.float32) y = np.random.randn(200, 10).astype(np.float32) model = CompressedModel() print("[1] 原始模型训练") model.train(x, y, epochs=200) orig_size = model.size_in_kb() print(f" 原始大小: {orig_size:.1f} KB") print("[2] 剪枝(移除低权重连接)...") remain = model.prune(threshold=0.05) print(f" 保留连接数: {remain}") print("[3] 量化(FP32 -> INT8)...") model.quantize() print(f" 量化后大小: {model.size_in_kb():.1f} KB") print("[4] 低秩分解(SVD rank=16)...") model.low_rank_decompose(rank=16) final_size = model.size_in_kb() print(f" 最终大小: {final_size:.1f} KB") print("[5] 精度恢复微调...") model.train(x, y, lr=0.005, epochs=100) print(f"[完成] 压缩比: {orig_size / final_size:.1f}x") if __name__ == "__main__": main()
self.w1 = np.random.randn(...).astype(np.float32) * 0.1初始化一个浮点权重矩阵,作为压缩前的“原始模型”。model.train(x, y, lr=0.01, epochs=200)先让模型在模拟数据上收敛,确保后续压缩步骤基于一个“已训练好”的模型。mask1 = np.abs(self.w1) > threshold生成剪枝掩码:权重绝对值大于阈值的保留,否则置零。self.w1 *= mask1掩码逐元素相乘,真正将低权重连接置零,这是剪枝的核心操作。np.round((self.w1 - self.calib_min) / ... )量化公式的代码实现:先归一化再扩缩到 INT8 整数范围。u, s, vt = np.linalg.svd(self.w1)对权重矩阵做奇异值分解,得到低秩分解所需的三个因子。(u[:, :rank] * s[:rank]) @ vt[:rank, :]只保留前 rank 个奇异值分量,用两个小矩阵乘积近似原矩阵。self.size_in_kb()用nbytes统计两部分权重的总字节数并换算为 KB。self.w1 -= lr * d_w1微调阶段的梯度更新,用很小的学习率在压缩后的参数空间中恢复精度。if __name__ == "__main__":可执行入口,按顺序跑完整个压缩流水线并打印压缩比。
常见误区
误区我以为只要把模型压到目标体积就行,精度降个 3-5 个点也没关系,反正 MCU 上的任务都很简单。
正解压缩率与精度是跷跷板的两端。在智能音箱唤醒场景中,唤醒率从 97% 掉到 92%,用户体验会急剧恶化——用户喊三遍设备都没反应,产品就会被退货。正确的目标是在满足体积约束的前提下,把精度损失压到最小,而不是盲目追求最小体积。就像打包行李,不能为了塞进登机箱就把洗漱用品全扔了,到目的地还得重新买。
为何常见:初学者容易被"90MB→80KB"的压缩数字震撼,误以为压缩本身是目的,忽略了模型最终是为推理精度服务的。
误区我习惯先量化再剪枝,因为量化步骤简单,剪枝后还要重新统计分布,麻烦。
正解顺序直接影响最终精度。先量化再剪枝时,剪枝把权重置零会改变量化统计范围,导致已经确定好的 $x_{min}$ 和 $x_{max}$ 失效,量化误差放大。经验上“先剪枝、后量化、再分解”的精度损失远小于随意排序。这就像打包时不能先把衣服抽真空再决定扔哪几件——得先清理掉不用的,再压缩剩下的。
为何常见:每一步压缩单独看起来都是“无损操作”,初学者容易低估步骤间的交互效应。
误区我以为量化就是简单调用 `astype(np.int8)`,把浮点数截断成整数就行。
正解直接截断会导致严重的精度损失,因为浮点数的分布范围可能很大(比如 -3.5 到 7.2),直接截断会丢失大量信息。正确的量化需要先统计权重分布的范围,设计合理的映射函数(如线性映射),并选择合适的校准数据集。这就像你不能直接把一件 2 米长大衣硬塞进 1 米长的压缩袋——得先量好尺寸,再折叠适配。
为何常见:编程语言中的“类型转换”先入为主,让人误以为量化只是数据类型层面的简单操作。
误区我听说低秩分解压缩效果很好,就只做 SVD 分解,不剪枝也不量化,省事。
正解三种压缩技术作用于不同的冗余维度。剪枝去除稀疏冗余(很多权重本来就接近零),量化减少数值表示精度,低秩分解消除参数空间的线性相关性。单一技术有天花板——只做低秩分解的压缩率通常在 2-4 倍,而组合使用能达到 10-30 倍。就像只靠折叠衣物省不下多少空间,必须同时配合压缩袋和断舍离。
为何常见:每种技术都能独立工作,初学者容易抓住一个“看起来最高级”的,而忽略组合增益。
误区压缩后精度掉了很多,我就用原始的学习率再训练 50 个 epoch,结果模型过拟合,效果更差了。
正解压缩后的微调需要小心对待:学习率应该比原始训练小(通常小 10 倍以上),训练轮次更短,有时还需要冻结部分层。因为压缩已经改变了权重分布,大规模更新会破坏保留的有效信息。这就像整理好的行李箱只需微调物品位置,而不是全部倒出来重新打包。
为何常见:“微调”这个词和“训练”天然关联,初学者容易忽略两者在压缩场景下的巨大差异。
面试题
Q1. 端侧模型压缩的首要驱动因素是什么?
- A.增加模型推理精度
- B.适配 MCU 的存储、功耗和算力限制← 正确答案
- C.加速云端训练速度
- D.简化数据标注流程
答案:B。端侧模型压缩的核心目标是让模型在资源受限的 MCU 设备上“装得下、跑得动、耗得少”,对应存储、算力、功耗三类约束。A 是压缩后需要尽量保持的性能,不是驱动因素;C 和 D 与端侧部署无关。
Q2. 将权重从 FP32 量化为 INT8,模型体积理论上缩小多少倍?
- A.2 倍
- B.4 倍← 正确答案
- C.8 倍
- D.16 倍
答案:B。FP32 每个参数占 4 字节,INT8 占 1 字节,4 ÷ 1 = 4,体积缩小到原来的四分之一。这与用真空压缩袋把羽绒服压成四分之一体积同理。
Q3. 量化公式中校准数据集的作用是什么?
- A.训练量化模型的权重参数
- B.统计权重分布以确定 x_min 和 x_max← 正确答案
- C.评估压缩后模型的最终精度
- D.生成剪枝掩码矩阵
答案:B。校准数据集用于统计权重或激活值的实际分布范围,从而确定量化的最小值和最大值。它不参与梯度训练,也不负责评估和剪枝。类比打包前先试穿衣服统计真实体积,才能确定压缩袋尺寸。
Q4. 结构剪枝相比非结构剪枝的优点是?
- A.压缩率更高
- B.无需微调即可恢复精度
- C.剪枝后仍然可以利用 SIMD/DSP 加速← 正确答案
- D.不需要设置剪枝阈值
答案:C。结构剪枝整块移除卷积通道或神经元,保持了权重的规则稠密结构,因此硬件可以直接获得加速效果。非结构剪枝虽压缩率更高,但产生稀疏矩阵需要特殊存储格式,MCU 上难以利用。类比扔掉一整件大衣比拆掉大衣上几颗纽扣更省事。
Q5. SVD 低秩分解中,参数总量从 m×n 降至多少?
- A.m + n
- B.k × (m + n)← 正确答案
- C.m × n / k
- D.(m + n) / k
答案:B。分解后得到 U(m×k) 和 V(k×n) 两个小矩阵,参数总和为 mk + kn = k×(m+n)。当 k 远小于 m 和 n 时,这个值远小于 mn。就像把大衣拆成袖子和主体,总折叠体积远小于整件大衣。
Q6. 为什么推荐“先剪枝、后量化、再低秩分解”的组合顺序?
- A.剪枝能减少量化范围,量化能提高分解精度
- B.先量化会使用压缩后的统计范围,剪枝为处理零值会破坏此范围← 正确答案
- C.低秩分解会放大浮点误差,需要放在量化前
- D.剪枝不需要校准数据,量化需要,顺序因此固定
答案:B。先量化后剪枝时,剪枝产生的零值会改变权重分布,使量化统计的 x_min/x_max 失效,量化误差被放大。先剪枝可以“清空”冗余权重,让量化统计更准确,而低秩分解会改变已量化权重结构,所以放在最后。类比要先扔掉不用的衣服再抽真空,不能反过来。
Q7. 精度恢复微调中,学习率通常应该?
- A.比原始训练更大
- B.与原始训练保持一致
- C.比原始训练小一个数量级以上← 正确答案
- D.学习率不影响微调效果
答案:C。压缩后的模型已经接近一个较好的局部最优解,学习率过大会破坏压缩后保留的有效信息,导致模型震荡或过拟合。小学习率配合少量 epoch 足以让模型重新适应新的参数分布,就像小心调整已装箱物品的位置而不是倒出来重装。
Q8. 以下哪些属于 KB 级部署测试的验收指标?
- A.模型体积不超过 Flash 容量← 正确答案
- B.推理延迟满足实时性要求← 正确答案
- C.训练集上的准确率达到 100%
- D.推理功耗在电池预算内← 正确答案
答案:ABD。KB 级部署测试验证的是端侧硬件的三大约束:存储(S ≤ S_flash)、延迟(T ≤ T_deadline)、功耗(P ≤ P_budget)。C 是训练阶段的事,且 100% 准确率既不现实也非部署目标。类比安检只看行李箱是否符合尺寸重量规定,不关心箱内衣物的美观程度。
Q9. 关于端云协同推理,以下说法正确的有?
- A.端侧模型置信度过低时才请求云端辅助← 正确答案
- B.所有数据都必须先上传云端再返回结果
- C.端侧模型处理简单高频任务可降低功耗和延迟← 正确答案
- D.协同调度的依据包括网络带宽和任务时延要求← 正确答案
答案:ACD。端云协同的精髓在于“小事先办、大事上报”:端侧模型负责高频简单任务,降低功耗和延迟;当置信度低于阈值时上云,由大模型兜底。调度策略综合带宽、功耗和时延。B 描述的是纯云方案,违背了端侧压缩的意义。
Q10. 知识蒸馏在压缩后微调中的作用是?
- A.学生模型模仿老师的软输出以保留类别间相似信息← 正确答案
- B.蒸馏损失可以用 λ 控制与任务损失的相对权重← 正确答案
- C.蒸馏可以完全替代原始标注数据的训练
- D.教师模型通常是压缩前的原始高精度模型← 正确答案
答案:ABD。蒸馏让压缩后的学生模型学习教师模型的软标签分布,保留“猫和狗之间的相似性”这类暗知识。λ 平衡蒸馏损失与任务损失。但蒸馏仍需少量真实标注数据做任务损失训练,A/B/D 正确,C 错误。类比旅行达人指导你叠衣服,但他不能代替你亲自把衣服放进箱子。