自然语言处理: 第十二章LoRA解读

news2025/1/16 5:03:15

论文地址:[2106.09685] LoRA: Low-Rank Adaptation of Large Language Models (arxiv.org)

理论基础

自从GPT-3.5问世以来,整个AI界基本都走向了大模型时代,而这种拥有数亿参数的大模型对于普通玩家来说作全量微调基本是不可能的事。从而微软公司提出了LoRA(low-Rank Adaptation) 对大模型进行微调的技术,简单的来说就是针对于fine_tune的过程并不是全量微调,而是更像加入了一个adapter插件(与fine_tune技术相对于的一种对于大模型适应下游任务的训练手段,其宗旨是并不改变大模型的参数,而是在大模型的基础上增加一些额外的架构,可以参考AdapterHub - 572 adapters for 76 text tasks and 50 languages , 上面有各种各样的adapter) — 降低模型的参数的秩(有关于秩的概念,不清楚的大概可以理解成矩阵中线性无关的行或者列的最大数量)而只去训练那些关键的参数,但是并不改变原始预训练模型的参数,从而大大的降低了可训练参数的数量从而加快了训练速度,并且拥有与全量微调相近甚至过犹不及的效果,这就是LoRA niubility的地方了。

针对于现在的大模型参数大的特点,全量微调对于很多非商业的使用者来说是非常不友好的,因此parameter-efficcient fine-tuning methods就提出来了,其并不需要去调整整个大模型的参数,而是去高校的优化模型的部分参数或者说是能适用于下游任务的新参数。下面是目前几个流行的方法

  • Adapter Tuning: 在transformer架构中增加其他模块
  • Prefix Tuning: 在每一个注意力前增加prefix
  • Prompt tuning: 去不断的改变prompt(问题)的embedding
  • LoRA: 将原始的参数替换成低秩的矩阵,从而去优化这个低秩矩阵,也可以看成是一种adapter
    在这里插入图片描述

Adapter这种技术核心思想是不改变原有的预训练语言模型的基础架构,而是在原有的架构基础上增加新的模块,比如Bitfit, Houisby , AdapterBias , prefix-tuning以及本文要讨论的LoRA。下面让我们来跟着论文一起走进lora的世界。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oYOxUyED-1692025807387)(image/12_LoRA/1692005137898.png)]


首先看看摘要部分,作者提出如果要对GPT-3 175B参数的模型进行全量微调的成本太高了,因此lora应运而生,其主要原理就是冻结原模型的权重并且在transformer结构中注入可训练的低秩分解矩阵(其实就是做了一个低秩矩阵分解),其在Adam下的效果可以看到训练参数降低了10000倍,GPU内存节省了3倍,并且训练的效果在多个模型上都能达到全量微调的匹配的效果,除此之外,在Pytorch上集成了LoRA的包,以方便开发者使用这么看还是非常牛逼的。

在这里插入图片描述

作者在原论文中提出,在lora提出之前,对于fine_tune大模型过程中,新模型包含原始模型相同数量的参数,之前的对于改善的工作大部分都是在效果和效率之间的一个权衡,最终效果都不是很理想。作者发现在模型自适应的过程中权重的改变有着低秩内核,换句话说就是模型在自适应下游任务过程中参数的改变量是低秩的(其实只有少部分权重参数是起决定性作用的),基于此lora的思想就提出来了,如下图,作者首先将预训练的模型参数全部冻结记作W(维度为 d * k), 然后模型重新注入两个低秩可训练的参数矩阵A(维度为d * r) 以及 B(维度为r * k), 其中r为秩,并且远远小于d 和k的最小值一般取 1 , 2 , 4 , 8, 16…,记作▲W = A * B。原始的模型参数就变成了W0 + ▲W = W0 + A * B ,从而整个模型的输出也就从 h = W0 * X 变成了 h = (W0 + A * B) * X = W0 * X + A * B * X。并且对于AB矩阵,作者分别进行了不同的初始化处理,A矩阵进行了随机高斯初始化,对B进行0初始化,所以最开始的时候模型输出由于▲W = A * B = 0 还是就等于W0 * X,并且作者还加入了一个缩放因子α , 对于▲W 进行的大小进行缩小,缩小α / r 倍,具体细节可以参考原文。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XByrxUhU-1692025807389)(image/12_LoRA/1691834096295.png)]

基于此的LoRA拥有由于加入了两个低秩矩阵的乘积从而有两个好处:

  • 通用性和适应性强,理论上适配所以模型,并且效果理想
  • 推断过程不会引入推理延迟,对于不同的下游任务不用担心知识迁移效果不理想,直接将BA矩阵拿掉就可以恢复原始模型,从而根据不同的BA可以搭建不同的模型。


下面看一下作者原论文中的实际应用效果,横向的各个指标的意思放在下面了,其中base / large / XXL 表示的是模型大小。FT代表fine-tuning, 可以看到lora调整的参数是大大的降低,大部分效果也比全量微调好。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-U1Fpn4B9-1692025807389)(image/12_LoRA/1691931417149.png)]

  • MNLI:自然语言推断任务
  • SST-2: 情感分析任务
  • MRPC: 句子对匹配任务
  • CoLA: 语言可接受性判断任务
  • QNLI: 自然语言推断任务
  • QQP: 句子对匹配任务
  • RTE: 自然语言推断任务
  • STS-B: 句子相似性任务

其次作者还研究了对于transformer模块中QKVO权重矩阵的研究,效果如下,可以发现将lora放置分散的放置在不同权重参数下,效果最佳。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q35UMg8Z-1692025807390)(image/12_LoRA/1691931805467.png)]


那关于秩r的取值,作者也提出对于一般普通的任务取 1 / 2 /4 /8 就可以了,效果就能比较理想。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hqh1xeS8-1692025807390)(image/12_LoRA/1691932036400.png)]

总结一下LoRA的优点总共有以下几点:

  1. 一个基础的预训练模型可以部署多个下游任务,大大减少了参数量
  2. 推理阶段无额外的计算量,大大的减少了延迟
  3. 与其他参数微调方法正交,可以混合使用
  4. 训练效果好,性能稳定






代码

Git地址: microsoft/LoRA: Code for loralib, an implementation of "LoRA: Low-Rank Adaptation of Large Language Models" (github.com)

由于LoRA是微软自研的,所以整个代码都非常成熟了,想使用的可以参考主页的介绍进行操作,下面我这里简单的介绍一下。

安装

pip install loralib

pip install git+https://github.com/microsoft/LoRA

上面两行命令都行

使用

目前支持linear / embedding / conv2d 这些层,使用起来也很方便直接lora.(in , out , r)多输入一个秩就行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CrwxpDwh-1692025807391)(image/12_LoRA/1691932613995.png)]

如果想对transformer架构进行设置,可以qkv单独设置,同样也可以直接用mergedlinear。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qRV2CHxj-1692025807391)(image/12_LoRA/1691932885630.png)]

训练模型时,需要设置lora.mark_only_lora_as_trainable,也就是把原始参数冻结,其余的与原始训练机制相同

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dee4ceYR-1692025807391)(image/12_LoRA/1691932696524.png)]

模型保存与torch一致,读取时需要将strict 参数设置成false

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QHWe7oTL-1692025807392)(image/12_LoRA/1691932822915.png)]

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

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

相关文章

指令延迟隐藏

一、指令延迟隐藏 1. 延迟和延迟隐藏 指令延迟指计算指令从调度到指令完成所需的时钟周期如果在每个时钟周期都有就绪的线程束可以被执行,此时GPU处于满符合状态指令延迟被GPU满负荷计算状态所掩盖的现象称为延迟隐藏延迟隐藏对GPU编程开发很重要,GPU设…

BeanFactory 和 FactoryBean傻傻分不清楚

🤵‍♂️ 个人主页:香菜的个人主页,加 ischongxin ,备注csdn ✍🏻作者简介:csdn 认证博客专家,游戏开发领域优质创作者,华为云享专家,2021年度华为云年度十佳博主 🐋 希望…

HTTPS双向认证

双向认证,指的是客户端和服务器端都需要验证对方的身份,在建立HTTPS连接的过程中,握手的流程相对于单向认证多了几步。 单向认证的过程,客户端从服务器端下载服务器端公钥证书进行验证,然后建立安全通信通道。 双向通信…

java的数据类型与变量(超详细每个都有小结论,习题巩固)

【本文章的目标】 1.字面常量 2.数据类型 3.变量 文章最后有习题等来帮助巩固,加深印象,相信看完这篇文章,大家会有收获 1.字面常量 在上节课HelloWorld程序中,System.Out,println(Hello World"); 语句,不论…

算法[动态规划]---买卖股票最佳时机

1、题目: 给你一个整数数组 prices,其中 prices[i] 表示某支股票第 i 天的价格。 在每一天,你可以决定是否购买和/或出售股票。你在任何时候最多只能持一股股票。你也可以先购买,然后在同一天出售。 返回你能获得的最大利润 。 2…

PLSQL

文章目录 基本pl/sql语法流程控制条件判断(两种)循环结构(三种)goto,exit关键字 游标的使用异常的处理存储过程(无返回值),存储函数(有返回值)触发器 命令行窗…

苹果手机远程控制安卓手机,为什么不能发起控制?

这位用户想要用iOS设备远程控制安卓设备,在被控端安装好AirDroid之后,就在控制端的苹果手机上也安装了AirDroid,然而打开控制端的软件,却没有在手机界面上看到【远程控制】按钮,于是提出了以上疑问。 解答 想要让iOS设…

A,B,C , D, E类地址的划分及子网划分汇总的详解

一、 A类地址 (1)A类地址第1字节为网络地址,其它3个字节为主机地址。它的第1个字节的第一位固定为0. (2)A类地址范围:1.0.0.1—126.255.255.254 (3)A类地址中的私有地址和保留地…

苹果电脑快捷键集合

苹果电脑Windows系统下的ALT键是组合键。苹果电脑键盘左下角的Fnoption是Windows的alt键。同时按下两个键是ALT键的功能。在非组合状态下,单独按Option键。 补充: 1. 按controlalt(选项)delete 启动任务管理器。 2. Option-Del…

nrf52832 使用ADC点LED

#define SAMPLES_IN_BUFFER 5 volatile uint8_t state 1;/*** brief UART events handler.*/void saadc_callback(nrf_drv_saadc_evt_t const * p_event) { // }//saadc的初始化 void saadc_init(void) {ret_code_t err_code;nrf_saadc_channel_config_t channel_config NR…

C#,数值计算——柯西微分(Cauchy deviates)的计算方法与源代码

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Cauchy deviates /// </summary> public class Cauchydev : Ran { private double mu { get; set; } private double sig { get; set; } public…

C++ -- 学习系列 static 关键字的使用

static 是 C 中常用的关键字&#xff0c;被 static 修饰的变量只会在 静态存储区&#xff08;常量数据也存放在这里&#xff09; 被分配一次内存&#xff0c;生命周期与整个程序一样&#xff0c;随着程序的消亡而消亡。 一 static 有以下几种用法&#xff1a; 1. 在文件中定义…

管理类联考——数学——汇总篇——知识点突破——应用题——交叉比例法/杠杆原理

读书笔记 甲有&#xff1a;x个a&#xff0c;乙有&#xff1a;y个b&#xff0c;甲乙的平均值为c&#xff0c;根据总数相等&#xff0c;得&#xff1a;axbyc(xy)&#xff0c;即ax-cxcy-by&#xff0c;则 x y c − b a − c \frac{x}{y}\frac{c-b}{a-c} yx​a−cc−b​ &#…

【Vue2.0源码学习】生命周期篇-初始化阶段(initState)

文章目录 1. 前言2. initState函数分析3. 初始化props3.1 规范化数据3.2 initProps函数分析3.3 validateProp函数分析3.4 getPropDefaultValue函数分析3.5 assertProp函数分析 4. 初始化methods5. 初始化data6. 初始化computed6.1 回顾用法6.2 initComputed函数分析6.3 defineC…

rv1126之isp黑电平(BLC)校准!

前言&#xff1a; 大家好&#xff0c;今天我们继续来讲解isp第二期内容&#xff0c;这期内容主要分三个部分&#xff1a; 1、tunning的工作流程 2、利用RKISP2.x_Tuner来创建tunning工程&#xff0c;并连接上rv1126开发板进行抓图 3、BLC(黑电平校准)的原理和校准方法以及实战…

UE4(Unreal Engine 4)运行setup.bat发生403报错的问题

最近UE官方在迁移服务器&#xff0c;有些D:\UE4\Engine\Build\Commit.gitdeps.xml文件需要更新。此时需要你去往UE对应的版本下载新的Commit.gitdeps.xml文件&#xff0c;并且覆盖原有的Commit.gitdeps.xml文件。UE的官方说明 覆盖前 覆盖后

Tomcat多实例与负载均衡

Tomcat多实例与负载均衡 一、Tomcat多实例1.1、安装JDK1.2、安装tomcat1.3、配置tomcat环境变量1.4、修改tomcat中的主配置文件1.5、修改启动脚本和关闭脚本1.6、 启动tomcat并查看 二、NginxTomcat负载均衡、动静分离2.1、部署Nginx负载均衡2.2、部署第一台tomcat2.3、部署第二…

Windows系统远程桌面连接CentOS7

1. 安装 GNOME 桌面环境&#xff08;如果尚未安装&#xff09; yum groupinstall "GNOME Desktop" 2. 安装 VNC Server yum install tigervnc-server 设置 vnc 账号密码 vncpasswd root root 是账号&#xff0c;接下会提示两次输入密码 3. 安装 xrdp 检查cento…

编译器01-整体概述

一&#xff1a;编译器各个阶段及它们之间接口 二&#xff1a;编译器各个阶段解释 三&#xff1a;编译器中常用的数据结构-树与链表

基于springboot+vue的实验室耗材管理系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…