大模型微调 - 用PEFT来配置和应用 LoRA 微调
大模型微调 - 用PEFT来配置和应用 LoRA 微调
flyfish
PEFT
(Parameter-Efficient Fine-Tuning)是一种参数高效微调库,旨在减少微调大型预训练模型时需要更新的参数量,而不影响最终模型的性能。它支持几种不同的微调方法,如 LoRA(Low-Rank Adaptation)、Prefix Tuning、Adapter 等。这里PEFT
被用来配置和应用 LoRA 微调。LoRA 是一种降低预训练模型微调时参数更新数量的方法,通过在 Transformer 层的某些投影矩阵上引入低秩分解,减少参数量,并且只需微调这些低秩矩阵。
from peft import LoraConfig, TaskType, get_peft_model# 定义 LoRA 的配置参数
config = LoraConfig(task_type=TaskType.CAUSAL_LM, # 指定任务类型为自回归语言建模任务(Causal Language Modeling),如 GPT 系列的模型target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"], # 这些是模型中要应用 LoRA 的目标模块inference_mode=False, # 表示训练模式,设置为 True 时是推理模式;为 False 是训练模式r=8, # LoRA 的秩 r,代表分解时矩阵的秩,越大越能保留原有的模型信息,但计算复杂度也会增加lora_alpha=32, # LoRA 的 alpha 超参数,控制了低秩矩阵的缩放因子。一般设置为与 r 成比例的值lora_dropout=0.1, # 在 LoRA 模块中应用 Dropout,防止过拟合,防止微调时模型过拟合到训练数据
)# 应用 PEFT(LoRA)到预训练的模型上
model = get_peft_model(model, config) # 使用 get_peft_model 函数,将定义好的 LoRA 配置应用到预训练模型中
解释
task_type=TaskType.CAUSAL_LM
: 指定任务类型为自回归语言模型,常见于 GPT 系列的生成任务。PEFT 支持不同的任务类型,如问答(Question Answering)、序列到序列任务(Seq2Seq LM)等。
target_modules
: 这是模型中应用 LoRA 的模块列表。对于 Transformer 模型,这些模块通常是负责自注意力计算的部分,如 q_proj
(query projection)、k_proj
(key projection)、v_proj
(value projection)、o_proj
(输出投影)等。
inference_mode=False
: 该参数指定模型是否处于推理模式。如果设为 True
,表示模型在推理时使用冻结的 LoRA 权重;如果为 False
,表示模型处于训练模式,可以继续微调 LoRA 层。
r=8
: LoRA 中的秩 r
,用于控制低秩矩阵的大小,值越大,表示模型的表达能力越强,但参数量也相应增加。
lora_alpha=32
: LoRA 中的缩放因子,控制了低秩矩阵的影响力。它常用于放大或缩小 LoRA 矩阵的输出,以确保它们在与原始模型输出进行组合时适当的权重。
lora_dropout=0.1
: 在 LoRA 层应用 Dropout,减少过拟合风险。通过设置 Dropout 概率,使得在训练时随机屏蔽部分神经元,有助于增强模型的泛化能力。
target_modules=["q_proj", "k_proj", "v_proj", "o_proj", "gate_proj", "up_proj", "down_proj"]
在 Transformer 模型中,这些 q_proj
、k_proj
、v_proj
、o_proj
等名称表示的是不同的投影矩阵,它们主要与模型的 自注意力机制(Self-Attention Mechanism) 相关。它们用于将输入向量变换为适合进行自注意力计算的表示。
-
q_proj
(Query Projection)
作用 : 将输入的 token 表示投影到 查询向量(Query Vector) 。在自注意力机制中,模型使用这个向量来与其他 token 的键向量(Key)进行相似性计算,从而决定每个 token 应该关注哪些其他 token。
解释 : 查询向量通常用于表示当前 token 的"问题",模型会通过查询向量去"询问"其他 token。 -
k_proj
(Key Projection)
作用 : 将输入的 token 表示投影到 键向量(Key Vector) 。键向量用于与查询向量进行相似性计算,衡量两个 token 之间的相关性。
解释 : 键向量可以被视为表示每个 token 特性的"标签",通过与查询向量的相似性计算,模型判断哪些 token 对当前查询最重要。 -
v_proj
(Value Projection)
作用 : 将输入的 token 表示投影到 值向量(Value Vector) 。值向量是自注意力机制的输出内容,它们会根据键与查询的相似度进行加权平均,作为最终的注意力输出。
解释 : 值向量可以看作是包含 token 具体信息的向量,模型在计算注意力时,最终会根据键-查询的匹配度来加权这些值向量。 -
o_proj
(Output Projection)
作用 : 将注意力机制的输出(即加权后的值向量)进一步变换成模型需要的输出形式。自注意力机制的最终结果通过o_proj
投影,返回给模型的下一层或其他模块。
解释 : 输出投影负责整合注意力层的输出,并确保其形状和表示适应接下来模型中的其他操作。 -
gate_proj
(Gate Projection)
作用 : 这个投影矩阵通常出现在模型中带有 门控机制(gating mechanism) 的模块中,类似于 LSTM 或 GRU 中的门控单元。它用于调节信息的流入或流出,决定哪些信息需要保留或丢弃。
解释 : 在一些模型中,特别是经过改进的 Transformer 结构里,可能加入了门控机制,用于更灵活地控制信息的流动。gate_proj
负责这个过程。 -
up_proj
和down_proj
作用 : 这些通常是在模型中进行 上采样(up-sampling) 和 下采样(down-sampling) 的操作,用来调整表示的维度。这些投影矩阵负责在不同的层或模块之间转换表示的维度,类似于提升或降低特征维度的操作。
up_proj
: 增大向量的维度(上采样)。
down_proj
: 减少向量的维度(下采样)。
补充
在理解 LoRA(Low-Rank Adaptation)时,涉及到的一些关键概念,如矩阵的秩、投影矩阵、低秩分解和低秩矩阵,都是线性代数中的核心概念。
-
矩阵的秩(Rank of a Matrix)
定义 : 矩阵的秩表示矩阵中独立行或独立列的最大数量,简单来说,它是矩阵的行或列向量的线性独立的数目。秩表示一个矩阵可以表示的维度或自由度。
解释 : 矩阵的秩越大,意味着它包含的信息越多。如果一个矩阵的秩等于其行数或列数,它是“满秩”的,意味着这个矩阵不能通过更小的维度来表示。反之,秩较低的矩阵可以通过更小的维度来表示,称为低秩矩阵 。
例如,一个 3×3 的矩阵如果秩为 3,它是满秩矩阵;如果秩为 2 或更小,它是低秩矩阵,意味着该矩阵存在冗余信息,可以被压缩。 -
投影矩阵(Projection Matrix)
定义 : 投影矩阵是将一个向量投影到某个子空间的矩阵。它可以用来把高维度的数据投影到一个较低维度的子空间上。
解释 : 例如在机器学习和自然语言处理中,投影矩阵常用于将输入的向量表示从一个空间(如词向量的维度)转换到另一个空间。投影矩阵可以应用于自注意力机制中的 query(查询)、key(键)和 value(值)等向量,将它们映射到一个新的向量空间。
在 Transformer 模型中,q_proj
,k_proj
,v_proj
这些都是投影矩阵,负责将输入序列的 token 表示转换到适合自注意力计算的空间中。 -
低秩分解(Low-Rank Decomposition)
定义 : 低秩分解是一种将一个高维矩阵分解为几个低维矩阵的技术,通常使用一些线性代数方法(如奇异值分解 SVD)。通过这种分解,可以将一个复杂的矩阵表示成若干个较小的矩阵的乘积,从而降低计算复杂度。
解释 : 低秩分解通过降低矩阵的维度,减少存储和计算需求。在机器学习中,低秩分解常用于减少模型的参数量,提高效率。例如,在 LoRA 中,低秩分解用于将原始的高维投影矩阵分解为两个低秩矩阵(分别是A
和B
),这些矩阵的秩比原始矩阵小,因此可以大大减少参数的数量。
数学上,假设我们有一个大矩阵W
,可以通过两个小矩阵A
和B
的乘积来近似表示:
W ≈ A × B W \approx A \times B W≈A×B
这里A
和B
的秩r
要比W
的秩小,因此称为低秩分解。 -
低秩矩阵(Low-Rank Matrix)
定义 : 低秩矩阵是指秩小于其行数和列数的矩阵,也就是说,它可以通过更小的维度来表示,不是“满秩”的。低秩矩阵可以看作是含有冗余信息的矩阵。
解释 : 在机器学习中,低秩矩阵被用于减少模型的复杂度,因为它们可以用更少的参数来表示一个矩阵。因此,低秩矩阵在需要减少计算成本或内存需求的场景下非常有用。
例如,在 LoRA 中,原始模型中的权重矩阵(如W
)通常是高秩矩阵,但我们可以通过低秩矩阵A
和B
来近似表示这个权重矩阵,从而在保持模型性能的同时减少需要训练的参数量。
相关文章:
大模型微调 - 用PEFT来配置和应用 LoRA 微调
大模型微调 - 用PEFT来配置和应用 LoRA 微调 flyfish PEFT(Parameter-Efficient Fine-Tuning)是一种参数高效微调库,旨在减少微调大型预训练模型时需要更新的参数量,而不影响最终模型的性能。它支持几种不同的微调方法ÿ…...

Ubuntu构建只读文件系统
本文介绍Ubuntu构建只读文件系统。 嵌入式系统使用过程中,有时会涉及到非法关机(比如直接关机,或意外断电),这可能造成文件系统损坏,为了提高系统的可靠性,通常将根文件系统设置为只读…...

【黑金系】金融UI/UX体验设计师面试作品集 Figma源文件分享
在数字金融时代,UI/UX体验设计师扮演着至关重要的角色。他们不仅塑造着产品的界面,更引领着用户的使用体验。我们的面试作品集,正是这样一部展现金融UI/UX设计魅力的宝典。 这套作品集汇聚了众多经典案例,每一处设计都经过精心雕…...

Golang | Leetcode Golang题解之第392题判断子序列
题目: 题解: func isSubsequence(s string, t string) bool {n, m : len(s), len(t)f : make([][26]int, m 1)for i : 0; i < 26; i {f[m][i] m}for i : m - 1; i > 0; i-- {for j : 0; j < 26; j {if t[i] byte(j a) {f[i][j] i} else {…...
Liunx常用指令
1. 文件和目录管理 ls 用法:ls [选项] [文件/目录]示例:ls -l(以长列表格式显示),ls -a(显示所有文件,包括隐藏文件)。 cd 用法:cd [目录]示例:cd ..…...
CSS基础:浮动(float)如何使用清楚以及代替方法
浮动元素在 CSS 中主要通过 float 属性来控制,影响元素的排列方式。浮动用于创建流式布局,常用于实现图文混排、布局列等效果。以下是浮动元素的相关属性和使用方法: 1. 基本浮动属性 float: 控制元素的浮动方向,可以设置为 left…...
margin重叠该怎么解决?
在CSS中,当两个或多个垂直相邻的块级元素(如<div>)的margin相遇时,它们不会叠加成两个margin的和,而是会取两个margin中的较大值,这种现象被称为“margin重叠”(margin collapsing&#x…...

Linux学习笔记(黑马程序员,前四章节)
第一章 快照 虚拟机快照: 通俗来说,在学习阶段我们无法避免的可能损坏Linux操作系统,如果损坏的话,重新安装一个Linux操作系统就会十分麻烦。VMware虚拟机支持为虚拟机制作快照。通过快照将当前虚拟机的状态保存下来,…...
tekton pipeline resources
PipelineResource 代表着一系列的资源,主要承担作为 Task 的输入或者输出的作用。它有以下几种类型: git:代表一个 git 仓库,包含了需要被构建的源代码。将 git 资源作为 Task 的 Input,会自动 clone 此 git 仓库。pu…...
使用Python实现多个PDF文件的合并
使用Python可以很方便地实现多个PDF文件的合并。我们可以使用PyPDF2库来完成这个任务。以下是一个实现PDF合并的Python脚本: import os from PyPDF2 import PdfMergerdef merge_pdfs(input_dir, output_filename):# 创建一个PdfMerger对象merger PdfMerger()# 获取…...

微擎忘记后台登录用户名和密码怎么办?解决方法
微擎忘记后台登录名和登录密码是很常见的,服务器百科网fwqbk.com告诉你找回后台登录用户名和密码的方法: 一:找回微擎后台用户名 (如果只是忘记了后台登录密码,请忽略此步骤,跳转到第二步) 通…...

blender我的对称模型好像中点被我不小心移动了 我现在如果雕刻 两边修改的地方不是对称的 我该怎么办
blender我的对称模型好像中点被我不小心移动了 我现在如果雕刻 两边修改的地方不是对称的 我该怎么办 首先请调整好模型确保左右前后对其相应的xyz轴 之后CtrlA应用变换 确保这些都归0且模型和xyz轴对应 如果在Blender中模型的中点(对称轴)不小心被移动了…...

数据库——MySQL概述
一、数据库 存储数据的仓库,数据是有组织的存储,简称database(DB) 二、数据库管理系统 操控和管理数据库的大型软件(DBMS) 三、SQL 操作关系型数据库的编程语言,定义了一套操作关系型数据库…...

云服务器部署DB-GPT项目
本文收录于《DB-GPT项目》专栏,专栏总目录: 点击这里。 文章目录 项目介绍 一、登录云服务器 1. 进入控制台 2.点击容器实例(点数字) 二、创建容器实例 1. 等待容器实例创建好,创建好的容器实例如下:…...

基于锂电池的多路直流电源模块设计
本实物模块从实物外观、接口介绍及功能说明三部分来介绍这款基于锂电池的多路直流电源模块。 1、实物外观 2、接口介绍 本模块的3D外观图如下图所示,整体尺寸为6*8cm。H1为单节锂电池接口,H2为5V输出接口,H3为12V输出接口,H4为-…...

蓝奏云网盘搜索网页版PHP源码
蓝搜WEB网页版V1.0是一款全开源的搜索引擎程序,支持添加搜索违禁词,并且提供了代码注释,方便用户阅读和修改。该程序支持自适应PC端和移动端,并采用了简洁的界面设计,没有后台管理的繁琐操作,使用起来十分方…...
CocosCreator面试真题详解
最近有位同学面试Cocos Creator,我们把面试时问道的真题列举出来,并配上参考答案。 问题1: 你们公司项目时如何做战斗系统的? 面试官你好,做战斗系统和架构的时候,我们一般把代码逻辑分成3层来设计,同时把数据独立出…...

线性代数 第七讲 二次型_标准型_规范型_坐标变换_合同_正定二次型详细讲解_重难点题型总结
文章目录 1.二次型1.1 二次型、标准型、规范型、正负惯性指数、二次型的秩1.2 坐标变换1.3 合同1.4 正交变换化为标准型 2.二次型的主要定理3.正定二次型与正定矩阵4.重难点题型总结4.1 配方法将二次型化为标准型4.2 正交变换法将二次型化为标准型4.3 规范型确定取值范围问题4.…...

国内外网络安全政策动态(2024年8月)
▶︎ 1.《关于进一步加强智能网联汽车准入、召回及软件在线升级管理的通知》公开征求意见 8月1日,工业和信息化部装备工业一司联合市场监管总局质量发展局组织编制了《关于进一步加强智能网联汽车准入、召回及软件在线升级管理的通知(征求意见稿&#…...

重心映射:坐标系统与边界处理策略
重心映射 在许多应用中,特别是在计算机图形学中,现在通常使用三角形网格形式的分段线性曲面工作,在本课程笔记的剩余部分,我们将主要坚持使用这种类型的曲面。 3.1 三角形网格 如前一章所述,让我们用 $ p (x,y,z) $ …...

JavaSec-RCE
简介 RCE(Remote Code Execution),可以分为:命令注入(Command Injection)、代码注入(Code Injection) 代码注入 1.漏洞场景:Groovy代码注入 Groovy是一种基于JVM的动态语言,语法简洁,支持闭包、动态类型和Java互操作性,…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...

STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...