简单理解大模型参数高效微调中的LoRA(Low-Rank Adaptation)

[论文地址] [代码] [ICLR 22]

阅前须知:本博文可能有描述不准确/过度简化/出错的地方,仅供参考。


网络结构

在这里插入图片描述
其中,原有模型的参数是直接冻结的,可训练参数只有额外引入的LoRA参数(由nn.Parameter实现)。


模型微调的本质

记网络原有预训练参数为 W 0 ∈ R d × k W_0 \in R^{d \times k} W0Rd×k。在新的下游任务微调后,参数变为 W ∈ R d × k W \in R^{d \times k} WRd×k。可以发现,参数的变化量 Δ W = W − W 0 \Delta W = W - W_0 ΔW=WW0。换而言之,有: W = W 0 + Δ W W=W_0+\Delta W W=W0+ΔW 也就是说,对模型微调,其实可以将原有参数 W 0 W_0 W0直接给冻结了,只学这个变化量 Δ W = W − W 0 \Delta W = W - W_0 ΔW=WW0即可。


为什么要进行低秩分解

LoRA文中指出,现有的预训练模型通常是过参数化的(the learned over-parametrized models in fact reside on a low intrinsic dimension),在对这些模型进行微调时,参数的更新主要在低维子空间中。换而言之,很多高维子空间的参数在微调前后根本就没动。基于这一点,微调所学的 Δ W \Delta W ΔW其实也就不需要那么高的维度(秩),我们可以将其降低到一个更低的维度进行优化。当然从这里也可以注意到,如果参数的更新也会大量发生在高维子空间中,此时进行低秩分解会遗漏信息,导致LoRA失效。


如何理解低维子空间/高维子空间特征

这里笔者给出一个可能不正确的类比。比如在计算机视觉中,无论是做分割,检测,医学等各种不同下游任务,都可以基于ImageNet上的预训练模型(如ResNet)进行微调。预训练模型中的纹理,边缘,轮廓等特征,一般是无论做哪种任务都需要的,那么这种任务无关特征就类似于上面所提到的高维子空间特征,在下游任务微调时基本上不发生变化。反之,对于一些下游任务中自有的先验特征(比如特有的光照条件,目标位置分布),则可以被视为上面所提到的低维子空间特征。模型想要刷点到SOTA则必须对这些任务相关特征进行有效的利用。


以数学形式描述低秩分解

LoRA将参数变化量矩阵 Δ W \Delta W ΔW分解成了两个更低秩的矩阵相乘,有: Δ W = B A \Delta W=BA ΔW=BA其中 B ∈ R d × r B \in R^{d \times r} BRd×r A ∈ R r × k A \in R^{r \times k} ARr×k


为什么矩阵B被初始化为0,而矩阵A正常高斯初始化

这里讨论另外两种设置的缺点:

  • 如果B,A全都初始化为0,那么缺点与深度网络全0初始化一样,很容易导致梯度消失(因为此时初始所有神经元的功能都是等价的)。
  • 如果B,A全部高斯初始化,那么在网络训练刚开始就会有概率为得到一个过大的偏移值 Δ W \Delta W ΔW从而引入太多噪声,导致难以收敛。

因此,一部分初始为0,一部分正常初始化是为了在训练开始时维持网络的原有输出(初始偏移为0),但同时也保证在真正开始学习后能够更好的收敛。


低秩分解到底有多低

哪怕降到8也是高度可用的,甚至能降到1:
在这里插入图片描述
注意这里r=64时性能甚至降低了。按照先前的结论来解释,这是因为参数的更新大多在低秩空间内;使用高秩矩阵允许对高维空间进行更新,反而可能会导致额外的非必要参数变化(引入了噪声)。


LoRA最终被插入在网络的哪些地方

只加在了Self Attention层的Q,K,V,O矩阵上,其余部分诸如MLP等位置则没有添加。当然,后续也有一些实验[1]表明,在其他任务中只添加在Q和K上会更好,如下图所示。因此这也可以算实际应用LoRA中一个可调节的点了。
在这里插入图片描述
在这里插入图片描述


LoRA与Adapter的区别

其实从结构上讲,更早出现的Adapter也是引入了少量可训练参数,并且也具有先降维再升维的"BottleNeck"型结构,如下所示:
在这里插入图片描述
主要的区别个人认为有如下几点:

  • 插入位置。LoRA是以残差连接的形式"并联"在Transformer的Q,K,V,O矩阵上,而Adapter是插入在Feed-forward Layer后面。
  • 推理延迟。LoRA在训练完后其参数可以与原有预训练模型直接合并,变回单分支结构,不会引入额外的延迟;而Adapter由于引入了额外的串联网络层,因此会带来额外的延迟。
  • 参数存储。使用LoRA进行微调,在训练完毕后只需要保存LoRA本身的参数;而使用Adapter则要保存整个原有模型的参数。

参考文献

[1] Customized Segment Anything Model for Medical Image Segmentation

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

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

相关文章

LabVIEW实现三相异步电机磁通模型

LabVIEW实现三相异步电机磁通模型 三相异步电动机由于经济和出色的机电坚固性而广泛用于工业化应用。这台机器的设计和驱动非常简单,但在控制扭矩和速度方面,它隐藏了相当大的功能复杂性。通过数学建模,可以理解机器动力学。 基于微分方程的…

【嵌入式学习笔记】嵌入式基础9——STM32启动过程

1.MAP文件浅析 1.1.MDK编译后生成的中间过程文件 1.2.Map文件构成: 程序段交叉引用关系(Section Cross References):描述各文件之间函数调用关系删除映像未使用的程序段(Removing Unused input sections from the im…

Netty学习(二)

文章目录 二. Netty 入门1. 概述1.1 Netty 是什么?1.2 Netty 的作者1.3 Netty 的地位1.4 Netty 的优势 2. Hello World2.1 目标加入依赖 2.2 服务器端2.3 客户端2.4 流程梳理课堂示例服务端客户端 分析提示(重要) 3. 组件3.1 EventLoop事件循…

【图像处理】使用 OpenCV 将您的照片变成卡通

图像到卡通 一、说明 在当今世界,我们被图像和视频所包围。从社交媒体到广告,图像已成为一种强大的交流媒介。但是你有没有想过,如果你能把你的照片变成卡通会发生什么?想象一下,为您最喜欢的照片创建动画版本&#xf…

express 路由匹配和数据获取

express配置路由只需要通过app.method(url,func)来配置,其中url配置和其中的参数获取方法不同 直接写全路径 路由中允许存在. get请求传入的参数 router.get("/home", (req, res) > {res.status(200).send(req.query); });通过/home?a1会收到对象…

Spark的DataFrame和Schema详解和实战案例Demo

1、概念介绍 Spark是一个分布式计算框架,用于处理大规模数据处理任务。在Spark中,DataFrame是一种分布式的数据集合,类似于关系型数据库中的表格。DataFrame提供了一种更高级别的抽象,允许用户以声明式的方式处理数据&#xff0c…

MyBatis-Plus

1.入门案例 1.1 pom依赖引用 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version> </dependency><dependency><groupId>mysql</grou…

Pytorch深度学习-----神经网络的基本骨架-nn.Module的使用

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

python爬虫基础入门——利用requests和BeautifulSoup

(本文是自己学习爬虫的一点笔记和感悟) 经过python的初步学习,对字符串、列表、字典、元祖、条件语句、循环语句……等概念应该已经有了整体印象,终于可以着手做一些小练习来巩固知识点,写爬虫练习再适合不过。 1. 网页基础 爬虫的本质就是从网页中获取所需的信息,对网…

ClickHouse使用场景和案列分析

目录 一、ClickHouse 概述1. ClickHouse简介2. ClickHouse 发展历程3. ClickHouse 特点 二、ClickHouse 架构1. 数据存储层&#xff1a;2. SQL 解析层&#xff1a;3. 查询执行层&#xff1a;4. 数据压缩层&#xff1a; 三、ClickHouse 性能优化1. 查询优化&#xff1a;2. 数据压…

QT:qInstallMessageHandler打印日志重定向

目录 1、qInstallMessageHandler含义 2、实例&#xff1a; 3、调试级别Q包含用于警告和调试文本的全局宏&#xff1a; 4、打印日志&#xff0c;如何使用 1、qInstallMessageHandler含义 &#xff08;1&#xff09;此函数在使用Qt消息处理程序之前已定义。返回一个指向前一…

Python代理模式介绍、使用

一、Python代理模式介绍 Python代理模式&#xff08;Proxy Pattern&#xff09;是一种结构型设计模式。在代理模式中&#xff0c;代理对象充当了另一个对象的占位符&#xff0c;以控制对该对象的访问。 代理对象和被代理对象实现了相同的接口&#xff0c;因此它们可以互相替代…

类加载机制与类加载器

点击下方关注我&#xff0c;然后右上角点击...“设为星标”&#xff0c;就能第一时间收到更新推送啦~~~ Java 源码是如何形成类文件的&#xff0c;类文件又是如何加载到虚拟机的&#xff0c;类加载有哪些机制和原则呢&#xff1f;本文将为大家一一介绍。 1 Java 源码形成类文件…

基于拉格朗日-遗传算法的最优分布式能源DG选址与定容(Matlab代码实现)

目录 1 概述 2 数学模型 2.1 问题表述 2.2 DG的最佳位置和容量&#xff08;解析法&#xff09; 2.3 使用 GA 进行最佳功率因数确定和 DG 分配 3 仿真结果与讨论 3.1 33 节点测试配电系统的仿真 3.2 69 节点测试配电系统仿真 4 结论 1 概述 为了使系统网损达到最低值&a…

AI Chat 设计模式:10. 组合模式

本文是该系列的第八篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的一些思考和补充。 问题列表 Q.1 给我介绍一下组合模式A.1Q.2 好的&#xff0c;给我举一个组合模式的例子&#xff0c;使…

idea导入maven项目问题

问题产生原因&#xff1a; ①idea加载maven项目&#xff0c;如果网络不通畅&#xff0c;会在maven仓库中产生一个文件&#xff0c;如下图所示: ②当网络通畅时&#xff0c;在下载就会因为此文件导致无法下载正确的maven依赖 解决方案&#xff1a; ①打开maven仓库的根目录 ②…

SpringDataJpa 实体类—主键生成策略

主键配置 IdGeneratedValue(strategy GenerationType.IDENTITY)Column(name "cust_id")private Long custId;//主键 Id&#xff1a;表示这个注解表示此属性对应数据表中的主键GeneratedValue(strategy GenerationType.IDENTITY) 此注解表示配置主键的生成策…

Ubuntu 安装 Wireshark

Ubuntu 安装 Wireshark_ubuntu wireshark_iBlackAngel的博客-CSDN博客

ts中声明引入未使用的报错——解决方案

在编写ts项目的时候&#xff0c;经常会出现如下报错&#xff1a; 导入声明中的所有导入都未使用 这是因为导入的模块暂时没有使用&#xff0c;ts给的一个提示信息 解决方案&#xff1a; 在ts.config.json中 把noUnusedLocals 设置为false即可 {"compilerOptions"…

【雕爷学编程】Arduino动手做(175)---机智云ESP8266开发板模块4

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…