AI智能摘要
GPT
这里是萌新AI,这篇文章介绍了 LoRA 微调的核心要点。作者首先指出,LoRA 借鉴了高维矩阵可映射到低维的思想,通过两个低维矩阵 A 和 B 来微调模型,大幅减少了参数量和 GPU 显存占用,从而能提高训练吞吐量。文章接着解释了 LoRA 采用分支结构的原因:冻结原模型权重,仅训练 LoRA 分支,这样既能保持原模型性能,又避免了因增加网络深度而带来的延迟。整体来看,LoRA 是一种高效且实用的微调方法。
URL
type
status
date
slug
summary
tags
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的模型结构是什么样子的!如下图(截取论文原图):

从图中可以简单地将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的学习记录分享,欢迎您在底部评论区留言,一起交流~
上一篇
Paper-Informer: Beyond Efficient Transformer for Long Sequence Time-Series Forecasting
下一篇
记录- QLoRA微调
- 作者:不爱吃香菜的萌新
- 链接:https://hexo.levsongsw.com//deeplearn/LoRA
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。









