大模型微调系列之LoRA详解

大模型微调之LoRA

1 大模型微调的动机

对于在开源大模型的基础上进行修改,创建可自用的大模型用于自定义的对话/翻译/推理/做题等业务,微调都是一个绕不开的研究方向。此外,由于个人的经济能力限制,可具备的计算资源也是有限的,且普通机箱的显卡槽位为1个,通常为单张RTX 4090 (24 GB显存)。而4卡槽/6卡槽工作站的显存可达到96 GB - 288GB (采用单张 24 GB 或 单张 48 GB 的显卡,型号包括90系,或A5000/A6000)。上述配置想开发自己的大模型的周期过长,且取得的效果也是有限的,此外目前开源社区 (huggingface魔搭社区GitHub) 中也存在大量的不同规格的开源大模型,如 (LLaMA 系列、通义千问 系列 等) 。以通义千问为例,各尺寸模型的微调所需计算资源如下:

微调方法名称 方法类别 精度 7B 13B 30B 72B 110B
FULL 全参数微调 AMP 120 GB 240 GB 600 GB 1200 GB 2000 GB
FULL 全参数微调 16 bit 60 GB 120 GB 300 GB 600 GB 900 GB
Freeze 部分参数微调 16 bit 20 GB 40 GB 80 GB 200 GB 360 GB
LoRA/GaLore/BAdam 部分参数微调 16 bit 16 GB 32 GB 64 GB 160 GB 240 GB
QLoRA 部分参数微调 8 bit 16 GB 32 GB 64 GB 160 GB 240 GB
QLoRA 部分参数微调 4 bit 10 GB 20 GB 40 GB 80 GB 140 GB
QLoRA 部分参数微调 2 bit 4 GB 8 GB 16 GB 24 GB 48 GB

如上表所示,全参数微调所需的计算资源仍然较大,但低精度微调的准确度又较低,因此选取较中间的部分参数微调方式,如LoRA (16 bit),可一定程度上达到精度与计算资源的平衡。本文就将结合原文介绍部分参数微调领域的经典方法: LoRA。

2 微调方法背景介绍

该论文的原文为:

LoRA: Low-Rank Adaptation of Large Language Models

在这里插入图片描述

如论文[1]题目所示,LoRA是 Low-Rank Adaptation 的简写,意为低秩自适应。动机为下列假设:

过参数化模型实际上存在于较低的内生性纬度中,在模型参数微调时,若假设其过参数化模型也存在于较低纬度中,则可通过仅对这些纬度进行微调,已达到可在降低计算量的并通知获取与全参数微调相同甚至更好的效果。

根据论文中的结论,使用LoRA可相对于传统方法提高3倍的训练效率。

3 论文主要内容

3.1 问题叙述

论文提出的方法是一般性的,但为了方便叙述,选定了大模型最常见的语言建模任务作为背景:

给定预训练自回归语言模型 (如 GPTQwen 等) P Φ ( y ∣ x ) P_\Phi(y|x) PΦ(yx) ,带有可训练参数 Φ \Phi Φ 。该模型中的每个下游任务 (downstream task) 由 Z = { ( x i , y i ) } i = 1 , . . . , N \mathcal{Z}=\{(x_{i},y_{i})\}_{i=1,...,N} Z={(xi,yi)}i=1,...,N 构成的数据集来表征(这里是因为大模型的数据驱动性比较强,基本是通过数据集来驱动新的模型业务),其中 x i x_{i} xi 为输入词元(input token), y i y_{i} yi 为输出词元(output token)。

在全参数微调时,上述模型可被初始化为预训练权重 Φ 0 \Phi_0 Φ0 ,并可通过最大化下列条件性语言模型并被更新为 Φ 0 + Δ Φ \Phi_0+\Delta\Phi Φ0

### LoRA低秩适应微调方法详解 #### 一、原理概述 LoRA(Low-Rank Adaptation),即低秩自适应调整,是一种用于优化预训练模型微调的技术。通过引入低秩分解的方式,在保持原有大型模型结构不变的情况下,仅需少量额外参数即可实现高效的迁移学习效果[^1]。 #### 二、核心组件解析 - **Rank与Alpha** - Rank决定了新增加的旁侧连接部分所采用的小型矩阵维度大小;较低的rank意味着更少的新参数被加入到整个网络当中,这有助于减少计算资源消耗并加速训练过程。 - Alpha则用来调节新添加模块对于原始线性变换强度的影响程度,允许灵活控制增强或减弱特定特征的重要性[^2]。 #### 三、具体实施流程 当应用LoRA进行微调时,主要操作如下: 1. 对于选定的目标层(通常是全连接层或者注意力机制中的投影子空间),不是直接修改其权重矩阵W,而是将其拆解成两组小型矩阵A和B相乘的形式:\( W_{new} = W + A \times B^T \),其中\( rank(A)=rank(B)<d \)(d表示原矩阵宽度)。 2. 在实际编码过程中可以利用Hugging Face Transformers库提供的API轻松集成LoRA功能。下面给出一段Python代码示例展示如何基于transformers加载已有的BERT模型并为其某些指定层启用LoRA特性: ```python from transformers import BertModel, get_scheduler import torch.nn as nn model = BertModel.from_pretrained('bert-base-uncased') for name,param in model.named_parameters(): param.requires_grad_(False) lora_config={ 'target_modules': ['query', 'key', 'value'], # 需要适配的具体模块名称列表 'ranks':[8], # 各个目标层对应的rank值设置 'alphas':[32] # alpha系数设定 } def apply_lora(module,lora_cfg): for n,m in module._modules.items(): if isinstance(m,(nn.Linear)): m.lora_A=nn.Parameter(torch.randn(lora_cfg['ranks'][0],m.in_features)) m.lora_B=nn.Parameter(torch.randn(m.out_features,lora_cfg['ranks'][0])) setattr(m,'old_forward',getattr(m,'forward')) def new_forward(self,x): y=self.old_forward(x)+self.lora_A@torch.transpose(self.lora_B,-2,-1)@x return y setattr(m,'forward',types.MethodType(new_forward,m)) apply_lora(model,lora_config) ``` 上述脚本实现了对BERT模型内部Attention机制下Query/Key/Value三个向量映射函数施加LoRA改造的过程[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

空 白II

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值