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

论文阅读_模型结构_LoRA

name_en: LoRA: Low-Rank Adaptation of Large Language Models
name_ch: LORA:大语言模型的低阶自适应
paper_addr: http://arxiv.org/abs/2106.09685
date_read: 2023-08-17
date_publish: 2021-10-16
tags: [‘深度学习’,‘大模型’]
author: Edward J. Hu
citation: 657
code: https://github.com/microsoft/LoRA pytorch,风格简捷

1 读后感

LoRA 是 Low-Rank 的缩写,它是一种大模型微调技术。一开始用于优化自然语言模型,但是后来自然语言模型后来选择了 Prompt 的道路;而该技术在图像领域得到了广泛的应用,比如 Stable Diffusion 的一众 LoRA 模型,从背景风格到人物形像,不用精调 2-8 G 的基础模型,通过训练 只有几十到几百兆 LoRA 模型,就可以实现建模。

它针对的问题是:当模型大到一定程度,比如 GPT-3 有 175B 参数,精调变得费时而昂贵。其解决方法是:它修改了fine-tune过程,提出低阶自适应技术,冻结了预训练的模型权重,并将可训练的秩分解矩阵注入到 Transformer 架构的每一层中,这大大减少了下游任务中可训练参数的数量。其的效果是:与使用 Adam 微调的 GPT-3 175B 相比,LoRA 可以将可训练参数数量减少 10,000 倍,GPU 内存需求减少 3 倍。且推理时没有额外延迟。

2 介绍

2.1 感性理解

先用图像建模举个例子,比如使用 LAION-5B 数据集训练底模,它包含 58.5 亿个 图像-文本对,如果我们在其基础上用 200 张图片精调模型,可以想见,最终模型的大多数参数与底模差异不大;如果也使用与原模型一样大的空间存储是很浪费的,需要保留的只是当前风格和通用风格的差异,信息量并不大。这种情况下,使用 LoRA模型,相当于对两个模型的差异做降维后再存储。这种情况下,相对于5G的底模,LoRA 模型可能只有10-20M。

2.2 LoRA 优势

之前的优化 fine-tune 的方法主要有:只精调部分参数,训练额外层,调节激活函数等,这些方法精调效果往往不是很好,有的还会引起推理延迟。LoRA优势如下:

  • 对于一个大模型,可针对不同下游任务训练多个LoRA小模型,方便存储和切换。
  • 训练效率更高,硬件需求更低,只需要优化注入的小得多的低秩矩阵。
  • 与完全微调的模型相比,不会引入推理延迟。
  • LoRA 与许多现有方法正交,可与其中许多方法相结合。

(既不复杂,使用时也没有太多限制条件)

3 背景知识

3.1 矩阵的秩 Rank

矩阵的秩是指矩阵中线性独立的行向量或列向量的最大数量,即矩阵中的最大线性无关行(或列)的数量。对于一个 m 行 n 列的矩阵,它的秩记为r,r 的取值范围是 0 到 min(m, n)。当 r = 0 时,表示该矩阵是一个零矩阵,所有元素都为零。

3.2 全秩 Full-Rank

当 r = min(m, n) 时,表示矩阵的所有行(或列)都是线性无关的,即全秩(满秩,full-rank)矩阵。

3.3 低秩 Low-Rank

低秩表示(Low-Rank Representation,简称LRR)的基本思想是将高维数据表示为低维子空间中的低秩表示。假设数据中的信息可以由较少的关键特征表示。通过将数据表示为低秩矩阵,LRR可以实现降维和去噪的效果,从而提取出数据中的重要特征。

4 方法

4.1 低秩参数矩阵

之前论文《Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning》证明,预训练的语言模型具有较低的“内在维度”(实际不需要那么大维度),即使随机投影到较小的子空间,仍可有效学习。我们假设权重的更新 fine-tune 也具有较低的“内在维度”。

将预训练的权重矩阵定义为W0,其维度为 d×k,通过用低秩分解 W0 + ΔW = W0 + BA 用后者来约束其更新,其中 B 为 d×r 维,A 为 r×k 维,并且秩 r << min(d, k)。训练期间,W0 被冻结,不更新,而 A 和 B 包含可训练参数。W0 和 ΔW = BA 都与相同的输入相乘,并且它们各自的输出向量按维度求和。

h = W 0 x + ∆ W x = W 0 x + B A x h = W_0x + ∆W x = W_0x + BAx h=W0x+Wx=W0x+BAx

对 A 使用随机高斯初始化,对 B 使用零初始化,因此 ΔW = BA 在训练开始时为零。然后按 α/r 缩放 ΔW x ,其中 α 是 r 中的常数,调整 α 与调整学习率大致相同。

这里的 r 需要设置,如果 r 与 d 维度相同,即降维时,理论上其效果和 fine-tune 一致,而具体 r 如何设置详见对比实验部分。

4.2 将 LORA 应用于 Transformer 框架

从原理来看,LoRA 可用于任何神经网络中。在 Transformer 架构中,自注意力模块中有四个权重矩阵(Wq、Wk、Wv、Wo),MLP 模块中有两个。研究限制为仅调整下游任务的注意力权重,并冻结 MLP 模块。后面的对比实验针对这四个矩阵做了 LoRA 测试。

这样做最显著的好处是减少内存和存储量。对于使用 Adam 训练的大型 Transformer,如果使用 r << d 的模型,可以将 VRAM 使用量减少多达 2/3。在 GPT-3 175B 上,可将训练期间的 VRAM 消耗从 1.2TB 减少到 350GB。当 r = 4 并且仅调整查询和值投影矩阵时,检查点大小减少了大约 10,000倍(从 350GB 到 35MB)。

RoLA 还允许支持定制多个模型,这些模型可在预训练权重存储在 VRAM 中的机器上动态地换入换出。与完全微调相比,由于不需要计算绝大多数参数的梯度,GPT-3 175B 训练期间的速度提高了 25%。

5 实验

实验部分分别对 RoBERTa,GPT-2,GPT-3 做了针对下游任务的对比实验,从实验部分可以看到,LoRA模型参数非常少,且效果往往不低于fine-tune,有时效果更好。

6 对比实验

6.1 在 Transformer 中的哪些权重矩阵上应用 LORA

文中实验限定了参数整体大小,针对不同的 LoRA 设置,对比模型性能。这里只考虑了自注意力中的权重矩阵,如果使用 1 种类型的注意力权重,则 r = 8;如果使用 2 种类型,则对应于 r = 4,结果如表 5 所示:

实验证明 Wq,Wv 组合可提供最佳性能,4 阶也能捕获足够的 ΔW 信息,因此适应更多的权重矩阵比适应具有更大阶数的单一类型权重效果更好。

6.2 最佳 rank 的大小是多少

实验对比了不同秩大小的模型效果,可以看到,r=1 时 Wq,Wv 就可以满足一定效果,而单独调节 Wq 需要更大的 r。这说明 ΔW 只需要很低的秩(另外两个实验也验证了数据的低秩性质)。

6.3 ΔW 与 W 对比

观察 ∆W 与 W 的相关性,具体方法是将 W 映射到 ∆W 的 r 维子空间中,然后用 Frobenius 范数,对比其一致性。

实验得出结论:与随机矩阵相比,ΔW 与 W 具有更强的相关性;ΔW 不重复 W 的顶部奇异方向,而是仅放大 W 中未强调的方向;放大系数相当大:r = 4 时为 21.5 ≈ 6.91/0.32。这表明低秩适应矩阵可能会放大特定下游任务的重要特征,这些特征是在一般预训练模型中学习但未强调的

7 实用技巧

7.1 LoRA 与 基础模型

根据 LoRA 原理可知,LoRA保存的是精调与基础模型(底模)差异的降维数据,所以 LoRA 与训练它的底模强相关,一般 LoRA 描述中也有对其底模的说明,一般情况下,至少二者的 2D/现实风格需要一致。
当然也有像 “Detail Tweaker LoRA” 这样不挑底模的 LoRA。

7.2 LoRA 权重

在引用 LoRA 时,可在 Prompt 中指定 LoRA 权重,一般默认为 1,虽然 SD 是基于 LDM 技术,理论上,其特征是连续的,可微调的,但是将 LoRA 设得太大,结果往往也是反常识的。

7.3 多个 LoRA 叠加

操作时可以叠加使用多个 LoRA。实际使用时,尽量叠加不同类型的 LoRA,比如一个增加画面细节,另一个修改背景风格,它们调整的往往不是一组权重,问题不大;但是不建议叠加同一类型的 LoRA,在同一组权重上反复计算,效果往往不可控。

相关文章:

论文阅读_模型结构_LoRA

name_en: LoRA: Low-Rank Adaptation of Large Language Models name_ch: LORA&#xff1a;大语言模型的低阶自适应 paper_addr: http://arxiv.org/abs/2106.09685 date_read: 2023-08-17 date_publish: 2021-10-16 tags: [‘深度学习’,‘大模型’] author: Edward J. Hu cita…...

uniapp获取 pdf文件流 并展示

1、流数据 uni.request({ url: this.$config.apiUrl“/api/report/content/fill?codebv.mf.refund.pay.voucher&busiNo00201323051500148949”, header: { ‘content-type’: ‘application/json;charsetutf-8’, ‘X-App-Code’: ‘weixin’, ‘X-Source’: ‘program’,…...

Linux(进程间通信)

目录 一、通信概念 二、进程间通信机制 1、管道 1.1 匿名管道&#xff08;Anonymous Pipe&#xff09; 1.2 命名管道&#xff08;Named Pipe&#xff09; 2、信号量 2.1 概念 2.2 API详解 2.3 使用示例 3、消息队列 3.1 概念 3.2 API函数 3.3 应用代码 4、共享内…...

Go的Gorm数据库操作错误WHERE conditions required

这是我在写这个代码处出现的问题 result : db.Save(&emergency) 这个错误是由于在提交保存数据时&#xff0c;GORM 需要指定 WHERE 条件&#xff0c;确保能够正确执行数据库操作。要解决这个问题&#xff0c;可以尝试使用 Create 方法替换 Save 方法&#xff0c;同时将创…...

基于java swing和mysql实现的仓库商品管理系统(源码+数据库+运行指导视频)

一、项目简介 本项目是一套基于java swing和mysql实现的仓库商品管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经…...

6、css学习6(表格)

1、指定CSS表格边框&#xff0c;使用border属性。 2、表格双边框是因为th/td有各自独立的边框。 3、boder-collapse设置表格边框是否被折叠成一个单一的边框。 4、width和height属性定义表格的宽度和高度。 5、text-align属性设置水平对齐方式。 6、vertic-align属性设置垂…...

Ceph源码解析:PG peering

集群中的设备异常(异常OSD的添加删除操作)&#xff0c;会导致PG的各个副本间出现数据的不一致现象&#xff0c;这时就需要进行数据的恢复&#xff0c;让所有的副本都达到一致的状态。 一、OSD的故障和处理办法&#xff1a; 1. OSD的故障种类&#xff1a; 故障A&#xff1a;一…...

解决jupyter notebook可以使用pytorch而Pycharm不能使用pytorch的问题

之前我是用的这个目录下的Python 开始更新目录 1、 2、 3、...

对建造者模式理解

当对象成员变量太多时&#xff0c;使用建造方法给变量赋值往往变得很臃肿&#xff0c;所以可以这样做 public class Something {private String a;private String b;private String c;private String d;private String e;public Something(Builder builder) {this.a builder.…...

回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CSO-ELM布谷鸟算法优化极限学习机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一览基本介…...

静态链接库和动态链接库的区别

C静态链接库&#xff08;Static Linking&#xff09;和动态链接库&#xff08;Dynamic Linking&#xff09;的主要区别在于代码的组织和加载方式。 静态链接库 在编译时将库的代码和应用程序的代码合并在一起&#xff0c;生成一个单独的可执行文件。执行文件独立包含所需的库…...

使用 python 源码搭建 conda 环境

今天需要使用 python 2.6.8 的环境&#xff0c;发现 conda 设置成清华源后&#xff0c;没有旧版本了。所以打算从官网上下载一份 python 进行安装&#xff0c; 结果发现&#xff0c;conda 不能直接安装离线包&#xff08;也可能我没找到方法&#xff09;&#xff0c;经过一番尝…...

dart 学习之 异步操作

import package:dio/dio.dart;// 定义一个异步函数&#xff0c;用于获取 URL 的内容 Future<String> getUrl(String url) async {Dio dio Dio();Response response await dio.get(url);return response.data; }void main() async {// 在主函数中执行异步操作var conten…...

《Flink学习笔记》——第二章 Flink的安装和启动、以及应用开发和提交

​ 介绍Flink的安装、启动以及如何进行Flink程序的开发&#xff0c;如何运行部署Flink程序等 2.1 Flink的安装和启动 本地安装指的是单机模式 0、前期准备 java8或者java11&#xff08;官方推荐11&#xff09;下载Flink安装包 https://flink.apache.org/zh/downloads/hadoop&a…...

网易新财报:游戏稳、有道进、云音乐正爬坡

今年以来&#xff0c;AI大模型的火热程度屡屡攀升&#xff0c;越来越多的企业都加入到了AI大模型的赛场中&#xff0c;纷纷下场布局。而在众多参与者中&#xff0c;互联网企业的身影更是频频浮现&#xff0c;比如&#xff0c;百度、阿里巴巴、腾讯等等。值得一提的是&#xff0…...

Docsify的评论系统gitalk配置过程

&#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是Zeeland&#xff0c;开源建设者与全栈领域优质创作者。&#x1f4dd; CSDN主页&#xff1a;Zeeland&#x1f525;&#x1f4e3; 我的博客&#xff1a;Zeeland&#x1f4da; Github主页: Undertone0809 (Zeeland)&…...

HarmonyOS/OpenHarmony(Stage模型)卡片开发应用上下文Context使用场景二

3.创建其他应用或其他Module的Context 基类Context提供创建其他应用或其他Module的Context的方法为createModuleContext(moduleName:string)&#xff0c;创建其他应用或者其他Module的Context&#xff0c;从而通过该Context获取相应的资源信息&#xff08;例如获取其他Module的…...

数字货币量化交易平台

数字货币量化交易平台是近年来金融科技领域迅速崛起的一种创新型交易方式。它通过应用数学模型和算法策略&#xff0c;实现对数字货币市场的自动交易和风险控制。然而&#xff0c;要在这个竞争激烈的领域中脱颖而出&#xff0c;一个数字货币量化交易平台需要具备足够的专业性&a…...

2022 ICPC 济南 E Identical Parity (扩欧)

2022 ICPC 济南 E. Identical Parity (扩欧) Problem - E - Codeforces 大意&#xff1a;给出一个 n 和一个 k &#xff0c; 问是否能构造一个长 n 的排列使得所有长 k 的连续子序列和的奇偶性相同。 思路&#xff1a;通过分析可知 &#xff0c; 任两个间隔 k - 1 的元素奇偶…...

【BUG事务内消息发送】事务内消息发送,事务还未结束,消息发送已被消费,查无数据怎么解决?

问题描述 在一个事务内完成插入操作&#xff0c;通过MQ异步通知其他微服务进行事件处理。 由于是在事务内发送&#xff0c;其他服务消费消息&#xff0c;查询数据时还不存在如何解决呢&#xff1f; 解决方案 通过spring-tx包的TransactionSynchronizationManager事务管理器解…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

uniapp 开发ios, xcode 提交app store connect 和 testflight内测

uniapp 中配置 配置manifest 文档&#xff1a;manifest.json 应用配置 | uni-app官网 hbuilderx中本地打包 下载IOS最新SDK 开发环境 | uni小程序SDK hbulderx 版本号&#xff1a;4.66 对应的sdk版本 4.66 两者必须一致 本地打包的资源导入到SDK 导入资源 | uni小程序SDK …...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

在 Spring Boot 项目里,MYSQL中json类型字段使用

前言&#xff1a; 因为程序特殊需求导致&#xff0c;需要mysql数据库存储json类型数据&#xff0c;因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...