
一、为什么要讲稀疏正则化剪枝前面几篇文章中我们已经介绍了几类经典剪枝思想OBD利用 Hessian 对角项估计删除权重后的损失变化OBS利用 Hessian 逆矩阵考虑参数之间的补偿Han Pruning通过 Train-Prune-Retrain 流程删除小幅值连接Lottery Ticket Hypothesis研究稀疏子网络能否从原始初始化重新训练。这些方法大多有一个共同特点先训练一个网络再根据某种重要性指标删除参数。但是还有一类方法不是等模型训练完之后再剪而是在训练过程中就鼓励模型自己变稀疏。这类方法通常叫做稀疏正则化剪枝。其中最经典的思想就是在损失函数中加入 L1 正则项让不重要的参数逐渐变成 0 或接近 0。本文就来系统讲清楚什么是 L1 正则L1 正则为什么会诱导稀疏L1 正则和 L2 正则有什么区别L1 正则和模型剪枝是什么关系为什么 L1 正则不等于真正结构化剪枝在 CNN、Transformer 和大模型剪枝中如何理解这种思想二、什么是正则化在深度学习中模型训练通常是最小化任务损失例如分类任务中的交叉熵损失如果只优化任务损失模型可能会过拟合训练数据也可能学到很多冗余参数。因此我们常常在损失函数中加入一个额外约束项其中是总损失是任务损失是正则项是正则强度表示模型参数。正则化的作用是不仅要求模型在训练数据上表现好还要求模型参数满足某种约束。如果正则项鼓励参数变小就可以抑制过拟合。如果正则项进一步鼓励参数变成 0就可能产生稀疏性。三、什么是 L1 正则L1 正则是最常见的稀疏正则化方法。对于模型参数L1 正则定义为所有参数绝对值之和加入 L1 正则后的训练目标为如果越大模型越倾向于让参数变小甚至让一部分参数变成 0。因此L1 正则的核心作用可以概括为在保证任务性能的同时尽量减少参数绝对值之和从而诱导模型产生稀疏参数。这就是 L1 正则和模型剪枝之间的关系。四、L1 正则为什么会诱导稀疏这是本文最核心的问题。为什么 L1 正则会让参数变稀疏为什么不是所有正则项都能做到这一点我们先从直觉解释开始。假设模型中有一个参数。如果加入 L1 正则那么优化目标中会多出一项只要不等于 0这一项就会给损失带来额外惩罚。因此优化器在训练时不仅要降低任务损失还要尽量降低参数绝对值。五、为什么 L1 比 L2 更容易产生稀疏为了理解 L1 正则必须把它和 L2 正则放在一起比较。L2 正则定义为加入 L2 正则后的目标为L2 正则对 w_i 的梯度为这说明 L2 正则对参数的收缩强度和参数大小有关。如果 w_i很大L2 正则会强烈惩罚它如果 w_i 已经很小L2 正则的梯度也会很小。因此L2 正则更像是把大权重压小但不一定把小权重压成 0。而 L1 正则不同。L1 正则的梯度大小基本是常数只要参数不是 0它就会受到持续的收缩作用。所以L1 正则更容易把一部分小权重真正推到 0 附近甚至变成 0。一句话概括L2 正则让权重变小L1 正则更容易让权重变成 0。这就是 L1 正则经常被用于稀疏化的原因。六、L1 正则和剪枝是什么关系L1 正则本身不是剪枝操作但它可以为剪枝创造条件。在没有 L1 正则时很多参数可能只是比较小但并不明显接近 0。加入 L1 正则后不重要的参数会被持续压缩到 0 附近。此时如果我们再设置一个阈值然后把绝对值小于阈值的参数删除就可以得到一个稀疏网络。所以L1 正则剪枝通常可以理解为两步训练阶段通过 L1 正则诱导参数接近 0剪枝阶段通过阈值把接近 0 的参数真正删除。这个流程可以表示为训练时加入 L1 正则 → 参数自然变稀疏 → 阈值剪枝 → 微调恢复性能也就是说L1 正则的作用不是直接“剪掉参数”而是让参数更容易被剪。七、L1 正则的优点L1 正则剪枝有几个明显优点。1. 思想简单L1 正则只是在训练目标中增加一项实现起来非常直接。2. 可以和训练过程自然结合它不需要等模型训练完再剪而是在训练过程中逐渐诱导稀疏。这使得模型有机会在训练阶段主动适应稀疏性。3. 可以作为剪枝前的稀疏诱导L1 正则可以让不重要参数集中到 0 附近使后续阈值剪枝更加稳定。4. 可以扩展到结构化剪枝如果对通道、head、neuron 等结构变量加 L1就可以诱导结构级稀疏。这比直接对单个权重加 L1 更容易获得实际加速。八、L1 正则的局限性L1 正则虽然经典但也有不少局限。1. 正则强度难以选择L1 正则强度 $\lambda$ 太小稀疏效果不明显$\lambda$ 太大模型性能可能明显下降。因此$\lambda$ 是一个非常关键的超参数。2. 不一定自动产生精确 0在深度学习优化中L1 正则通常让参数接近 0但未必严格等于 0。因此仍然需要阈值剪枝。3. 对所有权重加 L1 可能伤害性能如果简单粗暴地对所有权重加 L1可能会过度压缩重要参数导致模型表达能力下降。4. 非结构化稀疏不一定带来加速如果 L1 正则作用于单个权重得到的通常是不规则稀疏。这种稀疏形式在普通 GPU 上不一定能显著减少推理延迟。5. L1 正则不能准确刻画参数重要性权重小不一定不重要。某些小权重可能对损失函数很敏感。L1 正则只是提供一种稀疏诱导并不能精确估计剪枝后的损失变化。这也是为什么后续会出现敏感度剪枝、二阶剪枝、梯度剪枝、激活剪枝等方法。九、L1 正则和模型压缩的真实关系需要强调一点L1 正则本身只是稀疏诱导不等于模型压缩完成。要真正实现模型压缩通常还需要后续步骤根据权重或结构变量选择剪枝对象删除参数、通道、head 或 neuron重建模型结构微调恢复精度测量真实延迟、显存和吞吐。如果只是在训练时加入 L1 正则但没有真正删除参数那么模型文件大小和推理速度可能不会明显变化。尤其是在非结构化稀疏中即使很多权重接近 0只要矩阵仍然是 dense 存储和 dense 计算推理速度就不会明显提升。因此L1 正则更准确的定位是剪枝前的稀疏诱导机制而不是完整剪枝算法本身。十、一个简单的 PyTorch 实现思路如果对所有权重加 L1 正则训练时可以在任务损失上加一项 L1 penalty。示意如下l1_lambda 1e-5 task_loss criterion(outputs, targets) l1_penalty 0.0 for name, param in model.named_parameters(): if weight in name: l1_penalty l1_penalty param.abs().sum() loss task_loss l1_lambda * l1_penalty十一、L1 正则剪枝适合放在哪里在模型剪枝流程中L1 正则通常有几种使用方式。1. 从头训练时加入 L1这种方式希望模型在训练过程中自然形成稀疏性。流程为随机初始化 → 带 L1 正则训练 → 阈值剪枝 → 微调2. 在预训练模型上稀疏微调这种方式更常见于已有预训练模型的场景。流程为加载预训练模型 → 加 L1 正则微调 → 产生稀疏结构 → 剪枝 → 再微调这种方式比从头训练更省成本也更适合迁移学习和大模型压缩。3. 对结构 gate 做稀疏化如果目标是结构化剪枝可以引入 gate并对 gate 加 L1。流程为引入结构 gate → 对 gate 加 L1 正则 → 删除小 gate 对应结构 → 微调这类方法更适合实际部署因为它能删除完整结构单元。