如何微调出自己的大模型——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.mzph.cn/diannao/22566.shtml

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

相关文章

RocketMQ教程(一):RocketMQ的基本概念

RocketMQ是什么? RocketMQ 是一个分布式消息中间件和流计算平台,由阿里巴巴团队开源并贡献给 Apache 软件基金会,现为 Apache 顶级项目。它主要用于处理大规模数据的传输问题,支持高吞吐量、高可用性和可扩展性的消息发布和订阅服…

Kotlin 抽象类

文章目录 定义构造函数普通成员(属性或方法)抽象成员(属性或方法)实例化抽象类使用伴生对象继承抽象类 定义 在 Kotlin 中,抽象类使用abstract class定义: abstract class 类名 { 属性/方法 }我们可以尝试…

React - 实现走马灯组件

一、实现效果 二、源码分析 import {useRef, useState} from "react";export const Carousel () > {const images [{id: 3, url: https://sslstage3.sephorastatic.cn/products/2/4/6/8/1/6/1_n_new03504_100x100.jpg}, {id: 1, url: https://sslstage2.sephor…

RabbitMQ docker安装及使用

1. docker安装RabbitMQ docker下载及配置环境 docker pull rabbitmq:management # 创建用于挂载的目录 mkdir -p /home/docker/rabbitmq/{data,conf,log} # 创建完成之后要对所创建文件授权权限,都设置成777 否则在启动容器的时候容易失败 chmod -R 777 /home/doc…

团队项目开发使用git工作流(IDEA)【精细】

目录 开发项目总体使用git流程 图解流程 1.创建项目仓库[组长完成] 2. 创建项目,并进行绑定远程仓库【组长完成】 3.将项目与远程仓库(gitee)进行绑定 3.1 创建本地的git仓库 3.2 将项目添加到缓存区 3.3 将项目提交到本地仓库&#…

102、python-第三阶段-11-数据输出-输出到文件中

配置完成后,再次执行代码,发现输出的文件有好多,和电脑的内核数量有关系 这样就可以分别输出到一个对应的文件了

攻防世界---misc---normal_png

1、下载附件是一张图片 2、先看这张照片,我感觉它的宽高不一样,感觉有问题,但是我也没深想 3、接着用winhex分析,也没有发现奇怪的地方,于是我去binwalk,没什么发现,就是一张正常的图片&#x…

【Vue】Vue生命周期

Vue生命周期:就是一个Vue实例从创建(new一个Vue实例) 到 销毁(关闭网页) 的整个过程。 生命周期四个阶段:① 创建 ② 挂载 ③ 更新 ④ 销毁 创建阶段:创建响应式数据 通过data给当前的Vue实例提…

树莓集团:产学研一体化发展

树莓集团,通过与高校、研究机构等合作,旨在促进科技成果的转化和应用,提高技术创新能力,实现经济社会可持续发展。深刻认识产学研一体化对于推动产业创新、提升竞争力的关键作用。 1、与高校合作 紧密合作:树莓集团与…

Day08 备忘录页面设计

​ 当前章节完成后效果图 一.布局设计和生成静态数据 当前章节备忘录页面布局设计跟 第7章节一样,只是内容方面发生变化,其他样式都一样。直接把代码粘出来了当前章节备忘录 MemoView.xaml 页面完整示例代码 <UserControl x:Class="MyToDo.Views.MemoView"xmlns…

Python | 刷题日记

1.海伦公式求三角形的面积 area根号下&#xff08;p(p-a)(p-b&#xff09;(p-c)) p是周长的一半 2.随机生成一个整数 import random xrandom.randint(0,9)#随机生成0到9之间的一个数 yeval(input("please input:")) if xy:print("bingo") elif x<y:pri…

python数据分析——逻辑回归

参考资料&#xff1a;活用pandas库 逻辑回归 当响应变量为二值响应变量时&#xff0c;经常使用逻辑回归对数据建模。 # 导入pandas库 import pandas as pd # 导入数据集 acspd.read_csv(r"...\data\acs_ny.csv") # 展示数据列 print(acs.columns) # 展示数据集 pri…

[数据集][图像分类]茶叶叶子病害分类数据集304张4类别

数据集类型&#xff1a;图像分类用&#xff0c;不可用于目标检测无标注文件 数据集格式&#xff1a;仅仅包含jpg图片&#xff0c;每个类别文件夹下面存放着对应图片 图片数量(jpg文件个数)&#xff1a;304 分类类别数&#xff1a;4 类别名称:[“anthracnose”,“bird_eye_spot”…

功效系数法

功效系数法&#xff08;Efficacy Coefficient Method&#xff09;是一种综合评价方法&#xff0c;它根据多目标规划的原理&#xff0c;对每个评价指标确定一个满意值和不允许值&#xff0c;以满意值为上限&#xff0c;以不允许值为下限。计算各指标实现满意值的程度&#xff0c…

ant-design vue3 中上传图片组件的回传图片显示问题

最近在做web端的上传图片 有一个数据列表中的编辑功能 是之前上传的图片 点击编辑进入编辑页面 会显示之前写的数据 现在需要把原来上传的图片 显示出来 因为之前给后端上传的 图片格式 是一个数组 ["图片链接"&#xff0c;“图片链接”。。。] 后端给我返回的数据也…

ESP32 ESP8266 Arduino开发环境离线安装

在下面链接中详细介绍了ESP32 ESP8266在线安装方法&#xff0c; 智能红外遥控器&#xff08;二&#xff09;&#xff1a; Arduino环境搭建及库安装_arduino ide 1.8.13-CSDN博客 但是由于在线安装受国外服务器的影响很多时间会不成功&#xff0c;下面介绍使用离线安装包的方法…

AI视频教程下载:给初学者的ChatGPT提示词技巧

你是否厌倦了花费数小时在可以通过强大的语言模型自动化的琐碎任务上&#xff1f;你是否准备好利用 ChatGPT——世界上最先进的语言模型——并将你的生产力提升到下一个水平&#xff1f; ChatGPT 是语言处理领域的游戏规则改变者&#xff0c;它能够理解并响应自然语言&#xf…

JavaWeb基础(JQuery,XML及解析)

这个阶段有点拖沓了&#xff0c;因为事情比较多&#xff0c;耽搁了一段时间&#xff0c;学习的主要内容为JQuery和XML&#xff0c;因为vue的出现&#xff0c;JQuery技术现在已经不流行了&#xff0c;但是不流行不代表我不会&#xff0c;JQuery最最最最核心的就是他的$()核心函数…

十大排序 —— 希尔排序

十大排序 —— 希尔排序 什么是希尔排序插入排序希尔排序递归版本 我们今天来看另一个很有名的排序——希尔排序 什么是希尔排序 希尔排序&#xff08;Shell Sort&#xff09;是插入排序的一种更高效的改进版本&#xff0c;由Donald Shell于1959年提出。它通过比较相距一定间…

路由策略案例

一、路由策略案例 如图所示&#xff0c;某公司内终端通过Switch接入公司内部网络。如果该公司内存在非如图1所示&#xff0c;运行OSPF协议的网络中&#xff0c;RouterA从Internet网络接收路由&#xff0c;并头RouterB提供了部分Internet路由。其中: RouterA仅提供172.1…