当前位置: 首页 > news >正文

大模型微调 - 用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_projk_projv_projo_proj 等名称表示的是不同的投影矩阵,它们主要与模型的 自注意力机制(Self-Attention Mechanism) 相关。它们用于将输入向量变换为适合进行自注意力计算的表示。

  1. q_proj(Query Projection)
    作用 : 将输入的 token 表示投影到 查询向量(Query Vector) 。在自注意力机制中,模型使用这个向量来与其他 token 的键向量(Key)进行相似性计算,从而决定每个 token 应该关注哪些其他 token。
    解释 : 查询向量通常用于表示当前 token 的"问题",模型会通过查询向量去"询问"其他 token。

  2. k_proj(Key Projection)
    作用 : 将输入的 token 表示投影到 键向量(Key Vector) 。键向量用于与查询向量进行相似性计算,衡量两个 token 之间的相关性。
    解释 : 键向量可以被视为表示每个 token 特性的"标签",通过与查询向量的相似性计算,模型判断哪些 token 对当前查询最重要。

  3. v_proj(Value Projection)
    作用 : 将输入的 token 表示投影到 值向量(Value Vector) 。值向量是自注意力机制的输出内容,它们会根据键与查询的相似度进行加权平均,作为最终的注意力输出。
    解释 : 值向量可以看作是包含 token 具体信息的向量,模型在计算注意力时,最终会根据键-查询的匹配度来加权这些值向量。

  4. o_proj(Output Projection)
    作用 : 将注意力机制的输出(即加权后的值向量)进一步变换成模型需要的输出形式。自注意力机制的最终结果通过 o_proj 投影,返回给模型的下一层或其他模块。
    解释 : 输出投影负责整合注意力层的输出,并确保其形状和表示适应接下来模型中的其他操作。

  5. gate_proj(Gate Projection)
    作用 : 这个投影矩阵通常出现在模型中带有 门控机制(gating mechanism) 的模块中,类似于 LSTM 或 GRU 中的门控单元。它用于调节信息的流入或流出,决定哪些信息需要保留或丢弃。
    解释 : 在一些模型中,特别是经过改进的 Transformer 结构里,可能加入了门控机制,用于更灵活地控制信息的流动。gate_proj 负责这个过程。

  6. up_projdown_proj
    作用 : 这些通常是在模型中进行 上采样(up-sampling)下采样(down-sampling) 的操作,用来调整表示的维度。这些投影矩阵负责在不同的层或模块之间转换表示的维度,类似于提升或降低特征维度的操作。
    up_proj : 增大向量的维度(上采样)。
    down_proj : 减少向量的维度(下采样)。

补充

在理解 LoRA(Low-Rank Adaptation)时,涉及到的一些关键概念,如矩阵的秩、投影矩阵、低秩分解和低秩矩阵,都是线性代数中的核心概念。

  1. 矩阵的秩(Rank of a Matrix)
    定义 : 矩阵的秩表示矩阵中独立行或独立列的最大数量,简单来说,它是矩阵的行或列向量的线性独立的数目。秩表示一个矩阵可以表示的维度或自由度。
    解释 : 矩阵的秩越大,意味着它包含的信息越多。如果一个矩阵的秩等于其行数或列数,它是“满秩”的,意味着这个矩阵不能通过更小的维度来表示。反之,秩较低的矩阵可以通过更小的维度来表示,称为低秩矩阵
    例如,一个 3×3 的矩阵如果秩为 3,它是满秩矩阵;如果秩为 2 或更小,它是低秩矩阵,意味着该矩阵存在冗余信息,可以被压缩。

  2. 投影矩阵(Projection Matrix)
    定义 : 投影矩阵是将一个向量投影到某个子空间的矩阵。它可以用来把高维度的数据投影到一个较低维度的子空间上。
    解释 : 例如在机器学习和自然语言处理中,投影矩阵常用于将输入的向量表示从一个空间(如词向量的维度)转换到另一个空间。投影矩阵可以应用于自注意力机制中的 query(查询)、key(键)和 value(值)等向量,将它们映射到一个新的向量空间。
    在 Transformer 模型中,q_proj, k_proj, v_proj 这些都是投影矩阵,负责将输入序列的 token 表示转换到适合自注意力计算的空间中。

  3. 低秩分解(Low-Rank Decomposition)
    定义 : 低秩分解是一种将一个高维矩阵分解为几个低维矩阵的技术,通常使用一些线性代数方法(如奇异值分解 SVD)。通过这种分解,可以将一个复杂的矩阵表示成若干个较小的矩阵的乘积,从而降低计算复杂度。
    解释 : 低秩分解通过降低矩阵的维度,减少存储和计算需求。在机器学习中,低秩分解常用于减少模型的参数量,提高效率。例如,在 LoRA 中,低秩分解用于将原始的高维投影矩阵分解为两个低秩矩阵(分别是 AB),这些矩阵的秩比原始矩阵小,因此可以大大减少参数的数量。
    数学上,假设我们有一个大矩阵 W,可以通过两个小矩阵 AB 的乘积来近似表示:
    W ≈ A × B W \approx A \times B WA×B
    这里 AB 的秩 r 要比 W 的秩小,因此称为低秩分解。

  4. 低秩矩阵(Low-Rank Matrix)
    定义 : 低秩矩阵是指秩小于其行数和列数的矩阵,也就是说,它可以通过更小的维度来表示,不是“满秩”的。低秩矩阵可以看作是含有冗余信息的矩阵。
    解释 : 在机器学习中,低秩矩阵被用于减少模型的复杂度,因为它们可以用更少的参数来表示一个矩阵。因此,低秩矩阵在需要减少计算成本或内存需求的场景下非常有用。
    例如,在 LoRA 中,原始模型中的权重矩阵(如 W)通常是高秩矩阵,但我们可以通过低秩矩阵 AB 来近似表示这个权重矩阵,从而在保持模型性能的同时减少需要训练的参数量。

相关文章:

大模型微调 - 用PEFT来配置和应用 LoRA 微调

大模型微调 - 用PEFT来配置和应用 LoRA 微调 flyfish PEFT(Parameter-Efficient Fine-Tuning)是一种参数高效微调库,旨在减少微调大型预训练模型时需要更新的参数量,而不影响最终模型的性能。它支持几种不同的微调方法&#xff…...

Ubuntu构建只读文件系统

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

【黑金系】金融UI/UX体验设计师面试作品集 Figma源文件分享

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

Golang | Leetcode Golang题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; 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 用法&#xff1a;ls [选项] [文件/目录]示例&#xff1a;ls -l&#xff08;以长列表格式显示&#xff09;&#xff0c;ls -a&#xff08;显示所有文件&#xff0c;包括隐藏文件&#xff09;。 cd 用法&#xff1a;cd [目录]示例&#xff1a;cd ..&#xf…...

CSS基础:浮动(float)如何使用清楚以及代替方法

浮动元素在 CSS 中主要通过 float 属性来控制&#xff0c;影响元素的排列方式。浮动用于创建流式布局&#xff0c;常用于实现图文混排、布局列等效果。以下是浮动元素的相关属性和使用方法&#xff1a; 1. 基本浮动属性 float: 控制元素的浮动方向&#xff0c;可以设置为 left…...

margin重叠该怎么解决?

在CSS中&#xff0c;当两个或多个垂直相邻的块级元素&#xff08;如<div>&#xff09;的margin相遇时&#xff0c;它们不会叠加成两个margin的和&#xff0c;而是会取两个margin中的较大值&#xff0c;这种现象被称为“margin重叠”&#xff08;margin collapsing&#x…...

Linux学习笔记(黑马程序员,前四章节)

第一章 快照 虚拟机快照&#xff1a; 通俗来说&#xff0c;在学习阶段我们无法避免的可能损坏Linux操作系统&#xff0c;如果损坏的话&#xff0c;重新安装一个Linux操作系统就会十分麻烦。VMware虚拟机支持为虚拟机制作快照。通过快照将当前虚拟机的状态保存下来&#xff0c;…...

tekton pipeline resources

PipelineResource 代表着一系列的资源&#xff0c;主要承担作为 Task 的输入或者输出的作用。它有以下几种类型&#xff1a; git&#xff1a;代表一个 git 仓库&#xff0c;包含了需要被构建的源代码。将 git 资源作为 Task 的 Input&#xff0c;会自动 clone 此 git 仓库。pu…...

使用Python实现多个PDF文件的合并

使用Python可以很方便地实现多个PDF文件的合并。我们可以使用PyPDF2库来完成这个任务。以下是一个实现PDF合并的Python脚本&#xff1a; import os from PyPDF2 import PdfMergerdef merge_pdfs(input_dir, output_filename):# 创建一个PdfMerger对象merger PdfMerger()# 获取…...

微擎忘记后台登录用户名和密码怎么办?解决方法

微擎忘记后台登录名和登录密码是很常见的&#xff0c;服务器百科网fwqbk.com告诉你找回后台登录用户名和密码的方法&#xff1a; 一&#xff1a;找回微擎后台用户名 &#xff08;如果只是忘记了后台登录密码&#xff0c;请忽略此步骤&#xff0c;跳转到第二步&#xff09; 通…...

blender我的对称模型好像中点被我不小心移动了 我现在如果雕刻 两边修改的地方不是对称的 我该怎么办

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

数据库——MySQL概述

一、数据库 存储数据的仓库&#xff0c;数据是有组织的存储&#xff0c;简称database&#xff08;DB&#xff09; 二、数据库管理系统 操控和管理数据库的大型软件&#xff08;DBMS&#xff09; 三、SQL 操作关系型数据库的编程语言&#xff0c;定义了一套操作关系型数据库…...

云服务器部署DB-GPT项目

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

基于锂电池的多路直流电源模块设计

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

蓝奏云网盘搜索网页版PHP源码

蓝搜WEB网页版V1.0是一款全开源的搜索引擎程序&#xff0c;支持添加搜索违禁词&#xff0c;并且提供了代码注释&#xff0c;方便用户阅读和修改。该程序支持自适应PC端和移动端&#xff0c;并采用了简洁的界面设计&#xff0c;没有后台管理的繁琐操作&#xff0c;使用起来十分方…...

CocosCreator面试真题详解

最近有位同学面试Cocos Creator&#xff0c;我们把面试时问道的真题列举出来&#xff0c;并配上参考答案。 问题1: 你们公司项目时如何做战斗系统的? 面试官你好&#xff0c;做战斗系统和架构的时候&#xff0c;我们一般把代码逻辑分成3层来设计&#xff0c;同时把数据独立出…...

线性代数 第七讲 二次型_标准型_规范型_坐标变换_合同_正定二次型详细讲解_重难点题型总结

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

国内外网络安全政策动态(2024年8月)

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

重心映射:坐标系统与边界处理策略

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

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

.Net Framework 4/C# 关键字(非常用,持续更新...)

一、is 关键字 is 关键字用于检查对象是否于给定类型兼容,如果兼容将返回 true,如果不兼容则返回 false,在进行类型转换前,可以先使用 is 关键字判断对象是否与指定类型兼容,如果兼容才进行转换,这样的转换是安全的。 例如有:首先创建一个字符串对象,然后将字符串对象隐…...

C++使用 new 来创建动态数组

问题&#xff1a; 不能使用变量定义数组大小 原因&#xff1a; 这是因为数组在内存中是连续存储的&#xff0c;编译器需要在编译阶段就确定数组的大小&#xff0c;以便正确地分配内存空间。如果允许使用变量来定义数组的大小&#xff0c;那么编译器就无法在编译时确定数组的大…...

iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈

在日常iOS开发过程中&#xff0c;性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期&#xff0c;开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发&#xff0c;但背后往往隐藏着系统资源调度不当…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

Web中间件--tomcat学习

Web中间件–tomcat Java虚拟机详解 什么是JAVA虚拟机 Java虚拟机是一个抽象的计算机&#xff0c;它可以执行Java字节码。Java虚拟机是Java平台的一部分&#xff0c;Java平台由Java语言、Java API和Java虚拟机组成。Java虚拟机的主要作用是将Java字节码转换为机器代码&#x…...