LoRA:低秩自适应

LoRA:低秩自适应

本章节是对轻松上手微调大语言模型——QLORA篇中提到的LoRA的原理解释。

背后动机

现今模型的参数量变得越来越大,对预训练模型进行全微调变得越来越不可行。为了解决这个问题有了LoRA(Low-Rank Adaption)的诞生。将可训练的秩分解矩阵注入到每个模型中架构的层,极大的减少下游任务的训练参数量。以GPT-3 175B微调为例,相较于以Adam微调的GPT-3 175B, LoRA 可以减少10000倍训练参数,并且所需的GPU内存减少3倍。

LORA的优势:

  • LoRA 通过大幅减少可训练参数的数量,使微调更加高效。
  • 原始预训练权重保持冻结状态,这意味着您可以拥有多个轻量级、便携式 LoRA 模 型,用于在其之上构建的各种下游任务。
  • LoRA可以与其他许多方法结合使用,比如Prefix-tuning。
  • 使用 LoRA 微调的模型的性能与完全微调的模型的性能相当

思想

在这里插入图片描述

假设我们有权重位 W 0 W_0 W0密集层,以梯度 ∇ W 0 \nabla W_0 W0更新。则新的权重为:
W 1 = W 0 + ∇ W 0 W_1=W_0+\nabla W_0 W1=W0+W0
经过 n n n次梯度下降得到:
W 2 = W 1 + ∇ W 1 W 3 = W 2 + ∇ W 2 ⋮ W n = W n − 1 + ∇ W n − 1 = W 0 + ∑ i = 0 n − 1 ∇ W i = W 0 + ∇ W W_2=W_1+\nabla W_1\\ W_3=W_2+\nabla W_2\\ \vdots\\ W_n=W_{n-1}+\nabla W_{n-1}=W_0+\sum_{i=0}^{n-1}\nabla W_i=W_0+\nabla W W2=W1+W1W3=W2+W2Wn=Wn1+Wn1=W0+i=0n1Wi=W0+W
因为现在的大模型一般是过参数化的,所以我们可以使用两个秩(r)比较低的两个矩阵 B A BA BA来拟合。

LoRA 可以应用于神经网络中权重矩阵的任何子集,以减少可训练参数的数量。然而,为了简单性和进一步的参数效率,LoRA 通常仅应用于 Transformer 模型中的注意力块。 LoRA 模型中可训练参数的数量取决于更新矩阵的大小,而更新矩阵的大小主要由秩 r 和原始权重矩阵的形状决定。

注意:由于LoRA实质上就是在原权重矩阵的基础上,加上了我们训练得到的新权重,而原始模型参数保持不变。故此,对于不同的任务,可以只保存训练的LoRA权重也就是上文提到的 ∇ W = B A \nabla W=BA W=BA,而不必多次保存原始模型,当用于不同任务时,只需卸载当前的LoRA权重,加载相应得LoRA权重即可。

一些实验性的结果

是否应该对所有参数都微调?

在这里插入图片描述

表中的 W q , W k , W v , W o W_q,W_k,W_v,W_o Wq,Wk,Wv,Wo分别表示自注意力机制的查询、键、值和输出权重参数。
从表中可看出,将所有参数都放入 ∇ W q \nabla W_q Wq ∇ W k \nabla W_k Wk会导致性能显著降低,而同时采用 ∇ W q \nabla W_q Wq ∇ W k \nabla W_k Wk会得到最好的结果。这表明,即使是4的秩也能捕获 ∇ W \nabla W W中足够多的信息,以至于采用更多的权重矩阵比采用秩更大的单一类型的权重更好。

LoRA的秩如何挑选?

在这里插入图片描述

原论文作者认为增大r并不能覆盖一个更有意义的子空间,一个低秩的适应矩阵是足够的。

LoRA原论文地址:arxiv:https://arxiv.org/pdf/2106.09685

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

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

相关文章

Nginx制作下载站点

使用nginx制作一个类似nginx官网的下载站点 如何制作一个下载站点,首先需要ngx_http_autoindex_module模块 该模块处理以斜杠(“/”)结尾的请求,并生成目录列表。 nginx编译的时候会自动加载该模块,但是该模块默认是关闭的,需要使用下来指令…

3 FreeRTOS移植(从FREERTOS官网移植进自己的工程)

3 FreeRTOS移植 1 获取FreeRTOS源码(熟悉)1.1 介绍源码内容1.2 FreeRTOS内核1.2.1 Demo文件夹1.2.2 Source文件夹1.2.2.1 portable文件夹 2 FreeRTOS手把手移植(掌握)(重要)2.1 移植步骤 3 系统配置文件说明…

GraphHopper-map-navi_路径规划、导航(web前端页面版)

文章目录 一、项目地址二、踩坑环境三、问题记录3.1、graphhopper中地图问题3.1.1. getOpacity不存在的问题3.1.2. dispatchEvent不存在的问题3.1.3. vectorLayer.set(background-maplibre-layer, true)不存在set方法3.1.4. maplibre-gl.js.map不存在的问题3.1.5. Uncaught Ref…

学习记录:ESP32控制舵机 FREERTOS BLE

控制舵机 PWM信号 PWM信号是一种周期性变化的方波信号,它有两个关键参数: 周期(Period):一个完整的PWM信号的时间长度,通常用秒(s)或毫秒(ms)表示。占空比…

FFmpeg解复用器如何从封装格式中解析出不同的音视频数据

目录 1、ffmpeg介绍 2、FFMPEG的目录结构 3、FFmpeg的格式封装与分离 3.1、数据结构 3.2、封装和分离(muxer和demuxer) 3.2.1、Demuxer流程 3.2.2、Muxer流程 4、总结 4.1、播放器 4.2、转码器 C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续…

微服务上(黑马)

文章目录 微服务011 认识微服务1.1 单体架构1.2 微服务1.3 SpringCloud 2 微服务拆分2.1 熟悉黑马商城2.2 服务拆分原则2.2.1.什么时候拆2.2.2.怎么拆 2.3 拆分服务2.3.1 拆分商品管理功能模块2.3.2 拆分购物车功能模块 2.4 远程调用2.4.1 RestTemplate2.4.2.远程调用 2.5 总结…

顺序表算法题

在学习了顺序表专题后,了解的顺序表的结构以及相关概念后就可以来试着完成一些顺序表的算法题了,在本篇中将对三道顺序表相关的算法题进行讲解,希望能对你有所帮助,一起加油吧!!! 1.移除元素 2…

nginx转发netty长链接(nginx负载tcp长链接配置)

首先要清楚一点,netty是长链接是tcp连接不同于http中负载在http中配置server监听。长连接需要开启nginx的stream模块(和http是并列关系) 安装nginx时注意开启stream,编译时加上参数 --with-stream (其他参数根据自己所需来加) …

脊髓损伤的小伙伴锻炼贴士

Hey小伙伴们~👋 今天要跟大家聊一个超燃又超温馨的话题!🌟 对于我们脊髓损伤的小伙伴们来说,保持身体活力,不仅是健康的小秘诀,更是拥抱美好生活的超能量哦!💪 #脊髓损伤# 首先&…

Cache 替换策略--PLRU算法详解

一、引言 LRU(Least Recently Used)是 cache 的经典替换策略之一,但当 Cache 的路数比较大时(多路组相连结构),实现 LRU 的硬件开销就会变得很大。现代处理器一般会考虑使用 PLRU(pseudo-LRU&a…

一文带你搞懂C++运算符重载

7. C运算符重载 C运算符重载 什么是运算符重载 运算符重载赋予运算能够操作自定义类型。 运算符重载前提条件: 必定存在一个自定义类型 运算符重载实质: 就是函数调用 友元重载 类重载 在同一自定义类型中,一个运算符只能被重载一次 C重载只能重载…

vue element-ui日期控件传参

前端&#xff1a;Vue element-ui <el-form-item label"过期时间" :rules"[ { required: true, message: 请选择过期时间, trigger: blur }]"><el-date-picker v-model"form.expireTime" type"date" format"yyyy-MM-dd&…

【C++】透析类和对象(下)

有不懂的可以翻阅我之前文章&#xff01; 个人主页&#xff1a;CSDN_小八哥向前冲 所属专栏&#xff1a;CSDN_C入门 目录 拷贝构造函数 运算符重载 赋值运算符重载 取地址运算符重载 const成员函数 取地址重载 再探构造函数 初始化列表 类型转换 static成员 友元 内…

MySQL查询执行(二):order by工作原理

假设你要查询城市是“杭州”的所有人名字&#xff0c; 并且按照姓名排序返回前1000个人的姓名、 年龄。 假设这个表的部分定义是这样的&#xff1a; -- 创建表t CREATE TABLE t (id int(11) NOT NULL,city varchar(16) NOT NULL,name varchar(16) NOT NULL,age int(11) NOT N…

Docker 搭建Elasticsearch详细步骤

本章教程使用Docker搭建Elasticsearch环境。 一、拉取镜像 docker pull docker.elastic.co/elasticsearch/elasticsearch:8.8.2二、运行容器 docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-n

maven clean报错:Failed to delete xxxxx\target\xxxx.jar

问题描述 今天使用maven的clean命令时候出错如下&#xff1a; 分析问题 target文件可能时编译的文件被其他程序占用&#xff0c;导致资源无法回收 解决问题 1 打开任务管理器 右键任务栏。进入任务管理器 点击详细信息 2 进入 点击性能&#xff0c;点击打开资源监视器 …

推荐2024年大家都在用的4款ai写作免费神器

最近公司年中总结&#xff0c;要写好多像工作报告&#xff0c;工作计划之类的文件。我尝试着使用AI写作工具帮助&#xff0c;没想到效果意外的好&#xff0c;省事又省力。如果你也有和我一样的烦恼的话&#xff0c;可以去使用这4个写作工具&#xff0c;都是可以免费使用的。 1、…

错误代码0x80070035是什么情况?针对错误代码0x80070035的解决方法

错误代码 0x80070035 通常与网络连接和文件共享有关&#xff0c;表示“找不到网络路径”。这个问题可能由多种原因引起&#xff0c;包括网络设置不当、服务未启动、注册表配置错误等。今天这篇文章就和大家分享几种针对错误代码0x80070035的解决方法。 针对错误代码0x80070035问…

express连接mysql

一、 安装express npm install express --save二、express配置 //引入 const express require("express"); //创建实例 const app express(); //启动服务 app.listen(8081, () > {console.log("http://localhost:8081"); });三、安装mysql npm i m…