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

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」:大型语言模型的低秩适应查看全文。

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

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

相关文章

接口项目操作图-thinkphp6-rabbitmq

一、用户开户流程 用户首次需要联系商务开通账户,需要提供手机号及来访问的IP。开好户之后,平台方将提供用户访问的key值及header头部参数的公钥加密文件、body访问参数以及返回数据的公私钥加解密文件。 二、用户请求流程 用户将拿到的key值进行rsa公钥…

程序环境及预处理

一.程序的翻译环境和执行环境 在ANSI C(标准c)的任何一种实现中,存在两个不同的环境。 计算机是能够执行二进制指令的,但是我们写出的c语言代码是文本信息,计算机不能直接理解 第1种是翻译环境,在这个环境…

回顾 Tableau 2024 亮点功能,助力 2025 数据分析新突破

2024 年,Tableau 用更智能、更高效的工具,重新定义了数据分析的可能性。 回顾 2024 年,Tableau 凭借一系列创新功能,在数据可视化与分析领域再次引领潮流。无论是深度整合 AI 技术,还是优化用户体验的细节,…

【姿态估计实战】使用OpenCV和Mediapipe构建锻炼跟踪器【附完整源码与详细说明】

《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…

快速上手Python,制作趣味猜数字游戏

在编程学习的旅程中,游戏是一个极佳的切入点。今天,我们将一起创建一个简单而有趣的猜数字游戏,借此机会深入学习Python编程的基础知识和一些实用的编程技巧。无论你是初学者还是有一定基础的开发者,相信你都能从中获得乐趣和收获…

AI驱动的可演化架构与前端开发效率

1. 引言 在当今快节奏的数字时代,软件系统需要具备强大的适应能力才能在瞬息万变的市场需求中保持竞争力。软件可演化架构的重要性日益凸显,它能够让软件系统在面对需求变更、技术升级以及市场波动时,能够快速、高效地进行调整和升级&#x…

用豆包MarsCode IDE打造精美数据大屏:从零开始的指南

原标题:用豆包MarsCode IDE,从0到1画出精美数据大屏! 豆包MarsCode IDE 是一个云端 AI IDE 平台,通过内置的 AI 编程助手,开箱即用的开发环境,可以帮助开发者更专注于各类项目的开发。 作为一名前端开发工…

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

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

pygame飞机大战

飞机大战 1.main类2.配置类3.游戏主类4.游戏资源类5.资源下载6.游戏效果 1.main类 启动游戏。 from MainWindow import MainWindow if __name__ __main__:appMainWindow()app.run()2.配置类 该类主要存放游戏的各种设置参数。 #窗口尺寸 #窗口尺寸 import random import p…

c++ 两线交点计算程序(Program for Point of Intersection of Two Lines)

给定对应于线 AB 的点 A 和 B 以及对应于线 PQ 的点 P 和 Q,找到这些线的交点。这些点在 2D 平面中给出,并带有其 X 和 Y 坐标。示例: 输入:A (1, 1), B (4, 4) C (1, 8), D (2, 4) 输出:给定直线 AB 和…

Taro+react 开发第一节创建 带有redux状态管理的项目

Taro 项目基于 node,请确保已具备较新的 node 环境(>16.20.0),推荐使用 node 版本管理工具 nvm 来管理 node,这样不仅可以很方便地切换 node 版本,而且全局安装时候也不用加 sudo 了。 1.安装 npm inf…

2024AAAI SCTNet论文阅读笔记

文章目录 SCTNet: Single-Branch CNN with Transformer Semantic Information for Real-Time Segmentation摘要背景创新点方法Conv-Former Block卷积注意力机制前馈网络FFN 语义信息对齐模块主干特征对齐共享解码头对齐 总体架构backbone解码器头 对齐损失 实验SOTA效果对比Cit…

代码随想录 数组test5(leetcode 59.螺旋矩阵)

59. 螺旋矩阵 II - 力扣(LeetCode) 大致的想法是从起点开始以顺时针走到中心,有两种实现方式:一圈一圈赋值或者每走一步就赋值 方法一:按圈循环 思路: 外层循环是要循环的圈数,这里需要分奇偶讨论,若题目给出的n为偶…

向成电子XC3588H工控主板助力内窥镜应用升级

随着微创手术在全球范围内普及,内窥镜应用越来越广泛。利用内窥镜,医生可以看到X射线不能显示的病变,对医疗诊断有非常重要的作用。内窥镜设备凝聚了先进的影像技术,提供高画像精度诊断微小的病变。在设备智能化的今天&#xff0c…

基于SpringBoot的音乐网站与分享平台

基于SpringBoot的音乐网站与分享平台 摘要1. 研究背景2.研究内容3.系统功能 3.1前台首页功能模块3.2在线听歌功能模块3.3后台登录功能模块3.4在线听歌管理模块 4.部分功能代码实现5.源码分享(免费获取) 需要源码联系我即可(免费获取)~ ??大家点赞、收藏、关注、评论啦 、查…

nginx-灰度发布策略(split_clients)

一. 简述: 基于客户端的灰度发布(也称为蓝绿部署或金丝雀发布)是一种逐步将新版本的服务或应用暴露给部分用户,以确保在出现问题时可以快速回滚并最小化影响的技术。对于 Nginx,可以通过配置和使用不同的模块来实现基于…

【数据结构】栈与队列(FIFO)

在阅读该篇文章之前&#xff0c;可以先了解一下堆栈寄存器和栈帧的运作原理&#xff1a;<【操作系统】堆栈寄存器sp详解以及栈帧>。 栈(FILO) 特性: 栈区的存储遵循着先进后出的原则。 例子: 枪的弹夹&#xff0c;最先装进去的子弹最后射出来&#xff0c;最后装入的子弹…

python基础案例

#一个年份如果能被4整除但不能被 100整除&#xff0c;或能被 400整除&#xff0c;那么这个年份就是闰年。 year int(input(请输入年份&#xff1a;)) if (year %40 and year %100!0) or year %4000:print("这个年份就是闰年") else:print("这个年份不是闰…

微服务框架,Http异步编程中,如何保证数据的最终一致性

一、背景 在微服务框架下&#xff0c;跨服务之间的调用&#xff0c;当遇到操作耗时或者量大的情况&#xff0c;我们一般会采用异步编程实现。 本文出现的问题是&#xff1a;异步回调过来时&#xff0c;却未查询到数据库中的任务&#xff0c;导致未能正常处理回调。 下面是当…

Kafka详解 ③ | Kafka集群操作与API操作

目录 1、Kafka集群操作 1.1、创建 topic 1.2、查看主题命令 1.3、生产者生产 1.4、消费者消费数据 1.5、运行 describe topics命令 1.6、增加 topic分区数 1.7、增加配置 1.8、删除配置 1.9、删除 topic 2、Kafka的Java API操作 2.1、生产者代码 2.2、消费者代 2…