大模型高效微调 LoRA 原理详解与训练过程分析
本文详细解析了低秩适应(LoRA)在大模型高效微调中的核心原理,包括其通过低秩分解近似增量参数的机制、显存优化策略及梯度计算过程。文章阐述了为何 LoRA 能减少训练参数量而不影响推理性能,分析了秩 r 和系数 alpha 的选择对微调效果的影响,并对比了不同微调方法的硬件需求。最后总结了 LoRA 在实际应用中的参数配置建议,为开发者提供从理论到实践的完整指导。

本文详细解析了低秩适应(LoRA)在大模型高效微调中的核心原理,包括其通过低秩分解近似增量参数的机制、显存优化策略及梯度计算过程。文章阐述了为何 LoRA 能减少训练参数量而不影响推理性能,分析了秩 r 和系数 alpha 的选择对微调效果的影响,并对比了不同微调方法的硬件需求。最后总结了 LoRA 在实际应用中的参数配置建议,为开发者提供从理论到实践的完整指导。

LoRA(Low-Rank Adaptation of LLMs),即大语言模型的秩适应,是目前参数高效微调(PEFT)中最常用的方法之一。
LoRA 的本质是用更少的训练参数来近似全参数微调所得的增量参数,从而达到在有限显存下实现高效微调的目标。
LoRA 的训练目标通常与预训练任务解耦,但在本分析中设定为语言建模任务。以下给出语言建模的基本符号定义,即最大化给定提示的条件概率(本质是极大似然估计)。
给定一个参数为 $\mathbf{\Phi}$ 的预训练自回归语言模型 $P_{\mathbf{\Phi}}(y|x)$。 其中 $x$ 为输入序列,$y$ 为输出序列。 注:为与原文符号一致,下文 $\mathbf{\Phi}$、$\mathbf{\Theta}$、$\mathbf{W}$ 均表示模型参数。
全参数微调
每次 Full Fine-tuning 训练,需要学习一个增量矩阵 $\Delta \mathbf{\Phi}$。由于 $|\Delta \mathbf{\Phi}|$ 参数量巨大,对显存和计算资源要求极高。
![图片]
语言模型的条件概率分布建模目标。
高效微调
$\Delta \mathbf{\Phi}$ 是特定于下游任务的增量参数。LoRA 将 $\Delta \mathbf{\Phi} = \Delta \mathbf{\Phi}(\mathbf{\Theta})$,用参数量更少的 $\mathbf{\Theta}$ 来编码(通过低秩降维表示来近似),满足 $|\mathbf{\Phi}| << |\mathbf{\Theta}|$。
![图片]
LoRA 训练目标。
Transformer 架构参数
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 权重合并,因此在推理阶段不存在额外开销。
背景
通常,冻结预训练模型权重并额外插入可训练权重是常规做法,例如 Adapter。可训练的权重学习的是微调数据的知识。 但它们的问题在于,不仅额外增加了参数,而且还改变了模型结构。 这会导致模型训练、推理的计算成本和内存占用急剧增加,尤其在模型参数需在多 GPU 上分布式推理时(这越来越常见)。
![图片]
推理性能比较。
动机
深度网络由大量 Dense 层构成,这些参数矩阵通常是满秩的。 相关工作表明,当适配特定任务时,训练学到的过度参数化的模型实际上存在于一个较低的内在维度上(高维数据实际是在低维子空间中)。
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 在下游任务上微调得到的增量参数矩阵 $\Delta \mathbf{W}$ 是低秩的(肯定不是满秩),即存在冗余参数或高度相关的参数矩阵,但实际有效参数是更低维度的。
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 遂设想,对全参数微调的增量参数矩阵 $\Delta \mathbf{W}$ 进行低秩分解近似表示(即对参数做降维)。
![图片]
PCA 降维示意图。
这样训练 $\Delta \mathbf{W}$ 的低秩分解近似参数矩阵,效果上相比其他 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 的具体方案。
![图片]
LoRA 就是低秩矩阵适应,在冻结原有 LLM 参数时,用参数量更小的矩阵进行低秩近似训练。
LoRA 原理
对于预训练权重矩阵 $\mathbf{W}_{0} \in \mathbb{R}^{d \times d}$,LoRA 限制了其更新方式,即将全参微调的增量参数矩阵 $\Delta \mathbf{W}$ 表示为两个参数量更小的矩阵 $\mathbf{B}$ 和 $\mathbf{A}$ 的低秩近似:
$$\mathbf{W}{0} + \Delta \mathbf{W} = \mathbf{W}{0}+ \mathbf{B}\mathbf{A}$$
其中,$\mathbf{B}\in \mathbb{R}^{d \times r}$ 和 $\mathbf{A}\in \mathbb{R}^{r \times d}$ 为 LoRA 低秩适应的权重矩阵,秩 $r$ 远小于 $d$。 此时,微调的参数量从原来 $\Delta \mathbf{W}$ 的 $dd$,变成了 $\mathbf{B}$ 和 $\mathbf{A}$ 的 $2rd$。可知,$2rd << dd$(有 $2r << d$)。
![图片]
给定输入 $\mathbf{x} \in \mathbb{R}^{d}$,添加 LoRA 后的输出 $\mathbf{h} \in \mathbb{R}^{d}$:
$$\mathbf{h} = (\mathbf{W}{0} + \Delta \mathbf{W} ) \mathbf{x} = \mathbf{W}{0}\mathbf{x} + \mathbf{B}\mathbf{A} \mathbf{x}$$
这里,将 $\Delta \mathbf{h}=\mathbf{B}\mathbf{A} \mathbf{x}$,便于后续求导计算。
在训练时,原始参数 $\mathbf{W}{0}$ 被冻结,意味着 $\mathbf{W}{0}$ 虽然会参与前向传播和反向传播,但是不会计算其对应梯度 $\frac{\partial L}{\partial \mathbf{W}_0}$,更不会更新其参数。
在推理时,直接按上面的式子将 $\mathbf{B}\mathbf{A}$ 合并到 $\mathbf{W}_{0}$ 中,因此相比原始 LLM 不存在推理延时。
在开始训练时:
这使得训练开始前,LoRA 的旁路 $\mathbf{B}\mathbf{A}=0$,那么微调就能从预训练权重 $\mathbf{W}_{0}$ 开始。 这样就能和全参数微调时一样,能有相同的初始状态。 这个策略要求,至少 $\mathbf{B}$ 和 $\mathbf{A}$ 中有一个被初始化为全 0 项。 但如果两者全被初始化为 0,$\mathbf{B}$ 和 $\mathbf{A}$ 就训不动了。因为,$\mathbf{B}$ 和 $\mathbf{A}$ 全 0 时,处于鞍点,两个权重的梯度也全为 0。 ($\mathbf{B}$ 的梯度 $\frac{\partial L}{\partial \mathbf{B}}$ 依赖 $\mathbf{A}$,$\mathbf{A}$ 的梯度 $\frac{\partial L}{\partial \mathbf{A}}$ 依赖 $\mathbf{B}$,如果仅一项为 0 训练是可以启动的)
实际实现时,$\Delta \mathbf{W} = \mathbf{B}\mathbf{A}$ 会乘以系数 $\frac{\alpha}{r}$ 与原始预训练权重合并 $\mathbf{W}_{0}$,$\alpha$ 是一个超参:
$$\mathbf{h} = (\mathbf{W}_{0} + \frac{\alpha}{r} \Delta \mathbf{W})\mathbf{x}$$
直观来看,系数 $\frac{\alpha}{r}$ 决定了在下游任务上微调得到的 LoRA 低秩适应的权重矩阵 $\mathbf{B}\mathbf{A}$ 占最终模型参数的比例。
给定一个或多个下游任务数据,进行 LoRA 微调:
一般来说,在给定任务上 LoRA 微调,让 $\alpha$ 为 $r$ 的 2 倍数。(太大容易过头,太小学不动。)
根据经验,LoRA 训练大概很难注入新的知识,更多是修改 LLM 的指令遵循的能力,例如输出风格和格式。原始的 LLM 能力,是在预训练时获得的(取决于参数量、数据规模及数据质量)。
LoRA 的秩 $r$ 决定,LoRA 的低秩近似矩阵的拟合能力,实际任务需要调参挑选合适的秩 $r$ 维度。系数 $\frac{\alpha}{r}$ 中 $\alpha$ 决定新老权重的占比。
和推荐系统中的评分矩阵分解、文本的非负矩阵分解,以及奇异值分解一样。LoRA 的低秩分解近似矩阵 $\mathbf{B}$ 和 $\mathbf{A}$ 的秩 $r$ 的大小,决定了其拟合能力。
理想的情况是找到一个秩 $r$,使得 LoRA 的低秩近似结构 $\mathbf{B}\mathbf{A}$ 能具备全参数微调的增量矩阵 $\Delta \mathbf{W}$ 的表达能力,能越接近越好。
秩 $r$ 成为了 LoRA 的超参数,随着秩 $r$ 维度的不断增加,参与训练的参数量也随之增加,LoRA 的低秩适应能力将逐渐提高甚至过拟合。
![图片]
论文基于 GPT-3 175B,WikiSQL 和 MultiNLI 数据上,进行了关于 LoRA 秩 $r$ 选取的实验分析。 Weight Type 指明对 Attention 的那部分参数做了低秩适应。可以发现,在这个 2 个数据集上,$r=4,8$ 时基本上要略优于 $r=64$ 的效果。更高的 $r$ 不一定带来更好的效果。
作者指出,增加 $r$ 并不能涵盖更有意义的子空间,这表明低秩适应矩阵就足够了。但是,并不可能期望一个小的 $r$ 适用于每个任务或数据集。
一些秩 $r$ 选取经验:
微调的下游任务: 简单任务所需的秩 $r$ 不大,任务越难/多任务混合的情况,需要更大的秩 $r$。
基座能力: 越强的基座,所需的秩 $r$ 应该更小。例如 Qwen2-72B-Instruct 对比 Qwen2-7B-Instruct。 越强的基座在处理同等任务时,需要微调的样本数也通常会更少些。
数据规模: 数据规模越大,需要更大的秩 $r$。
LoRA 原始论文只研究了注意力参数 $\mathbf{W_q}$、$\mathbf{W_k}$、$\mathbf{W_v}$ 和 $\mathbf{W_o}$。
![图片]
论文基于 GPT-3 175B,对比分析了训练预算有限时,关于 LoRA 的微调注意力参数的选择。 在训练预算为 18M 时 (roughly 35MB if stored in FP16) on GPT-3 175B,注意力权重全部选择时的效果最佳。 这表明,即使全部的注意力参数即使秩更小时($r=2$),相比秩更大的($r=8$)部分注意力参数,具有更强的建模能力。
在实际中,一般会把 FFN 的参数也考虑进来。
![图片]
LoRA 反向传播的过程。
LoRA 训练时,将冻结预训练权重 $\mathbf{W_0}$,只优化低秩矩阵 $\mathbf{B}$ 和 $\mathbf{A}$。 LoRA 训练后,只需保存低秩矩阵的 $\mathbf{B}$ 和 $\mathbf{A}$ 参数。
![图片]
LoRA 的计算图和梯度计算。
$\mathbf{B}$ 和 $\mathbf{A}$ 的梯度计算,$\mathbf{W}_{0}$ 不参与计算。
$$\frac{\partial L}{\partial \mathbf{B}} = \frac{\partial L}{\partial \mathbf{h}} \frac{\partial \mathbf{h}}{\partial \Delta \mathbf{h}} \frac{\partial \Delta \mathbf{h}}{\partial \mathbf{B}} = \frac{\partial L}{\partial \mathbf{h}} (\mathbf{Ax})^{\mathsf{T}} \in \mathbb{R}^{d \times r}$$
$$\frac{\partial L}{\partial \mathbf{A}} = \frac{\partial L}{\partial \mathbf{h}} \frac{\partial \mathbf{h}}{\partial \Delta \mathbf{h}} \frac{\partial \Delta \mathbf{h}}{\partial \mathbf{A}} = \mathbf{B}^{\mathsf{T}} \frac{\partial L}{\partial \mathbf{h}} \mathbf{x}^{\mathsf{T}} \in \mathbb{R}^{r \times d}$$
继续回传的梯度,包括 $\mathbf{W}_{0}$ 这一路:
$$\frac{\partial L}{\partial \mathbf{x}} = \frac{\partial L}{\partial \mathbf{h}} \frac{\partial \mathbf{h}}{\partial \mathbf{x}} = \frac{\partial L}{\partial \mathbf{h}} (\mathbf{W}_{0} + \mathbf{B}\mathbf{A})^{\mathsf{T}} \in \mathbb{R}^{d}$$
全量微调前向计算:$\mathbf{h} = \mathbf{W}_0 \mathbf{x}$
全量微调反向计算:
$$\frac{\partial L}{\partial \mathbf{W}{0}} = \frac{\partial L}{\partial \mathbf{h}} \frac{\partial \mathbf{h}}{\partial \mathbf{W}{0}} = \frac{\partial L}{\partial \mathbf{h}} \mathbf{x}^{\mathsf{T}} \in \mathbb{R}^{d \times d}$$
$$\frac{\partial L}{\partial \mathbf{x}} = \frac{\partial L}{\partial \mathbf{h}} \frac{\partial \mathbf{h}}{\partial \mathbf{x}} = \frac{\partial L}{\partial \mathbf{h}} \mathbf{W}_{0}^{\mathsf{T}} \in \mathbb{R}^{d }$$
LoRA 微调计算:$\mathbf{h} = \mathbf{W}_{0}\mathbf{x} + \mathbf{B}\mathbf{A} \mathbf{x}$
此时,微调的参数量从原来 $\Delta \mathbf{W}$ 的 $dd$,变成了 $\mathbf{B}$ 和 $\mathbf{A}$ 的 $2rd$。可知,$2rd << dd$(有 $2r << d$)。
不考虑 PyTorch、llm.c 或 8-bit 优化器、Float8 的训练优化实现。可以看到,光梯度计算的话,实际计算量是增加了的。
$\mathbf{B}$ 和 $\mathbf{A}$ 的梯度是小头,这里暂时忽略。
预训练权重 $\mathbf{W_0}$ 的梯度存储开销,实际就是 LoRA 能大大减少显存占用的关键。
在 LoRA 训练时,$\mathbf{W_0}$ 仍然会参与前向传播和反向传播,但是不会计算其对应梯度 $\frac{\partial L}{\partial \mathbf{W}_0}$,更不会更新其参数。
因此,这一步不再需要计算和保存梯度 $\frac{\partial L}{\partial \mathbf{W}_0}$,以及更新 $\mathbf{W_0}$。
以 $d=4096, r=16$ 为例,这部分减少的梯度显存占用粗略估计为:$dd - 2d*r = 1 - \frac{2r}{d}$,减少了 99.2187%。
若以 Adam optimizer 的视角来看,其优化器所需维护的 states(梯度的一阶矩(均值)和二阶原始矩(有偏方差)),那么显存占用减少得更多。
按照 LoRA 论文报告的结果,LoRA 微调使得在训练 GPT3 175B 时的显存消耗从 1.2TB 降至 350GB;
当 $r=4$ 时,最终保存的模型从 350GB 降至 35MB,极大降低了训练的开销。
下表,来源于 LlamaFactory Github 展示的微调 LLM 的最小硬件依赖估算值。
| 方法 | 精度 | 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 |
实际的使用情况:
基于上述理论分析,在实际工程落地中,建议关注以下几点以提升微调效率和效果:
虽然原始 LoRA 论文主要针对 Attention 层($W_q, W_k, W_v, W_o$),但在实践中,针对 FFN 层(Feed Forward Network)应用 LoRA 往往能带来更好的性能提升,尤其是在处理复杂逻辑推理任务时。
秩 $r$ 的选择:
缩放系数 $\alpha$ 的设置:
学习率调整:
LoRA 的一个显著优势是推理时无额外开销,前提是完成权重合并。
LoRA 通过低秩分解的思想,巧妙地解决了大模型微调中显存不足和训练成本高的问题。它在不改变模型结构的前提下,实现了高效的参数更新,并在推理阶段保持了与原模型一致的延迟表现。
本文详细梳理了 LoRA 的数学原理、梯度计算机制、显存优化逻辑以及实际应用中的参数选择策略。对于开发者而言,理解 LoRA 的核心机制有助于更好地配置微调实验,平衡性能与资源消耗。随着大模型技术的演进,LoRA 及其变体(如 QLoRA、DoRA 等)将继续成为垂直领域模型落地的关键技术栈。
在实际应用中,建议结合具体任务难度和数据规模,灵活调整秩 $r$ 和缩放系数 $\alpha$,并充分利用现有的开源框架(如 HuggingFace PEFT、LlamaFactory)加速开发流程。通过合理的资源配置和参数调优,LoRA 能够赋能企业在有限的算力条件下,构建高质量的大模型应用。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online