模型剪枝综述
目录
1 深度神经网络的稀疏性:
2 剪枝算法分类:
3 具体的剪枝方法包括:
4 剪枝算法流程:
5 几种常见的剪枝算法:
6 结构化剪枝和非结构化剪枝各有其优缺点:
7 剪枝算法对模型精度的影响
8 影响剪枝算法对模型精度的因素
模型压缩中的剪枝算法是一种应用广泛的模型压缩方法,其通过剔除模型中“不重要”的权重,来减少模型的参数量和计算量,同时尽量保证模型的精度不受影响。
模型剪枝的核心是模型中的权重、激活、梯度等是稀疏的,减少部分参数不会影响模型的性能和泛化能力。
1 深度神经网络的稀疏性:
-
权重稀疏:在大多数神经网络中,权重数值的分布接近正态分布,越接近0的权重越多。通常认为权重数值的绝对值大小可作为重要性的一种度量,数值越大对模型输出贡献越大,反之则不重要,删去后对模型精度影响较小,但仍需再训练模型以恢复精度。
-
激活稀疏:ReLU 激活函数会使负半轴的输入产生0值的输出,此外,max_pooling 池化操作也会产生类似稀疏的效果,即无论网络接收到什么输入,大型网络中很大一部分神经元的输出大多为零。
2 剪枝算法分类:
-
结构化剪枝:改变网络中的滤波器组和特征通道数目,所获得的模型不需要专门的算法和硬件就能运行。可进一步细分,如 channel-wise、filter-wise 或 shape-wise 等。
-
非结构化剪枝:对连接或者神经元进行剪枝,能实现更高的压缩率并保持较高的模型性能,但会带来网络模型稀疏化,其稀疏结构对于硬件加速计算并不友好,除非底层硬件和计算加速库对稀疏计算有较好的支持,否则剪枝后很难获得实质的性能提升。
3 具体的剪枝方法包括:
-
细粒度剪枝(fine-grained):粒度最小的剪枝,如随机将一些神经元的输出置零的 dropout,以及随机将部分神经元间的连接置零的 dropconnect 都属于细粒度剪枝。
-
向量剪枝(vector-level):对卷积核内部(intra-kernel)进行剪枝,粒度稍大于细粒度剪枝。
-
核剪枝(kernel-level):去除某个卷积核,丢弃对输入通道中对应卷积核的计算。
-
滤波器剪枝(filter-level):对整个卷积核组进行剪枝,推理过程中输出特征通道数会改变。
4 剪枝算法流程:
目前剪枝算法的总体流程可归结为以下三种:
-
标准剪枝算法流程:主要包含训练、剪枝以及微调三个部分。首先对网络模型进行预训练,获得在特定基础任务上训练好的原始模型;然后进行如细粒度剪枝、向量剪枝、核剪枝、滤波器剪枝等操作,并对网络模型结构进行评估,确定需要剪枝的层,设定裁剪阈值或比例,通过加入 mask 矩阵来实现剪枝;最后进行微调,以恢复被剪枝操作影响的模型表达能力。微调时参数在计算时先乘以 mask,mask 为 1 的参数值可继续训练通过 BP 调整梯度,而 mask 为 0 的部分则不对后续部分产生影响。之后还可进行再剪枝,将微调后的网络模型再次进行模型结构评估和执行剪枝算法,不断迭代优化,直到满足剪枝目标需求。
-
基于子模型采样的剪枝流程:得到训练好的模型后,对可修剪的网络结构按照剪枝目标进行采样(采样过程可以是随机的,也可按照网络结构的重要性或通过 KL 散度计算进行概率采样),得到采样子模型。通常进行多次采样,得到多个子模型,之后对每个子模型进行性能评估,选取最优的子模型进行微调得到最后的剪枝模型。
-
基于搜索的剪枝流程:主要依靠强化学习等无监督学习或半监督学习算法,或神经网络结构搜索相关理论。给定剪枝目标后,在网络结构中搜索较优的子结构,此搜索过程往往伴随着网络参数的学习过程,因此部分基于搜索的剪枝算法在剪枝结束后不需要再进行微调。
剪枝算法的发展趋势包括打破固定假设、走向自动化以及与 NAS(神经网络架构搜索)融合等。例如挑战已有的固有假设,将部分工作自动化,以及 NAS 中有针对结构化剪枝进行搜索的方法等。
5 几种常见的剪枝算法:
以下是一些常见的剪枝算法:
-
α-β剪枝(alpha-beta pruning) :这是对极小化-极大化算法的改进,用于减少博弈树搜索的节点数量,从而提高搜索效率,适用于博弈树的最小最大搜索过程。它通过设定下限α和上限β,记录搜索过程中得到的最优解的取值范围。在搜索过程中,当某个节点的取值范围超出了α和β的范围时,就可以剪枝,停止对该节点的搜索;
-
极小化-极大化算法(minimax algorithm) :一种博弈树搜索算法,用于决策博弈过程中的最佳走法。该算法假设两个对手在博弈中都会采取最优策略,因此在搜索博弈树时,它会交替地考虑最大化自己的利益和最小化对手的利益。在每一层,算法会选择最大化自己利益的节点或最小化对手利益的节点,直到达到叶子节点,然后根据叶子节点的估值来进行决策。该算法适用于零和博弈,即一方获利就意味着另一方损失;
-
启发式剪枝(heuristic pruning) :利用启发性信息来判断节点是否值得继续搜索。根据启发性信息,评估某个节点的潜在价值,如果该节点的价值低于阈值,则可以进行剪枝,停止对该节点的搜索;
-
约束剪枝(constraint pruning) :在满足某种预定约束的情况下,可以直接进行剪枝。例如,在搜索排列组合时,若剩余的元素数量已经无法满足目标要求,就可以直接剪掉该分支;
-
子问题剪枝(subproblem pruning) :在动态规划等问题中,利用子问题的最优解来剪枝。如果当前子问题的最优解已经计算出来,并且该最优解无法改进,则可以直接剪枝,避免重复计算;
-
双向剪枝(bidirectional pruning) :在某些问题中,可以从问题的两个方向同时进行搜索。在搜索过程中,利用对称性或问题的特殊性质,可以剪掉对称的或重复的分支,从而减少搜索空间;
-
排序剪枝(sorting pruning) :在搜索过程中,对搜索的待选节点进行排序,优先搜索那些更有可能满足条件的节点。通过先搜索可能更优的节点,可以尽早地找到最优解,从而剪去无需再搜索的分支;
-
动态剪枝(dynamic pruning) :在搜索过程中,根据当前搜索状态和之前搜索的结果,动态地调整剪枝策略。可以基于实时信息来决定是否继续搜索,从而提高搜索效率。
剪枝算法的核心思想是通过合理的判断条件来剪掉不必要的搜索分支,从而减少搜索时间和空间消耗。选择合适的剪枝技术需要针对具体问题进行分析和设计,以达到更高效的搜索效果,它常用于回溯法、深度优先搜索和博弈树等问题中。
6 结构化剪枝和非结构化剪枝各有其优缺点:
结构化剪枝的优点:
-
硬件友好性:由于是按照一定的结构模式进行剪枝,如对整个卷积核或特征通道进行剪枝,所得模型在现有硬件上易于部署和加速,无需特殊的算法支持。
-
计算效率高:能显著减少模型的计算量和内存占用,且不会引入额外的计算开销。
-
模型稳定性较好:保留了模型的整体结构,对模型的泛化能力影响相对较小。
结构化剪枝的缺点:
-
压缩率受限:相比于非结构化剪枝,其压缩率可能相对较低,难以实现极高的模型压缩。
-
灵活性较差:只能按照预定的结构模式进行剪枝,可能无法精确地去除那些不太重要但仍有一定作用的参数。
非结构化剪枝的优点:
-
高压缩率:能够更精细地剪除权重参数,实现更高的压缩比例。
-
灵活性强:可以根据模型的具体情况,更精准地选择剪除不重要的参数。
非结构化剪枝的缺点:
-
硬件不友好:由于剪枝后的模型具有不规则的稀疏结构,需要特定的硬件支持或者专门的算法来处理,否则难以有效提升计算效率。
-
模型微调难度大:剪枝后的模型结构不规则,可能会对模型的稳定性和泛化能力产生较大影响,需要更复杂的微调策略来恢复模型性能。
-
计算复杂度增加:在实际计算过程中,由于稀疏结构的存在,可能会导致计算效率的降低。
7 剪枝算法对模型精度的影响
剪枝算法对模型精度的积极影响
-
合理应用剪枝算法可能对模型精度影响小甚至无影响。因为会去除对模型输出贡献小的权重或神经元。在适当剪枝比例和策略下,模型能减少参数和计算量并保持原有精度。
-
对于过参数化模型,存在大量冗余权重连接,精心设计的剪枝算法能去除冗余部分,实现压缩且不损失精度。
剪枝算法对模型精度的消极影响
-
剪枝过度或策略不当会对模型精度有显著负面影响。过度剪枝可能导致模型丢失关键特征表示能力,降低对输入数据的拟合和泛化能力。
-
例如,剪枝掉对特定类别或复杂模式识别重要的权重,模型处理相关情况时可能出错致精度下降。
剪枝后模型精度的恢复相关
-
剪枝后的模型通常需微调恢复精度,微调不充分或不合适可能无法完全弥补精度损失。
总结
-
剪枝算法对模型精度的影响取决于多种因素,包括模型结构和复杂度、剪枝比例和策略、微调方法和程度等。实际应用中要权衡压缩率和精度关系,不断试验优化,找到适合特定模型和任务的剪枝方案,保证精度下实现有效模型压缩。
8 影响剪枝算法对模型精度的因素
-
剪枝比例:
剪枝比例过高,即剪除过多的参数,可能会导致模型丢失重要的特征信息,从而显著降低精度。相反,剪枝比例过低可能无法达到有效的压缩效果。
-
剪枝策略:
不同的剪枝策略会产生不同的结果。例如,基于权重绝对值大小的剪枝、基于神经元激活值的剪枝、基于梯度的剪枝等。策略的选择不当可能会误剪重要的参数。
-
模型结构和复杂度:
简单的模型可能对剪枝的容忍度较低,因为其本身参数较少,可冗余的部分有限。而复杂的大型模型可能具有更多的冗余,但也需要更精细的剪枝策略以避免破坏关键结构。
-
数据集特性:
数据集的大小、数据分布的多样性、数据的复杂度等都会影响。如果数据集较小或数据分布较单一,模型对剪枝可能更敏感,精度更容易受到影响。
-
模型的训练程度:
未充分训练的模型进行剪枝可能更容易导致精度下降。而经过充分训练、已经达到较好性能的模型,在适当剪枝后可能更能保持精度。
-
微调的效果:
剪枝后是否进行有效的微调以及微调的方法和程度对精度恢复至关重要。合适的微调可以帮助模型重新适应剪枝后的结构。
-
任务的性质:
不同的任务对模型的要求不同。例如图像识别任务可能对某些特征的依赖较强,剪枝时需更谨慎;而某些简单的分类任务可能对剪枝的容忍度稍高。
-
模型的层敏感度:
不同的层对模型的贡献不同,有些层对精度影响较大,对这些关键层的剪枝需要格外小心。
-
硬件和计算环境:
在某些硬件平台上,特定的剪枝模式可能更有利于计算效率,但可能对精度产生间接影响。
综上所述,在应用剪枝算法时,需要综合考虑这些因素,通过试验和优化来找到最优的剪枝方案,以平衡模型压缩和精度保持之间的关系。
有兴趣可以关注我的专栏《高性能开发基础教程》
该文章首发于 subscriptions:极空AI,后续我会在上面整理完整的AI+HPC资料,并提供相关书籍推荐,至于视频要不要录制,看大家需要不需要。
有兴趣的可以关注。

相关文章:
模型剪枝综述
目录 1 深度神经网络的稀疏性: 2 剪枝算法分类: 3 具体的剪枝方法包括: 4 剪枝算法流程: 5 几种常见的剪枝算法: 6 结构化剪枝和非结构化剪枝各有其优缺点: 7 剪枝算法对模型精度的影响 8 影响剪枝…...
破解监控难题,局域网电脑监控软件哪家强?
现在的环境,企业要想茁壮成长,员工的高效工作那可是关键中的关键。但不少老板都发现了一个头疼的问题,员工上班老是偷懒,这可怎么行?今天,就来给大家详细说道说道几款出色的局域网电脑监控软件,…...
Linux--Socket编程TCP
前文:Socket套接字编程 TCP的特点 面向连接:TCP 在发送数据之前,必须先建立连接。可靠性:TCP 提供了数据传输的可靠性。面向字节流:TCP 是一个面向字节流的协议,这意味着 TCP 将应用程序交下来的数据看成是…...
Android Studio导入源码
在有源码并且编译环境可用的情况下: 1.生成导入AS所需的配置文件 在源码的根目录执行以下命令: source build/ensetup.sh lunch 要编译的项目 make idegen //这一步会生成out/host/linux-x86/framework/idegen.jar development/tools/idegen/idegen.sh…...
UE5 UE4 使用python进行编辑器操作
使用UE 4.25以上版本后,python代码改动相对较少。 如下类库在4.20/21/22等早起版本不适用,建议查询UE的python文档 unreal.EditorAssetLibrary 1.获取当前选中的资源(Content中) # 获取当前选中的资产selected_assets unreal.E…...
区块链技术在智能城市中的创新应用探索
随着全球城市化进程的加速和信息技术的快速发展,智能城市成为了未来城市发展的重要方向。在智能城市建设中,区块链技术作为一种去中心化、安全和透明的分布式账本技术,正逐渐展现出其在优化城市管理、提升公共服务和增强城市安全性方面的潜力…...
解决mysql事件调度器重启服务后自动失效的问题
前段时间为通过mysql事件生成测试数据,今天发现数据在10:57后停止了CREATE EVENT IF NOT EXISTS insert_random_data ON SCHEDULE EVERY 10 SECOND DO INSERT INTO test (createtime, random_number) VALUES (NOW(), FLOOR(RAND() * 100));检查事件状态&#…...
mybatis开启二级缓存
例子 mybatis-config.xml <configuration><settings><setting name"cacheEnabled" value"true"/></settings><environments default"development"><environment id"development"><transacti…...
Oracle大型数据库管理(一)Oracle大型数据库管理全面指南
文章目录 Oracle大型数据库管理全面指南引言1. Oracle数据库概述1.1 什么是Oracle数据库1.2 Oracle数据库的主要特点 2. Oracle数据库部署2.1 安装前的准备工作2.1.1 操作系统要求2.1.2 硬件要求2.1.3 软件环境要求 2.2 Oracle数据库的安装2.2.1 用户和目录的创建2.2.2 安装Ora…...
Arcgis中查找空间距离范围内字段相等的数据
背景 目前有两份空间点数据,需要通过点数据1查找100米空间距离范围内点数据2中与点数据1某个字段相同的数据 步骤 1、arcgis中加载数据 2、空间连接 结果,从下面这两个字段可以看出,点数据1在100米空间距离范围内有多个点数据2 3、选择数…...
js中map属性
JavaScript中的Map对象保存键值对,并且能够记住键的原始插入顺序 以下是关于如何在JavaScript中使用Map对象的博客文章概要: 一、创建和初始化Map对象 使用new Map()构造函数可以创建一个新的Map对象。你还可以在构造函数中传入一个可迭代对象&#x…...
CS224W—03 GNN
CS224W—03 GNN 回顾 快速回顾一下上一讲的内容。我们学到的关键概念是节点嵌入(Node Embedding)。我们的直觉是将网络中的节点编码到低维向量空间中。我们希望学习一个接受输入图的函数 f f f,并将其嵌入到低维节点嵌入空间中。在这里&am…...
库存超卖问题解决方式
文章目录 超卖问题解决方式什么是库存超卖问题?乐观锁和悲观锁的定义超卖问题解决方式一、悲观锁1.jvm单机锁2.通过使用mysql的行锁,使用一个sql解决并发访问问题3.使用mysql的悲观锁解决4. 使用redis分布式锁来解决 二、乐观锁解决1.版本号2. CAS法&…...
30岁决心转行,AI太香了
今天是一篇老学员的经历分享,此时的王同学在大洋彼岸即将毕业,手握多家北美大厂offer,一片明媚。谁能想到王同学的转码之路竟始于一场裁员,这场访谈拉开了他的回忆。 最近总刷到一些关于转行的话题,很多刚毕业的同学喜…...
C#知识|文件与目录操作:目录的操作
哈喽,你好啊,我是雷工! 前边学习了文件的删除、复制、移动,接下来学习目录的操作。 以下为学习笔记。 01 效果演示 1.1、显示指定目录下的所有文件 在左侧的文本框中显示出F:\F004-C#目录下的所有文件, 演示效果: 1.2、显示指定目录下的所有子文件 在左侧的文本框中显…...
从零到一:用Go语言构建你的第一个Web服务
使用Go语言从零开始搭建一个Web服务,包括环境搭建、路由处理、中间件使用、JSON和表单数据处理等关键步骤,提供丰富的代码示例。 关注TechLead,复旦博士,分享云服务领域全维度开发技术。拥有10年互联网服务架构、AI产品研发经验、…...
塔子哥的环游之旅-腾讯2023笔试(codefun2000)
题目链接 塔子哥的环游之旅-腾讯2023笔试(codefun2000) 题目内容 塔子哥是一位热衷旅游的程序员。他所在的国家共有 n 个城市,编号从 1 到 n。这些城市之间有 m 条双向的交通线路,分别为飞机线路和火车线路。塔子哥起始位于编号为 1 的城市,他计划前往编号为 n 的城市进行旅游…...
力扣SQL50 换座位
Problem: 626. 换座位 👨🏫 参考题解 Code SELECT(CASEWHEN MOD(id, 2) ! 0 AND counts ! id THEN id 1WHEN MOD(id, 2) ! 0 AND counts id THEN idELSE id - 1END) AS id,student FROMseat,(SELECTCOUNT(*) AS countsFROMseat) AS seat_counts O…...
SOPHGO算能科技BM1684芯片修改内存布局
目录 1 问题由来 2 下载memory_edit工具 3 查看当前内存配置 3 修改内存布局 4 替换生效 参考文献: 1 问题由来 我在算能SE5盒子上开发的时候,明显感觉很慢,然后看了下cpu内存竟然只有2.6G 但是这个盒子出厂默认是12G的,于…...
CUDA实现矩阵乘法的性能优化策略
本人主要参考了https://zhuanlan.zhihu.com/p/435908830,https://zhuanlan.zhihu.com/p/410278370,https://zhuanlan.zhihu.com/p/518857175 ,下面的代码均是本人实现 矩阵乘法的easy实现-V1 C = A B , A ∈ R M K , B ∈ R K...
StarVCenter单机版安装避坑指南:从BIOS设置到虚拟机创建的完整流程
StarVCenter单机版安装全流程实战:从硬件准备到虚拟机管理的深度解析 在当今企业IT基础设施快速迭代的背景下,虚拟化技术已成为资源整合与管理的核心解决方案。StarVCenter作为一款国产化虚拟化管理平台,其单机版部署方案特别适合中小型业务场…...
终极指南:OpenAI Python SDK推理强度参数调优实战
终极指南:OpenAI Python SDK推理强度参数调优实战 【免费下载链接】openai-python The official Python library for the OpenAI API 项目地址: https://gitcode.com/GitHub_Trending/op/openai-python 掌握OpenAI Python SDK推理强度参数配置,让…...
Cloudflare邮件路由的隐藏玩法:一个域名无限别名,管理不同网站注册,再也不怕信息泄露
Cloudflare邮件路由的隐私管理艺术:用无限别名打造数字身份防火墙 在个人信息如同裸奔的数字时代,每次网站注册都是一次隐私赌博。你是否经历过这样的困扰?某个小众论坛注册三个月后,主邮箱突然涌入大量赌博邮件;双十一…...
STVD与STVP实战指南:从环境搭建到串口烧录全流程解析
1. STVD与STVP开发环境全解析 第一次接触STM8开发的朋友,往往会被STVD和STVP这两个工具搞得一头雾水。我刚开始用的时候也踩过不少坑,比如明明安装了STVD却编译不了C程序,烧录时总是提示设备保护。后来才发现,STM8开发需要工具链的…...
AtlasOS:终极Windows系统性能优化与隐私保护指南
AtlasOS:终极Windows系统性能优化与隐私保护指南 【免费下载链接】Atlas 🚀 An open and lightweight modification to Windows, designed to optimize performance, privacy and security. 项目地址: https://gitcode.com/GitHub_Trending/atlas1/Atl…...
图像标注难题如何破解?LabelImg工具全面解析与实战指南
图像标注难题如何破解?LabelImg工具全面解析与实战指南 【免费下载链接】labelImg LabelImg is now part of the Label Studio community. The popular image annotation tool created by Tzutalin is no longer actively being developed, but you can check out L…...
Phi-3-vision-128k-instruct创意编程:用JavaScript构建交互式图像故事生成器
Phi-3-vision-128k-instruct创意编程:用JavaScript构建交互式图像故事生成器 1. 引言:当AI创意遇上前端交互 想象这样一个场景:用户上传一张随手拍的照片,通过简单的滑块调整和风格选择,几秒钟后就能获得一个与图片内…...
别再只会用Burpsuite了!手把手教你用Python脚本+Crunch字典搞定DVWA暴力破解
从零构建Python自动化爆破工具:DVWA全等级攻防实战解析 在渗透测试领域,暴力破解(Brute Force)始终是验证系统弱口令防御的基础手段。虽然Burpsuite这类图形化工具降低了入门门槛,但真正理解底层通信原理并构建自定义攻击脚本,才是…...
从H5到uni-app:迁移‘滚动菜单高亮’功能时,我踩过的3个关键差异点
从H5到uni-app:迁移滚动菜单高亮功能的三大思维转换 第一次在uni-app里实现滚动菜单高亮效果时,我差点把键盘摔了——那些在H5里信手拈来的document.querySelector和window.scrollY突然全部失效。这就像习惯右手写字的人突然被要求用左手,明明…...
别再让地图‘飘’了!深入浅出解析Cesium中GCJ-02、BD-09坐标偏移原理与DVGIS库实战
解密国内地图坐标系:从原理到实战解决Cesium中的“飘移”问题 你是否曾在Cesium中加载不同来源的地图数据时,发现明明标注的是同一个位置,却出现了明显的偏移?这种“飘移”现象背后,隐藏着国内地图坐标系复杂的加密体系…...
