(剪枝)剪枝的理论

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

剪枝参考视频
本文将介绍深度学习模型压缩方法中的剪枝,内容从剪枝简介、剪枝步骤、结构化剪枝与非结构化剪枝、静态剪枝与动态剪枝、硬剪枝与软剪枝等五个部分展开。

剪枝简介

在介绍剪枝之前,首先来过参数化这个概念,过参数化主要是指在训练阶段,在数学上需要进行大量的微分求解,去捕捉数据中微小的变化信息,一旦完成迭代式的训练之后,网络模型在推理的时候就不需要这么多参数。而剪枝算法正是基于过参数化的理论基础提出来的。剪枝算法的核心思想就是减少网络模型中参数量和计算量,同时尽量保证模型的性能不受影响。
在这里插入图片描述

剪枝步骤

对模型进行剪枝有三种常见的做法:

1、先训练一个模型 ,然后对模型进行剪枝,最后对剪枝后模型进行微调。这种方法是三种方法中用的最多的。
2、直接在模型训练过程中进行剪枝,最后对剪枝后模型进行微调。
3、直接进行剪枝,然后从头训练剪枝后的模型。

上述做法中提到的对模型进行剪枝具体步骤如下:
在这里插入图片描述
第一步训练: 是对网络模型进行训练。在剪枝流程中,训练部分主要指预训练,训练的目的是为剪枝算法做准备;

第二步剪枝: 在这里面可以进行如细粒度剪枝、向量剪枝、核剪枝、滤波器剪枝等各种不同的剪枝算法。其中很重要的一点,就是在剪枝之后,对网络模型进行评估,看是否符合要求。剪枝之前需要确定需要剪枝的层,设定一个裁剪阈值或者比例。在具体实现上,通过修改代码加入一个与参数矩阵尺寸一致的Mask矩阵。Mask矩阵中只有0和1,它的实际作用是微调网络;

第三步微调: 微调是一个的必要的步骤,它能恢复被剪枝操作影响的模型性能。结构化剪枝会对原始模型的结构进行调整,因此剪枝后的模型虽然保留了原始模型的参数,但是由于模型结构的改变,模型的表达能力会受到一定程度的影响。具体实现上,在计算的时候先乘以该Mask矩阵,Mask为1的参数值将继续训练,并通过反向传播调整梯度,而Mask为0的部分因为输出始终为0则不对后续部分产生影响。

结构化剪枝与非结构化剪枝

如图所示,从左到右,剪枝的粒度是递增的,最左边的非结构化剪枝粒度最小,右边结构化剪枝中的层级、通道级、滤波器级剪枝粒度依次增大。
在这里插入图片描述

非结构化剪枝

非结构化剪枝主要是对一些独立的权重或者神经元进行剪枝,就是随机的剪,是粒度最小的剪枝。问题是如何确定要剪哪些东西呢?

最简单的方法是预定义一个阈值,低于这个阈值的权重被剪去,高于的被保留。但是有三个主要缺点:

1、阈值与稀疏性没有直接联系;
2、不同的层应该具有不同的灵敏度;
3、这样设置阈值可能会剪掉太多信息,无法恢复原来的精度。

在这里插入图片描述

结构化剪枝

图中右边这三个是结构化剪枝,结构化的剪枝是有规律、有顺序的。对神经网络,或者计算图进行剪枝,几个比较经典的就是对layer进行剪枝,对channel进行剪枝,对Filter进行剪枝,剪枝粒度依次增大。

在滤波器剪枝中,有一种方法是使用滤波器的Lp范数来评估每个滤波器的重要性(p为1则使用L1范数,p为2则使用L2范数)。通常,L范数较小的滤波器的卷积结果导致相对较低的激活值,因此对模型的最终预测具有较小的数值影响。根据这种理解,这种小Lp范数的滤波器将比那些大Lp范数滤波器更容易被剪掉。
在这里插入图片描述
结构化剪枝的优点是:大部分算法保留原始卷积结构,不需要专用硬件就可以实现;缺点是:剪枝算法相对复杂。

静态剪枝与动态剪枝

在这里插入图片描述
上图显示了静态剪枝和动态剪枝之间的差异。静态剪枝在推理之前离线执行所有剪枝步骤,而动态剪枝是在运行时执行。

静态剪枝

静态剪枝在训练后和推理前进行剪枝。在推理过程中,不需要对网络进行额外的剪枝。 静态剪枝通常包括三个部分:剪枝参数的选择;剪枝的方法;选择性微调或再训练;

再训练可以提高修剪后的网络的性能,以达到与未修剪时的网络相当的精度,但可能需要大量的计算时间和能耗。

静态剪枝存储成本低,适用于资源有限的边缘设备,但是也存在三个主要问题:

1、通道的删除是永久性的,对于一些较为复杂的输入数据,可能无法达到很好的精度,这是因为有些通道已经被永久剪掉了。
2、需要精心设计要剪的部分,不然容易造成计算资源的浪费。
3、神经元的重要性并不是静态的,而且神经元的重要性很大程度上依赖于输入数据,静态的剪枝很容易降低模型的推理性能。

动态剪枝

网络中有一些奇怪的权重,他们在某些迭代中作用不大,但在其他的迭代中却很重要。动态剪枝就是通过动态的恢复权重来得到更好的网络性能。动态剪枝在运行时才决定哪些层、通道或滤波器不会参与进一步的活动。动态剪枝可以通过改变输入数据来克服静态剪枝的限制,从而潜在地减少计算量、带宽和功耗。而且动态剪枝通常不会执行微调或重新训练。

与静态剪枝相比,动态剪枝能够显着提高卷积神经网络的表示能力,从而在预测精度方面取得更好的性能。同样,动态剪枝也存在一些问题:

1、之前有方法通过强化学习来实现动态剪枝,但在训练过程中要消耗非常多的运算资源。
2、很多动态剪枝的方法都是通过强化学习的方式来实现的,但是”阀门的开关“,是不可微的,也就是说,梯度下降法在这里是用不了的。
3、存储成本高,不适用于资源有限的边缘设备。

硬剪枝与软剪枝

硬剪枝与软剪枝都是对Filter进行剪枝,是结构化剪枝中粒度最大的剪枝。

硬剪枝

硬剪枝在每一轮后,会将卷积核直接剪掉,被剪掉的卷积核在下一轮中不会再出现。这类的剪枝算法通常从模型本身的参数出发,寻找或者设计出合适的统计量来表明连接的重要性。通过对重要性的排序等算法,永久删除部分不重要的连接,保留下来的模型即为剪枝模型。但是也存在一些问题:

1、模型性能可能会降低;
2、依赖预先训练的模型。
在这里插入图片描述

软剪枝

相比较于硬剪枝,软剪枝在进行训练时,上一轮中被剪掉的卷积核在本轮训练时仍参与迭代,只是将其参数置为0,因此那些卷积核不会被直接丢弃。

在每轮训练中,根据不同的数据对完整模型进行优化和训练。在每轮之后,为每个加权层计算所有滤波器的L2范数,并将其作为滤波器选择的标准。然后,通过将相应的滤波器权重设置为零来修剪所选择的滤波器,随后是下一轮训练。最后,原始的深度神经网络模型被修剪成一个紧凑而有效的模型。
在这里插入图片描述
软剪枝一般有四个步骤:

1、滤波器选择: 使用L2范数来评估每个滤波器的重要性。具有较小L2范数的滤波器的卷积结果会导致相对较低的激活值,从而对网络模型的最终的预测结果有较小的影响。所以这种具有较小L2范数的滤波器将更容易被剪掉。
2、滤波器剪枝: 将所选滤波器的值设置为零。这可以暂时消除它们对网络输出的影响。然而,在接下来的训练阶段,这些滤波器仍然可以被更新,以保持模型的高性能。在滤波器剪枝步骤中,可以同时修剪所有加权层。此外,要对所有加权层使用相同的剪枝率。
3、重建: 在剪枝步骤之后,再训练一个轮来重构修剪后的滤波器。修剪滤波器通过反向传播被更新为非零。这样,经过软剪枝的模型可以具有与原始模型相当的性能。
4、获得紧凑模型: 重复以上3个步骤。当模型收敛后,我们可以得到一个包含许多“零滤波器”的稀疏模型。一个“零过滤器”对应于一个特征图。对应于那些“零过滤器”的特征图在推理过程中将总是零。移除这些过滤器以及相应的特征图不会有任何影响。


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

相关文章

剪枝总结

一、引子 剪枝,就是减小搜索树规模、尽早排除搜索树中不必要的分支的一种手段。 形象地看,就好像剪掉了搜索树的枝条,故被称为剪枝。 二、常见剪枝方法 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操作系统采取的便是这种调…

[算法] 栈和队列

欢迎来到老胡的算法解题思路,本文章主要使用的语言为java,使用的题型为力扣算法题,基于这一篇文章,我将为你介绍栈和队列的基础知识和栈和队列的题型,喜欢的朋友可以关注一下,下次更新不迷路! 目…

十道经典面试算法真题详解

前言 分享一下 腾讯常考的十道算法题(真题)。在金三银四,希望对大家有帮助呀。 重排链表 最长递增子序列 环形链表 反转链表 最长回文子串 全排列 LRU 缓存 合并K个升序链表 无重复字符的最长子串 删除链表的倒数第 N 个结点 1. …

队列相关习题

1.已知循环队列存储在一维数组A0…n-1]中,且队列非空时front和rear分别指向队头元素和队尾元素。若初始时队列为空,且要求第一个进入队列的元素存储在A[0]处,则初始时front和rear的值分别是( )。 A.0,0 B. 0,n-1 C. n-…

java算法面试题_Java算法面试题汇总

原标题:Java算法面试题汇总 1. 字符串 如果IDE没有代码自动补全功能,所以你应该记住下面的这些方法。 toCharArray() // 获得字符串对应的char数组 Arrays.sort() // 数组排序 Arrays.toString(char[] a) // 数组转成字符串 charAt(int x) // 获得某个索…

详解单调队列算法

前言 嘿!彩蛋!感觉有帮助就三连呗! 如果你对这篇文章可感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 在上一篇文章中,我们介绍了「单调栈」这一最常考察的线性数据结构。而今天我们将继续沿着这个思路,介绍另…

栈和队列相关经典算法题总结(数据结构+C语言)

我们这里针对栈和队列的一些经典算法题做详细讲解: 1.括号匹配问题. 2.用队列实现栈. 3.用栈实现队列. 4.设计循环队列. 一.详细讲解如下: 1.括号匹配问题.(如下图) 给定一个只包括 (,),{,},[,] 的字符串 s &am…

qt使用消息队列服务器,qt代码实现消息队列通信

qt代码实现消息队列通信 内容精选 换一换 HBase 1.X版本在RPC流程中,多个数据通信线程会争抢同一个缓存Buffer队列,代码以lock重入锁实现线程安全,锁抢占严重,导致HBase不能充分发挥CPU多核的能力。HBase 1.X版本的RPC通信机制中B…

消息队列MQ常见面试题

面试官在面试候选人时,如果发现候选人的简历中写了在项目中使用了 MQ 技术(如 Kafka、RabbitMQ、RocketMQ),基本都会抛出一个问题:在使用 MQ 的时候,怎么确保消息 100% 不丢失? 这个问题在实际…

RabbitMQ消息队列常见面试题总结

1、什么是消息队列: 1.1、消息队列的优点: (1)解耦:将系统按照不同的业务功能拆分出来,消息生产者只管把消息发布到 MQ 中而不用管谁来取,消息消费者只管从 MQ 中取消息而不管是谁发布的。消息…

【消息队列】面试题及答案整理

消息队列面试题 为什么要使用消息队列/消息队列的应用场景使用了消息队列会有什么缺点如何保证消息队列是高可用的RocketMQ是如何保证消息队列是高可用的 如何保证消息不被重复消费/如何保证消息消费的幂等性如何保证消费的可靠性传输RocketMQ如何保证消费的可靠性传输RabbitMQ…

JAVA——快速排序(详细)

JAVA快速排序的实现 快速排序由于排序效率在同为O(N*logN)的几种排序方法中效率较高,因此经常被采用,再加上快速排序思想----分治法也确实实用,因此很多软件公司的笔试面试,包括像腾讯,微软等知名IT公司都喜欢考这个&…