论文阅读_模型结构_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,在同一组权重上反复计算,效果往往不可控。

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

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

相关文章

每天一道leetcode:542. 01 矩阵(图论中等广度优先遍历)

今日份题目&#xff1a; 给定一个由 0 和 1 组成的矩阵 mat &#xff0c;请输出一个大小相同的矩阵&#xff0c;其中每一个格子是 mat 中对应位置元素到最近的 0 的距离。 两个相邻元素间的距离为 1 。 示例1 输入&#xff1a;mat [[0,0,0],[0,1,0],[0,0,0]] 输出&#xff…

MATLAB图论合集(二)计算最小生成树

今天来介绍第二部分&#xff0c;图论中非常重要的知识点——最小生成树。作为数据结构的理论知识&#xff0c;Prim算法和克鲁斯卡尔算法的思想此处博主不详细介绍&#xff0c;建议在阅读本帖前熟练掌握。 对于无向带权图&#xff0c;在MATLAB中可以直接以邻接矩阵的方式创建出来…

直播小程序源码有用的协议知识:MQTT协议

MQTT协议分析&#xff1a; MQTT协议中文全称为消息队列遥测传输协议&#xff0c;是一种实时通信协议&#xff0c;适用于物联网场景中。MQTT协议被应用到直播小程序源码平台中&#xff0c;确保了直播小程序源码平台音视频流的传输高效、低延迟&#xff0c;为直播小程序源码平台…

打家劫舍00

题目链接 打家劫舍 题目描述 注意点 如果两间相邻的房屋在同一晚上被小偷闯入&#xff0c;系统会自动报警0 < nums[i] < 400 解答思路 最初想的是使用深度优先遍历&#xff0c;到达任意一个位置时&#xff0c;小偷想要偷窃最高金额&#xff0c;一定要选择后面第2个房…

【java】【idea2023版】Springboot模块没有.iml文件的问题

目录 方法一&#xff1a; 1、首先鼠标选中对应的对应的模块 &#xff0c;按两下Ctrl键 2、project中选择对应的模块 3、运行mvn idea:module 命令​编辑 方法二&#xff1a; 1、可以右键点击open Terminal 2、然后在打开的Terminal里输入 方法一&#xff1a; 1、首先鼠…

【负载均衡】Nacos简单入门

Nacos简单入门 快速安装 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; 下载完压缩包之后&#xff0c;放在任意目录下面进行解压&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos G…

人体行走电压测试仪的特点

人体行走电压测试仪是一种用于测量人体行走时身体所受到的电压的设备。当人体行走时&#xff0c;我们身体与地面之间会形成电位差&#xff0c;这个电位差通常是很小的&#xff0c;但可能会对人体产生影响。通过使用行走电压测试仪&#xff0c;可以精确地测量这种电位差的大小。…

如何进行微服务的集成测试

集成测试的概念 说到集成测试&#xff0c;相信每个测试工程师并不陌生&#xff0c;它不是一个崭新的概念&#xff0c;通过维基百科定义可以知道它在传统软件测试中的含义。 Integration testing (sometimes called integration and testing, abbreviated I&T) is the pha…

Kafka生产者原理 kafka生产者发送流程 kafka消息发送到集群步骤 kafka如何发送消息 kafka详解

kafka尚硅谷视频&#xff1a; 10_尚硅谷_Kafka_生产者_原理_哔哩哔哩_bilibili ​ 1. producer初始化&#xff1a;加载默认配置&#xff0c;以及配置的参数&#xff0c;开启网络线程 2. 拦截器拦截 3. 序列化器进行消息key, value序列化 4. 进行分区 5. kafka broker集群 获取…

PHP小白搭建Kafka环境以及初步使用rdkafka

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、安装java&#xff08;Kafka必须安装java&#xff0c;因为kafka依赖java核心&#xff09;二、安装以及配置Kafka、zookeeper1.下载Kafka&#xff08;无需下载…

优维产品最佳实践第5期:什么是持续集成?

谈到到DevOps&#xff0c;持续交付流水线是绕不开的一个话题&#xff0c;相对于其他实践&#xff0c;通过流水线来实现快速高质量的交付价值是相对能快速见效的&#xff0c;特别对于开发测试人员&#xff0c;能够获得实实在在的收益。 本期EasyOps产品使用最佳实践&#xff0c…

Java的锁大全

Java的锁 各种锁的类型 乐观锁 VS 悲观锁 乐观锁与悲观锁是一种广义上的概念&#xff0c;体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。 先说概念。对于同一个数据的并发操作&#xff0c;悲观锁认为自己在使用数据的时候一定有别的线程来修改数…

陪诊系统源码开发:实现个性化医疗陪护的创新之路

陪诊系统的源码开发在现代医疗中具有重要意义。本文将通过代码示例介绍陪诊系统的源码开发&#xff0c;展示如何实现个性化医疗陪护的创新方案。 1. 安装和环境设置&#xff1a; 首先&#xff0c;确保你的开发环境中已经安装了合适的编程语言和框架&#xff0c;比如Python和…

c++ qt--页面布局(第五部分)

c qt–页面布局&#xff08;第五部分&#xff09; 一.页面布局 在设计页面的左侧一栏的组件中我们可以看到进行页面布局的一些组件 布局组件的使用 1.水平布局 使用&#xff1a;将别的组件拖到水平布局的组件中即可&#xff0c;可以选择是在哪个位置 2.垂直布局 使用&…

玩转 PI 系列-看起来像服务器的 ARM 开发板矩阵-Firefly Cluster Server

前言 基于我个人的工作内容和兴趣&#xff0c;想要在家里搞一套服务器集群&#xff0c;用于容器/K8s 等方案的测试验证。 考虑过使用二手服务器&#xff0c;比如 Dell R730, 还搞了一套配置清单&#xff0c;如下&#xff1a; Dell R7303.5 尺寸规格硬盘CPU: 2686v4*2 内存&a…

初阶c语言:趣味扫雷游戏

目录 前言 制作菜单 构建游戏选择框架 实现游戏功能 模块化编程&#xff1a;查看前节三子棋的内容 初始化雷区 ​编辑 优化棋盘 随机埋入地雷 点击后的决策 实现此功能代码 game&#xff08;&#xff09;&#xff1b;的安排 前言 《扫雷》是一款大众类的益智小游戏&…

从0到1学会Git(第一部分):Git的下载和初始化配置

1.Git是什么: 首先我们看一下百度百科的介绍:Git&#xff08;读音为/gɪt/&#xff09;是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 也是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 …

配置Linux内核支持make menuconfig

新环境从0配置Linux内核支持make menuconfig hudahuahudahua-virtual-machine:~/workspace/tools/linux-5.15.13$ make menuconfigCommand ‘make’ not found, but can be installed with sudo apt install make # version 4.2.1-1.2, or sudo apt install make-guile # vers…

系统上线安全测评需要做哪些内容?

电力信息系统、航空航天、交通运输、银行金融、地图绘画、政府官网等系统再正式上线前需要做安全测试。避免造成数据泄露从而引起的各种严重问题。 那么系统上线前需要做哪些测试内容呢&#xff1f;下面由我给大家介绍 1、安全机制检测-应用安全 身份鉴别 登录控制模块 应提供…