返回首页

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 的秩,通常远小于 dk

所以 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_projv_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 更适合显存有限的场景。