零压力了解 LoRA 微调原理

部署运行你感兴趣的模型镜像

在这里插入图片描述

写在最前

LoRA 全称为 Low-Rank Adaptation,翻译成中文就是低秩适配

⊙﹏⊙ 是不是一头雾水?没关系,相信我,看完下文你就会明白个大概了

那如果还不懂怎么办呢?那就请狠狠的给我一键三连,以示鼓励吧 ¬‿¬


直入正文

丹尼尔:蛋兄,我常常听到 LoRA 微调,那什么是 LoRA 呢?它又为什么可以加速微调呢?原理是什么呢?

蛋先生:这个问题问得好!但是能不能别一下子全问完,不然这篇文章就没法写了 ╮(╯▽╰)╭

丹尼尔:😜 Sorry!那先说说什么是 LoRA 吧

蛋先生:LoRA 全称 Low-Rank Adaptation,中文叫低秩适配。

丹尼尔:开头讲过啦,看名字看不出什么啊,是不是名字起得不好,不能顾名思义?(¬_¬)

蛋先生:别急,等会我讲完原理,你就会觉得这个名字其实起得挺好的 ( ̄▽ ̄)ノ

先说说 LoRA 是什么吧,它是一种非常流行的大模型微调方法。大模型的参数很多,每个参数都去调整的话不仅消耗资源,而且并不是每个参数的调整都有意义。因此,我们需要一种方法,通过调整少量参数就能让大模型适应特定领域的任务,这就是 LoRA 的由来。

简单来说,LoRA 就是只调整模型权重里很小一部分参数,让预训练模型更好地适应特定(通常是小规模)的数据集 (๑•̀ㅂ•́)و✧

丹尼尔:它是怎么做到只调整一小部分参数的呢?

蛋先生:假设预训练大模型的原始权重参数为 W⁰,经过微调后的权重参数为 W,那么就有以下公式

W = W⁰ + △W

丹尼尔:这个 △W 就是权重参数调整的量(权重更新矩阵),也就是我们要学习的部分是吗?

蛋先生:没错!假设 W⁰ 是 100×100 的矩阵,那么 △W 也是 100×100 的矩阵,请问总共需要调整多少个参数?

丹尼尔:1 万啊

蛋先生:真聪明 ( ̄▽ ̄)b

丹尼尔:我谢谢你的夸奖哦,把我当小学生了 (╯°□°)╯

蛋先生:1 万个参数都调,这种称为全量微调

丹尼尔:那 LoRA 怎么优化?(o゚▽゚)o

蛋先生:别急,我们再来看一个矩阵乘积 AB(A 矩阵乘以 B 矩阵),A 是 100×{rank} 的矩阵,B 是 {rank}×100 的矩阵,它们的结果是什么形状的矩阵呢?

丹尼尔:无论 rank 取多少,AB 的结果都正好是 100×100 的矩阵。咦,这个结果正好跟 △W 形状一样!(⊙o⊙)

蛋先生:对了!所以在 LoRA 中,我们不再学习一个完整的 △W,而是直接把它参数化为 AB,这样天然就是低秩的。如果 rank 取 10,那么这两个矩阵共有多少个值(权重参数)呢?

丹尼尔:让我算算…100×10 + 10×100 = 2000 个参数!(≧∇≦)ノ

蛋先生:聪明!原来是 10000 个参数,现在只要 2000 个,只有原来的五分之一

丹尼尔:但有个疑问,△W≈A@B 这个为什么成立呢?

蛋先生:语言模型在下游任务中,不需要“彻底改写”原有能力,而是“往某些方向上调整”。这些调整在数学上往往集中在低秩子空间,所以这样做不会损失太多效果。就像画画时,你只需要在关键位置勾几笔,而不是把整张画重画一遍。

丹尼尔:如果 rank 取更少,那岂不是参数更少了

蛋先生:回到 LoRA 名称中的 low rank,不就是指这里要取更少的维度吗

丹尼尔:原来如此。那具体怎么应用到模型中?

蛋先生:我们可以选择原来的部分全连接层替换为 LoRA 层,用公式表示就是将 XW 替换成 XW⁰+XAB。

XW = X(W⁰+AB) = XW⁰+XAB

丹尼尔:哇,我好像看出来了,这里就体现了 adaption 适配!

蛋先生:没错!因为它不修改原来的权重,只是加了个扩展。编程原则有个开闭原则,对修改关闭,对扩展开放,这里就是这样的。

丹尼尔:那 W⁰ 和 A、B 怎么训练?

蛋先生:其中 W⁰ 是冻结的,我们只微调 A 和 B 即可。

丹尼尔:计算效率怎么样?

蛋先生:在训练时,前向传播虽然多了一次矩阵乘法,但因为参数大幅减少,反向传播的开销也随之下降,所以整体微调速度反而更快。而在推理时,可以把 W⁰+AB 合并成一个整体,几乎不会增加额外计算量。

丹尼尔:原来如此!那除了 A 和 B,还有别的可调参数吗?

蛋先生:当然,LoRA 公式中还会有缩放因子,rank 和缩放因子都属于超参数,可以在训练过程中进行调整。

丹尼尔:现在来看,LoRA 的名字起得确实不错


写在最后

在此声明,以上内容并不严谨。严谨与通俗易懂在表达上往往难以兼顾,就像安全与便利常常难以平衡一样 ( ̄~ ̄; )

因此,建议有兴趣的同学,在此基础上,自行查阅专业资料以获得更深入的了解

亲们,都到这了,要不,点赞或收藏或关注支持下我呗 o( ̄ ▽  ̄)d

关键字: LoRA, 大模型微调, LLM, AI,低秩适配, Fine-tuning, PEFT

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

### LoRA 和 ControlNets 技术详解 #### 一、LoRA (Low-Rank Adaptation) LoRA 是一种用于高效微调大型预训练模型的方法。其核心思想是通过引入低秩分解矩阵来减少参数更新的数量,从而降低计算成本并提高效率。 在传统的微调过程中,整个模型的参数都会被调整,这不仅增加了计算负担,也容易导致过拟合现象的发生。然而,在 LoRA 方法中,只有少量新增加的小型矩阵会被优化,而原始的大规模权重保持冻结状态。这种方法显著减少了需要训练的参数数量,使得资源受限环境下的部署成为可能[^1]。 具体实现方面,假设有一个全连接层 \(W \in R^{m\times n}\),那么可以将其拆分为两个更小维度的矩阵 \(A\in R^{m\times r}\) 和 \(B\in R^{r\times n}\),其中\(r\)远小于\(min(m,n)\)[^2]: ```python import torch.nn as nn class LowRankLinear(nn.Module): def __init__(self, in_features, out_features, rank=4): super(LowRankLinear, self).__init__() self.A = nn.Parameter(torch.randn(out_features, rank)) self.B = nn.Parameter(torch.randn(rank, in_features)) def forward(self, x): W_low_rank = torch.matmul(self.A, self.B) return torch.matmul(x, W_low_rank.T) ``` 以上代码片段展示了如何构建基于 LoRA 的线性变换模块。这里定义了一个 `LowRankLinear` 类继承自 PyTorch 中的标准神经网络组件,并实现了前向传播逻辑。 --- #### 二、ControlNets 架构解析 ControlNet 提供了一种全新的机制以增强条件生成能力,特别是在文本转图片的任务场景下表现出色。它能够有效解决传统扩散模型难以精确控制图像细节的问题,比如物体位置、形状以及纹理等方面的要求都可以得到更好的满足[^3]。 从技术角度来看,ControlNet 主要是通过对输入数据附加额外的信息通道完成对生成过程的影响调控作用。例如,在处理一张照片时除了基本像素值之外还可以加入边缘检测结果作为辅助指导信号传递给后续各阶段操作单元共同参与决策制定流程之中。这种设计思路类似于人类视觉系统工作原理——即利用多种感官协同合作提升认知水平。 此外,为了探索不同配置版本的效果差异情况开展了多项对比测试实验其中包括但不限于以下几个主要方向:采用普通卷积代替填充卷积初始化为高斯分布随机数;或者仅保留单一拷贝形式简化后的轻量化变体称为“ControlNet-lite”。所有这些改动均有助于深入理解哪些因素最影响最终输出质量的好坏程度[^4]。 --- #### 三、两者结合的实际应用场景分析 当我们将 LoRA 应用于 ControlNet 上时,则可以获得更加灵活高效的解决方案组合拳出击应对复杂挑战局面变得游刃有余起来。一方面借助前者带来的优势特性大幅削减了整体运算开销压力;另一方面又充分利用后者所提供的强大可控性能达成预期目标效果最大化呈现出来。 例如在一个典型的艺术创作平台当中,开发者们可能会先运用 LoRA 对基础骨干部分实施快速适配定制化改造升级措施然后再叠加植入特定风格导向性的 Condition Information 进一步细化完善作品表现力层次感等等诸多方面的改进成果显而易见令人满意不已! ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值