2.1 模型剪枝Model Pruning模型剪枝Pruning关注的是一个已经训练好的神经网络中哪些参数/结构是冗余的、对输出贡献很小能否删除它们来降低模型的存储与计算成本。它与量化Quantization经常被放在一起讨论但两者压缩路径不同模型量化减少权重/激活的比特数例如 FP16 → INT8/INT4核心是“同样的结构用更低精度表示”。模型剪枝删除权重连接或网络结构把某些权重置零或移除某些通道/头/层核心是“更少的参数与更少的计算”。在大模型LLM/MLLM场景中剪枝通常被用来实现更小的模型大小显存/磁盘占用下降更快的推理尤其是结构化剪枝能直接减少矩阵乘更低的训练/微调成本对剪枝后的结构进行适配1 剪枝简介为什么“能删还不掉精度”1冗余从哪里来神经网络通常是过参数化over-parameterized的训练过程中很多权重会收敛到很小的值或形成高度相关的表示许多注意力头、FFN 中间维度、甚至某些层在特定任务或数据分布上贡献较小大模型为了通用性与可迁移性往往“留了很多余量”。剪枝的目标并不是随便删参数而是寻找一种“近似等价”的更小模型在保证输出不显著变化的前提下让模型的有效自由度减少。2剪枝的基本数学视角以一个线性层为例yWx y WxyWx剪枝可以被理解为对WWW施加一个掩码矩阵MMM元素为 0 或 1得到稀疏权重W′M⊙W W M \odot WW′M⊙W从而输出变为y′W′x(M⊙W)x y Wx (M \odot W)xy′W′x(M⊙W)x剪枝的核心难点在于如何选择MMM让y′yy′尽可能接近yyy同时MMM的 0 尽可能多更高稀疏率。一种常见的抽象目标是min⁡M Ex∼D[∥Wx−(M⊙W)x∥22]s.t.∥M∥0≤k \min_{M} \ \mathbb{E}_{x \sim \mathcal{D}} \left[\lVert Wx - (M \odot W)x \rVert_2^2 \right] \quad \text{s.t.} \quad \lVert M \rVert_0 \le kMmin​Ex∼D​[∥Wx−(M⊙W)x∥22​]s.t.∥M∥0​≤k其中∥M∥0\lVert M \rVert_0∥M∥0​表示MMM中非零元素的个数kkk控制保留多少参数。这个形式揭示了一个事实剪枝不是“删小权重”这么简单本质是一个带约束的近似优化问题。2 剪枝流程三条主路线剪枝通常不是一步到位而是一个“结构变化 性能修复”的过程。实践中常见三种大流程流程 A先训练 → 再剪枝 → 再微调Post-training pruning Finetune这是最经典、最广泛使用的流程训练一个基座模型或拿现成预训练模型。根据重要性度量例如权重幅值、激活统计、二阶近似等剪掉一部分参数/结构。对剪枝后的模型进行微调Finetune来恢复性能。特点实操最稳因为你从一个强模型开始可控性较好剪多少、掉多少性能、微调能恢复多少比较可预期对大模型代价较高微调成本不小但通常比从头训练便宜。案例直观理解假设一个 7B LLM 在某个评测集上准确率 60%。你做 50% 非结构化稀疏剪枝后准确率可能掉到 50%。再进行少量数据/少量步数微调后可能恢复到 57%59%。这说明剪枝引入的误差可以被“再适配”部分修复但不一定完全恢复。流程 B训练过程中剪枝 → 再微调Pruning during training这条路线把“稀疏化”当成训练过程的一部分训练时逐步提高稀疏率例如从 0% 增到 50%。在训练中持续更新参数同时逐步将不重要的连接置零。达到目标稀疏率后再做一次稳定微调或校准。特点通常比后剪枝更“平滑”模型有机会逐渐适应结构变化工程复杂度更高要设计稀疏率调度、稀疏结构的稳定训练策略对大模型而言仍然昂贵因为你在训练阶段就引入额外机制。直观解释“后剪枝”像是突然砍掉一半神经连接再去修“训中剪枝”像是训练时不断提醒模型“将来这些连接会消失你提前学会不用它们”。流程 C先剪枝结构 → 从头训练Prune then train from scratch这条路线先确定一个更小的结构更少层/更少通道/更少头然后直接训练定义剪枝后结构例如减少 FFN 宽度、减少注意力头、删掉若干层。用标准预训练方式从头训练该结构。特点最“干净”的加速路径因为结构本身变小计算图更小成本最高从头训练大模型代价巨大需要更强的结构设计能力剪坏结构可能导致上限下降。常见使用场景当你要做一个“同家族的小模型”版本并希望推理效率更高、部署更轻量时这条路线更合理例如把某个大模型架构剪成多档规模。3 剪枝分类非结构化 vs 结构化剪枝方式大体分为两类非结构化剪枝Unstructured与结构化剪枝Structured。它们的核心差异在于删的是“单个权重”还是“成组结构”。一、非结构化剪枝Unstructured Pruning1定义与特征非结构化剪枝随机性更强但这里的“随机”是指结构上不规则你可能把矩阵WWW中的某些元素置零但保留矩阵形状不变从张量视角看稀疏位置分布不规则irregular sparsity。形式上还是前面的掩码W′M⊙W W M \odot WW′M⊙W其中MMM的 0/1 分布没有规则不是整行整列被删。2优缺点优点剪枝算法相对简单压缩比可以很高例如 50%90% 稀疏。缺点稀疏矩阵乘在通用 GPU/CPU 上不一定快甚至可能更慢访存不连续、kernel 不友好需要专门稀疏算子/硬件支持才容易获得真实加速对 LLM 来说精度恢复往往需要再训练/微调代价较高。3为什么“没有专用硬件难以加速”对一个d×dd \times dd×d的稠密矩阵乘计算复杂度大致是O(d2)O(d^2)O(d2)。如果你把一半元素置零理论乘法次数减少但实际执行时稀疏索引的存取与不连续内存访问带来额外开销GPU 的张量核心Tensor Core更擅长规则稠密计算稀疏 kernel 若不成熟无法把“理论 FLOPs 减少”转化为“壁钟时间减少”。因此非结构化剪枝常见收益是显存/存储下降前提是采用稀疏存储格式真实推理加速不稳定强依赖硬件与实现4代表方法SparseGPT核心思想一次性one-shot剪枝尽量减少重新训练成本。它把剪枝视作一个“稀疏回归”近似问题在给定少量校准数据的情况下让剪枝后输出尽可能贴近原模型。对某一层线性映射yWxy WxyWx它希望找到稀疏W′WW′使得min⁡W′ ∥WX−W′X∥F2s.t.∥W′∥0≤k \min_{W} \ \lVert WX - WX \rVert_F^2 \quad \text{s.t.} \quad \lVert W \rVert_0 \le kW′min​∥WX−W′X∥F2​s.t.∥W′∥0​≤k其中XXX是收集到的校准输入按列堆叠∥⋅∥F\lVert \cdot \rVert_F∥⋅∥F​是 Frobenius 范数约束要求W′WW′足够稀疏。直观案例你从真实推理数据中抽取一小批 token 的激活作为XXXSparseGPT 在每层上做近似优化寻找一组置零方案使得输出偏差最小。优点在于不需要长时间微调就能得到较高稀疏率但精度与任务鲁棒性仍取决于校准数据覆盖度。5代表方法LoRAPrune核心思想把“参数高效微调PEFT”和剪枝结合用 LoRA 的信息来指导权重重要性。LoRA 通常表示为对权重增量的低秩分解WadaptWΔW,ΔWAB W_{\text{adapt}} W \Delta W, \quad \Delta W ABWadapt​WΔW,ΔWAB其中A∈Rd×rA \in \mathbb{R}^{d \times r}A∈Rd×rB∈Rr×dB \in \mathbb{R}^{r \times d}B∈Rr×dr≪dr \ll dr≪d。LoRAPrune 的直觉是如果某些方向/通道在 LoRA 适配中贡献更大例如 LoRA 更新幅度更大、梯度更显著那么这些参数可能更“重要”反之可作为剪枝候选。案例为什么 LoRA 信息有用在特定下游任务上你用少量数据做 LoRA 微调。如果某一层的某些通道始终几乎不被 LoRA 更新对应方向梯度很小可能说明它们对该任务贡献较低。剪掉这些通道往往比盲目按权重幅值剪更稳。6代表方法Wanda核心思想用“权重大小 × 输入激活强度”来衡量重要性。对线性层yWxy WxyWxWanda 给每个权重wijw_{ij}wij​一个重要性度量Iij∣wij∣⋅∥xj∥ I_{ij} |w_{ij}| \cdot \lVert x_j \rVertIij​∣wij​∣⋅∥xj​∥其中xjx_jxj​表示该权重对应输入维度在校准数据上的激活或其范数统计。然后在局部范围内比较例如按行/按输出通道删除低重要性的权重。为什么要乘激活范数只看∣wij∣|w_{ij}|∣wij​∣会忽略输入分布某些权重即使不大但如果对应输入维度经常被强烈激活它对输出影响可能仍很大某些权重很大但对应输入维度几乎不激活它对实际推理贡献可能很小。直观案例在注意力/FFN 的线性层中某些输入维度在真实 token 分布下几乎不出现高激活。Wanda 倾向于剪掉连接到这些“冷门输入维度”的权重从而更贴合实际推理分布。二、结构化剪枝Structured Pruning1定义与特征结构化剪枝删除的是成组结构使网络结构更“规整”更容易获得真实加速。常见结构粒度包括删除某些注意力头attention heads删除某些FFN 中间通道neurons / channels删除某些层layers删除某些块blocks或专家MoE experts在 MoE 场景以 FFN 为例标准 Transformer FFN 常写作FFN(h)W2 σ(W1h) \text{FFN}(h) W_2 \ \sigma(W_1 h)FFN(h)W2​σ(W1​h)其中W1W_1W1​把隐藏维度ddd扩到中间维度dffd_{\text{ff}}dff​W2W_2W2​再投回ddd。如果结构化剪枝把中间维度从dffd_{\text{ff}}dff​剪到dff′d_{\text{ff}}dff′​那么参数量下降W1W_1W1​与W2W_2W2​都变小计算量下降两次矩阵乘都减少推理可直接加速因为矩阵形状变小仍是稠密 GEMM2优缺点优点更容易在现有硬件上获得真实推理加速无需依赖复杂稀疏算子部署更友好形状规整。缺点压缩比通常不如非结构化极端因为按组删除更“粗”结构选择更难删错头/删错层可能造成不可逆的能力损失需要更强的重要性估计与依赖分析。3代表方法LLM-PrunerLLM-Pruner 的目标是在压缩 LLM 的同时尽量保护多任务能力与生成质量。其思路通常包含两层要点1依赖检测不是“哪个小删哪个”Transformer 内部存在强依赖关系注意力头之间可能互补FFN 通道与注意力输出的分布耦合某些层承担更关键的表征变换例如中间层对语义组合、后层对指令遵循/对齐。因此结构化剪枝往往需要先做“依赖检测”dependency detection识别哪些结构是互相依赖的一组避免只删其中一个导致整体功能断裂。2重要性估计一阶信息 近似二阶信息结构化剪枝更强调“删掉一个结构会造成多大损失”。经典的参数敏感性分析通常来自泰勒展开如果目标函数为L(θ)\mathcal{L}(\theta)L(θ)删除某个结构相当于对参数做扰动Δθ\Delta \thetaΔθ近似损失变化为ΔL≈∇L⊤Δθ12Δθ⊤HΔθ \Delta \mathcal{L} \approx \nabla \mathcal{L}^\top \Delta \theta \frac{1}{2}\Delta \theta^\top H \Delta \thetaΔL≈∇L⊤Δθ21​Δθ⊤HΔθ其中HHH是 Hessian。只用一阶项梯度容易不稳定因为梯度会随 batch 波动加入二阶项能更好估计“删掉后是否会造成大幅损失”但 Hessian 精确计算代价极高所以通常采用近似。直观案例结构化剪枝为何要二阶信息两个注意力头在当前 batch 上梯度都很小但其中一个头承担了“关键 rare pattern”的捕捉能力在普通样本上梯度不显著但一旦删除会导致模型在特定类型任务上崩得很厉害。二阶近似对曲率敏感往往更能反映这种“潜在重要性”。三、非结构化 vs 结构化选择策略与实践建议1真实目标决定剪枝类型若你的目标是尽可能高的压缩率参数稀疏并且你有稀疏推理支持专用 kernel/硬件非结构化更合适。若你的目标是推理加速与部署友好结构化通常更合适矩阵变小直接加速。2大模型里最常见的结构化剪枝对象FFN 中间维度剪枝通常收益稳定且对推理延迟影响明显。注意力头剪枝能减少注意力计算但删头策略需要谨慎头之间有互补。层剪枝收益最大但风险也最大容易伤到“推理深度”和泛化能力。3一个可落地的经验框架不含代码实现可以把剪枝看成三个阶段的闭环度量重要性权重幅值 / 激活统计 / 梯度 / 近似 Hessian / 任务适配信号如 LoRA 更新。执行剪枝选定稀疏率或结构压缩比例得到新模型。性能修复校准或微调使剪枝后输出重新稳定。其中“重要性度量”决定上限“修复策略”决定能恢复多少。四、总结把关键点压缩成一句话非结构化剪枝删“单个权重”稀疏率高但结构不规则真实加速依赖稀疏算子/硬件SparseGPT、Wanda、LoRAPrune 等都在“如何用更好的重要性度量与更少的再训练”上发力。结构化剪枝删“成组结构”头/通道/层结构规整、部署友好、加速更直接LLM-Pruner 等强调依赖检测与更稳健的重要性估计以减少能力断崖式下降。剪枝的本质不是“删得越多越好”而是在给定部署目标延迟/显存/吞吐的约束下找到对能力影响最小的可删部分并通过校准/微调把损失补回来。