王师傅的果园种了一大片果树,每年入冬前他都要干一件事:修剪枝条。他从不心疼那些看似茂盛的枝——因为枝条太多,果子反而长不大,阳光和养分全被浪费了。更神奇的是,他渐渐发现有些树苗天生带着“中奖基因”:哪怕被剪成光杆,只要保留的几根枝还在,第二年照样硕果累累,比那些枝繁叶茂的树更省心、更好打理。 这个故事讲的正是 AI 模型里的“果园管理术”——模型压缩。神经网络里成千上万的参数,就像一棵枝枝蔓蔓的果树,很多“枝条”其实对结果贡献不大,甚至拖慢计算速度。聪明人有三招:摘掉枯叶(把不重要的权重归零)、砍掉大枝(把整个通道结构删掉)、以及找到那棵“天生中奖”的树(彩票假说,Lottery Ticket Hypothesis)。读完这篇,你就能让大模型瘦身数倍、几乎不掉精度,稳稳跑进手机和边缘设备。

岗位关联

对 AI 从业者而言,掌握结构化剪枝与彩票假说是端侧部署的必修课——它直接决定你的模型能否从服务器搬进手机、能否在算力受限场景落地,是算法工程师晋升全栈部署能力的关键拼图。

目录
  1. 可视化演示
  2. 剪枝价值总览
  3. 非结构化剪枝
  4. 结构化剪枝
  5. 剪枝执行流程
  6. 彩票假说原理
  7. 假说验证方法
  8. 精度恢复策略
  9. 部署落地收益
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

动态演示结构化剪枝与彩票假说实战的核心机制,通过全局/局部/动态/静态四种模式展示关键概念与交互流程。

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

结构化剪枝与彩票假说实战:结构化剪 结构化剪枝与非结构化剪枝对比 通道级与层级剪枝方法 核心机制可视化 结构化剪枝与彩票假说实战整体架构与关键组件

剪枝价值总览

王师傅修剪果树,不是嫌树长得丑,而是为了让果子结得更好、让树在贫瘠的坡地上也能活。深度学习模型也一样——动辄上亿参数,就像一棵疯长的果树,枝叶间挤满了养分,部署到手机里直接把内存撑爆、把电池耗干。模型压缩技术,就是给神经网络“修剪园艺”。

所谓剪枝,本质是删除模型中“不重要”的权重或结构。为什么能删?因为神经网络训练时有大量冗余:许多参数对最终输出的贡献极小,删掉它们就像剪掉几根不结果的枝,果子反而更大。剪枝的价值体现在三处:体积变小(内存友好)、计算量降低(算力友好)、能耗减少(电池友好),这正是端侧大模型落地的前提。

剪枝按粒度分两大门派:非结构化剪枝(摘枯叶)和结构化剪枝(砍大枝)。前者灵活但硬件不买账,后者规整但需要精细设计。理解了这两派,你就拿到了果园修剪的第一把剪刀。

非结构化剪枝

枯叶的摘法,是每片叶子单独判断——如果这片叶子已经枯黄(权重值很小),就把它摘掉。非结构化剪枝正是如此:遍历网络中的每个权重,凡是绝对值低于某个阈值的,直接置为零。它不做任何“结构性”决策,只问一个问题:这个参数配不配活着?

这样剪出来的网络,参数矩阵变成了“稀疏矩阵”——大部分是零,只有少数非零值像零散的新芽。优点是灵活:剪枝粒度细到单个参数,理论上对精度的伤害最小,压缩率可以很高。但问题也在这里:稀疏矩阵是“不规则”的,像撒了一地的落叶,常规的 CPU/GPU 没法用整齐的矩阵乘法加速,要么用专用稀疏硬件(如 A100 的稀疏张量核),要么在存储上做特殊编码。

非结构化剪枝的直观度量是剪枝率——被剪掉的比例。如果网络有 N 个权重,剪完还剩多少非零,一目了然:

回到果园:你摘掉枯叶后,树看着可能稀疏了些,但树形结构一点没变,微风吹过还是原来那副骨架。非结构化剪枝的精髓,正是“叶落而枝不变”。

s=1−∥M∥0N\displaystyle s = 1 - \frac{\|\mathbf{M}\|_0}{N}
剪枝率 s 是衡量“摘了多少枯叶”的尺子。s 越大,模型越瘦,但精度风险也越高。
  1. 保留权重计数掩码矩阵中非零元素的个数,即剪完后仍然存活的权重数量。
    ∥M∥0\|\mathbf{M}\|_0
  2. 总权重基线剪枝前网络中全部参数的数量。
    NN
  3. 整体比例用 1 减去存活比例,得到被剪掉的比例,就是剪枝率。
    s=1−∥M∥0N\displaystyle s = 1 - \frac{\|\mathbf{M}\|_0}{N}

结构化剪枝

摘枯叶效率太低——真正让果园焕然一新的,是砍掉整根枝。结构化剪枝,就是直接删除网络的“大块结构”:通道级剪枝把某个卷积核对应的整个输出通道(channel)全部删掉,层级剪枝更狠,直接移除一个层。这意味着不是单个权重变零,而是把一整条枝干从模型里“锯掉”。

结构化剪枝最常用的选择准则,是看每个通道的权重绝对值之和(L1 范数)。如果某个通道的所有权重都很小,说明这条“枝”上果子少,留着纯浪费阳光,砍了也不心疼。计算每个通道的得分后,按分数从低到高排序,分数最低的那批通道就是被放弃的枝干。

被删除的通道在数学上如何表达?用一个掩码矩阵与原始权重逐元素相乘。掩码中对应被删通道的位置为 0,其余为 1:

砍完大枝,模型的宽度立刻收缩:下一层的输入通道数减少、上一层的输出通道数也跟着减少,计算量以平方级别下降。对比摘枯叶,这棵树真的“变小”了——骨架变了,结构规整,CPU/GPU 都能偷偷笑。

Wpruned=W⊙M\displaystyle \mathbf{W}_{\text{pruned}} = \mathbf{W} \odot \mathbf{M}
掩码 M 像一张“砍枝清单”:0 代表锯掉,1 代表保留。逐元素相乘,被列为 0 的通道权重整体消失。
  1. 权重矩阵原始网络中某一层的全部权重参数。
    W\mathbf{W}
  2. 掩码矩阵与权重同形状的 0/1 矩阵,0 的位置对应该删除的通道。
    M\mathbf{M}
  3. 逐元素乘把两个矩阵对应位置的数字相乘,完成权重的“筛选”。
    ⊙\odot

剪枝执行流程

修剪不是上来就砍。王师傅的做法很讲究:先让树长三年(预训练),再动剪子(剪枝),剪完还要施肥浇水(微调)。剪枝执行流程同样三步走:

第一步,预训练一个完整的模型——这是“底肥”,确保网络学到了足够好的特征。第二步,按某种准则剪枝:可以用通道的 L1 范数、BN 层的缩放因子、或者泰勒展开估计的损失敏感度,选出“最不重要的枝干”删除。第三步,对剪过的模型微调(fine-tune)若干个 epoch,让剩下的权重重新适应,把精度捞回来。

剪枝很少一步到位。实际工程中常用“迭代剪枝”:每轮剪一小部分(比如 20%),微调恢复,再剪下一批。这种“少食多餐”的策略,比一步剪掉 80% 温和得多。迭代 k 轮后,剩余参数比例是每一轮剩余率的乘积:

园丁的经验是“宁可多剪几轮,不要一次剪秃”。迭代剪枝给模型留出了适应期,精度曲线从陡降变成缓降,是高压缩率下保持精度的首选方案。

Rk=(1−p)k\displaystyle R_k = (1 - p)^k
迭代剪枝的剩余率:每轮剪掉比例 p,经过 k 轮后,原始参数只剩 (1-p) 的 k 次方。
  1. 单轮剩余每轮剪掉 p 比例,剩下来的参数占比。
    1−p1 - p
  2. 迭代轮数剪枝、微调、再剪枝的循环次数。
    kk
  3. 总剩余率每轮的剩余率连乘,得到剪完 k 轮后还存在的参数比例。
    Rk=(1−p)k\displaystyle R_k = (1 - p)^k

彩票假说原理

王师傅发现一个奇事:同样两棵苗,一棵剪完后恢复得很好,另一棵怎么施肥都蔫蔫的。差别不在剪法,而在“种子的基因”——有些随机初始化天生就藏着优秀的子网络。这正是彩票假说的核心洞察:在一个随机初始化的网络中,存在一个子网络(记住它的掩码和初始权重),即使从头独立训练,也能达到甚至超过原网络的精度。

为什么叫“彩票”?因为初始化相当于买彩票。每张彩票(随机初始化)上都印着一串号码(各层权重),只有少数号码组合会中奖。常规训练像是把整张彩票拿去刮,而剪枝像是提前刮开几个位置——如果这个初始化恰好内含一个“中奖子网络”,那么保留这些位置、剪掉其他位置,再重新训练,就能用更小的“票面”赢下同样的奖金。

彩票假说的数学表达,是一个带掩码的训练过程。设掩码为 m(由剪枝决定哪些位置保留),初始化权重为 W₀,完整训练过程只在掩码覆盖的子网络上进行梯度更新:

η∑k=1tablaL(Wk)\displaystyle \eta \sum_{k=1}^{t} abla \mathcal{L}(\mathbf{W}_k)

Wt=m⊙(W0−η∑k=1tablaL(Wk))\mathbf{W}_t = \mathbf{m} \odot \left( \mathbf{W}_0 - \eta \sum_{k=1}^{t} abla \mathcal{L}(\mathbf{W}_k) \right)

果园里最朴素的经验得到理论印证:修剪的价值不仅在于“去掉冗余”,更在于“发现天赋”——找到那棵天生会结果的树,然后全力培养它的核心枝干。

Wt=m⊙(W0−η∑k=1tablaL(Wk))\displaystyle \mathbf{W}_t = \mathbf{m} \odot \left( \mathbf{W}_0 - \eta \sum_{k=1}^{t}abla \mathcal{L}(\mathbf{W}_k) \right)
训练只在中奖区域(掩码 m 为 1 的位置)进行:初始权重 W₀ 沿梯度下降方向更新,但每次更新都被掩码“圈定”在保留的子网内。
  1. 初始权重随机初始化时的那组参数,彩票假说强调“中奖基因”就在这里面。
    W0\mathbf{W}_0
  2. 掩码圈定由剪枝得到的 0/1 掩码,决定哪些位置参与训练。
    m\mathbf{m}
  3. 累计梯度从第 1 轮到第 t 轮的所有梯度之和,乘以学习率后更新初始权重。
  4. 掩码更新把更新量逐元素乘以掩码,确保只有保留区域被修改。

假说验证方法

发现了中奖彩票,怎么验证它真的能中奖?研究者提出了经典的 IMP 算法(Iterative Magnitude Pruning,迭代幅度剪枝),像做“对照实验”一样严格验证:每轮训练后,把所有权重按绝对值排序,剪掉最小的 p%;然后把剩余权重重置到初始值,重新训练。重复这个过程。

关键在于“权重复绕”(weight rewinding)——剪完枝,不是保留训练后的数值,而是回到这张彩票最初的号码(初始权重)。为什么要回去?因为彩票假说断言“中奖号码是印在票面上的”,训练只是把号码刮清楚。如果复绕到剪枝前的迭代(如第 k 轮)而非初始值,就是更温和的“重绕变体”,能进一步提升精度。

IMP 的每一步都很清楚:训练到收敛 → 按幅度剪枝 → 剩余权重恢复为初始值 → 再训练。每轮都能找到一个更小的“中奖子网络”,几轮迭代后,子网络通常小到原来的 10%~20%,却能保持接近原始网络的精度。这就是“先刮票,再兑奖”的实证流程:

验证完成后,王师傅手里就有了一棵“验证过基因”的树苗。它不是普通剪枝,而是在剪之前就知道这棵树会中奖——这种确定性,给了工程师针对某个具体任务定制微型网络的信心。

Wrewind=m⊙W0+(1−m)⊙Wtrain\displaystyle \mathbf{W}_{\text{rewind}} = \mathbf{m} \odot \mathbf{W}_0 + (\mathbf{1} - \mathbf{m}) \odot \mathbf{W}_{\text{train}}
重绕公式的含义:保留区域(掩码为 1)放回初始权重 W₀,被剪区域(掩码为 0)的值保持训练后的结果也无妨——反正它们不再参与前向计算。
  1. 保留区域掩码为 1 的位置,权重重置为初始值,这是“回到彩票原始号码”。
    m⊙W0\mathbf{m} \odot \mathbf{W}_0
  2. 剪掉区域掩码为 0 的位置,保留训练后的权重(实际不会再参与计算)。
    (1−m)⊙Wtrain(\mathbf{1} - \mathbf{m}) \odot \mathbf{W}_{\text{train}}
  3. 整体拼接两部分相加,得到重绕后的权重——既保留中奖号码,又丢弃多余枝干。
    Wrewind=m⊙W0+(1−m)⊙Wtrain\displaystyle \mathbf{W}_{\text{rewind}} = \mathbf{m} \odot \mathbf{W}_0 + (\mathbf{1} - \mathbf{m}) \odot \mathbf{W}_{\text{train}}

精度恢复策略

修剪后的树元气大伤,需要精心调理。模型剪枝后同样面临精度下滑,恢复策略是落地不可缺的一环。最基础的是重训练:用较小的学习率在剪枝后的模型上继续训练若干个 epoch,让幸存权重重新协调配合。这就像给树浇水施肥,让它把养分重新分配到剩下的枝干上。

进阶策略是知识蒸馏。大模型(教师网络)在剪枝前是“满状态的果园”,剪枝后的模型(学生网络)可以向老师学习。学生不仅要学老师的硬标签(正确答案),还要学老师的“软标签”——老师对各类别的置信度分布。软标签里藏着类别间的相似关系,比如“猫”和“狗”比“猫”和“火箭”更接近,这些信息能大幅补偿剪枝损失的知识。

蒸馏损失由两段加权合成:学生跟真实标签的差距(硬损失),加上学生与教师软输出的差距(软损失):

另外两个实用技巧:学习率调度——剪枝后的重训练用余弦退火,比固定学习率恢复得快;渐进剪枝——把大剪枝拆成多轮“剪一点、恢复一点”,避免断崖式精度下跌。总之,恢复策略的目标是让剩下的枝干长得更壮,而不是急着再砍。

L=α⋅Lhard+(1−α)⋅Lsoft\displaystyle \mathcal{L} = \alpha \cdot \mathcal{L}_{\text{hard}} + (1-\alpha) \cdot \mathcal{L}_{\text{soft}}
总损失 = 硬损失 + 软损失。α 控制“向真实答案学”和“向老师学”的配比,通常 α 取 0.7 左右。
  1. 硬损失学生网络输出与真实标签的交叉熵,保证基本任务能力。
    Lhard\mathcal{L}_{\text{hard}}
  2. 软损失学生网络输出与教师网络软标签的 KL 散度,传递类别间相似关系。
    Lsoft\mathcal{L}_{\text{soft}}
  3. 配比系数α 控制两项损失的比例,α 太大会忽略教师知识,太小则偏离真实任务。
    α\alpha

部署落地收益

果园的最终收成,是又小又甜的果子。结构化剪枝 + 彩票假说的组合拳,落地到端侧,收益非常直接:模型体积从几百 MB 缩到几十 MB,手机内存松了一口气;单次推理的 FLOPs(浮点运算量)下降数倍,高帧率不再烫手。

为什么结构化剪枝对部署这么关键?因为通道数减少是“结构性”的——编译器可以提前规划内存布局,算子可以改用更小的矩阵乘法,缓存命中率也大幅提升。非结构化稀疏则很难在各端侧推理框架(如 MNN、NCNN、TFLite)中获得同等的加速收益。配合层级剪枝,整个模块(如 Attention 中的某个 head)都能移除,进一步节省计算。

计算量的收益可以用公式量化:假设剪枝后第 l 层的输入输出通道数分别从 Cᵢ、Cₒ 变为 Cᵢ'、Cₒ',则整网 FLOPs 下降比例为:

王师傅的果园故事到这里收尾:剪枝不是破坏,而是删繁就简、激活天赋。从摘枯叶到砍大枝,从凭经验到认“彩票基因”,最终收获的是小而美的模型——它跑得飞快,精度却毫不含糊。

FLOPs降=1−∑lCl′⋅Cl+1′∑lCl⋅Cl+1\displaystyle \text{FLOPs}_{\text{降}} = 1 - \frac{\sum_{l} C'_l \cdot C'_{l+1}}{\sum_{l} C_l \cdot C_{l+1}}
该公式衡量“砍枝”后计算量下降的幅度:通道数减小,相邻两层的乘法次数随之减少。
  1. 原始计算量每一层输出通道数乘下一层输入通道数,再求和,代表原来的总 FLOPs。
    ∑lCl⋅Cl+1\sum_{l} C_l \cdot C_{l+1}
  2. 剪后计算量剪枝后各层的通道数带入同样的连乘求和。
    ∑lCl′⋅Cl+1′\sum_{l} C'_l \cdot C'_{l+1}
  3. 下降比例1 减去比值,得到计算量被砍掉的比例。
    1−∑lCl′⋅Cl+1′∑lCl⋅Cl+1\displaystyle 1 - \frac{\sum_{l} C'_l \cdot C'_{l+1}}{\sum_{l} C_l \cdot C_{l+1}}

AI 应用场景

场景一:手机端图像分类模型瘦身

阶段:模型压缩与端侧部署

解决的问题:在服务器上训练的 200MB 分类模型直接部署到手机,内存占用过高、推理延迟 800ms,用户明显感知卡顿。传统做法是换小模型(如从 ResNet50 换 MobileNet),但需要重新训练、调参,且精度仍有损失。

具体案例:某智能相册 App 需要对本地照片做实时分类。算法工程师先训练完整的 EfficientNet-B3,再用结构化通道剪枝按 BN 层缩放因子裁剪 60% 的通道,最后用 10 个 epoch 重训练 + 知识蒸馏恢复精度。剪枝后模型从 180MB 降到 45MB,单张图片推理时间从 340ms 降至 95ms,Top-1 精度只下降 1.2%,成功在主流 Android 手机上流畅运行。

场景二:智能音箱唤醒词模型压缩

阶段:模型压缩与在线学习

解决的问题:唤醒词模型虽然不大,但需要在低功耗 DSP 芯片上常驻运行。非结构化剪枝在 DSP 上无法加速,必须用结构化剪枝确保指令流水线整齐。

具体案例:某智能音箱团队用彩票假说筛选子网络:对预训练好的唤醒词模型执行三轮 IMP,每轮剪掉 30% 的最小幅度权重并重绕到初始值重训练,最终找到原始网络 15% 规模的子网络。该子网络在 DSP 上推理耗电量下降 70%,唤醒率在原噪声环境下保持 96%,让设备在电池模式下也能持续待机。

场景三:大语言模型 KV Cache 剪枝

阶段:推理优化

解决的问题:LLM 长文本推理时,KV Cache 占用大量显存,导致并发上不去。通过结构化剪枝对 Attention 的某些头(head)做层级剪枝,可以在不明显影响生成质量的前提下释放显存。

具体案例:某对话系统对 7B 模型做 head 剪枝分析,用类似 IMP 的方式评估每个 Attention head 的重要性,剪掉 20% 的低分 head 并重训练。单次请求 KV Cache 体积减少约 18%,服务端单卡并发数从 4 提升到 7,生成延迟降低 25%,业务侧人工评测的答案质量几乎无感。

Python 演示

python66 行
import numpy as np def make_data(n=240, d=12, seed=42, noise=0.2):    """生成线性回归合成数据,真实权重随机,便于观察训练效果"""    rng = np.random.default_rng(seed)    X = rng.normal(size=(n, d))    w_true = rng.normal(size=d)    y = X @ w_true + rng.normal(scale=noise, size=n)    return X, y  def train(X, y, w_init, mask=None, lr=0.05, epochs=80):    """带掩码的梯度下降训练。mask 为 None 表示全量训练,否则只在非零位置更新"""    w = w_init.copy()    history = []    for _ in range(epochs):        grad = 2 * X.T @ (X @ w - y) / len(y)        if mask is not None:            grad = grad * mask        w -= lr * grad        history.append(np.mean((X @ w - y) ** 2))    return w, history  def prune(w, rate=0.5):    """按权重绝对值幅度剪枝:把最小的 rate 比例置零,返回掩码"""    k = int(rate * len(w))    idx = np.argsort(np.abs(w))[:k]    mask = np.ones_like(w, dtype=float)    mask[idx] = 0.0    return mask  def main():    X, y = make_data()    rng = np.random.default_rng(7)    w0 = rng.normal(size=X.shape[1])  # 彩票初始权重     # 1. 完整网络正常训练(对照组)    w_full, hist_full = train(X, y, np.zeros(X.shape[1]))    full_loss = hist_full[-1]     # 2. 标准剪枝:训练后直接剪掉 50%,不再训练    mask = prune(w_full, 0.5)    w_pruned_only = w_full * mask    pruned_loss = np.mean((X @ w_pruned_only - y) ** 2)     # 3. 彩票假说:剪枝后重绕到初始权重,再带掩码训练    w_rewind = w0 * mask    w_lth, hist_lth = train(X, y, w_rewind, mask=mask)    lth_loss = hist_lth[-1]     # 4. 随机重初始化对照组:相同掩码,但用新随机权重训练    w_random = rng.normal(size=X.shape[1]) * mask    w_random_trained, hist_rand = train(X, y, w_random, mask=mask)    rand_loss = hist_rand[-1]     print(f"完整网络   MSE = {full_loss:.4f}")    print(f"剪枝不训练 MSE = {pruned_loss:.4f}")    print(f"彩票重绕   MSE = {lth_loss:.4f}")    print(f"随机重训   MSE = {rand_loss:.4f}")    print(f"可见彩票假说优于随机重初始化,逼近完整网络精度")  if __name__ == "__main__":    main()
目的:用 100 行 NumPy 复现彩票假说的核心对比实验,跑完即可直观理解“掩码 + 初始权重重绕”为何是关键。
  1. mask = np.ones_like(w, dtype=float); mask[idx] = 0.0用 0/1 掩码标记被剪枝的位置,这就是“砍枝清单”。
  2. grad = grad * mask梯度乘以掩码,只有保留位置的权重能被更新,其余位置被“圈外”。
  3. w_rewind = w0 * mask保留位置重绕到初始权重,这是彩票假说最核心的一步。
  4. w_random = rng.normal(size=... ) * mask对照组用新的随机权重,证明“初始权重本身”是中奖关键。

常见误区

误区既然剪枝能省内存省算力,那把剪枝率调到 90% 甚至 95%,再花点时间重训练,不就行了?反正模型容量大,剪掉的多半都是冗余。

正解剪枝率存在阈值效应——当剪枝率超过某个临界点,模型会进入“坍塌区”,关键通道被连根拔掉,重训练也救不回来。就像果园里你把结果的主枝都砍了,施再多肥也长不出果子。正确做法是用迭代剪枝,每轮剪少量、观察精度下降幅度,找到“精度-体积”的黄金平衡点,而不是盲目追求高压缩率。

为何常见:很多人看到论文里 90% 剪枝率还能保持精度,就以为这是常态。实际上那是经过精心调参、特定任务、特定网络的结果,迁移到自己的任务上往往完全不同。

误区非结构化剪枝可以精确到每个权重,保留所有“重要的参数”,所以精度损失最小,工程上就应该优先选择它。

正解在纯指标对比上,非结构化剪枝确实往往取得更高的压缩率,但这是“纸面优势”。真正的工程部署要考虑硬件:通用 CPU/GPU/DSP 无法高效计算不规则稀疏矩阵,你省下的存储空间会在运行时找补回来——甚至更慢。结构化剪枝虽然剪得更“粗”,但结构规整,配合 BLAS 库、SIMD 指令和编译优化,能拿到真实的端到端加速。选哪种,取决于你的目标硬件有没有稀疏加速单元。

为何常见:学术论文习惯用“参数稀疏度”作为指标,但工业界关心的是“真实推理延迟”。两个世界的评价标准不同,导致认知偏差。

误区IMP 算法就是普通的迭代剪枝啊,剪一下、训练一下,循环几次,就叫彩票假说了。

正解普通迭代剪枝每轮直接保留训练后的权重继续微调;彩票假说的核心在于剪完后把保留权重重绕到初始值,再从头训练。这才是“验证彩票号码”的关键动作——它证明了子网络的训练能力来自初始化本身,而非上一轮的训练痕迹。如果只是微调,那叫“剪枝后微调”;有重绕这一步,才算严格的彩票验证。

为何常见:IMP 的流程表面上看和迭代剪枝很像,不细看算法细节的人很容易忽略"rewinding"这一步的深意。

误区剪枝让模型受到了“创伤”,所以要加大学习率,让它快速恢复到原来的精度。

正解恰恰相反。剪枝后的参数量变少,模型容量下降,大学习率容易让权重震荡甚至发散。正确姿势是使用比预训练更小的学习率(通常是原来的 0.1 倍或 0.01 倍),配合余弦退火或线性 warmup,让幸存权重在原有最优解附近平稳调整。就像刚动完手术的病人,要静养而不是剧烈运动。

为何常见:直觉上觉得“伤得重就要大补”,但优化中没有这样的因果关系。学习率是步长,“步子太大容易扯着”才是真实写照。

面试题

Q1. 结构化剪枝相比非结构化剪枝的核心优势是?

单选题 · easy

  • A.剪枝后无需任何重训练
  • B.参数矩阵自动变成稀疏存储
  • C.结构规整利于硬件部署加速← 正确答案
  • D.完全不会损失模型精度

答案:C。结构化剪枝删除整个通道或层,模型结构保持规整的密集张量,CPU/GPU/DSP 都能直接高效计算。A 错在剪枝后仍需重训练,B 是稀疏存储(非结构化特征),D 过于绝对,任何剪枝都有精度风险。

Q2. 关于彩票假说,下列说法中准确的是?

单选题 · easy

  • A.任何随机初始化都包含中奖子网络
  • B.某些初始化中存在可独立训练的子网络← 正确答案
  • C.剪枝率越高,中奖概率必然越大
  • D.彩票假说只适用于卷积神经网络

答案:B。彩票假说的核心是“部分随机初始化含有一个可独立训练到达原网络精度的子网络”,B 正确。A 过于绝对,并非所有初始化都容易找到;C 没有依据;D 错误,彩票假说在 MLP、CNN、Transformer 上都被验证过。

Q3. IMP 算法中“权重复绕”(rewinding)指的是?

单选题 · mid

  • A.将被剪区域权重恢复为随机数
  • B.将保留区域权重重置为初始值← 正确答案
  • C.将学习率恢复到初始时刻
  • D.将优化器状态全部清空重建

答案:B。权重复绕是彩票假说验证的关键动作:剪枝完成后,把保留位置的权重恢复为该网络初始化时的数值,然后再训练。B 正确。A 是随机重初始化对照组的操作;C、D 与重绕无关。

Q4. 通道级剪枝通常采用哪种准则来评估通道重要性?

单选题 · mid

  • A.通道权重绝对值之和← 正确答案
  • B.通道命名长度大小
  • C.训练数据集样本总量
  • D.激活函数输出维度

答案:A。通道级剪枝常计算每个通道权重的 L1 范数(绝对值之和)作为重要度,分数低的通道先被剪掉。B、C、D 与通道重要性无关,属于干扰项。

Q5. 剪枝率过高时模型精度骤降的根本原因是?

单选题 · mid

  • A.模型参数量变少无法承载任务
  • B.关键通道被误删且难以恢复
  • C.训练数据被压缩损失信息
  • D.学习率太小导致收敛缓慢

答案:。当剪枝率超过临界点时,被剪掉的往往是携带核心特征的通道,剩余结构不足以表达任务所需的知识,重训练也难以找回。A 是表象而非根本原因,C、D 与剪枝无关。

Q6. 知识蒸馏中软标签(soft label)的作用是?

单选题 · hard

  • A.提供类别间的语义相似关系← 正确答案
  • B.增加训练数据的多样性
  • C.直接提高剪枝率上限
  • D.减少教师网络的推理开销

答案:A。软标签是教师网络输出的类别概率分布,保留了“猫与狗接近、猫与火箭远离”的相似度信息,学生学到的是更丰富的语义结构。B 是数据增强的作用,C 与蒸馏无关,D 说的是教师网本身就需要的开销。

Q7. 结构化剪枝后 FLOPs 大幅下降主要是由于?

单选题 · hard

  • A.单个权重数值被压缩为低精度
  • B.各层输入输出通道数同步减小← 正确答案
  • C.激活函数换成了更简单的形式
  • D.批归一化层被完全移除

答案:B。通道级剪枝删除通道后,本层输出通道数与下一层输入通道数同步减少,卷积运算的乘法次数平方级下降,FLOPs 因而大减。A 是量化,C 是算子替换,D 的 BN 层本身算力开销很小。

Q8. 非结构化剪枝的典型特点有哪些?

多选题 · easy

  • A.对每个权重独立判断是否置零← 正确答案
  • B.产生不规则的稀疏矩阵← 正确答案
  • C.在常规硬件上难以直接加速← 正确答案
  • D.剪枝后网络结构完全规整

答案:ABC。非结构化剪枝逐个权重判断、权重归零后得到不规则稀疏矩阵,普通 CPU/GPU 的稠密矩阵运算无法直接受益,因此 A、B、C 正确。D 恰恰相反,非结构化剪枝的稀疏分布不规则,结构并不规整。

Q9. 剪枝后缓解精度损失的常用策略包括?

多选题 · mid

  • A.用小学习率做重训练← 正确答案
  • B.采用迭代渐进式剪枝← 正确答案
  • C.引入知识蒸馏辅助约束← 正确答案
  • D.随机把学习率调大数倍

答案:ABC。小学习率重训练让幸存权重平稳适应,迭代剪枝避免一次剪秃,知识蒸馏让学生模型模仿教师恢复信息——都是有效策略。D 错误,剪枝后调大学习率容易震荡发散。

Q10. 关于结构化剪枝与端侧部署的关系,正确的是?

多选题 · hard

  • A.通道数减少直接降低计算量← 正确答案
  • B.规整结构有利于编译优化← 正确答案
  • C.必须搭配非结构化剪枝才有效
  • D.层级剪枝可整体移除冗余模块← 正确答案

答案:ABD。通道数减少带来 FLOPs 平方级下降,规整的密集张量便于编译器做内存布局和算子融合,层级剪枝能直接删除整块冗余结构,A、B、D 正确。C 错误,结构化剪枝可独立使用,且部署收益已足够显著。