Lazy loaded image
记录- LoRA微调
字数 2563阅读时长 7 分钟
2025-7-17
2025-9-6
AI智能摘要
GPT
这里是萌新AI,这篇文章介绍了 LoRA 微调的核心要点。首先,LoRA 借鉴高维矩阵可映射到低维的思想,通过两个低维矩阵(如秩 r=2)大幅降低参数量,例如将 64K 参数降至 1K,从而减少 GPU 显存占用并提升 Batch Size。其次,LoRA 采用分支结构,冻结原模型权重,只训练 LoRA 分支,避免增加模型深度导致推理延迟。文章还涵盖代码实践和常见疑惑点,强调该方法的效率和实用性。
URL
type
Post
status
Published
date
Jul 17, 2025
slug
LoRA
summary
LoRA
tags
深度学习
推荐
大模型
Pytorch
实用教程
category
深度学习
icon
password
😀
此篇博客主要记录LoRA学习过程:重要点、代码实践和疑惑点三个方面。有错误或者说法有歧义的地方,请伙伴们及时在下方评论指正。
Tips
  • 论文中的内容不会详细记录,仅仅记录Lora重要点。

📝 重要点

什么是LoRA

科研证明:在高维矩阵中,并不是每个元素都具有很大的作用。高维矩阵中有用的元素完全可以映射到低维矩阵。
LoRA便是借鉴该思想而诞生,用两个低维进行微调适配下游任务。
例子:
  • 以Transformer的Q为例:Q = torch.nn.Linear(256, 256),则线性层Q权重的shape为(256,256),参数量为256*256=65,536 = 64K。假设我们使用LoRA进行微调(只使用秩:r=2,不使用缩放因子),则对应的低维矩阵A和B的shape分别为(256, 2)和(2,256),参数量为256*2 + 2 * 256 = 1,024 = 1K。
  • 从这个例子我们可以发现LoRA相较于全参微调很大程度上降低了模型训练的参数量。模型训练的参数量降低,则训练时所占用的GPU显存减少。那么,进一步可以调整模型训练的Batch Size,提高模型训练的吞吐量。
上述例子,我们提到了低维矩阵A和低微矩阵B。那么,矩阵A和B如何实现LoRA微调?LoRA微调的模型结构是什么?接下来我们一一来解答。
首先,我们需要知道LoRA的模型结构是什么样子的!如下图(截取论文原图):
notion image
从图中可以简单地将LoRA结构理解为分支结构:一个是原模型(预训练权重)分支,一个是LoRA分支。原模型分支权重被冻结,不进行梯度计算。LoRA分支进行梯度计算。
看到这里,博主相信大家一定会有一个疑惑:为什么需要建立分支结构,而不是在预训练模型对应Linear后增加相应的Linear或者矩阵呢?这是因为建立分支结构,数据并行输入到原模型分支和LoRA分支。在训练和推理时,模型反馈结果没有延迟性。如果是在模型基础上增加Linear或者矩阵,模型深度增加。那么模型反馈结果相较于原模型具有一定的延迟性。
接着,我们分析矩阵A和B如何实现LoRA微调!LoRA微调是在原模型的基础上进行微调适配下游任务。既然,我们不去全参微调原模型权重W_0,那么我们增加一个权重△W。训练△W权重值,让W_0+△W适配下游任务。
再接着,为什么矩阵A初始为正态分布矩阵,矩阵B初始为0矩阵!首先分析为什么需要0矩阵,这是因为我们希望在训练开始时,能够获取到原模型的性能,通过原模型性能调整0矩阵。这会让LoRA是在原模型的基础上训练。如果没有0矩阵,而是随机初始化一个矩阵。这种情况会造成模型训练开始时的结果不再是原模型的结果。那么模型初始结果的好坏无法确定,会造成模型训练不稳定。接着分析为什么需要正态分布矩阵。根据正态分布特性,大多数数值会集中分布在一个区域,且数值一般会较小。这样在模型训练初期,模型的初始性能主要依赖于预训练模型。同时,根据正态分布特性,矩阵初始化的值大都集中分布在一个区域,每个值间的差值波动较小。这样在模型初期不会发生由于某个权重值太大或者太小造成梯度爆炸或者消失。
最后,我们进行一个总结:简单来说LoRA就是模型上的一个分支。通过训练两个低维矩阵,实现下游任务的适配。相较于全参微调,大大降低了参数量和训练成本。

LoRA的优点

其实,上述已经说了一些LoRA的优点,这里进行一个总结。
  • LoRA使用低维矩阵微调模型,大大缩减了模型的参数量,降低GPU显存占用。
  • 模型训练结束后,LoRA低维矩阵参数值合并到原模型中,这样原模型的结构没有发生变化,且不会增加任何推理延迟。
  • 在训练初期,LoRA的两个低维矩阵对整个模型的性能影响不是很大,低维矩阵的值可以有效的通过原模型的性能调整,不断适配下游任务。

🤗 代码实践

创建一个LoRA层很简单,但是如何将LoRA层嵌入到预训练模型目标层构建双分支结构是一个难题。
这里博主借鉴了DeepSpeed的LoRA相关代码简单实现。

代码流程

1、创建一个Attention类,用于构建模型。
2、创建一个LoRA类,用于构建LoRA层。
3、将模型目标层转换为LoRA模块。
4、将LoRA参数和原模型参数合并,并去掉LoRA分支。
5、其他函数
6、模型转换

总结

以上便是LoRA的简单代码,从代码中你可以发现,博主并没有训练该模型,只是简单测试LoRA层和原模型目标层相互转换。如果你想完成训练,需要博主完整的代码,那么请点击下方链接:

疑惑点

以下是博主个人的疑惑点,方便博主后面记录。如果伙伴们可以帮助博主解答,欢迎下方评论区留下评论。

疑惑点一:

博主目前接触到的大量LoRA微调都针对的是线性层,还没有发现有针对卷机微调的模型(著名模型)。如果有,请告知博主。

📎 参考文章

LoRA_05_01_基于GPT-2进行LoRA微调实战_哔哩哔哩_bilibili
在本课时中,我们将深入探讨微软开源的LoRA项目,并通过一个实际示例来演示如何在GPT-2模型上应用LoRA进行微调。此外,我们还将讲解如何对微调后的模型进行全面评估,包括性能测试和效果分析,以确保你能够理解和掌握微调技术的应用与评估方法。学习过程中有任何疑问随时在对应视频下方给我留言。如果觉得课程对你有帮助,请三连支持,感谢~, 视频播放量 3357、弹幕量 1、点赞数 46、投硬币枚数 27、收藏人数 65、转发人数 8, 视频作者 唐国梁Tommy, 作者简介 学无止境,一起加油!,相关视频:LoRA_04_基于PEFT进行llama3模型微调实战,LoRA_02_算法原理深入解析-下集,LoRA_03_案例演示 LoRA的核心逻辑,【系列课程】深度探索Llama 3 Torchrun分布式推理与特殊标记应用 大模型llama系列课程,QLoRA_01_课程简介,DeepSeek R1 原创项目 基于PyTorch QLoRA PEFT vLLM 实现R1蒸馏版大模型微调与部署 单卡/多卡两种方法,FlashRAG 大模型LLM与RAG研究利器 核心组件原理精讲,03_多模态_基于llama.cpp进行模型量化和推理,OpenAI Agents SDK 多智能体开发框架 常用代理模式 LLM大模型作为评判者 Agent智能体 AI大模型实战教程 写作助手Agent案例演示,案例实战-08-LLaMA与LangChain进行集成
LoRA_05_01_基于GPT-2进行LoRA微调实战_哔哩哔哩_bilibili
 
💡
以上便是LoRA的学习记录分享,欢迎您在底部评论区留言,一起交流~
 
上一篇
Paper-Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting
下一篇
记录- QLoRA微调

评论
Loading...