一、论文基本信息
论文题目:DepGraph: Towards Any Structural Pruning
作者:Gongfan Fang、Xinyin Ma、Mingli Song、Michael Bi Mi、Xinchao Wang
发表信息:CVPR 2023
论文链接:CVF Open Access / arXiv
官方代码:Torch-Pruning,GitHub 仓库为 VainF/Torch-Pruning
这篇论文的核心目标是解决结构化剪枝中的一个通用难题:如何让剪枝方法适用于任意网络结构,而不是只针对 ResNet、VGG、MobileNet 或 ViT 手工写规则。
DepGraph 的全称可以理解为 Dependency Graph,依赖图。它的核心作用不是重新设计一个通道重要性指标,而是自动分析网络中的结构依赖关系。
也就是说,DepGraph 重点解决的问题不是:
这个通道重不重要?
而是:
如果我要剪掉这个通道,哪些层、哪些参数、哪些输入输出维度必须一起被剪,才能保证网络结构仍然合法?
这是这篇论文最重要的定位。
二、论文要解决的问题
传统结构化剪枝通常很依赖网络结构。
例如在 VGG 这种顺序网络中,剪掉某一层的输出通道,只需要同步修改下一层输入通道,逻辑比较简单。
但在 ResNet、DenseNet、ViT、LSTM、GNN 这类网络中,剪枝会复杂得多。
例如 ResNet 中存在 shortcut connection。如果某个 residual branch 被剪掉部分通道,那么 shortcut 分支、BN 层、后续相加操作、后续卷积输入通道都可能需要同步修改。否则就会出现维度不匹配。
所以结构化剪枝真正困难的地方在于:
剪枝不是孤立删除某一层的一个通道,而是要删除一组存在结构耦合关系的参数。
很多早期方法会针对某种网络手工写规则。例如:
VGG 剪枝规则比较简单。
ResNet 需要专门处理 residual add。
DenseNet 需要专门处理 concat。
MobileNet 需要处理 depthwise conv 和 pointwise conv 的通道绑定。
ViT 需要处理 attention head、MLP hidden dimension、LayerNorm 和 embedding 维度之间的关系。
这些规则往往不能直接迁移。一旦网络结构变了,就需要重新分析依赖关系。
DepGraph 要解决的就是这个问题:
自动发现结构化剪枝中的依赖关系,并自动生成必须同步剪枝的参数组。
三、核心思想
DepGraph 的核心思想可以概括为一句话:
把神经网络中的结构依赖关系构建成一张图,然后通过图搜索自动找到所有必须同步剪枝的参数。
传统做法是人工分析网络结构,然后手动写剪枝规则。
DepGraph 的做法是:输入一个模型和 example input,通过前向追踪分析网络计算图,识别哪些模块的输入输出维度存在依赖,然后构建 Dependency Graph。
之后,如果我们想剪掉某个通道,DepGraph 会沿着依赖图自动传播,找到所有受到影响的层和参数。
所以,DepGraph 的核心贡献不是"如何给通道打分",而是:
如何安全地剪。
这一点非常关键。
前面很多论文关注的是通道重要性,例如 L1、FPGM、HRank、CHIP、Taylor、Gate Decorator 等。
而 DepGraph 关注的是:
剪掉某个结构单元时,哪些相关结构必须一起剪。
四、为什么 DepGraph 很重要?
结构化剪枝真正落地时,最容易出问题的不是重要性分数,而是维度依赖。
如果只根据 L1 norm 或 Taylor score 选出某些通道,然后直接删除,网络很容易报错。
常见错误包括:
卷积输出通道数和 BN 通道数不一致。
残差分支两边通道数不一致。
Concat 后的通道索引错位。
Linear 层输入维度和前面输出维度不一致。
Attention 中 Q、K、V、projection 维度不匹配。
LayerNorm 参数维度和 hidden dimension 不一致。
这些问题说明:
结构化剪枝不是简单地把某一层剪小,而是要维护整个网络计算图的一致性。
DepGraph 的价值就在于,它把这部分复杂的人工依赖分析自动化了。
五、DepGraph 的方法细节
5.1 把模块拆成输入和输出两个节点
DepGraph 不只是把每个层当作一个节点,而是将每个模块拆成输入端和输出端。
这样可以区分一个模块的输入维度剪枝和输出维度剪枝。
例如一个 Conv2d 层:
剪输出通道时,要删除 weight 的输出维度。
剪输入通道时,要删除 weight 的输入维度。
这两个操作不是同一个概念。
所以 DepGraph 需要更精细地表示结构依赖。
这一点是为了支持 any structural pruning。
也就是不仅能剪 CNN channel,也能扩展到 Transformer hidden dimension、attention head、MLP neuron 等结构单元。
5.2 两类依赖关系
DepGraph 主要建模两类依赖关系。
第一类是 inter-layer dependency,层间依赖。
例如 Conv 的输出连接到 BN 的输入,BN 的输出连接到 ReLU,ReLU 的输出连接到下一层 Conv 的输入。
如果 Conv 的某个输出通道被删除,那么 BN、ReLU 和下一层 Conv 的对应输入通道都必须同步删除。
第二类是 intra-layer dependency,层内依赖。
例如 BN 层本身不改变通道数,因此它的输入通道和输出通道必须使用同一个剪枝方案。
也就是说,如果 BN 输入的第 5 个通道被删除,那么 BN 输出的第 5 个通道也必须删除。
这两类依赖共同决定了一个剪枝操作会传播到哪些参数。
5.3 依赖传播
当我们选择一个待剪结构单元后,DepGraph 会沿着依赖图传播。
例如,如果要剪掉某个卷积层的输出通道,它可能会触发:
对应 BN 参数删除。
对应后续 Conv 输入通道删除。
对应 residual branch 中相同位置通道删除。
对应 shortcut 分支相关通道删除。
对应 Linear 输入维度删除。
最终得到的不是单个通道,而是一个 pruning group。
所以 DepGraph 的剪枝对象本质上是:
一组结构耦合参数,而不是单独某一层的某个通道。
这是这篇论文最需要强调的地方。
六、Group-level Pruning:组级剪枝
DepGraph 找到的剪枝单元是 group。
一个 group 里可能包含多个层的参数,例如:
Conv 输出通道。
BN scale 和 bias。
后续 Conv 输入通道。
Residual 分支对应通道。
Shortcut 分支对应通道。
如果这个 group 中第 k 个维度被剪掉,那么 group 内所有相关参数的第 k 个维度都要同步删除。
因此,DepGraph 强调 group-level pruning。
这和传统 layer-wise pruning 不同。
传统方法可能只看某一层的通道重要性。
DepGraph 认为,结构化剪枝应该先确定依赖组,再对整个组进行重要性评估或稀疏训练。
换句话说:
剪枝决策应该发生在 group 级别,而不是孤立层级别。
七、Consistent Group Sparsity:一致组稀疏
DepGraph 论文中还有一个重要概念:consistent group sparsity,一致组稀疏。
为什么需要一致组稀疏?
因为一个剪枝 group 里包含多个耦合层。如果只让其中某一层稀疏,而其他耦合层不稀疏,就会出现不一致。
例如某个通道在 Conv1 中看起来不重要,但在后续 Conv2 的输入维度中可能仍然重要。
如果只根据 Conv1 的分数剪掉这个通道,可能会破坏后续层的信息表达。
DepGraph 的思路是:
让同一个 group 中对应维度的所有参数一起变小。
这样,被剪掉的结构单元在整个依赖组中都表现为不重要,剪枝会更安全。
这也是 DepGraph 相比普通单层稀疏训练更强的地方。
八、DepGraph 的整体流程
DepGraph 的整体流程可以概括为以下几步。
第一,输入一个模型和 example input。
第二,追踪模型的前向计算过程。
第三,把网络模块拆成输入节点和输出节点。
第四,建立层间依赖和层内依赖。
第五,构建完整的 Dependency Graph。
第六,从一个目标剪枝操作出发,沿依赖图传播。
第七,得到必须同步剪枝的 pruning group。
第八,对 group 计算重要性,或进行 group-level sparse training。
第九,删除低重要性的 group 维度。
第十,对剪枝模型进行 fine-tuning。
这里最重要的是:
DepGraph 负责自动找出"谁必须和谁一起剪"。
这让结构化剪枝从手工规则变成了自动图分析。
九、实验结果解读
9.1 CNN 上的结果
DepGraph 在 CIFAR 和 ImageNet 上测试了多种 CNN,包括 ResNet、VGG、DenseNet、MobileNetV2、ResNeXt 等。
实验结果说明,即使用比较简单的 norm-based group importance,只要结构依赖分析正确,DepGraph 也能取得有竞争力的剪枝效果。
这说明:
正确处理依赖关系本身,就能显著提升结构化剪枝的可靠性。
9.2 ViT 上的结果
DepGraph 还测试了 ViT-B/16。
这很重要,因为 ViT 的剪枝不再是传统 CNN channel pruning,而涉及 hidden dimension、attention module、MLP module、LayerNorm 等复杂结构依赖。
DepGraph 能处理 ViT,说明它的目标确实不是只服务 CNN,而是面向更通用的结构化剪枝。
这也是论文题目中 Towards Any Structural Pruning 的含义。
9.3 RNN 和 GNN 上的结果
论文还在 LSTM、DGCNN、GAT 等非 CNN 网络上进行了实验。
这进一步证明 DepGraph 的通用性。
它不仅能处理图像分类网络,也能处理序列模型和图神经网络。
所以 DepGraph 的真正价值是:
它把结构化剪枝从 CNN 专用方法,推进到多架构通用剪枝框架。
十、方法优点
10.1 通用性强
DepGraph 最大优点是 通用结构依赖建模。
它不需要为 ResNet、DenseNet、MobileNet、ViT、LSTM、GNN 分别写独立剪枝规则,而是通过依赖图自动发现参数耦合关系。
这是它区别于传统剪枝论文的最大价值。
10.2 工程价值高
很多剪枝论文只提出重要性指标,但真正复现时常常卡在结构修改上。
DepGraph 解决的是工程上最关键的问题:
剪完之后模型不能报错,且结构真的变小。
这使它不只是一个理论方法,也是一套实际可用的结构化剪枝基础设施。
10.3 可以和多种重要性指标结合
DepGraph 本身不绑定某一种评分方式。
它可以和 L1、L2、Taylor、BN gamma、Fisher、CHIP、learned sparsity 等方法结合。
因此,DepGraph 更像是剪枝框架,而不是单一剪枝准则。
它回答的是:
如何剪得合法。
而不是:
如何判断谁最不重要。
10.4 支持真正结构化删除
DepGraph 删除的是实际结构维度,而不是只把权重置零。
因此剪枝后模型参数量、MACs 和实际计算图都会变小。
这比非结构化 mask pruning 更容易带来真实部署收益。
十一、方法局限
11.1 DepGraph 不直接解决最优重要性估计
DepGraph 的核心是依赖建模,不是最优打分。
如果重要性指标本身不好,那么即使依赖关系处理正确,剪枝效果也可能受限。
所以 DepGraph 最适合作为底层结构化剪枝框架,再结合更强的重要性估计方法。
11.2 复杂动态图可能仍需要适配
如果模型 forward 中存在复杂控制流、自定义算子、动态 shape 或特殊张量操作,依赖分析可能仍然需要额外处理。
这也是所有自动图分析方法都会遇到的问题。
11.3 Group 过大时剪枝粒度会变粗
在某些网络中,多个层高度耦合,DepGraph 可能会生成很大的 group。
Group 越大,剪枝时需要同步删除的参数越多,剪枝粒度就越粗。
这可能限制精细化剪枝空间。
11.4 仍需要 fine-tuning
DepGraph 完成结构化删除后,通常仍需要 fine-tuning 恢复精度。
所以它不是完全训练后零成本剪枝方法。
十二、一句话总结
《DepGraph: Towards Any Structural Pruning》提出用 Dependency Graph 自动建模神经网络中的结构依赖关系,将必须同步裁剪的输入维度、输出维度和参数维度归为同一个 pruning group,从而支持 CNN、Transformer、RNN、GNN 等多种网络的通用结构化剪枝;它的核心贡献不是新的重要性指标,而是把结构化剪枝中最复杂的依赖分析和同步裁剪自动化。