一文读懂:LoRA实现大模型LLM微调

news2024/11/15 19:46:31

LoRA大模型LLM微调

  • 为什么要进行微调?
  • LoRA思路
    • 提高权重更新效率
    • 选择低的秩
  • 实现LoRA
  • LoRA在LLaMA实现

为什么要进行微调?

在快速发展的人工智能领域中,以高效和有效的方式使用大型语言模型变得越来越重要。
预训练的大型语言模型通常被称为优秀的基础模型,原因在于它们在各种任务上表现出色,

而大模型微调是将其适应到特定的目标任务或领域中。尽管预训练的大型语言模型在各种任务上表现出色,但它们并不是为特定任务而设计的。通过微调,我们可以根据目标任务的需求对模型进行调整,使其在该任务上的性能得到进一步提升。
微调使我们能够将模型调整到目标领域和目标任务。然而,它在计算上可能非常昂贵-模型越大,更新其层的成本就越高。作为更新所有层的替代方法,已经开发了参数高效的方法,例如前缀调整和适配器。

现在,又出现了一种更流行的参数高效微调技术:
低秩适应(LoRA)。LoRA是什么?它是如何工作的?与其他流行的微调方法相比如何?让我们在本文中回答所有这些问题!

LoRA思路

低秩适应(Low-Rank Adaptation)是一种参数高效的微调技术,其核心思想是对大型模型的权重矩阵进行隐式的低秩转换

什么是低秩转换呢?

整体的想法和概念与主成分分析(PCA)和奇异值分解(SVD)有关,我们通过一个较低维度的表示来近似表示一个高维矩阵或数据集。

换句话说,我们试图找到原始特征空间(或矩阵)中少数维度的(线性)组合,能够捕捉数据集中大部分的信息。
如下图所示:
在这里插入图片描述

提高权重更新效率

LoRA: Low-Rank Adaptation of Large Language Models 这篇论文提出了将权重变化 Δ W ΔW ΔW 分解为一个低秩表示的方法。(严格来说,LoRA 并不直接对矩阵进行分解,而是通过反向传播学习分解后的矩阵)。

在我们深入了解 LoRA 之前,先简要解释一下正常微调期间的训练过程。权重 Δ W ΔW ΔW 是如何变换的

假设 W W W表 示神经网络层中的权重矩阵。
使用常规的反向传播,我们可以得到权重更新 Δ W ΔW ΔW
通常计算为损失的负梯度乘以学习率:
Δ W = α ( − ∇ L W ) \Delta W = \alpha ( -\nabla L_W) ΔW=α(LW)

然后,当我们有了 Δ W ΔW ΔW之后,我们可以按照以下方式更新原始权重:
W ′ = W + Δ W W' = W + ΔW W=W+ΔW

下图中展示了这个过程,为了方便理解LoRA的思想,我们将权重更新矩阵 Δ W \Delta W ΔW和原始 W W W保持分开展示,并按照以下方式计算输出:
h = ( W + Δ W ) x h = (W + \Delta W)x h=(W+ΔW)x
h = W x + Δ W x h = W x + \Delta W x h=Wx+ΔWx
在这里插入图片描述
在这里插入图片描述
当我们训练神经网络中的全连接(即“稠密”)层时,如上图所示,权重矩阵通常具有完整秩(full rank)。完整秩是一个技术术语,意味着矩阵的行或列之间没有线性相关(即“冗余”)关系。相反,与完整秩相对应,低秩意味着矩阵具有冗余的行或列。详细理解如下图所示:

在深度学习中,权重矩阵通常具有完整秩,这意味着权重矩阵的行或列之间没有线性相关关系,也就是说,每个权重在模型中承担了不同的作用,没有冗余。这种情况下,权重矩阵能够充分表达模型的复杂性和丰富的特征表示能力。权重矩阵具有完整秩的好处是,模型可以通过学习到的权重进行准确的预测和分类。每个权重都对模型的输出产生影响,而且没有多余的冗余信息。
然而,在某些情况下,完整秩的权重矩阵可能会导致一些问题。例如,当训练数据量较少或数据噪声较多时,权重矩阵可能会过拟合,导致模型泛化能力下降。此外,权重矩阵中的大量参数可能会导致计算和存储的开销很大。
因此,在一些参数效率方面的研究中,人们开始关注如何利用低秩矩阵来表示权重矩阵。通过使用低秩矩阵,我们可以降低参数的数量,减少计算和存储的开销,并且仍然保留了大部分原始权重矩阵的关键信息。这样,我们可以在保持模型性能的同时,提高计算效率和模型的可解释性

因此,虽然预训练模型的权重在预训练任务中具有完整秩,但LoRA的作者指出,当预训练的大型语言模型适应新任务时,其固有维度很低,这是根据Aghajanyan等人的研究(2020)得出的。(换句话说:实际微调后的权重其实对比原始模型,能用到的权重其实很少)

低秩维度意味着数据可以通过较低维度的空间有效表示或近似,同时保留其大部分重要信息或结构。换句话说,这意味着我们可以将适应任务的新权重矩阵分解为较低维度(较小)的矩阵,而不会丢失太多重要信息。

例如,假设 Δ W ΔW ΔW是权重矩阵 W ∈ R A × B W \in \mathbb{R}^{A \times B} WRA×B的权重更新。然后,我们可以将权重更新矩阵分解为两个较小的矩阵: Δ W = W A W B ΔW=W_AW_B ΔW=WAWB,其中 W A R A × r W_A\mathbb{R}^{A \times r} WARA×r W B R r × B W_B\mathbb{R}^{r \times B} WBRr×B
在这里,我们保持原始权重 W W W不变,只训练新的矩阵 W A W_A WA W B W_B WB。简言之,这就是LoRA方法的核心思想,如下图所示。
在这里插入图片描述

选择低的秩

上图中的 r r r是一个超参数,我们可以用它来指定适应过程中所使用的低秩矩阵的等级。较小的 r r r会导致简化的低秩矩阵,从而减少适应过程中需要学习的参数数量。这可以加快训练速度,可能减少计算需求。
然而,较小的 r r r会降低低秩矩阵捕捉特定任务信息的能力。这可能导致适应质量较低,模型在新任务上的表现可能不如较高的 r r r好。
总结起来,在LoRA中选择较小的 r r r存在模型复杂性、适应能力以及欠拟合或过拟合的风险之间的权衡。因此,重要的是尝试不同的 r r r值,以找到适合新任务所需性能的合适平衡点。

实现LoRA

LoRA的实现相对简单。我们可以将其视为LLM中全连接层的修改后的前向传播。伪代码如下所示:

input_dim = 768 # 例如,预训练模型的隐藏大小
output_dim = 768 # 例如,层的输出大小
rank = 8 # 低秩适应的等级'r'
W = ... # 来自预训练网络的权重,形状为 input_dim x output_dim
W_A = nn.Parameter(torch.empty(input_dim, rank)) # LoRA权重A
W_B = nn.Parameter(torch.empty(rank, output_dim)) # LoRA权重B初始化LoRA权重
nn.init.kaiming_uniform_(W_A, a=math.sqrt(5))
nn.init.zeros_(W_B)

def regular_forward_matmul(x, W):
	h = x @ W
	return h

def lora_forward_matmul(x, W, W_A, W_B):
	h = x @ W # 常规矩阵乘法
	h += x @ (W_A @ W_B) * alpha # 使用缩放的LoRA权重
	return h

在上述伪代码中,alpha是一个缩放因子,用于调整组合结果(原始模型输出加上低秩适应)的幅度。这样可以平衡预训练模型的知识和新任务特定的适应性——默认情况下,alpha通常设置为1。还要注意,

虽然 W A W_A WA被初始化为小的随机权重,但 W B W_B WB被初始化为0,以便在训练开始时 Δ W = W A W B = 0 ΔW=W_AW_B=0 ΔW=WAWB=0,这意味着我们从原始权重开始进行训练。

LoRA在LLaMA实现

现在,让我们使用LoRA对Meta的流行LLaMA模型进行微调的实现。除了用于训练和运行LLaMA本身(使用原始的Meta LLaMA权重)的代码外,它还包含使用LLaMA-Adapter和LoRA对LLaMA进行微调的代码。推荐阅读以下教程文件:

  • 下载预训练权重 [ download_weights.md ]
  • 使用LoRA进行微调 [ finetune_lora.md ]
  • 使用Adapter进行微调 [finetune_adapter.md ](可选,用于比较研究)

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

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

相关文章

02-启动 Vue 项目

一. 学习目标 掌握 Vue 项目的启动 二. 学习内容 掌握 Vue 项目的启动 三. 学习过程 项目的启动也有两种方式,一种是通过图形界面启动,另一种是通过命令行启动。 1.图形界面 打开vscode编辑器,点击 1.文件 ——>打开文件夹&#xff0c…

springboot实现支付宝支付(沙箱环境)

springboot实现支付宝支付 1. 获取应用id,应用私钥和支付宝公钥2. 开始开发3. 内网穿透4. 测试支付功能 1. 获取应用id,应用私钥和支付宝公钥 进入支付宝控制台:https://open.alipay.com/develop/manage 找到沙箱 这里可以看到应用id 可以看到应用私钥和支付宝公钥,获取这…

Zoho:集成ChatGPT、开发大型语言模型,加紧布局AI+SaaS

在企业的数字化转型进程中,管理层和员工的数字化意识会随着建设的推进而不断提高,对于办公场景的数字化应用需求也不断产生。传统的办公系统建设中,系统的应用能力需要支撑越来越丰富的场景需求。 《今日人工智能》采访到Zoho中国VP兼SaaS事业…

【编程语言 · C语言 · for语句】

for 语句 C语言中,使用for语句也可以控制一个循环,并且在每一次循环时修改循环变量。在循环语句中,for语句的应用最为灵活,不仅可以用循环次数已经确定的情况,而且可以用于循环次数不确定而只给出循环结束条件的情况。…

jenkins构建pipline无法执行shell命令原因

问题表现 新的服务器上,新安装的jenkins,在上面创建了一个pipline项目,脚本里有shell命令,但是jenkins每次执行都卡住,经过尝试,无论多简单的命令都执行不了,cp,mv等都不行&#xf…

华为路由器:ospf协议三张表及邻居建立过程

说明:本篇接上一篇继续讲解 拓扑图 为了方便,我把R1/2/3/4/5的router id改成了回环网卡的IP。 ospf协议三张表 邻居表(neighbortable) OSPF用邻居机制来发现和维持路由的存在,邻居表存储了双向通信的邻居关系OSPF路…

矩形图:数据之美在图形中展现

在当今信息爆炸的时代,数据已经成为决策和洞察的重要基石,但海量的数据如果不经过整理和呈现,往往难以得出有意义的结论。这时候,可视化工具的作用就变得尤为重要了。在众多可视化形式中,矩形图以其简洁直观的特点受到…

团队管理之性能实施团队日志9

最近项目进入胶着状态。 混合场景在有些项目组里已经可以开始了,但还是有两三个项目组现在是完全没办法混合起来的。 本周计划是把基准测试、容量测试跑完,稳定性测试每个项目组至少能跑一遍。 但是从进度上来看,容量测试至少有四个系统不能跑…

各类动态路由协议汇总简介

目录 一、前言 二、OSPF协议 (一)OSPF是什么 (二)OSPF的工作原理 (三)OSPF的特点 (四)OSPF的使用 (五)OSPF的优点 (六)总结 …

ROS——从深度图转换到octomap(C++)

文章目录 介绍环境准备三维灰度栅格图三维RGB栅格图对点云进行过滤处理参考介绍 八叉树是用于在3D视觉中细分空间的数据结构。每个立方体都可以逐级地细分为8个子立方体,直到达到了给定的最小体积(体素)尺寸。且该最小体积(体素)决定了八叉树的分辨率。 octomap的作用:…

代码随想录算法训练营第五十一天|309.最佳买卖股票时机含冷冻期|714.买卖股票的最佳时机含手续费

LeetCode309.最佳买卖股票时机含冷冻期 动态规划五部曲: 1,确定dp数组以及下标的含义:dp[i][j],第i天状态为j,所剩的最多现金为dp[i][j]。出现冷冻期之后,状态其实是比较复杂度,例如今天买入股…

接口自动化【七】__包装响应结果的数据为key-value

文章目录 前言 一、本章学习的思路 二、用接口新建商品_使用步骤 ​​​​​​​步骤一:先用抓包的方式拿到新建商品的接口 步骤二:我们先用单接口的形式,把这个商品添加成功 三、处理响应接口_(包装响应结果的数据为&#xf…

Flume自定义拦截器 - ETL拦截器和分类拦截器

水善利万物而不争,处众人之所恶,故几于道💦 目录 一、拦截器(Interceptor)和选择器(Selector) 拦截器(Interceptor) 选择器(Selector) 二、自定…

【机器学习 | 深度学习】Colab是什么?以及如何使用它?

文章目录 一、介绍二、如何使用 Colaboratory 创建代码三、实例测试 一、介绍 Colaboratory(简称为Colab)是由Google开发的一种基于云端的交互式笔记本环境。它提供了免费的计算资源(包括CPU、GPU和TPU),可让用户在浏…

本地部署gitlab学习git使用

文章目录 前言一、安装gitlab二、nginx反向代理三、本地配置hosts,自定义域名四、配置gitlab独立ngxin实现域名访问五、其他总结 前言 最近想学习git使用了,在本地部署一个gitlab社区版玩玩吧~ gitlab只能部署在liunx系统上面,可以使用云服务…

TLD2314EL-ASEMI代理英飞凌汽车芯片TLD2314EL

编辑:ll TLD2314EL-ASEMI代理英飞凌汽车芯片TLD2314EL 型号:TLD2314EL 品牌:Infineon(英飞凌) 封装:SSOP-14-EP-150mil 特性:LED驱动、汽车芯片 宽温度范围:-40C~150C 封装:SSOP-14&…

虚拟云网络系列 | 如何将 NSX NVDS 迁移到 VDS

1.NVDS 迁移到 VDS 的主要原因 在早期的 vsphere6.7 的版本上安装 NSX-T 采用的都是 NVDS,而随着 NSX 版本的升级,从 NSX 4.0 开始,NSX 已经不在支持在 ESXi 上部署 NVDS,仅能使用 vsphere7.0 上的 VDS。所以,对于早期…

linux系统编程-----下

linux网络编程 tcp通信 Berkeley Socket TCP/IP协议族标准只规定了网络各个层次的设计和规范,具体实现则需要由各个操作系统厂商完成。最出名的网络库由BSD 4.2版本最先推出,所以称作伯克利套接字,这些API随后被移植到各大操作系统中&…

Android Key Hash生成

在接入FaceBook 安卓第三方登录的时候,就需要获取Debug Android Hash Key。 Android Hah Key有两种,即开发密钥散列和发布密钥散列 获得散列值需要借助openssl工具。 下载并配置openssl 1、下载 到https://code.google.com/archive/p/openssl-for-win…