关于大型语言模型的结构修剪
本文介绍了一种名为 **LLM-Pruner** 的方法,用于对大型语言模型(LLMs)进行结构化剪枝,以减少模型大小和计算需求,同时保留其多任务解决和语言生成能力。LLM-Pruner 通过依赖检测和重要性估计实现高效剪枝,并结合低秩近似(LoRA)快速恢复模型性能。以下是文章的核心公式及其解释:
---
### 1. **依赖关系的定义**
文章定义了模型中结构之间的依赖关系,用于确定哪些结构需要同时剪枝。依赖关系的定义如下:
- **公式 (1)**:
\[
N_j \in \text{Out}(N_i) \land \text{Deg}^-(N_j) = 1 \Rightarrow N_j \text{ 依赖于 } N_i
\]
其中,\(N_i\) 和 \(N_j\) 是模型中的两个神经元,\(\text{Out}(N_i)\) 表示指向 \(N_i\) 的神经元集合,\(\text{Deg}^-(N_j)\) 表示 \(N_j\) 的入度。如果 \(N_j\) 的入度为1且唯一依赖于 \(N_i\),则 \(N_j\) 依赖于 \(N_i\)。
- **公式 (2)**:
\[
N_i \in \text{In}(N_j) \land \text{Deg}^+(N_i) = 1 \Rightarrow N_i \text{ 依赖于 } N_j
\]
其中,\(\text{In}(N_j)\) 表示从 \(N_j\) 指向的神经元集合,\(\text{Deg}^+(N_i)\) 表示 \(N_i\) 的出度。如果 \(N_i\) 的出度为1且唯一指向 \(N_j\),则 \(N_i\) 依赖于 \(N_j\)。
**作用**:这些公式用于自动检测模型中耦合的结构,确保剪枝时不会破坏模型的依赖关系。
---
### 2. **重要性估计**
为了决定哪些结构可以被剪枝,文章提出了基于梯度和近似 Hessian 矩阵的重要性估计方法。
- **公式 (3)**:向量级重要性估计
\[
I_{W_i} = |\Delta L(D)| = |L_{W_i}(D) - L_{W_i=0}(D)| = \left|\frac{\partial L(D)}{\partial W_i} W_i - \frac{1}{2} W_i^\top H W_i + O(\|W_i\|^3)\right|
\]
其中,\(L\) 是模型的损失函数,\(D\) 是用于估计重要性的数据集,\(H\) 是 Hessian 矩阵。公式中忽略了 Hessian 矩阵的高阶项,因为计算复杂度较高。
- **公式 (4)**:元素级重要性估计
\[
I_{W_k^i} = |\Delta L(D)| = |L_{W_k^i}(D) - L_{W_k^i=0}(D)| = \left|\frac{\partial L(D)}{\partial W_k^i} W_k^i - \frac{1}{2} W_k^i H_{kk} W_k^i + O(\|W_k^i\|^3)\right|
\]
其中,\(k\) 表示权重矩阵 \(W_i\) 中的第 \(k\) 个元素,\(H_{kk}\) 是 Hessian 矩阵的对角线元素,可以用 Fisher 信息矩阵近似。
- **公式 (5)**:近似 Hessian 矩阵
\[
I_{W_k^i} \approx |L_{W_k^i}(D) - L_{W_k^i=0}(D)| \approx \left|\frac{\partial L(D)}{\partial W_k^i} W_k^i - \frac{1}{2} \sum_{j=1}^N \left(\frac{\partial L(D_j)}{\partial W_k^i} W_k^i\right)^2 + O(\|W_k^i\|^3)\right|
\]
其中,\(N\) 是数据集 \(D\) 的样本数量。
**作用**:这些公式用于评估每个结构或参数对模型性能的影响,帮助选择剪枝的目标。
---
### 3. **组重要性聚合**
文章提出了多种聚合方法来评估整个结构组的重要性:
- **求和(Summation)**:
\[
I_G = \sum_{i=1}^M I_{W_i} \quad \text{或} \quad I_G = \sum_{i=1}^M \sum_k I_{W_k^i}
\]
- **求积(Product)**:
\[
I_G = \prod_{i=1}^M I_{W_i} \quad \text{或} \quad I_G = \prod_{i=1}^M \prod_k I_{W_k^i}
\]
- **取最大值(Max)**:
\[
I_G = \max_{i=1}^M I_{W_i} \quad \text{或} \quad I_G = \max_{i=1}^M \max_k I_{W_k^i}
\]
- **仅最后执行的结构(Last-Only)**:
\[
I_G = I_{W_l} \quad \text{或} \quad I_G = \sum_k I_{W_k^l}
\]
其中,\(l\) 是组中最后执行的结构。
**作用**:这些聚合方法用于将单个结构或参数的重要性汇总为组的重要性,以便决定哪些组可以被剪枝。
---
### 4. **快速恢复阶段**
为了快速恢复剪枝后的模型性能,文章使用了低秩近似(LoRA)方法。具体公式如下:
- **公式 (6)**:LoRA 更新
\[
\Delta W = PQ \quad \text{其中} \quad P \in \mathbb{R}^{d^- \times d}, \quad Q \in \mathbb{R}^{d \times d^+}
\]
\[
f(x) = (W + \Delta W)X + b = (WX + b) + (PQ)X
\]
其中,\(W\) 是模型的权重矩阵,\(\Delta W\) 是更新值,\(P\) 和 \(Q\) 是低秩矩阵,\(d\) 是低秩维度。
**作用**:LoRA 通过分解权重矩阵的更新值为两个低秩矩阵的乘积,减少了优化参数的数量,从而加速模型的恢复过程。
---
### 5. **实验结果**
文章在多个大型语言模型(如 LLaMA、Vicuna 和 ChatGLM)上验证了 LLM-Pruner 的效果。实验结果表明:
- 在 20% 的剪枝率下,模型保留了 94.97% 的原始性能。
- 使用 LoRA 恢复后,模型的性能进一步提升,且仅需 3 小时的调优时间。
- 剪枝后的模型在零样本分类和生成任务中表现出色,且计算效率显著提高。
---
### 总结
LLM-Pruner 通过依赖关系检测和重要性估计实现了对大型语言模型的高效结构化剪枝,并结合 LoRA 快速恢复模型性能。这种方法在减少模型大小和计算需求的同时,保留了模型的多任务能力和语言生成能力。
相关文章:
关于大型语言模型的结构修剪
本文介绍了一种名为 **LLM-Pruner** 的方法,用于对大型语言模型(LLMs)进行结构化剪枝,以减少模型大小和计算需求,同时保留其多任务解决和语言生成能力。LLM-Pruner 通过依赖检测和重要性估计实现高效剪枝,并…...
PostgreSQL 生产环境升级指南:pg_upgrade 快速完成版本升级!
前言 PostgreSQL 的版本号由主要版本号和次要版本号组成。例如,在 10.1 中,10 是主要版本,1 是次要版本。关于更多版本的规划,请参考 PostgreSQL 版本路线图。 版本号规则: PostgreSQL 10 及以后:版本号…...

Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调
Ubuntu2204下使用NVIDIA GeForce RTX 4090进行DeepSeek-R1-Distill-Llama-8B模型微调 环境准备创建Python微调环境准备数据集准备模型文件 模型微调模型预测原始模型预测微调模型预测 使用unsloth,可以方便地对大模型进行微调。以微调DeepSeek-R1-Distill-Llama-8B为…...
JAVA面试常见题_基础部分_mybatis面试题
1、什么是 MyBatis? 答:MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。 2、讲下 MyBatis 的缓存答 :MyBatis 的缓存分为一级缓存和二级缓存,一级缓存放在 session 里面,默认就有,二级缓存放在它的命名空间里,默认是不打…...
RISC-V汇编学习(一)—— 基础认识
最近这三年的工作时间大部分的工作,都是基于riscv的cpu和接口ip开发适配驱动,时不时的就要debug测试代码,面对很多都是汇编,所以也是整理下积累的一点点笔记,系列博客将总结下riscv相关的内容,一是给有需要…...
【Delphi】如何解决使用webView2时主界面置顶,而导致网页选择文件对话框被覆盖问题
一、问题描述: 在Delphi 中使用WebView2控件,如果预先把主界面置顶(Self.FormStyle : fsStayOnTop;),此时,如果在Web页面中有使用(<input type"file" id"fileInput" acc…...

基于POI的Excel下拉框自动搜索,包括数据验证的单列删除
目录 目标 例子 1.搜索下拉框页 2.数据源页 3.效果 代码以及注意事项 1.代码 2.注意事项 1.基于Excel的话,相当于加入了一个【数据验证】 2.代码中的一些方法说明 目标 期望在Excel利用代码创建具备自动搜索功能的下拉框 例子 1.搜索下拉框页 2.数据源…...

基金 word-->pdf图片模糊的解决方法
1. 首先需要Adobe或福昕等pdf阅读器。 2. word中 [文件]--[打印],其中打印机选择pdf阅读器,例如此处我选择福昕阅读器。 3. 选择 [打印机属性]--[编辑]--[图像],将所有的采样、压缩均设置为 关闭。点击[另存为],保存为 基金报告…...

React底层原理详解
React中Element&Fiber对象、WorkInProgress双缓存、Reconcile&Render&Commit、第一次挂载过程详解 在面试中介绍React底层原理时,需遵循逻辑清晰、层次分明、重点突出的原则,结合技术深度与实际应用场景。以下是结构化回答模板:…...

Word 插入图片会到文字底下解决方案
一、现象描述 正常情况下,我们插入图片都是这样的。 但有时突然会这样,插入的图片陷于文字底部。 二、网上解决方案 网上有教程说,修改图片布局选项,从嵌入型改成上下型环绕。改完之后确实有用,但是需要手动拖动图片…...
基于DeepSeek 的图生文最新算法 VLM-R1
目录 一、算法介绍 二 算法部署 三 模型下载 四 算法测试 五 可视化脚本 一、算法介绍 VLM-R1:稳定且可通用的 R1 风格大型视觉语言模型 自从 Deepseek-R1 推出以来,出现了许多专注于复制和改进它的作品。在这个项目中,我们提出了 VLM-R1,一种稳定且可通用的 R1 风格…...
Composer如何通过GitHub Personal Access Token安装私有包:完整教程
使用Composer安全管理您的PHP私有依赖包 一、前言 在PHP开发中,我们经常需要将内部工具包托管为私有仓库。传统的账号密码验证方式存在安全隐患,而GitHub Personal Access Token(PAT)提供了一种更安全的鉴权方案。本文将通过4个…...
postgresql postgis扩展相关
项目 下载地址 http://rpmfind.net/linux/rpm2html/search.php?queryprotobuf(x86-64) Postgis Index of /postgis/source/ proj4 Index of /proj/ geos Index of /geos/ libxml2 ftp://xmlsoft.org/libxml2/ Index of /sources Json-c Releases json-c/json-c G…...

基于Python Django的人脸识别上课考勤系统(附源码,部署)
博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…...

神经网络之RNN和LSTM(基于pytorch-api)
1.RNN 1.1简介 RNN用于处理序列数据。在传统的神经网络模型中,是从输入层到隐含层再到输出层,层与层之间是全连接的,每层之间的节点是无连接的。但是这种普通的神经网络对于很多问题却无能无力。例如,你要预测句子的下一个单词是…...

leetcode第39题组合总和
原题出于leetcode第39题https://leetcode.cn/problems/combination-sum/description/题目如下: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以…...

【UI设计——视频播放界面分享】
视频播放界面设计分享 在本次设计分享中,带来一个视频播放界面的设计作品。 此界面采用了简洁直观的布局。顶部是导航栏,包含主页、播放、搜索框等常见功能,方便用户快速找到所需操作。搜索框旁输入 “萌宠成长记”,体现了对特定内…...

动态规划刷题
文章目录 动态规划三步问题题目解析代码 动态规划 1. 状态表示:dp[i],表示dp表中i下标位置的值 2. 状态转移方程:以i位置位置的状态,最近的一步来划分问题,比如可以将状态拆分成前状态来表示现状态,dp[i] …...

stm32week5
stm32学习 二.外设 14.串口发送数据包 数据包的定义: HEX数据包(以0xFF为包头,0xFE为包尾,实际上可自定义): 固定包长,含包头包尾可变包长,含包头包尾 对于数据中不会出现包头包尾的数据可以用可变包长…...

fastapi中的patch请求
目录 示例测试使用 curl 访问:使用 requests 访问:预期返回: 浏览器访问 示例 下面是一个使用 app.patch("") 的 FastAPI 示例,该示例实现了一个简单的用户信息更新 API。我们使用 pydantic 定义数据模型,并…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

C++:多态机制详解
目录 一. 多态的概念 1.静态多态(编译时多态) 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1).协变 2).析构函数的重写 5.override 和 final关键字 1&#…...

(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)
目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...