一、LoRA原理
LoRA(Low-Rank Adaptation of LLMs),即LLMs的低秩适应,是参数高效微调最常用的方法。
LoRA的本质就是用更少的训练参数来近似LLM全参数微调所得的增量参数,从而达到使用更少显存占用的高效微调。
1.1 问题定义
LoRA与训练目标是解耦的,但本文设定就是语言模型建模。
以下将给出语言建模(可自然推广到序列建模)的基本符号定义,即最大化给定提示的条件概率(极大似然估计)。
The maximization of conditional probabilities given a task-specific prompt
给定一个参数为�预训练的自回归语言模型 �Φ(�|�) 。
�为输入,�为输出
note: 为与原文符号一致,下文�、�、�均表示模型参数
全参数微调
每次full fine-tuning训练,学一个 Δ� ,, |Δ�| 参数量大hold不住
语言模型的条件概率分布建模目标
高效微调
Δ� 是特定于下游任务的增量参数
LoRA将 Δ�=Δ�(Θ) ,用参数量更少的 � 来编码(低秩降维表示来近似), |�|<<|�|
LoRA训练目标
Transformer架构参数
- Transformer层的输入和输出维度大小 ������
- ��、��、��,和��分别代表自注意力的query、key、value和output投影矩阵
- �或�0代表预训练的权重矩阵
- ∆�是微调后得到的增量参数矩阵(训练后,优化算法在参数上的累计更新量)
- �代表LoRA的低秩适应参数的秩
1.2 LoRA简介
LoRA的核心思想是,在冻结预训练模型权重后,将可训练的低秩分解矩阵注入到的Transformer架构的每一层中,从而大大减少了在下游任务上的可训练参数量。
LoRA结构
We propose Low-Rank Adaptation(LoRA), which freezes the pre trained model weights and injects trainable rank decomposition matrices into each layer of the Transformer architecture, greatly reducing the number of trainable parameters for downstream tasks.
在推理时,对于使用LoRA的模型来说,可直接将原预训练模型权重与训练好的LoRA权重合并,因此在推理时不存在额外开销。
1.3 为什么要LoRA
背景
通常,冻结预训练模型权重,再额外插入可训练的权重是常规做法,例如Adapter。可训练的权重学习的就是微调数据的知识。
推理性能比较
但它们的问题在于,不仅额外增加了参数,而且还改变了模型结构。
这会导致模型训练、推理的计算成本和内存占用急剧增加,尤其在模型参数需在多GPU上分布式推理时(这越来越常见)。
动机
深度网络由大量Dense层构成,这些参数矩阵通常是满秩的。
相关工作表明,When adapting to a specific task, 训练学到的过度参数化的模型实际上存在于一个较低的内在维度上(高维数据实际是在低维子空间中)
We take inspiration from Li et al. (2018a); Aghajanyan et al. (2020) which show that the learned over-parametrized models in fact reside on a low intrinsic dimension.
低秩矩阵
LoRA就假设LLM在下游任务上微调得到的增量参数矩阵Δ�是低秩的(肯定不是满秩),即存在冗余参数或高度相关的参数矩阵,但实际有效参数是更低维度的。
We hypothesize that the change in weights during model adaptation also has a low “intrinsic rank”, leading to our proposed Low-Rank Adaptation (LoRA) approach.
LoRA遂设想,对全参数微调的增量参数矩阵Δ�进行低秩分解近似表示(即对参数做降维)。
PCA降维示意图,源于https://lightning.ai/pages/community/tutorial/lora-llm/
这样训练Δ�的低秩分解近似参数矩阵,效果上相比其他PEFT方法不会打什么折扣,而且还能在推理时不增加额外开销。
LoRA allows us to train some dense layers in a neural network indirectly by optimizing rank decomposition matrices of the dense layers’change during adaptation instead, while keeping the pre-trained weights frozen
LoRA的大体思路就是这样,具体的矩阵分解也是靠微调过程学习的。
接下来,介绍LoRA的具体方案。
1.4 LoRA实现
LoRA就是低秩矩阵适应,在冻结原有LLM参数时,用参数量更小的矩阵进行低秩近似训练。
对于预训练权重矩阵�0∈��×�,LoRa限制了其更新方式,即将全参微调的增量参数矩阵Δ�表示为两个参数量更小的矩阵 � 和 � 的低秩近似:
�0+�=�0+��
其中,�∈��×�和�∈��×�为LoRA低秩适应的权重矩阵,秩�远小于�。
此时,微调的参数量从原来Δ�的�∗�,变成了� 和 �的2∗�∗�。可知,2∗�∗�<<�∗�(有2�<<�)
全参微调 v.s. LoRA微调
给定输入�∈��,添加LoRA后的输出ℎ∈��:
ℎ=(�0+Δ�)�=�0�+���
这里,将Δℎ=���,便于后续求导计算。
在训练时,原始参数�0被冻结,意味着�0虽然会参与前向传播和反向传播,但是不会计算其对应梯度∂�∂�0,更不会更新其参数。
在推理时,直接按上面的式子将��合并到�0中,因此相比原始LLM不存在推理延时。
1.5 LoRA参数初始化
在开始训练时:
矩阵 � 通过高斯函数初始化,��∼�(0,��2)
矩阵 � 为全零初始化,��=0
这使得训练开始前,LoRA的旁路��=0,那么微调就能从预训练权重�0开始。
这样就能和全参数微调时一样,能有相同的开始。
这个策略要求,至少� 和 �中有一个被初始化为全0项。
但如果,全被初始化为0,� 和 �就训不动了。因为,� 和 �全0时,处于鞍点,两个权重的梯度也全为0
(� 的梯度 ∂�∂�依赖�,� 的梯度∂�∂�依赖�,如果仅一项为0训练是可以启动的)
1.6 LoRA参数合并系数
实际实现时,Δ�=��会乘以系数��与原始预训练权重合并�0,�是一个超参:
ℎ=(�0+��Δ�)�
直观来看,系数��决定了在下游任务上微调得到的LoRA低秩适应的权重矩阵��占最终模型参数的比例。
给定一个或多个下游任务数据,进行LoRA微调:
- 系数��越大,LoRA微调权重的影响就越大,在下游任务上越容易过拟合
- 系数��越小,LoRA微调权重的影响就越小(微调的效果不明显,原始模型参数受到的影响也较少)
一般来说,在给定任务上LoRA微调,让�为�的2倍数。(太大学过头了,太小学不动。)
根据经验,LoRA训练大概很难注入新的知识,更多是修改LLM的指令尊随的能力,例如输出风格和格式。原始的LLM能力,是在预训练是获得的(取决于参数量、数据规模X数据质量)。
LoRA的秩�决定,LoRA的低秩近似矩阵的拟合能力,实际任务需要调参挑选合适的秩�维度。系数��中�决定新老权重的占比。
1.7 LoRA的秩如何选择
和推荐系统中的评分矩阵分解、文本的非负矩阵分解,以及奇异值分解一样。LoRA的低秩分解近似矩阵� 和 �的秩�的大小,决定了其拟合能力。
理想的情况是找到一个秩�,使得LoRA的低秩近似结构��能具备全参数微调的增量矩阵Δ� 的表达能力,能越接近越好。
秩�成为了LoRA的超参数,随着秩�维度的不断增加,参与训练的参数量也随之增加,LoRA的低秩适应能力将逐渐提高甚至过拟合。
论文基于GPT-3 175B,WikiSQL和MultiNLI数据上,进行了关于LoRA秩$r$选取的实验分析
Weight Type指明对Attention的那部分参数做了低秩适应。可以发现,在这个2个数据集上,�=4,8时基本上要略优于�=64的效果。更高的�不一定带来更好的效果。
作者指出,增加�并不能涵盖更有意义的子空间,这表明低秩适应矩阵就足够了。但是,并不可能期望一个小的�适用于每个任务或数据集
一些秩�选取经验:
微调的下游任务:
简单任务所需的秩�不大,任务越难/多任务混合的情况,需要更大的秩�
- 基座能力:
越强的基座,所需的秩�应该更小。例如Qwen2-72B-Instruct对比Qwen2-7B-Instruct。
越强的基座在处理同等任务时,需要微调的样本数也通常会更少些。
数据规模:
数据规模越大,需要更大的秩�
1.8 LoRA微调的模型参数选取
LoRA原始论文只研究了注意力参数��、��、��,和��。
论文基于GPT-3 175B,对比分析了训练预算有限时,关于LoRA的微调注意力参数的选择
在训练预算为18M时 (roughly 35MB if stored
in FP16) on GPT-3 175B,注意力权重全部选择时的效果最佳。
这表明,即使全部的注意力参数即使秩更小时(�=2),相比秩更大的(�=8)部分注意力参数,具有更强的建模能力。
在实际中,一般会把FFN的参数也考虑进来。
二、LoRA训练
LoRA反向传播的过程
LoRA训练时,将冻结预训练权重 �0,只优化低秩矩阵 �和�。
LoRA训练后,只需保存低秩矩阵的�和�参数。
2.1 LoRA训练的梯度计算
LoRA的计算图和梯度计算
� 和 �的梯度计算, �0不参与计算。
∂�∂�=∂�∂ℎ∂ℎ∂Δℎ∂Δℎ∂�=∂�∂ℎ(��)�∈��×�
∂�∂�=∂�∂ℎ∂ℎ∂Δℎ∂Δℎ∂�=��∂�∂ℎ��∈��×�
继续回传的梯度,包括�0这一路:
∂�∂�=∂�∂ℎ∂ℎ∂�=∂�∂ℎ(�0+��)�
2.2 反向传播计算量
全量微调前向计算: ℎ=�0�
全量微调反向计算:
∂�∂�0=∂�∂ℎ∂ℎ∂�0=∂�∂ℎ��∈��×�
∂�∂�=∂�∂ℎ∂ℎ∂�=∂�∂ℎ�0�
LoRA微调计算: ℎ=�0�+���
此时,微调的参数量从原来Δ�的�∗�,变成了� 和 �的2∗�∗�。
可知,2∗�∗�<<�∗�(有2�<<�)
不考虑pytorch或如llm.c的训练优化实现。可以看到,光梯度计算的话,实际计算量是增加了的。
2.3 LoRA在哪里减少了显存占用
�和�的参数、梯度和优化器状态是小头,暂时忽略。
预训练权重 �0的梯度和优化器状态存储开销,实际就是LoRA能大大减少了显存占用的关键。
在LoRA训练时,�0仍然会参与前向传播和反向传播,但是不会计算其对应梯度∂�∂�0,更不会更新其参数。
因此,这一步不再需要计算和保存梯度∂�∂�0,以及更新�0,也就不需要维护其优化器状态了。
以�=4096,�=16为例,这部分减少的梯度显存占用粗略估计为:�∗�−2∗�∗�=1−2��, 减少了99.2187%。
若以混合精度训练的视角来看,梯度为半精度bfl6,以Adaw optimizer为例,所有参与了LoRA训练的原始参数,其优化器状态Optimizer states(梯度的一阶矩(均值) + 二阶原始矩(有偏方差)+ 参数备份,均为全精度float32),是参数的3倍空间,也成比例减少了。
Adaw优化器
也就是说,加入LoRA训练的参数,对应的模型状态中的模型参数+梯度+优化器状态,节约了训练过程中优化器状态这部分的大头,引入了2个低秩矩阵的模型状态,这就是LoRA高效微调节约显存的原因。
2.4 LoRA Pytorch仿真
import torch
d = 4 # 模型维度为4
r = 2 # LoRA秩为2
x = torch.ones(d, requires_grad=True) # 输入tensor
y = torch.zeros(d) # 模拟计算损失的标签
# h = W0x + BAx LoRA计算
W_0 = torch.randn(d, d, requires_grad=False) # 预训练权重
B = torch.randn(d, r, requires_grad=True)
A = torch.randn(r, d, requires_grad=True)
delta_W = torch.matmul(B, A)
delta_h = torch.matmul(x, delta_W)
delta_h.retain_grad()
h = torch.matmul(x, W_0) + delta_h
h.retain_grad()
loss = torch.nn.functional.binary_cross_entropy_with_logits(h, y)
loss
损失:tensor(1.8470, grad_fn=<BinaryCrossEntropyWithLogitsBackward0>)
print(f"Gradient function for h = {h.grad_fn}")
print(f"Gradient function for loss = {loss.grad_fn}")
梯度函数:
Gradient function for h = <AddBackward0 object at 0x000002D6DE7D0D00>
Gradient function for loss = <BinaryCrossEntropyWithLogitsBackward0 object at 0x000002D6DE7D1DB0>
反向传播
loss.backward()
print(B.grad, (B.grad).shape)
print(A.grad, (A.grad).shape)
梯度值
tensor([[0.1928, 0.2755],
[0.1928, 0.2755],
[0.1928, 0.2755],
[0.1928, 0.2755]]) torch.Size([4, 2])
tensor([[-0.0582, -0.2058, -0.2852, -0.0059],
[ 0.0909, 0.3217, 0.4458, 0.0093]]) torch.Size([2, 4])
x.grad即 ∂�∂�
tensor([-0.1980, -0.1575, 0.4884, 0.5149])
计算值 ∂�∂�=∂�∂ℎ(�0+��)�
torch.matmul(h.grad, (W_0 + delta_W).T)
可以看到梯度值和torch计算梯度一样
tensor([-0.1980, -0.1575, 0.4884, 0.5149], grad_fn=<SqueezeBackward4>)
三、LoRA显存占用
按照LoRA论文报告的结果,LoRA微调使得在训练GPT3 175B时的,显存消耗从1.2TB降至350GB;
当�=4时,最终保存的模型从350GB降至35MB,极大降低了训练的开销。
下表,来源于LlamaFactory Github展示的微调LLM的最小硬件依赖估算值。
AMP为fp16混合精度训练,默认模型和梯度为fp16,优化器状态为fp32全精度。那么全参微调时,显存占用不考虑和序列长度相关的激活值,就至少为参数规模的16倍
半精度存储的10亿参数,占据空间1G * 2B=2GB , 以字节Byte为单位,模型参数2+梯度2+优化器状态12=16倍系数
例如7B参数,全参微调,默认占用7B *16 = 112B, 预估至少就要120GB空间了
方法 | 精度 | 7B | 13B | 30B | 70B | 8x7B | 8x22B |
---|---|---|---|---|---|---|---|
Full | AMP | 120GB | 240GB | 600GB | 1200GB | 900GB | 2400GB |
Full | 16 | 60GB | 120GB | 300GB | 600GB | 400GB | 1200GB |
Freeze | 16 | 20GB | 40GB | 80GB | 200GB | 160GB | 400GB |
LoRA/GaLore/BAdam | 16 | 16GB | 32GB | 64GB | 160GB | 120GB | 320GB |
QLoRA | 8 | 10GB | 20GB | 40GB | 80GB | 60GB | 160GB |
QLoRA | 4 | 6GB | 12GB | 24GB | 48GB | 30GB | 96GB |
QLoRA | 2 | 4GB | 8GB | 16GB | 24GB | 18GB | 48GB |
实际的使用情况:
- 一张16GB显存 T4,仅够6B或7B的模型在batchsize为1时,进行int4 QLoRA,这还只是考虑输入输出有限时。
- 一张32GB显存 V100,大致够6B或7B的模型在batchsize为1时,进行LoRA微调。
- 一张80GB显存 A800,Qwen1.5 72B 进行int4 QLoRA,以及例如Baichuan13B / Qwen14B的LoRA微调
- 2张A800 80GB显存,可以进行全参SFT或增量SFT
四、实验分析
4.1 BERT系列
对比了RoRERTa-base, RoRERTa-large和DeRERTa-XXL
判别任务实验可以发现,LoRA相比BitFit和Adpater(D,H,P三种),基本上都更好。
和全参微调FT对比,LoRA基本上是旗鼓相当甚至更好(不过我怀疑是可能是LoRA相比全参微调可以使劲调参)
当然,一般还是参数量越大的预训练模型微调效果越好。
调参的超参数
4.2 GPT2系列
对比了GPT-2 M和 GPT-2 L
在生成任务上。LoRa以更少或相当的参数,效果打败了PreLayer (即Prefix-layer tuning) 和Adpater(L,H)
4.3 GPT3规模
GPT3 175B参数
LoRA matches or exceeds the fine-tuning baseline on all three datasets
1、WikiSQL是NL2SQL任务,56355/8421 training/validation, 给定x = {table schema,query} ,预测 y ={ SQL}
2、SAMSum是对话摘要任务(2人),14732/819 training/test examples
LoRA微调,参数不是越多越好。甚至LoRA的效果还要优于FT。论文没有解释原因
不是所有的方法都随着微调参数增加,其效果也呈单调递增
4.4 GPT3规模是否要微调
当只有少数训练样本时,少样本学习或提示工程是非常有利的。
然而,在实践中,我们通常有能力为性能敏感型应用程序策划几千个或更多的训练示例。
GPT3 Few-shot和微调的对比结果
如上所示,与小样本上下文学习相比,对大规模或小规模的数据集微调都显著提升了效果。
对于几百亿参数如Qwen2-72B这种规模的开源LLM,写得比较好的提示词(CoStar目标+COT)+少量样本,可能媲美几十亿Qwen2-7B微调的效果。要想进一步提升效果,微调更大规模的LLM还是有用的(尽管有部署难度和推理时延)。
4.5 预训练参数和LoRA低秩适应参数的联系
∆ 和 在不同维度r上的归一化子空间的相似度比较
一、大模型风口已至:月薪30K+的AI岗正在批量诞生
2025年大模型应用呈现爆发式增长,根据工信部最新数据:
国内大模型相关岗位缺口达47万
初级工程师平均薪资28K
70%企业存在"能用模型不会调优"的痛点
真实案例:某二本机械专业学员,通过4个月系统学习,成功拿到某AI医疗公司大模型优化岗offer,薪资直接翻3倍!
二、如何学习大模型 AI ?
🔥AI取代的不是人类,而是不会用AI的人!麦肯锡最新报告显示:掌握AI工具的从业者生产效率提升47%,薪资溢价达34%!🚀
由于新岗位的生产效率,要优于被取代岗位的生产效率,所以实际上整个社会的生产效率是提升的。
但是具体到个人,只能说是:
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多互联网行业朋友无法获得正确的资料得到学习提升,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
1️⃣ 提示词工程:把ChatGPT从玩具变成生产工具
2️⃣ RAG系统:让大模型精准输出行业知识
3️⃣ 智能体开发:用AutoGPT打造24小时数字员工
📦熬了三个大夜整理的《AI进化工具包》送你:
✔️ 大厂内部LLM落地手册(含58个真实案例)
✔️ 提示词设计模板库(覆盖12大应用场景)
✔️ 私藏学习路径图(0基础到项目实战仅需90天)
第一阶段(10天):初阶应用
该阶段让大家对大模型 AI有一个最前沿的认识,对大模型 AI 的理解超过 95% 的人,可以在相关讨论时发表高级、不跟风、又接地气的见解,别人只会和 AI 聊天,而你能调教 AI,并能用代码将大模型和业务衔接。
* 大模型 AI 能干什么?
* 大模型是怎样获得「智能」的?
* 用好 AI 的核心心法
* 大模型应用业务架构
* 大模型应用技术架构
* 代码示例:向 GPT-3.5 灌入新知识
* 提示工程的意义和核心思想
* Prompt 典型构成
* 指令调优方法论
* 思维链和思维树
* Prompt 攻击和防范
* …
第二阶段(30天):高阶应用
该阶段我们正式进入大模型 AI 进阶实战学习,学会构造私有知识库,扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架,抓住最新的技术进展,适合 Python 和 JavaScript 程序员。
* 为什么要做 RAG
* 搭建一个简单的 ChatPDF
* 检索的基础概念
* 什么是向量表示(Embeddings)
* 向量数据库与向量检索
* 基于向量检索的 RAG
* 搭建 RAG 系统的扩展知识
* 混合检索与 RAG-Fusion 简介
* 向量模型本地部署
* …
第三阶段(30天):模型训练
恭喜你,如果学到这里,你基本可以找到一份大模型 AI相关的工作,自己也能训练 GPT 了!通过微调,训练自己的垂直大模型,能独立训练开源多模态大模型,掌握更多技术方案。
到此为止,大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗?
* 为什么要做 RAG
* 什么是模型
* 什么是模型训练
* 求解器 & 损失函数简介
* 小实验2:手写一个简单的神经网络并训练它
* 什么是训练/预训练/微调/轻量化微调
* Transformer结构简介
* 轻量化微调
* 实验数据集的构建
* …
第四阶段(20天):商业闭环
对全球大模型从性能、吞吐量、成本等方面有一定的认知,可以在云端和本地等多种环境下部署大模型,找到适合自己的项目/创业方向,做一名被 AI 武装的产品经理。
* 硬件选型
* 带你了解全球大模型
* 使用国产大模型服务
* 搭建 OpenAI 代理
* 热身:基于阿里云 PAI 部署 Stable Diffusion
* 在本地计算机运行大模型
* 大模型的私有化部署
* 基于 vLLM 部署大模型
* 案例:如何优雅地在阿里云私有部署开源大模型
* 部署一套开源 LLM 项目
* 内容安全
* 互联网信息服务算法备案
* …
学习是一个过程,只要学习就会有挑战。天道酬勤,你越努力,就会成为越优秀的自己。
如果你能在15天内完成所有的任务,那你堪称天才。然而,如果你能完成 60-70% 的内容,你就已经开始具备成为一名大模型 AI 的正确特征了。
这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】