简单理解大模型参数高效微调中的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…

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

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

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

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

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

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

类加载机制与类加载器

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

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

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

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

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

idea导入maven项目问题

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

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

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

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

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

【UE5 多人联机教程】03-创建游戏

效果 步骤 打开“UMG_MainMenu”,增加创建房间按钮的点击事件 添加如下节点 其中,“FUNL Fast Create Widget”是插件自带的函数节点,内容如下: “创建会话”节点指游戏成功创建一个会话后,游戏的其他实例即可发现&am…

微服务体系<1>

我们的微服务架构 我们的微服务架构和单体架构的区别 什么是微服务架构 微服务就是吧我们传统的单体服务分成 订单模块 库存模块 账户模块单体模块 是本地调用 从订单模块 调用到库存模块 再到账户模块 这三个模块都是调用的同一个数据库 这就是我们的单体架构微服务 就是…

Training-Time-Friendly Network for Real-Time Object Detection 论文学习

1. 解决了什么问题? 目前的目标检测器很少能做到快速训练、快速推理,并同时保持准确率。直觉上,推理越快的检测器应该训练也很快,但大多数的实时检测器反而需要更长的训练时间。准确率高的检测器大致可分为两类:推理时…

银河麒麟安装mysql数据库(mariadb)-银河麒麟安装JDK-银河麒麟安装nginx(附安装包)

银河麒麟离线全套安装教程(手把手教程) 1.银河麒麟服务器系统安装mysql数据库(mariadb) 2.银河麒麟桌面系统安装mysql数据库(mariadb) 3.银河麒麟服务器系统安装JDK 4.银河麒麟桌面系统安装JDK 5.银河麒麟…

青大数据结构【2021】

一、单选(17!) 根据中序遍历得到降序序列可以知道,每个结点的左子树的结点的值比该结点的值小,因为没有重复的关键字,所以拥有最大值的结点没有左子树。 二、简答 三、分析计算 四、算法分析 3.迪杰斯特拉…

windows安装Elasticsearch8.9.0

官网解压安装好路径(非中文,无空格) 可参考 言之有李LAX csdn http://t.csdn.cn/S2oju本人使用jdk17 修改配置elasticsearch.yml xpack.security.enabled: false xpack.security.http.ssl:enabled: false直接点击bin\elasticsearch.bat…

Unity 工具之 NuGetForUnity 包管理器,方便在 Unity 中的进行包管理的简单使用

Unity 工具之 NuGetForUnity 包管理器,方便在 Unity 中的进行包管理的简单使用 目录 Unity 工具之 NuGetForUnity 包管理器,方便在 Unity 中的进行包管理的简单使用 一、简单介绍 二、NuGetForUnity 的下载导入 Unity 三、NuGetForUnity 在 Unity 的…

LeetCode 75 第十二题(11)盛最多水的容器

目录 题目: 示例: 分析: 代码: 题目: 示例: 分析: 配合着示例给出的图片我们可以得知找出盛水最多的容器是什么意思,给一个数组,找出数组中两个元素能围成的最大的矩阵面积是多少. 比较直观的想法是套两层for循环暴力解出来,但是这题是中等难度题,一般中等题是没法用暴力得…

pinia在vue3中的使用

总结: 在store文件夹中建一个pinia的文件userStore.js 1.要想使用pinia必须先引入defineStore 这里我们使用es6的模块化语法导出的 import { defineStore } from pinia 2.然后使用export const useUserStore defineStore(user,{}) defineStore 方法有两个参数&…