LoRA
LoRA,全称Low-Rank Adaptation,是一种参数高效微调方法
LoRA: LOW-RANK ADAPTATION OF LARGE LANGUAGE MODELS
1. LoRA 是什么
LoRA,全称 Low-Rank Adaptation,是一种参数高效微调方法。
核心思想:
不直接更新大模型原有参数,而是在部分线性层旁边增加一个低秩增量矩阵,只训练这个小矩阵。
也就是说,原模型参数被冻结,只训练额外加入的 LoRA 参数。
2. 普通微调 vs LoRA 微调
普通全参数微调
普通微调会直接更新模型原始权重:
W → W'
其中 W 是模型中的权重矩阵。
缺点:
- 训练参数量大
- 显存占用高
- 优化器状态开销大
- 每个任务都要保存一份完整模型
LoRA 微调
LoRA 不直接修改原始权重,而是给原始权重加一个增量:
W' = W + ΔW
其中:
W:原模型权重,冻结不训练ΔW:任务适配产生的增量,只训练这一部分
LoRA 的关键是:ΔW 不直接用完整矩阵表示,而是拆成两个小矩阵相乘。
3. LoRA 的核心公式
原始线性层计算为:
y = Wx
LoRA 修改后变成:
y = Wx + BAx
其中:
ΔW = BA
假设原始权重矩阵是:
W ∈ R^(d × k)
LoRA 引入两个矩阵:
A ∈ R^(r × k)
B ∈ R^(d × r)
其中 r 是 LoRA 的秩,通常远小于 d 和 k。
所以 LoRA 实际训练的是:
A 和 B
而不是完整的 W。
4. 为什么 LoRA 参数量很小
假设一个线性层权重矩阵大小为:
4096 × 4096
全参数微调需要训练:
4096 × 4096 = 16,777,216 个参数
如果 LoRA 的 rank r = 8,则 LoRA 需要训练:
A: 8 × 4096
B: 4096 × 8
总参数量 = 65,536
相比原来的 1600 多万个参数,LoRA 只训练很小一部分。
5. “低秩”怎么理解
LoRA 的假设是:
大模型适配新任务时,不需要对原始权重做完整复杂的修改,只需要在少数几个方向上调整。
完整的权重变化是:
ΔW
但 LoRA 认为这个变化可以近似为:
ΔW = BA
因为 r 很小,所以 BA 是一个低秩矩阵。
直观理解:
原模型已经具备通用能力;
新任务只需要加一个小补丁;
这个补丁不需要完整大矩阵,只需要低秩增量。
6. LoRA 一般加在哪里
在 Transformer 模型中,LoRA 通常加在线性层上,尤其是 Attention 里的投影矩阵:
q_proj:Query 投影
k_proj:Key 投影
v_proj:Value 投影
o_proj:Attention 输出投影
常见配置:
target_modules = ["q_proj", "v_proj"]
也可以加到更多模块:
target_modules = ["q_proj", "k_proj", "v_proj", "o_proj"]
在一些大模型中,也会加到 MLP 层:
gate_proj
up_proj
down_proj
一般来说:
- 资源有限:优先加
q_proj、v_proj - 想要更强表达能力:可以加 Attention 全部投影层
- 任务更复杂:可以考虑 Attention + MLP
7. LoRA 的训练流程
LoRA 微调的大致流程:
1. 加载预训练大模型
2. 冻结原模型参数
3. 在指定线性层上插入 LoRA 模块
4. 只训练 LoRA 的 A、B 矩阵
5. 保存 LoRA adapter 参数
训练时:
原模型参数:不更新
LoRA 参数:更新
保存时:
只保存 LoRA adapter
因此一个基础模型可以对应多个 LoRA:
base model + 分类任务 LoRA
base model + 问答任务 LoRA
base model + 代码任务 LoRA
base model + 领域任务 LoRA
8. LoRA 的推理方式
LoRA 推理有两种方式。
方式一:不合并权重
推理时仍然使用:
y = Wx + BAx
这种方式可以动态切换不同 LoRA adapter。
方式二:合并权重
将 LoRA 增量合并回原模型:
W' = W + BA
合并后推理公式变回:
y = W'x
优点:
- 推理结构更简单
- 几乎没有额外计算分支
- 方便部署
9. LoRA 的重要超参数
rank r
控制 LoRA 的表达能力。
r 越大:参数更多,表达能力更强
r 越小:参数更少,但能力可能受限
常见取值:
8, 16, 32, 64
lora_alpha
控制 LoRA 增量的缩放强度。
常见形式:
ΔW = (alpha / r) · BA
可以理解为:控制 LoRA 对原模型的影响幅度。
target_modules
控制 LoRA 加到哪些模块。
例如:
["q_proj", "v_proj"]
lora_dropout
对 LoRA 分支做 dropout,减少过拟合。
常见取值:
0.05, 0.1
10. LoRA 的优点
LoRA 的主要优势:
- 训练参数少
- 显存占用低
- 训练速度更快
- 保存成本低
- 可以为不同任务保存不同 adapter
- 推理时可以合并回原模型
- 适合个人或小资源环境下微调大模型
11. LoRA 的局限
LoRA 也不是万能的。
可能的问题:
- rank 太小会限制表达能力
- 不适合所有任务
- target_modules 选择会影响效果
- 对复杂任务可能不如全参数微调
- 不同模型结构中模块名称可能不同
12. LoRA 和 QLoRA 的区别
LoRA
通常是:
底座模型:FP16 / BF16
LoRA 参数:FP16 / BF16
QLoRA
QLoRA 是 LoRA 的进一步省显存版本:
底座模型:INT4 量化并冻结
LoRA 参数:FP16 / BF16 训练
QLoRA 的核心是:
把大模型主体量化到 4bit,只训练 LoRA 小参数。
所以 QLoRA 更适合显存有限的场景。