一文读懂「LoRA」:大型语言模型的低秩适应

news2025/7/5 17:26:27

 LoRA: Low-Rank Adaptation of Large Language Models

前言

LoRA作为大模型的微调框架十分实用,在LoRA出现以前本人都是通过手动修改参数、优化器或者层数来“炼丹”的,具有极大的盲目性,但是LoRA技术能够快速微调参数,如果LoRA微调后的效果不行,就可以转而修改优化器或模块了。而调整参数一步是工作量最大的,而且大模型的参数都是以亿为计数单位的,所以人工硬调参数变得不太可能,而LoRA就为这个提供了解决方法!

LoRA通过仅训练低秩矩阵,然后将这些参数注入到原始模型中,从而实现对模型的微调。这种方法不仅减少了计算需求,而且使得训练资源比直接训练原始模型要小得多,因此非常适合在资源有限的环境中使用。

主流的微调方式

目前主流的低成本微调大模型方法包括2019年 Houlsby N 等人提出的 Adapter Tuning,2021年微软提出的 LORA,斯坦福提出的 Prefix-Tuning,谷歌提出的 Prompt Tuning,2022年清华提出的 P-tuning v2。

LORA 的效果会好于其它几种方法。其它方法都有各自的一些问题:

  • Adapter Tuning 增加了模型层数,引入了额外的推理延迟
  • Prefix-Tuning 难于训练,且预留给 Prompt 的序列挤占了下游任务的输入序列空间,影响模型性能
  • P-tuning v2 很容易导致旧知识遗忘,微调之后的模型,在之前的问题上表现明显变差

LoRA的出发点

微调大规模语言模型到特殊领域和任务是自然语言处理的重要课题之一。但随着模型规模的不断扩大,微调模型的所有参数(full fine-tuning)的可行性变得越来越低。以GPT-3的175B参数为例,每增加一个新领域就需要完整微调一个新模型,代价和成本很高。

LoRA的特点

  • 优点:训练和计算成本低、可并行、不引入推理延迟
  • 在 每层 transfomer block 旁边引入一个并行低秩的支路,支路的输入是transfomer block 的输入。然后将输出和 transfomer block 的输出相加,在固定主pretrian model参数的情况下,用支路去学习特定任务知识,来完成特定任务。

动机

  • Lora在不改变模型推理结构的条件下,直接调整少量参数

  • 参数的变化量△W△W 通常是参数冗余的,使用低秩近似可以很好地表达

  • 普适性强,可以微调任意模型中的线性层

image.png

算法流程

  • 将模型参数分解为W0+△WW0​+△W,W0W0​ 表示预训练参数,△W表示微调后的变化量

  • 训练阶段:并联低秩矩阵分支,冻结预训练参数W0W0​ ,学习变化量△W

  • 推理阶段:去除并联分支,将学习到的△W与W0W0​ 相加,不改变模型结构,不影响推理效率。公式为:W=W0W0​ +△W

image.png

实验结论

LORA论文实验表明

相比其它微调方法

  • LORA 相比其它微调方法,增加参数量不会导致性能的下降。
  • 性能上与全参数微调持平甚至超过。

秩的选择

实验结果显示,对于一般的任务, r=1,2,4,8r=1,2,4,8 就足够了。而一些领域差距比较大的任务可能需要更大的 rr

同时,增加 rr 值变大并不能提升微调的效果,这可能是因为参数量增加需要更多的语料。

动手实践

目前 LORA 已经被 HuggingFace 集成在了 PEFT(Parameter-Efficient Fine-Tuning) 代码库里。lora 微调需要设置两个参数一个是r,即矩阵秩。 alpha是一个scale参数。

pip install peft

通过使用 get_peft_model 包装基础模型和 PEFT 配置,准备使用 PEFT 方法(例如 LoRA)进行训练的模型。对于 bigscience-mt0-large 模型,仅需要训练 0.19% 的参数!

from transformers import AutoModelForSeq2SeqLM
from peft import get_peft_config, get_peft_model, LoraConfig, TaskType
model_name_or_path = "bigscience/mt0-large"
tokenizer_name_or_path = "bigscience/mt0-large"

peft_config = LoraConfig(
    task_type=TaskType.SEQ_2_SEQ_LM, inference_mode=False, r=8, lora_alpha=32, lora_dropout=0.1
)

model = AutoModelForSeq2SeqLM.from_pretrained(model_name_or_path)
model = get_peft_model(model, peft_config)
model.print_trainable_parameters()

结果如下:

"trainable params: 2359296 || all params: 1231940608 || trainable%: 0.19151053100118282"

可以看到仅仅需要训练0.19%的参数

加载一个PEFT模型用于推理:

from peft import AutoPeftModelForCausalLM
from transformers import AutoTokenizer
import torch

model = AutoPeftModelForCausalLM.from_pretrained("ybelkada/opt-350m-lora").to("cuda")
tokenizer = AutoTokenizer.from_pretrained("facebook/opt-350m")

model.eval()
inputs = tokenizer("Preheat the oven to 350 degrees and place the cookie dough", return_tensors="pt")

outputs = model.generate(input_ids=inputs["input_ids"].to("cuda"), max_new_tokens=50)
print(tokenizer.batch_decode(outputs, skip_special_tokens=True)[0])

结果:

"Preheat the oven to 350 degrees and place the cookie dough in the center of the oven. In a large bowl, combine the flour, baking powder, baking soda, salt, and cinnamon. In a separate bowl, combine the egg yolks, sugar, and vanilla."

拓展:QLoRA和LoRA的区别

QLoRA和LoRA的性能对比通常取决于多个因素,包括任务类型、数据集、模型架构、硬件环境等。以下是一些可能的性能对比方面:

参数数量和训练效率

  • LoRA:由于使用了低秩矩阵,LoRA显著减少了需要微调的参数数量,这通常意味着更快的训练速度和更低的内存需求。
  • QLoRA:进一步通过量化减少了参数的大小,因此在相同的硬件上,QLoRA可能会提供更高的训练效率,尤其是在资源受限的环境中。

"参数量化"是指在机器学习和深度学习中,将模型的参数(通常是权重和偏置)从浮点数(如32位浮点数)转换为低精度的表示,比如16位、8位甚至更少的位。这样做的目的主要是为了减少模型的存储需求和计算复杂度,从而提高模型在硬件上的运行效率,尤其是在那些不支持或不擅长处理浮点运算的硬件上。

参数量化可以带来以下好处:

  1. 减少模型大小:量化后的模型占用的存储空间更小,便于在资源受限的设备上部署。
  2. 降低计算成本:量化后的模型在计算时需要的算力更少,可以减少能耗和提高处理速度。
  3. 提高硬件兼容性:在不支持浮点运算的硬件上,量化模型可以更有效地运行。

然而,参数量化也可能带来一些挑战,比如模型精度的下降,因为量化过程可能会导致信息的损失。因此,量化技术需要在模型效率和精度之间找到一个平衡点。

精度和模型性能

  • LoRA:保持浮点精度,通常能够提供与全模型微调相当或接近的性能,尤其是在参数较少且任务与原始预训练任务相似的情况下。
  • QLoRA:量化可能会引入一些精度损失,这可能导致模型性能略有下降。然而,这种损失通常很小,特别是在使用4位或更高位量化时。

推理速度和资源消耗

  • LoRA:在推理时,由于参数数量的减少,LoRA可以提高推理速度并减少资源消耗。
  • QLoRA:由于参数量化,QLoRA在推理时可能会更加高效,特别是在不支持浮点运算或浮点运算效率较低的硬件上。

具体性能对比

  • 在标准硬件上:LoRA和QLoRA的性能可能非常接近,但QLoRA可能在使用低精度运算的硬件上具有优势。
  • 在移动或嵌入式设备上:QLoRA的性能通常优于LoRA,因为它更适合资源受限的环境。
  • 在特定任务上:对于某些任务,量化可能对模型性能的影响较小,因此QLoRA可能接近或达到LoRA的性能。

实际应用中的考量

点击一文读懂「LoRA」:大型语言模型的低秩适应查看全文。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

IT面试求职系列主题-人工智能(一)

想成功求职,必要的IT技能一样不能少,再从人工智能基础知识来一波吧。 1)您对人工智能的理解是什么? 人工智能是计算机科学技术,强调创造能够模仿人类行为的智能机器。这里智能机器可以定义为能够像人一样行动、像人一…

浏览器报错:您的连接不是私密连接,Kubernetes Dashboard无法打开

问题描述 部署完成Kubernetes Dashboard后,打开HTTPS的web页面,Chrome和Edge浏览器都无法正常加载页面,会提示您的连接不是私密连接的报错。 ​​​​​​​​​​​​ 原因: 浏览器不信任这些自签名的ssl证书,为了…

【Unity插件】解决移动端UI安全区问题 - Safe Area Helper

在移动端设计界面时,必须要考虑的就是UI的安全区。 Unity本身也提供了Safearea的API。 但在asset store时已经有人提供了免费的插件(Safe Area Helper),我们可以直接使用。 插件链接: https://assetstore.unity.com/p…

ffmpeg7.0 aac转pcm

#pragma once #define __STDC_CONSTANT_MACROS #define _CRT_SECURE_NO_WARNINGSextern "C" { #include "libavcodec/avcodec.h" }//缓冲区大小(缓存5帧数据) #define AUDIO_INBUF_SIZE 40960 /*name depthu8 8s16 …

USRP X310 Windows 烧录镜像

说明 USRP-X 系列设备包含两个用于两个以太网通道的 SFP 端口。由于 SFP 端口支持 1 千兆 (SFP) 和 10 千兆 (SFP) 收发器,因此 UHD 附带了多个 FPGA 图像,以确定上述接口的行为。 注意:Aurora 图像需要从 FPGA 源代码手动构建。 FPGA 图像…

新型物联网智能断路器功能参数介绍

安科瑞刘鸿鹏 摘要 智能断路器作为现代配电系统的重要组成部分,以其实时监测、多重保护和远程操控的智能化功能,显著提升了电力系统的运行效率和安全性。本文以ASCB1系列智能断路器为例,探讨其技术特点和在工业、商业及民用建筑中的应用价…

119.使用AI Agent解决问题:Jenkins build Pipeline时,提示npm ERR! errno FETCH_ERROR

目录 1.Jenkins Build时的错误 2.百度文心快码AI智能体帮我解决 提问1:jenkins中如何配置npm的源 提问2:jenkins pipeline 类型为pipeline script from SCM时,如何配置npm源 3.最终解决方法-Jenkinsfile的修改 4.感触 1.Jenkins Build时…

pytest+allure 入门

使用allure如何生成自动化测试报​​​​​​告 ?一文详解allure的使用 。_allure测试报告-CSDN博客 例子: import allure import pytest import osallure.epic("闹钟") allure.feature("闹钟增删") class TestSchedule():def setu…

【FPGA】时序约束与分析

设计约束 设计约束所处环节: 约束输入 分析实现结果 设计优化 设计约束分类: 物理约束:I/O接口约束(例如引脚分配、电平标准设定等物理属性的约束)、布局约束、布线约束以及配置约束 时序约束:设计FP…

【Vim Masterclass 笔记09】S06L22:Vim 核心操作训练之 —— 文本的搜索、查找与替换操作(第一部分)

文章目录 S06L22 Search, Find, and Replace - Part One1 从光标位置起,正向定位到当前行的首个字符 b2 从光标位置起,反向查找某个字符3 重复上一次字符查找操作4 定位到目标字符的前一个字符5 单字符查找与 Vim 命令的组合6 跨行查找某字符串7 Vim 的增…

win32汇编环境,窗口程序中对按钮控件常用操作的示例

;运行效果 ;win32汇编环境,窗口程序中对按钮控件常用操作的示例 ;常用的操作,例如创建按钮控件,使其无效,改变文本,得到文本等。 ;将代码复制进radasm软件里,直接就可以编译运行。重点部分加备注。 ;>&g…

继承(7)

大家好,今天我们继续来学习一下继承的知识,这方面需要大家勤动脑才能理解,那么我们来看。 1.9 protected关键字 在类和对象章节中,为了实现封装特性,java中引入访向限定符,主要限定:类或者类中成员能否在类外和其他包中被访问. …

基于RK3568/RK3588大车360度环视影像主动安全行车辅助系统解决方案,支持ADAS/DMS

产品设计初衷 HS-P2-2D是一款针对大车盲区开发的360度全景影像 安全行车辅助系统,通过车身四周安装的超广角像机,经算法合成全景鸟瞰图,通过鸟瞰图,司机非常清楚的看清楚车辆四周情况,大大降低盲区引发的交通事故。 产…

NVIDIA发布GeForce RTX 50 系列,售价549美元起

2025 CES消费电子展(1月7日至10日,美国拉斯维加斯)正式开幕。北京时间1月7日 (星期二)上午10:30,NVIDIA举办主题演讲,CEO黄仁勋担任主讲。正式发布了全新的RTX 50系列显卡!一月下旬上市。同时公布了各版本的…

后端:Spring(IOC、AOP)

文章目录 1. Spring2. IOC 控制反转2-1. 通过配置文件定义Bean2-1-1. 通过set方法来注入Bean2-1-2. 通过构造方法来注入Bean2-1-3. 自动装配2-1-4. 集合注入2-1-5. 数据源对象管理(第三方Bean)2-1-6. 在xml配置文件中加载properties文件的数据(context命名空间)2-1-7. 加载容器…

基于EasyExcel实现通用版一对一、一对多、多层嵌套结构数据导出并支持自动合并单元格

接口功能 通用 支持一对一数据结构导出 支持一对多数据结构导出 支持多层嵌套数据结构导出 支持单元格自动合并 原文来自:https://blog.csdn.net/qq_40980205/article/details/136564176 新增及修复 基于我自己的使用场景,新增并能修复一下功能&#x…

【数据库】一、数据库系统概述

文章目录 一、数据库系统概述1 基本概念2 现实世界的信息化过程3 数据库系统内部体系结构4 数据库系统外部体系结构5 数据管理方式 一、数据库系统概述 1 基本概念 数据:描述事物的符号记录 数据库(DB):长期存储在计算机内的、…

网络安全建设方案,信息安全风险评估报告,信息安全检测文档(Word原件完整版)

一、概述 1.1工作方法 1.2评估依据 1.3评估范围 1.4评估方法 1.5基本信息 二、资产分析 2.1 信息资产识别概述 2.2 信息资产识别 三、评估说明 3.1无线网络安全检查项目评估 3.2无线网络与系统安全评估 3.3 ip管理与补丁管理 3.4防火墙 四、威胁细…

数据分析工作流

数据分析工作流 1.流程 数据产生阶段 业务系统生成数据:在各种业务场景下,如用户在电商平台上进行购物(产生订单信息、浏览记录等)、在金融系统中进行交易(产生交易流水、账户余额变动等)或者在企业内部的…

【Go】:图片上添加水印的全面指南——从基础到高级特性

前言 在数字内容日益重要的今天,保护版权和标识来源变得关键。为图片添加水印有助于声明所有权、提升品牌认知度,并防止未经授权的使用。本文将介绍如何用Go语言实现图片水印,包括静态图片和带旋转、倾斜效果的文字水印,帮助您有…