📖 定义
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 模块,支持多任务动态切换