一、模型压缩技术概述

1.1 模型压缩问题定义

因为嵌入式设备的算力和内存有限,因此深度学习模型需要经过模型压缩后,方才能部署到嵌入式设备上。

模型压缩问题的定义可以从 3 角度出发:

  1. 模型压缩的收益:
  • 计算: 减少[浮点运算量](FLOPs),降低[延迟](Latency
  • 存储: 减少内存占用,提高 GPU/NPU 计算利用率
  1. 公式定义模型压缩问题: 

  1. 模型压缩问题的约束: 

我们知道,一定程度上,网络越深,参数越多,模型也会越复杂,但其最终效果也越好,而模型压缩算法是旨在将一个庞大而复杂的预训练模型转化为一个精简的小模型。

1.2 模型压缩方法分类

按照压缩过程对网络结构的破坏程度,《解析卷积神经网络》一书中将模型压缩技术分为“前端压缩”和“后端压缩”两部分:

  • 前端压缩,是指在不改变原网络结构的压缩技术,主要包括知识蒸馏、轻量级网络(紧凑的模型结构设计)以及滤波器(filter)层面的剪枝(结构化剪枝)等;
  • 后端压缩,是指包括低秩近似、未加限制的剪枝(非结构化剪枝/稀疏)、参数量化以及二值网络等,目标在于尽可能减少模型大小,会对原始网络结构造成极大程度的改造。

总结:前端压缩几乎不改变原有网络结构(仅仅只是在原模型基础上减少了网络的层数或者滤波器个数),后端压缩对网络结构有不可逆的大幅度改变,造成原有深度学习库、甚至硬件设备不兼容改变之后的网络。其维护成本很高。

剪枝对象:

  • 权重剪枝(Weight Pruning):移除单个权重(连接),通常基于权重的大小(如绝对值较小的权重被剪除)。这会导致稀疏矩阵,适合稀疏计算加速。
  • 结构化剪枝(Structured Pruning)
  1. 通道剪枝(Channel Pruning):移除整个卷积通道(filters),保持模型结构规则,适合通用硬件加速。(DepGraph剪枝
  2. 神经元剪枝:移除整个神经元或节点。
  3. 层剪枝:移除整个网络层(较少见)。
  4. 混合剪枝:结合权重和结构化剪枝。

剪枝粒度:

  1. 细粒度剪枝:操作单个权重,灵活但需要稀疏矩阵支持。
  2. 粗粒度剪枝:操作通道、层等结构化单元,硬件友好但可能损失更多精度。

剪枝依据:

  1. 基于幅度(Magnitude-based):移除绝对值较小的权重或通道,假设其贡献较小。
  2. 基于重要性(Importance-based):通过某些指标(如Hessian矩阵、梯度、特征图激活)评估权重或通道的重要性。
  3. 基于正则化:在训练时引入L1/L2正则化,鼓励权重趋向于零,便于后续剪枝。

剪枝策略:

  1. 一次性剪枝(One-shot Pruning):在训练后直接剪枝,然后微调。
  2. 迭代剪枝(Iterative Pruning):分多次逐步剪枝,每轮剪枝后微调,精度损失较小。
  3. 训练时剪枝(Pruning during Training):在训练过程中动态剪枝(如通过掩码或正则化)。

一、 按剪枝的“粒度”划分

“四个级别”是理解剪枝技术的关键维度,从最精细到最粗粒度排列。

剪枝的核心思想是:移除神经网络中冗余或不重要的参数(权重)或结构,在保持模型性能基本不变的前提下,减小模型大小、降低计算复杂度和内存占用,从而提升推理速度。

删除权重小于一定阈值的连接或者神经元节点得到更加稀疏的网络

  • Dropout 类似非结构化剪枝 剪去神经元
  • DropConnect 类似结构化剪枝 (剪去连接)

1. 非结构化剪枝

  • 核心思想:移除网络中个别不重要的权重(即将其置为零),形成稀疏的权重矩阵。

  • 特点

    • 粒度最细:针对单个权重参数。
    • 高理论压缩率:理论上可以移除大量权重。
    • 实现困难:产生的稀疏模式是不规则、随机的。
    • 硬件不友好:标准的CPU/GPU和深度学习框架(如PyTorch, TensorFlow)是针对密集矩阵运算优化的。稀疏矩阵需要特殊的稀疏存储格式(如CSR)和库(如cuSPARSE)才能获得实际的加速,而这通常支持不完善,难以达到理论加速比。
  • 典型方法

(1)权重剪枝((Fine-gained) sparsity 0-D):直接根据权重的绝对值(L1范数)或梯度信息,剪掉值接近零的权重。

(2)神经元剪枝:可以被视为一种特殊的非结构化剪枝,通过移除某个神经元的所有输入和输出连接来实现,但其效果等同于移除整个神经元。

2. 结构化剪枝

  • 核心思想移除整个结构化的组件(如通道、滤波器、层),从而直接改变网络的宏观架构,产生一个更小、更紧凑的稠密模型

  • 特点

    • 硬件友好:输出的模型仍然是规则的稠密网络,可以直接被现有硬件和框架高效支持,无需特殊库,能获得确定的、线性的加速
    • 粒度较粗:压缩率和精度损失之间需要更精细的权衡。
  • 典型方法(从细到粗):

(1)通道剪枝

主要针对卷积神经网络。移除特征图中的整个通道。例如,一个形状为 [C_out, C_in, K, K] 的卷积核,若移除其输入通道 C_in 中的第 i 个,则对应所有滤波器的第 i 个通道都被移除;若移除输出通道 C_out 中的第 j 个,则整个第 j 个滤波器被移除。

(2)滤波器剪枝

可以看作是通道剪枝的特例,直接移除整个滤波器(即输出通道)。这会减少下一层输入通道的数量,因此需要同步剪掉下一层卷积核的对应输入通道。

(3)层级别剪枝

粒度最粗。直接移除网络中的整个层(例如,残差网络中的某些残差块)。这需要模型本身有一定冗余深度,并且对网络拓扑结构影响较大,需谨慎设计。

二、 关键技术流程与共同步骤

无论哪种剪枝粒度,一个完整的剪枝流程通常包含以下核心步骤:

  1. 预训练:首先在目标任务上训练一个大型的、过参数化的模型,直至收敛。

  2. 重要性评估这是剪枝的核心决策环节。定义一个标准来判断哪些参数或结构是“不重要”的。

    • 常用准则

      • 权重绝对值:认为绝对值小的权重不重要(非结构化常用)。
      • L1/L2范数:计算滤波器或通道的权重范数,范数小的被认为不重要(结构化常用)。
      • 基于梯度/激活:分析梯度信息或激活值的统计量(如平均激活值为零的通道)。
      • 基于重建误差:试图最小化剪枝前后特征图或输出结果的差异。
      • 利用BN层缩放因子:在通道剪枝中,BN层的缩放因子γ可以很好地代表通道的重要性,γ接近零的通道可被剪枝(如Network Slimming方法)。
  3. 剪枝:根据评估准则和预设的剪枝比例(全局或逐层),移除不重要的部分。

  4. 微调/再训练:对剪枝后的模型进行重新训练,以恢复损失的精度。这是一个“剪枝-微调”的迭代过程,可以重复多次。

  5. 部署:将剪枝后的小模型部署到目标设备上。

三、 详细对比与总结

四、 发展趋势与挑战

  1. 自动化与联合优化

    • 将剪枝与神经网络架构搜索结合,自动寻找最优的稀疏结构。
    • 一次性剪枝:避免繁琐的迭代剪枝-微调流程。
    • 训练与剪枝同步:在训练过程中就引入稀疏性(如利用L1正则化)。
  2. 硬件协同设计: 设计支持高效稀疏计算的专用AI芯片(如某些NPU),以释放非结构化剪枝的潜力。

  3. 更优的重要性评估准则: 超越简单的范数判断,采用基于Hessian矩阵的二阶信息、基于影响力的分析等更精确的评估方法。

  4. 大语言模型的剪枝: LLMs参数量巨大,对其进行的结构化剪枝(如注意力头、FFN中间维度的剪枝)是当前研究热点。

本站提供的所有下载资源均来自互联网,仅提供学习交流使用,版权归原作者所有。如需商业使用,请联系原作者获得授权。 如您发现有涉嫌侵权的内容,请联系我们 邮箱:alixiixcom@163.com