如何微调出自己的大模型——LoRA原理解析

1、前言

上一篇文章,我们已经讲了隐扩散模型——Stable Diffusion生成大模型。这种大模型,参数量及其之大。你没有足够的算力资源,就只能够使用人家已经训练好的大模型。既然没有办法训练属于自己的模型,那我们就想,是否可以在别人已经训练好的大模型的基础上,用我们自己的训练数据,对模型进行微调,从而得到我们想要的模型。

参考论文:

①LoRA: Low-Rank Adaptation of Large Language Models (arxiv.org)

②Online Embedding Compression for Text Classification using Low Rank Matrix Factorization (arxiv.org)

代码:github.com

视频:[如何微调出属于自己大模型?——LORA原理解析-哔哩哔哩]

2、引入

如果你使用过Stable Diffusion,应该看到过LoRA这个词。他其实就是一种微调方法。

在这个微调方法之前,其实已经存在一些微调方法,比如

①Fine-Tuning,FT: 在微调过程中,模型初始化为预训练的权重和偏置项,所有的模型参数都会进行梯度更新。一个简单的变体是只更新一些层而冻结其他层。

②Bias-only or BitFit: 只训练偏置向量,而冻结其他所有部分。

③Adapter tuning: 在自注意力模块和后面的残差连接之间插入一个适配器层。该适配器层有两个全连接层,中间有非线性的偏置。后面还存在一些新的变体。

另外论文还提到了Prefix-embedding tuningPrefix-layer tuning。这两种我之前没见过,感兴趣的可以去看一下。

上述方法都或多或少的存在一些问题。如果模型的非常大。那么上述这些微调方法的计算成本将非常大。所以论文就提出了一种新的微调方法LoRA

Ps:这篇论文一开始提出来是应用在自然语言处理的。比如GPT,BERT这些模型。

3、LoRA

论文作者受到这篇论文Intrinsic Dimensionality Explains the Effectiveness of Language Model Fine-Tuning (arxiv.org)的启发。该论文表明,预训练的语言模型在去适应某些特定的任务时(下游任务),是具有较低的内在维度的。也就是说,即使我们把它投射到较小的子空间,仍然能够高效的学习。

基于这个思想,论文假设权重微调变化的过程中也具有较低的秩(权重更新矩阵 Δ W \Delta W ΔW是低秩矩阵),从而提出Low-Rank Adaptation(LoRA)

什么叫做具有低的秩?我们从方程的角度出发
2 x + y = 1 x + y = 0 2x+y=1\\x+y=0 2x+y=1x+y=0
两个方程,两个未知量。我们可以求出对应的值 x = 1 , y = − 1 x=1,y=-1 x=1,y=1

那假如我们的方程长这样呢
2 x + y = 1 4 x + 2 y = 2 2x+y=1\\4x+2y=2 2x+y=14x+2y=2
我们绝对求不出,因为这两个方程是线性相关的。我们仔细看,第一个方程乘以2,就得到了第二个方程。因此,我们不难发现,这种存在相关性的方程之间,是无法求解的。也就是说,第二个方程实际上是无用的,因为它可以由第一个方程进行线性变化得到。

现在,我们假设有一份方程组
{ x + 0 × y = 0 2 x + 0 × y = 0 \begin{cases}x+0\times y=0\\2x+0\times y=0\end{cases} {x+0×y=02x+0×y=0
我们把系数写成矩阵的形式
( 1 0 2 0 ) \begin{pmatrix}1 & 0 \\2 & 0\end{pmatrix} (1200)
像这种方式,由于第一行和第二行线性相关,所以这个矩阵的秩就等于1。而矩阵的维度是2x2。当矩阵的秩(记为r)远远小于行,列的维度,我们称该矩阵为低秩矩阵(当燃了,我这里举的例子,也没有远远小于…大家知道概念就行)。

我们做个微调假设更新,对一个参数层,有
W ′ = W 0 + W F T W'=W_0+W^{FT} W=W0+WFT
W F T W^{FT} WFT是一个微调矩阵, W ′ W' W表示微调后的参数, W 0 W_0 W0表示原始参数,假设 W 0 ∈ R d × k W_0\in R^{d\times k} W0Rd×k,那么 W F T W^{FT} WFT也是一样的维度。对 W F T W^{FT} WFT进行奇异值分解
W F T = U d × d Σ d × k V k × k T W^{FT}=U_{d\times d}\Sigma_{d\times k}V_{k\times k}^T WFT=Ud×dΣd×kVk×kT
W F T W^{FT} WFT的秩远远小于d和k,则我们可以获取 W F T W^{FT} WFT的近似(选择前r个奇异值来压缩矩阵,如果矩阵的秩足够小,被丢弃的奇异值将为0或者较小,所以以下近似成立,该方法被称为低秩分解)
W F T ≈ U d × r Σ r × r V r × k T W^{FT}\approx U_{d\times r}\Sigma_{r\times r}V^T_{r\times k} WFTUd×rΣr×rVr×kT
为什么可以选择前r个奇异值?因为 Σ d × k \Sigma_{d\times k} Σd×k一般是从大到小排序的。奇异值越大,代表其对应的奇异向量越重要,越小则越不重要。

我们将奇异值分解压缩成两个矩阵相乘
B = U d × r A = Σ r × r V r × k T B=U_{d\times r}\\A=\Sigma_{r\times r}V_{r \times k}^T B=Ud×rA=Σr×rVr×kT
再说回来,假设权重微调变化的过程中也具有较低的秩。所以,可以通过低秩分解。来缩小可训练的参数维度。

我们用 Δ W \Delta W ΔW表示 W F T W^{FT} WFT低秩分解的结果。并用该低秩分解的结果去微调。于是就得到了论文里面结论
W ′ = W 0 + Δ W = W 0 + B A W'=W_0+\Delta W=W_0+BA W=W0+ΔW=W0+BA
那么 B ∈ R d × r , A ∈ R r × k B \in R^{d\times r},A \in R^{r\times k} BRd×r,ARr×k,B和A里面的参数是可学习的,r就是我们所选择的秩,并且 r ≪ min ⁡ ( d , k ) r \ll \min(d,k) rmin(d,k)。而 W 0 W_0 W0参数冻结。

所以对于 W 0 W_0 W0乘以一个x得到输出,也就是 h = W 0 x h=W_0x h=W0x,就可以变成
h = W ′ x = W 0 x + B A x h=W'x=W_0x+BAx h=Wx=W0x+BAx
其中,A是随机高斯初始化的,而B初始化为0,因此一开始, B A = 0 BA=0 BA=0。也就是相当于没有微调。

然后,论文作者使用 α r \frac{\alpha}{r} rα来缩放 B A x BAx BAx α \alpha α是一个与r相关的常数,在使用Adam优化器时,可以把 α \alpha α调整为与学习率相当。

通过这种方式,我们可训练的参数,实际上是
∣ Φ ∣ = ( d + k ) × r × L ^ L o R A |\Phi|=(d+k)\times r\times \hat L_{LoRA} ∣Φ∣=(d+k)×r×L^LoRA
其中 L ^ L o R A \hat L_{LoRA} L^LoRA代表应用LoRA的权重矩阵的数量

4、选择哪些参数微调

在这篇论文中,是应用在自然语言处理的,比如GPT,Transformer,BERT这些模型。作者指出,我们对里面的自注意力机制的权重矩阵进行更改。也就是对 W q , W k , W v , W o W_q,W_k,W_v,W_o Wq,Wk,Wv,Wo进行微调(也可以只微调其中一部分,比如只微调 W q , W v W_q,W_v Wq,Wv)。

而对于我们的Stable Diffusion,在哪些参数进行微调呢?我可以明确的告诉你,我不知道!这篇论文的发表先于Stable Diffusion那篇论文,里面没有提到对这个模型的微调修改。我也没有看过相关的代码

不过,Stable Diffusion里面也有一个自注意力机制。所以盲猜就是对注意力的权重矩阵进行微调了。

5、结束

好了,本篇文章到此为止,如有问题,还望指出。阿里嘎多!!!

在这里插入图片描述

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

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

相关文章

小索引大力量,记一次explain的性能优化经历

在 MySQL 的生产环境中,性能问题是一个常见的挑战。当数据库查询响应时间变慢,或者系统资源消耗异常时,我们需要快速定位问题并进行优化。MySQL 提供了一个强大的工具——EXPLAIN,它可以帮助我们分析查询语句的执行计划&#xff0…

前后端实现文件上传进度条-实时进度

后端接口代码&#xff1a; PostMapping("/upload")public ResponseEntity<String> handleFileUpload(RequestParam("file") MultipartFile file) {try {// 获取文件名String fileName file.getOriginalFilename();// 创建上传目标路径Path targetPa…

读书笔记-Java并发编程的艺术-第2章 Java并发机制的底层实现原理

文章目录 2.1 volatile的应用2.1.1 volatile的定义与实现原理2.1.2 volatile的使用优化 2.2 synchronized的实现原理与应用2.2.1 Java对象头2.2.2 锁的升级与对比2.2.2.1 偏向锁2.2.2.2 轻量级锁2.2.2.3 锁的优缺点对比 2.3 原子操作的实现原理2.3.1 术语定义2.3.2 处理器如何实…

Linux 内存管理 SLUB 分配器

文章目录 前言一、SLUB allocator二、SLUB core参考资料 前言 本文来自&#xff1a;https://lwn.net/Articles/229984/ [Posted April 11, 2007 by corbet]SLAB分配器是用于处理“频繁分配和释放的对象”的对象缓存内核内存分配器。它是内存管理子系统中关键的一部分&#xf…

Opencv 色彩空间

一 核心知识 色彩空间变换&#xff1b; 像素访问&#xff1b; 矩阵的、-、*、、&#xff1b; 基本图形的绘制 二 颜色空间 RGB&#xff1a;人眼的色彩空间&#xff1b; OpenCV默认使用BGR&#xff1b; HSV/HSB/HSL; YUV(视频); 1 RGB 2 BGR 图像的多种属性 1 访问图像(Ma…

MySQL之查询性能优化(三)

查询性能优化 重构查询的方式 在优化有问题的查询时&#xff0c;目标应该是找到一个更优的方法获得实际需要的记过——而不是一定总是需要从MySQL获取一模一样的结果集。有时候&#xff0c;可以将查询转换一种写法让其返回一样的结果&#xff0c;但是性能更好。但也可以通过修…

关于URL获取的参数,无法执行二选一查询

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Arthas调优工具使用

1&#xff0c;服务器端下载 curl -O https://arthas.aliyun.com/arthas-boot.jar 2&#xff0c;服务器端启动 java -jar arthas-boot.jar 选定要绑定的Java进程ID 3&#xff0c;本地idea安装Arthas idea 4&#xff0c;选定方法右键trace,生成命令 trace com.xxx.xxx.xxx.vouche…

C++之noexcept

目录 1.概述 2.noexcept作为说明符 3.noexcept作为运算符 4.传统throw与noexcept比较 5.原理剖析 6.总结 1.概述 在C中&#xff0c;noexcept是一个关键字&#xff0c;用于指定函数不会抛出异常。如果函数保证不会抛出异常&#xff0c;编译器可以进行更多优化&#xff0c;…

Spring Boot既打jar包又打war包如何做

你好&#xff0c;我是柳岸花开。 引言 在软件开发中&#xff0c;根据不同的部署需求&#xff0c;我们可能需要将应用打包成不同的格式。Spring Boot作为目前流行的Java应用开发框架&#xff0c;提供了一种简单的方式来打包应用。本文将介绍如何利用Maven Profiles在Spring Boot…

JDK8安装详细教程教程-windows

&#x1f4d6;JDK8安装详细教程教程-windows ✅1. 下载✅2. 安装 ✅1. 下载 123云盘下载地址&#xff1a; JDK8 | JDK11 | JDK17 官方Oracle地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ ✅2. 安装 运行jdk-8u211-windows-x64.exe安装包文…

Blog项目切换Markdown编辑器———LayUI弹出层弹出写在页面的内容导致的各种bug

【2024.5.24回顾】 1 问题描述(描述完自己解决了…) 正常情况 点击添加文章按钮后&#xff0c;弹出文章编辑界面&#xff0c;如果用富文本功能编辑&#xff0c;则一切正常。可以多次打开、关闭 Markdown 如果在弹出层中点击了切换编辑器按钮&#xff0c;会成功切换为markd…

FreeRTOS的使用与编码器设计

第一步&#xff1a;任务创建&#xff1a;在 FreeRTOS 中&#xff0c;系统功能由任务&#xff08;Task&#xff09;组成。在系统启动时&#xff0c;你需要创建各个任务并指定它们的任务频率、优先级、堆栈大小等参数。 xTaskCreate() 来创建开始任务并定义任务的执行函数、优先级…

Java之instanceof 运算符:掌握它的使用方法

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

人工智能--深度神经网络

目录 &#x1f349;引言 &#x1f349;深度神经网络的基本概念 &#x1f348;神经网络的起源 &#x1f34d; 神经网络的基本结构 &#x1f349;深度神经网络的结构 &#x1f348; 卷积神经网络&#xff08;CNN&#xff09; &#x1f348;循环神经网络&#xff08;RNN&…

期权懂基础知识分享:场外期权怎么做?

今天带你了解期权懂基础知识分享&#xff1a;场外期权怎么做&#xff1f;场外个股期权是一种金融工具&#xff0c;用于在股票市场之外交易。 场外期权怎么做&#xff1f; 签订框架协议&#xff1a;个人需要与机构签订场外期权框架协议&#xff0c;通常无需单独开立账户。 询价…

Web3.0区块链技术开发方案丨中心化与去中心化交易所开发

随着区块链技术的不断发展和普及&#xff0c;加密货币交易所成为数字资产市场中的关键组成部分。其中&#xff0c;中心化交易所&#xff08;CEX&#xff09;和去中心化交易所&#xff08;DEX&#xff09;是两种主要的交易所类型。本文将探讨Web3.0区块链技术开发方案&#xff0…

【Postman接口测试】第四节.Postman接口测试项目实战(中)

文章目录 前言五、Postman断言 5.1 Postman断言介绍 5.2 响应状态码断言 5.3 包含指定字符串断言 5.4 JSON数据断言六、参数化 5.1 Postman参数化介绍 5.2 Postman参数化实现 5.3 针对项目登录接口参数化实现 总结 前言 五、Postman断言 5.1 Postman断言介…

Android 应用权限

文章目录 权限声明uses-permissionpermissionpermission-grouppermission-tree其他uses-feature 权限配置 权限声明 Android权限在AndroidManifest.xml中声明&#xff0c;<permission>、 <permission-group> 、<permission-tree> 和<uses-permission>…

TSINGSEE青犀视频汇聚机房动环智能监控方案,提升机房安全稳定性

一、背景需求 在当今信息化时代&#xff0c;机房作为数据中心的核心设施&#xff0c;承载着重要的网络设备和数据存储设备&#xff0c;其正常运行对于企业的数据安全和业务连续性至关重要。机房内部设备众多&#xff0c;且运行过程中涉及大量的数据交换和传输。一旦发生安全事…