LoRA Low-Rank Adaptation

低秩适应 — 高效微调大模型的革命性方法

模型训练 参数高效 热门

📖 定义

LoRA(Low-Rank Adaptation,低秩适应)是一种参数高效微调(Parameter-Efficient Fine-Tuning, PEFT)技术。它通过引入少量可训练的低秩矩阵,在不改变预训练模型原始参数的情况下,实现对大语言模型的高效微调。

核心理念:冻结预训练权重,仅训练低秩分解矩阵,大幅减少训练参数和显存需求。

⚙️ 工作原理

传统微调需要更新模型所有参数,而 LoRA 基于一个关键假设:模型在微调时的权重更新具有低秩结构。

1

冻结原权重

保持预训练模型的原始权重矩阵 W 不变

2

引入低秩矩阵

训练两个小矩阵 A 和 B,使得 ΔW = B × A

3

前向传播

h = Wx + BAx,输出 = 原权重 + 低秩更新

其中,若原始权重 W ∈ R^{d×k},则 A ∈ R^{r×k},B ∈ R^{d×r},秩 r ≪ min(d,k),参数量从 d×k 降至 r×(d+k)。

🎯 核心优势

💾

显存节省

训练参数量减少 10,000 倍,可在消费级GPU上微调70B模型

训练加速

反向传播只需计算低秩矩阵梯度,训练速度提升 2-3 倍

🔄

快速切换

不同任务的 LoRA 权重可轻松切换,无需加载完整模型

💰

存储高效

单个 LoRA 权重文件通常只有几MB到几百MB

💻 代码示例

使用 PEFT 库进行 LoRA 微调

from transformers import AutoModelForCausalLM, AutoTokenizer, TrainingArguments
from peft import LoraConfig, get_peft_model, TaskType
from datasets import load_dataset

# 加载预训练模型
model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")
tokenizer = AutoTokenizer.from_pretrained("meta-llama/Llama-2-7b-hf")

# 配置 LoRA
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    r=16,                    # 低秩维度
    lora_alpha=32,           # 缩放参数
    lora_dropout=0.1,        # Dropout率
    target_modules=["q_proj", "v_proj"],  # 目标层
    bias="none"
)

# 应用 LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()  # 查看可训练参数量

# 准备数据
dataset = load_dataset("tatsu-lab/alpaca", split="train[:1000]")

# 训练配置
training_args = TrainingArguments(
    output_dir="./lora-alpaca",
    num_train_epochs=3,
    per_device_train_batch_size=4,
    learning_rate=2e-4,
    logging_steps=10,
    save_strategy="epoch"
)

# 开始训练
trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=dataset,
)
trainer.train()

# 保存 LoRA 权重
model.save_pretrained("./lora-weights")

加载并使用 LoRA 模型

from transformers import AutoModelForCausalLM
from peft import PeftModel

# 加载基础模型
base_model = AutoModelForCausalLM.from_pretrained("meta-llama/Llama-2-7b-hf")

# 加载 LoRA 权重
model = PeftModel.from_pretrained(base_model, "./lora-weights")

# 合并权重(可选,用于推理加速)
model = model.merge_and_unload()

# 推理
text = "解释什么是LoRA技术:"
inputs = tokenizer(text, return_tensors="pt")
outputs = model.generate(**inputs, max_length=200)
print(tokenizer.decode(outputs[0]))

🚀 应用场景

  • 领域适配:让通用模型学习医疗、法律等专业领域知识
  • 风格定制:训练特定写作风格或人格的对话模型
  • 多任务学习:为不同任务训练不同的 LoRA 模块,灵活组合
  • 低资源语言:用少量数据微调支持低资源语言
  • 个性化助手:基于用户数据创建个性化AI助手

🛠️ 关键超参数

rank (r) 低秩维度,通常 4-64,越大表达能力越强
lora_alpha 缩放系数,通常 2r,控制 LoRA 权重影响
target_modules 目标层,常用 q_proj、k_proj、v_proj、o_proj
lora_dropout 正则化参数,通常 0.01-0.1

📚 变体与扩展

QLoRA

量化 LoRA,将模型量化为 4-bit,进一步降低显存需求,可在单卡24GB显存上微调65B模型

DoRA

权重分解低秩适应,分别微调权重大小和方向,效果更稳定

LoRA-FA

冻结特征学习的 LoRA 变体,更适合迁移学习场景

Multi-LoRA

同时训练多个 LoRA 模块,支持多任务动态切换