关于剪枝对象的分类(weights剪枝、神经元剪枝、filters剪枝、layers剪枝、channel剪枝、对channel分组剪枝、Stripe剪枝)

article/2025/9/15 13:24:10

文章目录

  • 剪枝对象分析:
    • 1.weights剪枝:
    • 2.神经元剪枝:
    • 3.Filters剪枝:
    • 4.通道剪枝
    • 5.Group-wise剪枝
    • 6.Stripe剪枝

图1

剪枝对象分析:

剪枝分为结构化剪枝和非结构化剪枝,细化可分为weights剪枝、神经元剪枝、filters剪枝、layers剪枝、channel剪枝、对channel分组剪枝,还有今年新提出来的Stripe剪枝。
先讲对weights做剪枝和对神经元做剪枝的区别


由 于 非 结 构 化 的 剪 枝 在 硬 件 方 面 需 要 有 专 用 的 库 支 持 {\color{blue}由于非结构化的剪枝在硬件方面需要有专用的库支持} 没 有 结 构 化 剪 枝 易 于 实 现 , {\color{Blue}没有结构化剪枝易于实现,} 正在逐渐淡出人们的焦点。

1.weights剪枝:

最原始的权重剪枝
将权重矩阵中相对不重要的权值剔除,然后再重新精修(finetune)网络进行微调。

基于结构化剪枝中比较经典的方法是:
Pruning Filters for Efficient ConvNets(ICLR 2017),基于L1-norm判断filter的重要性。如下图:在这里插入图片描述

和2016年Han S的Deep compression: Compressing deep neural networks with pruning, trained quantization and huffman coding,
基于权重的绝对值大小来判断重要性。(ICLR 2016)

  • 顾名思义,也就是将权重矩阵里一部分的权值剪枝掉,那它是怎么剪掉的呢?通过将权重设置为0,那么剪掉哪些weighs呢?答案很简单,就是直接把那些数值近于0的weights赋为0。如下图:

但是有人问:将数值 ≈ {\color{Blue} \approx} 0的weights赋为0后,真的能起到压缩模型大小的作用吗,Parameters并没有减少啊?

这 就 是 我 们 要 提 到 的 非 结 构 化 剪 枝 — — 权 重 修 剪 导 致 产 生 非 结 构 化 稀 疏 的 f i l t e r s , 这 很 难 被 通 用 硬 件 加 速 。 {\color{Red}这就是我们要提到的非结构化剪枝——权重修剪导致产生非结构化稀疏的filters,这很难被通用硬件加速。} filters

至于上面问题的回答是,Parameter的确没有减少,但是FLOPs减少了,所以仍然起到了压缩模型大小,降低Inference latency的效果。

  • 显然数值 ≈ {\color{Blue} \approx} 0的weights赋为0是最简单的判断unimportant的方式,判断的标准还有很多。

Weights Pruning是一种细粒度的剪枝方法,它对网络内部的单个权值进行剪枝,在不牺牲Accuracy的情况下形成稀疏网络。

细粒度级的稀疏性使其提供了最高的灵活性,通用性导致了更高压缩率,然而,由于非零的位置权重是不规则的,需要额外的权重记录位置信息,并且由于网络内部的随机性,WP修剪后的稀疏网络不能像FP(Filters Pruninng)那样以结构化的方式表示,使得权重剪枝无法在通用处理器上实现加速。


2.神经元剪枝:

神经元(Activation)剪枝
Activation pruning中比较经典的方法有:
Network trimming: A data-driven neuron pruning approach towards efficient deep architectures,
这是2017年Hu等人发表在ICLR上的工作。这篇论文中用activations中0的比例 (Average Percentage of Zeros, APoZ)作为度量标准,An Entropy-based Pruning Method for CNN Compression,则利用信息熵进行剪枝。文章针对VGG16和ResNet18采用了两个不同的裁剪策略。对VGG16:
1. 裁剪前十层的layer
2. 用最大平均池化代替全连接层

Remarkable,也就是将模型中一部分的神经元剪掉,那它是怎么剪掉的呢?有人说是随机的。但很显然并不是。随机减去神经元的那就是dropout的工作了—————那么对应在实践操作中,只要删掉参数矩阵的一行元素就好啦~~

神经元剪枝可见下图,神经元简直就是去掉一些Neurons, 但是与weights 剪枝不同,体现在具体操作上就不是对权重矩阵的不规律的位置赋值为0 了,就是对权重矩阵的某一行置零了。那怎么找到这一行呢?或者说怎么找到这一行对应的神经元呢?做法可以是,计算神经元对应的一行或一列的平方和的根,以这个数值进行unimportance 的排序,将排序最小的那 k%置零。示意图如下:
在这里插入图片描述

  • 可以看到,与weights pruning相比,神经元剪枝就是对权重矩阵的整行整列做修剪,有基础知识应该很好理解…

权重矩阵的剪枝除了将权重矩阵中某些零散的参数,或者整行整列去掉外,我们能否将整个权重矩阵去掉呢?答案是肯定的,目前也有很多这方面的研究。而且直接进行权重矩阵剪枝,也是可行的方案。相比突触剪枝和神经元剪枝,压缩率要大很多。这就是对filters做pruning。

3.Filters剪枝:

由于原始卷积结构仍然保留,因此不需要专用硬件/库来实现。

Pruning convolutional neural networks for resource efficient inference
In ICLR, 2017。这篇ICLR2017的工作使用泰勒展开作为修剪标准的衡量,对filters进行剪枝

Filter Pruning via Geometric Median for Deep Convolutional Neural Networks Acceleration(CVPR2019) ,这是CVPR 2019的一篇oral,简称 FPGM
如上图,这篇论文利用几何中位数(Geometric Median)进行模型剪枝,属于对filters的剪枝。把绝对重要性拉到相对层面,认为与其他filters太相似的filter不重要。

《ThiNet: A Filter Level Pruning Method for Deep Neural Network Compression》 ICCV2017 以filter(卷积核)为单位,根据该层filter的输出来判断该filter是否对结果有贡献,如果没有贡献或贡献很小,则直接把这个filter去掉,因此文章的核心就在于filter的选择方式。
这篇论文的结果:VGG-16可以达到减少3.31倍FLOPs和16.63倍的压缩,top-5准确率只下降0.52%。

对filter和channel剪枝的工作有很多,各种算法层出不穷,但是这几年的paper各种算法Accuracy的提升很有限,虽然剪枝的主要目的并不在提升精度,但是从17年的那篇network slimming开始,对剪枝后的模型进行finetune之后精度明显超过baseline,而近几年的结果与17年的工作相比都没有一个明显的进步。当然,此言的前提是针对vgg网络的调研。



4.通道剪枝

关于通道剪枝的工作是最多的,是最易于IC实现的。它属于机构化剪枝的一种,通道剪枝就是每次剪枝若干组通道,如封图1所示,并且ICCV 2017年liu.等人的

《Learning Efficient Convolution Networks through Network Slimming》ICCV2017
它是引入BN层中缩放因子的γ对通道进行排序,对这篇论文我在CIFAR-10上的复现结果,在剪枝率为50%时,达到了惊人的94.22%。比paper中给的70%剪枝率时精度高了0.44%。如下图:
在这里插入图片描述
核心公式是 ∑ ( x , y ) l ( f ( x , W ) , y ) + λ ∑ γ ∈ Γ g ( γ ) \color{blue} \sum_{(x,y)}^{}l(f(x,W),y)+\lambda \sum_{\gamma \in \Gamma }^{}g(\gamma ) (x,y)l(f(x,W),y)+λγΓg(γ)

在训练时,对BN层的尺度因子添加L1正则化,达到稀疏化的作用,这样就可以通过BN层的尺度因子趋于0来识别不重要的channel。如上图,对应 γ \gamma γ 小的通道就直接被剪去。

《Channel Pruning for Accelerating Very Deep Neural Networks》ICCV2017 旷视科技。论文提出了新的通道剪枝方法,基于2步迭代的剪枝方法。首先基于LASSO回归选择通道,然后基于最小均方误差,进行权值的重新学习。该方法在VGG-16上取得了5倍的加速,并且只产生0.3%的误差。

同样,由于通道剪枝的亲近性,对其的研究不少于filter pruning。



5.Group-wise剪枝

就是对通道的分组剪枝,如封图所示,对通道进行分组剪枝其实已经是一个改进的方法了。但是他也有一个明显的弊端。
就是他移除的是某一层中所有的filters相同位置上的权重。但是,每个filters中无效的权重位置可能不同,所以这个方法解决不了这一点。

在这里插入图片描述

CVPR 2016的《Fast convnets using group-wise brain damage》和NIPS 2016的《Learning structured sparsity in deep neural networks》介绍了对通道进行分组剪枝的概念,如上图,提出通过group lasso regularization来学习神经网络中的结构化稀疏性。可以看到,分组后每次剪枝都是对每一层中filter的同一个位置剪去,使用“im2col”实现作为过滤器式和通道式修剪,可以有效地处理分组式修剪。

IJCNN2019的这篇《Structured pruning for efficient convnets via incremental regularization》提出一种动态的正则化方法改进了分组剪枝。



6.Stripe剪枝

这是最近NeurIPS2020新提出来的工作,腾讯优图的论文,号称刷新了filter剪枝的SOTA效果,下一篇博客我会详细介绍一下这个方法。方法如下:在这里插入图片描述
如封面图所示,他是结合了两种结构化和非结构化剪枝中的典型方法——weights pruning 和 filters pruning。所以它的做法是在filters中剪枝filter。如上图所示,他是按照kernel size把原filter切分成一个个条状的小条纹。
在这里插入图片描述
比如一个kernel,它的长和宽是经常相等的,假设是k×k×c,那我们就可以按照他的size把它剪成k×k个条。而且结合paper中提出的框架,可以学习到这个最佳形状的条纹。

以上就是对剪枝的对象的总结,如有不全之处,希望读到的各位朋友们指正,下一期会专门出一个对剪枝算法及其相关优秀论文的总结,也是对最近调研工作的一个记忆。




由于是六一儿童节,所以是以可爱的粉粉色来写的,祝大家六一快乐,一直可爱。

http://chatgpt.dhexx.cn/article/BMFPGPOA.shtml

相关文章

决策树——剪枝处理

剪枝处理 1:剪枝处理的原因 “剪枝”是决策树学习算法对付“过拟合”的主要手段,因此,可通过“剪枝”来一定程度避免因决策分支过多,以致于把训练集自身的一些特点当做所有数据都具有的一般性质而导致的过拟合 2:剪…

【ML】决策树--剪枝处理(预剪枝、后剪枝)

1. 剪枝(pruning)处理 首先,我们先说一下剪枝的目的——防止“过拟合”。 在决策树的学习过程中,为了保证正确性,会不断的进行划分,这样可能会导致对于训练样本能够达到一个很好的准确性,但是…

深度学习剪枝

一般来说,神经网络层数越深、参数越多,所得出的结果就越精细。但与此同时,问题也来了:越精细,意味着所消耗的计算资源也就越多。这个问题怎么破?这就要靠剪枝技术了。言下之意,把那些对输出结果…

决策树后剪枝算法(一)代价复杂度剪枝CPP

​  ​​ ​决策树后剪枝算法(一)代价复杂度剪枝CPP  ​​ ​决策树后剪枝算法(二)错误率降低剪枝REP  ​​ ​决策树后剪枝算法(三)悲观错误剪枝PEP  ​​ ​决策树后剪枝算法(四&…

机器学习-预剪枝和后剪枝

一棵完全生长的决策树会面临一个很严重的问题,即过拟合。当模型过拟合进行预测时,在测试集上的效果将会很差。因此我们需要对决策树进行剪枝, 剪掉一些枝叶,提升模型的泛化能力。 决策树的剪枝通常有两种方法,预剪枝&a…

【机器学习】Python实现决策树的预剪枝与后剪枝

决策树是一种用于分类和回归任务的非参数监督学习算法。它是一种分层树形结构,由根节点、分支、内部节点和叶节点组成。 从上图中可以看出,决策树从根节点开始,根节点没有任何传入分支。然后,根节点的传出分支为内部节点&#xff…

决策树的预剪枝与后剪枝

前言: 本次讲解参考的仍是周志华的《机器学习》,采用的是书中的样例,按照我个人的理解对其进行了详细解释,希望大家能看得懂。 1、数据集 其中{1,2,3,6,7,10,14,15,16,17}为测试集,{4,5,8,9,11,12,13}为训练集。 2、…

YOLOv5剪枝✂️ | 模型剪枝理论篇

文章目录 1. 前言2. 摘要精读3. 背景4. 本文提出的解决方式5. 通道层次稀疏性的优势6. 挑战7. 缩放因素和稀疏性惩罚8. 利用BN图层中的缩放因子9. 通道剪枝和微调10. 多通道方案11. 处理跨层连接和预激活结构12. 实验结果12.1 CIFAR-10数据集剪枝效果12.2 CIFAR-100数据集剪枝效…

决策树及决策树生成与剪枝

文章目录 1. 决策树学习2. 最优划分属性的选择2.1 信息增益 - ID32.1.1 什么是信息增益2.1.2 ID3 树中最优划分属性计算举例 2.2 信息增益率 - C4.52.3 基尼指数 - CART 3. 决策树剪枝3.1 决策树的损失函数3.2 如何进行决策树剪枝3.2.1 预剪枝3.2.2 后剪枝3.3.3 两种剪枝策略对…

剪枝

将复杂的决策树进行简化的过程称为剪枝,它的目的是去掉一些节点,包括叶节点和中间节点。 剪枝常用方法:预剪枝与后剪枝两种。 预剪枝:在构建决策树的过程中,提前终止决策树生长,从而避免过多的节点产生。该…

(剪枝)剪枝的理论

剪枝参考视频 本文将介绍深度学习模型压缩方法中的剪枝,内容从剪枝简介、剪枝步骤、结构化剪枝与非结构化剪枝、静态剪枝与动态剪枝、硬剪枝与软剪枝等五个部分展开。 剪枝简介 在介绍剪枝之前,首先来过参数化这个概念,过参数化主要是指在训…

剪枝总结

一、引子 剪枝,就是减小搜索树规模、尽早排除搜索树中不必要的分支的一种手段。 形象地看,就好像剪掉了搜索树的枝条,故被称为剪枝。 二、常见剪枝方法 1.优化搜索顺序 在一些问题中,搜索树的各个分支之间的顺序是不固定的 …

搜索剪枝

目录 什么是剪枝 几种常见的剪枝 1.可行性剪枝 2.排除等效冗余 3.最优性剪枝 4.顺序剪枝 5.记忆化 运用实例 1.选数 2.吃奶酪 3.小木棍 什么是剪枝 剪枝:通过某种判断,避免一些不必要的遍历过程。搜索的时间复杂度通常很大,通过剪…

【模型压缩】(二)—— 剪枝

一、概述 剪枝(Pruning)的一些概念: 当提及神经网络的"参数"时,大多数情况指的是网络的学习型参数,也就是权重矩阵weights和偏置bias;现代网络的参数量大概在百万至数十亿之间,因此…

环形队列的基本运算算法-数据结构教程

环形队列的基本概念 如图,其实它就是一个队列,就是有点难理解而已,它避免了普通队列的缺点,一样有队列头,队列尾,一样是先进先出的原则。我们采用顺时针的方式来对队列进行排序。 队列头(front) :允许进行删…

一道亚马逊算法面试题的情景分析

阅读博客的朋友可以观看视频: http://study.163.com/course/courseMain.htm?courseId1002942008 我们聚焦于一道亚马逊的算法面试题,通过分析该题,复盘它的解题情景,我们可以初步体会到算法面试的应对步骤,并从中窥…

LeetCode刷题笔记 标准模板库巧解算法题 优先队列

优先队列简介 ​ 优先队列(priority queue)可以在 O(1) 时间内获得最大值,并且可以在 O(log n) 时间内取出最大值或插入任意值。 ​ 优先队列常常用堆(heap)来实现。堆是一个完全二叉树,其每个节点的值总…

Python数据结构与算法(3.4)——队列相关应用与习题

Python数据结构与算法(3.4)——队列相关应用与习题 0. 学习目标1. 使用两个栈实现一个队列2. 使用两个队列实现一个栈3. 栈中元素连续性判断4. 重新排列队列中元素顺序5. 反转队列中前 m 个元素的顺序相关链接0. 学习目标 我们已经学习了队列的相关概念以及其实现,同时也了…

第十七章 优先队列优化Dijkstra算法

第十七章 优先队列优化Dijkstra算法 一、普通dijkstra算法的缺陷1、选出最小距离的过程:2、松弛所有点的过程: 二、如何优化1、代码模板(1)问题:(2)模板: 2、详细解读 三、优化分析1…

【自顶向下模块化编程】C语言实现多级反馈队列调度算法

自顶向下-多级反馈队列 多级反馈队列算法算法原理算法描述题目摘要 自顶向下模块化设计整体框架具体实现GeneratorSchedulerExecutor 整体代码实现 总结及心得总结心得 多级反馈队列算法 多级反馈队列调度算法是一种CPU处理机调度算法,UNIX操作系统采取的便是这种调…