模型剪枝中的预训练权重真的有用么?重新思考模型剪枝的价值二

在https://hpg123.blog.csdn.net/article/details/137705869中,根据论文提供的数据初步整理出了模型剪枝的信息,但不够精练,故而在此深入分析。
主要解决以下问题:
1、模型剪枝真的有用么?
2、什么样的方案模型剪枝效果好?
3、模型剪枝对性能影响大么?

通过分析,得出结论,剪枝是有用的;自动结构化剪枝效果是综合效果最优的;对于任意规模的问题训练处的模型,剪枝50%基本上不会影响精度,如果问题规模较小,剪枝规模还可以更大。

前提概要
论文中提到的剪枝步骤包含:训练大模型、剪枝成小模型、微调小模型。
在这里插入图片描述
然后与剪枝方案对比的训练方案有,Scratch-E、Scratch-B。
Scratch-E:表示与剪枝模型训练相同epoch数,
Scratch-B:表示相同计算预算的训练(在ImageNet上,如果修剪模型节省的FLOPs超过2倍,则将训练epoch的数量增加一倍)

所涉及到的数据有:cifar10、cifar100、imagenet 。cifar10是简单数据、cifar100是复杂数据、 imagenet 是极其复杂的数据。
涉及的模型有:vgg模型(简单结构模型)、resnet模型(复杂结构模型)、densenet模型(超复杂结构模型)。

1、模型剪枝真的有用么?

整体来说是有用的,在论文中虽然证明未剪枝模型展现出了与剪枝模型相同的性能,但有很多隐含信息没有披露。

论文中的剪枝:是从0训练重参数模型开始,然而实际工作中是直接从剪枝开始、或者是从迁移学习模开始。绝大部分工作都是使用开源的预训练模型,从迁移学习开始

基于重参数模型模型得出的剪枝模型,本质上是一个精度快速上升(训练重参数模型),然后在轻微下降的过程。很多时候,模型剪枝掉少量参数后,并没有显著的精度下降,重新训练的精度起点比较高。例如一个模型剪枝掉10%的权重 从torch-prune项目中的一个图片可以看出,模型参数从2.57左右降低到2.28左右,精度只是从75%左右降低到60%左右。
在这里插入图片描述

然而,从0开始训练目标结构的模型,是一个精度慢慢上升的过程(小模型的拟合能力必然是没有迁移大模型强)。从零训练精度通常是从0开始增加,至少要20个epoch左右才能达到top精度的30%-50%左右。在精度起点上,从0训练就要额外多20个epoch保持相同的起点。

论文中所阐述的Scratch-B,可以媲美甚至超越剪枝的精度,要求相同的训练预算,这意味着epoch数要比剪枝多n倍。如下图所示,Scratch-E与Scratch-B的精度差距不足0.2%, 但这两个方法都是一样的训练起点与过程,只是Scratch-B的epoch数多了n倍。假设剪枝50%,Scratch-B训练了100个epoch,那Scratch-E则训练了200个epoch 这是一个精度缓慢的增长过程,在普通的训练重很可能就因为early stop策略而停止了,作者却通过耐心训练达成目标,但未取得与训练资源相匹配的效果。
在这里插入图片描述

2、什么样的方案模型剪枝效果好?

在论文中一个展示了3种剪枝策略:预定义的结构化修剪、自动结构化剪枝、基于非结构化大小的修剪。通过分析自动结构化剪枝是最为有效的。

预定义的结构化修剪:是指基于现有网络,进行layer kernel数量级的剪枝,在训练前就已经设定好目标结构了。以ImageNet结构为例,

自动结构化剪枝:是指基于现有网络,对符合剪枝条件的layer kernel进行剪枝,在剪枝前不知道目标网络结构。

基于非结构化的修剪:是指基于现有网络,对符合剪枝条件的参数进行移除(是一个最细粒度的参数移除),在剪枝前不知道目标网络结构。

2.1 预定义的结构化修剪效果

这里关于CIFAR-10的结果可以忽略(这是一个简单数据集)。
关于ImageNet的剪枝中,基于L1规则的剪枝效果保持最好,是通过最小化下一层的特征图重建误差来修剪通道方法。 但这里的数据不够全面,没有展示出ResNet50在L1测量下的剪枝效果。然后论文作者得出结论,剪枝模型不如同等训练资源下的原始模型; 但我们已经分析出,这在工程上是个假命题; 同时也透露了,在预定义结构的剪枝方法下,是一定存在精度损失的。
在这里插入图片描述在这里插入图片描述

2.2 自动结构化剪枝效果

该方法是基于L1等权重重要性分析规则,移除模型中的权重。本质上可以看成非结构化剪枝的更高层或更粗粒度
在该方法下,可以看到剪枝40%的权重,模型依然能保持相同的精度。可以看出该方案是优于2.1方案的。 这里没有进行剪枝后得出目标网络结构,实际上是无法开展Scratch-E或者Scratch-B的工作。
在这里插入图片描述

2.3 非结构化剪枝效果

非结构化剪枝表现出与自动化结构剪枝类似的将,可以确定剪枝50%左右对精度没有影响。但是,非结构化剪枝后的模型在普通硬件上并没有加速效果,只有结构化剪枝才能在普通硬件上加速。 实际上没有用
在这里插入图片描述

3、模型剪枝对性能影响大么?

对于一般性难点数据(CIFAR100级别),基于章节2中分析,其实已经可以发现剪枝50%(模型加速一倍),对任意被剪枝性能基本上是没有影响的。 基于DepGraph: Towards Any Structural Pruning论文数据,更是可以发现剪枝到30%(推理速度3x)也可以保持性能。
在这里插入图片描述

对于简单性数据(CIFAR10级别),基于下图可以看出,对于高冗余模型vgg16(传统conv模型),精度几乎没有影响,也就是说可以在高冗余模型中剥离出80%的无关参数。但对于Resnet等复杂设计的模型,精度存在下降。这与前面的图表数据有冲突,章节2中的图表展示,对于CIFAR10数据,对任意剪枝模型基本上没有精度变化。

在这里插入图片描述

对于复杂性数据(ImageNet级别),基于章节2中分析,其实已经可以发现剪枝50%(模型加速一倍),对任意被剪枝性能基本上是没有影响的。 通过论文SlimSAM: 0.1% Data Makes Segment Anything Slim中的数据也可以发现。如果存在精度下降,只能是说剪枝的方式与权重选择方式存在问题。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/797277.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java中常用线程安全的集合

文章目录 常用线程安全的集合CopyWriteArrayListCopyOnWriteArraySetHashTableConcurrentHashMapJDK1.7JDK1.8 常用线程安全的集合 在多线程环境中,数据的一致性和线程的安全性是至关重要的。传统的集合类,如ArrayList、HashMap和HashSet,在…

Wikijs 部署教程

以下是一个 Wikijs 部署的简单教程,涵盖了使用 Docker 和直接安装两种方式: 方法一: 使用 Docker (推荐) Docker 是一个方便快捷的方式来部署 Wikijs,它可以避免许多手动配置步骤。 安装 Docker: 按照 https://docs.docker.com/…

使用Gitee仓库镜像管理功能实现Gitee与Github 双向同步

进入你所需要同步的仓库,点击「管理」->「镜像仓库管理」,点击「添加镜像」选项; 如果你的Gitee账号还没有绑定过 GitHub 帐号,先根据弹窗的提示绑定 GitHub 帐号; 添加镜像时候,在「镜像方向」中选择…

拥抱UniHttp,规范Http接口对接之旅

前言 如果你项目里还在用传统的编程式Http客户端比如HttpClient、Okhttp去直接对接第三方Http接口, 那么你项目一定充斥着大量的对接逻辑和代码, 并且针对不同的对接渠道方需要每次封装一次调用的简化, 一旦封装不好系统将会变得难以维护&am…

【Wamp】局域网设备访问WampServer | 使用域名访问Wamp | Wamp配置HTTPS

局域网设备访问WampServer 参考&#xff1a;https://www.jianshu.com/p/d431a845e5cb 修改Apache的httpd.conf文件 D:\Academic\Wamp\program\bin\apache\apache2.4.54.2\conf\httpd.conf 搜索 Require local 和Require all denied&#xff0c;改为Require all granted <…

【Caffeine】⭐️SpringBoot 项目整合 Caffeine 实现本地缓存

目录 &#x1f378;前言 &#x1f37b;一、Caffeine &#x1f37a;二、项目实践 2.1 环境准备 2.2 项目搭建 2.3 接口测试 ​&#x1f49e;️三、章末 &#x1f378;前言 小伙伴们大家好&#xff0c;缓存是提升系统性能的一个不可或缺的工具&#xff0c;通过缓存可以避免大…

[安洵杯 2019]easy_web1

知识点&#xff1a; 1.base64加解密 2.md5加解密 3.md5碰撞绕过强类型比较 4.Linux命令绕过 进入页面发现url地址中存在 img参数和一个cmd参数&#xff0c;img参数看上去像是base64编码&#xff0c;可以去尝试一下解码. 进行了两次base64解密得到3535352e706e67看着像16进制那么…

log4j2的日志框架(详细,springboot和异步日志的实现)

目录 log4j2的介绍 Log4j2的性能 SpringBoot中的使用Log4j2 log4j2的进阶--异步日志 AsyncAppender方式 AsyncLogger方式 log4j2的介绍 Apache Log4j 2是对Log4j的升级版&#xff0c;参考了logback的一些优秀的设计&#xff0c;并且修复了一些问题&#xff0c;因此带 来…

谷粒商城实战笔记-29~34-前端基础 - ES6

文章目录 零&#xff0c;安装Live Server插件一&#xff0c;创建前端工程1&#xff0c;创建工程2&#xff0c;在工程ES6中创建一个html文件 二&#xff0c;ES6 简介1&#xff0c;ES6 的历史 三&#xff0c;前端基础ES61&#xff0c;let 和 const1.1&#xff0c;let1.1.1 严格的…

蔚来汽车:拥抱TiDB,实现数据库性能与稳定性的飞跃

作者&#xff1a; Billdi表弟 原文来源&#xff1a; https://tidb.net/blog/449c3f5b 演讲嘉宾&#xff1a;吴记 蔚来汽车Tidb爱好者 整理编辑&#xff1a;黄漫绅&#xff08;表妹&#xff09;、李仲舒、吴记 本文来自 TiDB 社区合肥站走进蔚来汽车——来自吴记老师的演讲…

C++ | Leetcode C++题解之第232题用栈实现队列

题目&#xff1a; 题解&#xff1a; class MyQueue { private:stack<int> inStack, outStack;void in2out() {while (!inStack.empty()) {outStack.push(inStack.top());inStack.pop();}}public:MyQueue() {}void push(int x) {inStack.push(x);}int pop() {if (outStac…

QML 鼠标和键盘事件

学习目标&#xff1a;Qml 鼠标和键盘事件 学习内容 1、QML 鼠标事件处理QML 直接提供 MouseArea 来捕获鼠标事件&#xff0c;该操作必须配合Rectangle 获取指定区域内的鼠标事件, 2、QML 键盘事件处理&#xff0c;并且获取对OML直接通过键盘事件 Keys 监控键盘任意按键应的消…

PHP贵州旅游攻略系统-计算机毕业设计源码16663

目 录 第 1 章 引 言 1.1 选题背景与意义 1.2 国内外研究现状 1.3 论文结构安排 第 2 章 系统的需求分析 2.1 系统可行性分析 2.1.1 技术方面可行性分析 2.1.2 经济方面可行性分析 2.1.3 法律方面可行性分析 2.1.4 操作方面可行性分析 2.2 系统功能需求分析 2.3 系…

RK3568笔记三十五:LED驱动开发测试

若该文为原创文章&#xff0c;转载请注明原文出处。 字符设备驱动程序的基本框架&#xff0c;主要是如何申请及释放设备号、添加以及注销设备&#xff0c;初始化、添加与删除 cdev 结构体&#xff0c;并通过 cdev_init 函数建立 cdev 和 file_operations 之间的关联&#xff0c…

IoTDB 集群高效管理:一键启停功能介绍

如何快速启动、停止 IoTDB 集群节点的功能详解&#xff01; 在部署 IoTDB 集群时&#xff0c;对于基础的单机模式&#xff0c;启动过程相对简单&#xff0c;仅需执行 start-standalone 脚本来启动 1 个 ConfigNode 节点和 1 个 DataNode 节点。然而&#xff0c;对于更高级的分布…

9. Python的魔法函数

Python中的魔法函数 在Python中魔法函数是在为类赋能&#xff0c;使得类能够有更多操作。通过重写类中的魔法函数&#xff0c;可以完成很多具体的任务 1. __str__ 通过str魔法函数&#xff0c;可以设置对类的实例的 print() 内容 2. __len__ 通过len魔法函数&#xff0c;可…

在 vite+vue3+electron 中使用 express

文章目录 一、Vite Vue3 Electron 项目的搭建二、搭建 express 环境1、安装 express 框架所需依赖2、创建 express 项目3、配置路由4、启动 express 服务5、启动 electron 并获取数据 三、项目打包 一、Vite Vue3 Electron 项目的搭建 详细的项目构建和打包可参考另一篇文…

【数学建模】——力学模型建立的基本理论及方法

目录 一、基本理论 1. 牛顿力学 1.1 牛顿第一定律&#xff08;惯性定律&#xff09; 1.2 牛顿第二定律&#xff08;动力学定律&#xff09; 1.3 牛顿第三定律&#xff08;作用反作用定律&#xff09; 2. 能量守恒定律 2.1 动能和势能 2.2 能量守恒 3. 动量守恒定律…

【银河麒麟服务器操作系统】系统夯死分析及处理建议

了解银河麒麟操作系统更多全新产品&#xff0c;请点击访问麒麟软件产品专区&#xff1a;https://product.kylinos.cn 服务器环境以及配置 【机型】物理机 处理器&#xff1a; Intel 内存&#xff1a; 512G 整机类型/架构&#xff1a; X86_64 【内核版本】 4.19.90-25…

Perl语言之数组

Perl数组可以存储多个标量&#xff0c;并且标量数据类型可以不同。   数组变量以开头。访问与定义格式如下&#xff1a; #! /usr/bin/perl arr("asdfasd",2,23.56,a); print "输出所有:arr\n"; print "arr[0]$arr[0]\n"; #输出指定下标 print…