
LoRA(Low-Rank Adaptation) 是一种 参数高效微调(Parameter-Efficient Fine-tuning, PEFT) 方法,通过在预训练模型的权重矩阵中引入 低秩分解(Low-Rank Decomposition),仅优化少量参数(低秩矩阵)来适配下游任务,从而显著减少计算和存储需求。
LoRA(Low-Rank Adaptation)作为大模型的微调框架十分实用,在 LoRA 出现以前本人都是通过手动修改参数、优化器或者层数来“炼丹”的,具有极大的盲目性,但是 LoRA 技术能够快速微调参数,如果 LoRA 微调后的效果不行,就可以转而修改优化器或模块了。而调整参数一步是工作量最大的,而且大模型的参数都是以亿为计数单位的,所以人工硬调参数变得不太可能,而 LoRA 就为这个提供了解决方法!
LoRA(Low-Rank Adaptation) 通过仅训练低秩矩阵,然后将这些参数注入到原始模型中,从而实现对模型的微调。这种方法不仅减少了计算需求,而且使得训练资源比直接训练原始模型要小得多,因此超级适合在资源有限的环境中使用。
一、关键术语
|
术语 |
解释 |
|
低秩矩阵(Low-Rank Matrix) |
通过矩阵分解得到的低维矩阵,用于近似原始权重矩阵的增量部分。 |
|
秩参数(Rank Parameter, r) |
控制低秩矩阵的维度,一般取值为8-64,权衡性能与效率。 |
|
适配器(Adapter) |
LoRA中用于存储低秩矩阵的轻量级模块。 |
|
原始权重(Base Weights) |
预训练模型的固定权重,仅在推理时与低秩矩阵相加。 |
二、背景信息
- 问题背景:
计算资源限制:全量微调(Full Fine-tuning)对超大规模模型(如GPT-3)的计算和显存要求极高。
过拟合风险:更新所有参数可能导致模型在小数据集上过拟合。
- 解决方案:
低秩近似:通过低秩矩阵捕捉任务特定的参数变化,仅优化少量参数。
理论依据:实验证明,神经网络的权重矩阵增量往往具有低秩结构。
三、核心原理

- 数学表明:
原始权重矩阵 W被分解为:

- 优势:
- 参数效率:仅需优化 2×r×d 个参数(原参数量的 ∼1%∼1%)。
- 通用性:适用于多种模型(如BERT、GPT、ViT)。
四、核心技术

(1) 低秩分解实现
- 步骤:

(2) 参数优化策略

(3) 与全量微调的对比
|
指标 |
LoRA |
全量微调 |
|
参数量 |
原参数的 ∼1%∼1% |
全部参数 |
|
训练速度 |
快(仅优化少量参数) |
慢(需更新全部参数) |
|
显存占用 |
低(仅存储低秩矩阵) |
高(需存储全部梯度) |
|
性能 |
接近全量微调(差距<1%) |
理论最优 |
五、微调步骤
1. 典型流程

|
步骤 |
描述 |
示例 |
|
加载预训练模型 |
加载预训练模型(如BERT、GPT)并冻结所有参数。 |
使用Hugging Face的transformers库加载BERT。 |
|
插入LoRA适配器 |
在指定层(如全连接层)中替换为LoRA层,设置秩参数 rr。 |
在BERT的Transformer层中插入LoRA。 |
|
配置训练参数 |
设置学习率、批次大小、训练轮次等超参数。 |
学习率:1e-4,批次大小:32,epoch:3。 |
|
训练与评估 |
仅优化LoRA参数,监控验证集性能。 |
监控准确率,动态调整 rr 或学习率。 |
|
推理部署 |
将LoRA参数与原始权重相加,导出完整模型或仅保存LoRA适配器。 |
导出为ONNX格式,部署到推理服务。 |
2. 详细过程

2.1 加载预训练模型
目的:加载基础模型(如BERT、GPT、ViT等),保留其原始权重。
代码示例(PyTorch + Hugging Face):
from transformers import AutoModelForSequenceClassification, AutoTokenizer
model_name = "bert-base-uncased"
model = AutoModelForSequenceClassification.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)
2.2 冻结原权重
目的:阻止原始权重在训练过程中更新,仅优化LoRA参数。
实现方法:
将所有参数的 requires_grad 设置为 False。
使用PEFT库的 freeze_base_model 方法(如Hugging Face的peft库)。
代码示例:
# 手动冻结所有参数
for param in model.parameters():
param.requires_grad = False
# 或使用PEFT的冻结方法
from peft import get_peft_config, get_peft_model
# 后续步骤中会展示完整配置
2.3 插入LoRA适配器
目的:在模型的特定层(如全连接层)中插入LoRA适配器,引入低秩矩阵。
关键参数:
秩参数(r):控制低秩矩阵的维度(一般取8-64)。
适配层选择:选择需要插入LoRA的层(如Transformer的注意力层或全连接层)。
代码示例(使用PEFT库):
from peft import LoraConfig, get_peft_model
# 定义LoRA配置
lora_config = LoraConfig(
r=8, # 秩参数
lora_alpha=32,# 推荐设置为r的倍数,如16或32
lora_dropout=0.1,
target_modules=["query", "value", "key", "dense"], # 指定插入LoRA的层
bias="none", # 是否调整偏置
task_type="SEQ_CLS" # 任务类型(如分类、生成等)
)
# 将LoRA适配器插入模型
model = get_peft_model(model, lora_config)
model.print_trainable_parameters() # 输出可训练参数量(仅LoRA参数)
2.4 配置训练参数
关键设置:
学习率:一般比全量微调低(如1e-4到5e-5)。
批次大小:根据显存调整,LoRA的显存占用较低,可适当增大。
优化器:AdamW 或 Adam(推荐)。
代码示例(使用Hugging Face Trainer):
from transformers import TrainingArguments, Trainer, DataCollatorWithPadding
training_args = TrainingArguments(
output_dir="./lora_results",
learning_rate=1e-4,
per_device_train_batch_size=32,
per_device_eval_batch_size=64,
num_train_epochs=3,
weight_decay=0.01,
logging_steps=10,
evaluation_strategy="epoch",
save_strategy="epoch",
load_best_model_at_end=True,
metric_for_best_model="accuracy",
)
2.5 数据准备与预处理
数据要求:
格式化数据集(如文本分类、序列标注等)。
使用模型对应的分词器(tokenizer)进行编码。
示例数据格式(文本分类):
from datasets import load_dataset
dataset = load_dataset("imdb") # 加载IMDb数据集
tokenized_datasets = dataset.map(
lambda examples: tokenizer(examples["text"], truncation=True, padding="max_length", max_length=512),
batched=True
)
2.6 训练模型
流程:
定义训练器(Trainer)。
启动训练,仅优化LoRA参数。
代码示例:
from transformers import DefaultDataCollator
data_collator = DataCollatorWithPadding(tokenizer=tokenizer)
trainer = Trainer(
model=model,
args=training_args,
train_dataset=tokenized_datasets["train"],
eval_dataset=tokenized_datasets["test"],
data_collator=data_collator,
)
trainer.train()
2.7 验证与调整
验证指标:根据任务选择(如准确率、F1-score、BLEU等)。
参数调优:
若性能不足,尝试增大秩参数(如r=16)。
调整学习率或增加训练轮次。
代码示例(评估):
eval_results = trainer.evaluate()
print(f"Validation Accuracy: {eval_results['eval_accuracy']}")
2.8 保存与推理
保存LoRA适配器:仅保存低秩矩阵,不保存原始权重。
model.save_pretrained("./lora_model") # 仅保存LoRA参数
推理时合并参数:
model = get_peft_model(model, lora_config)
model.load_state_dict(torch.load("./lora_model/pytorch_model.bin"))
model.merge_and_unload() # 合并LoRA参数到原始权重
3. 关键注意事项
3.1 冻结与适配层选择
- 冻结策略:仅冻结原始权重,确保LoRA参数独立更新。
- 适配层选择:
语言模型:一般在Transformer的注意力层(QKV)和全连接层插入LoRA。
视觉模型:在卷积层或全连接层插入。
3.2 秩参数(r)的选择
- 小r(如r=8):节省显存,但可能性能稍低。
- 大r(如r=32):提升性能,但增加计算量。
- 提议:通过实验在验证集上选择最优r值。
3.3 训练配置优化
- 学习率:一般比全量微调低1-2个数量级(如1e-4 vs 2e-5)。
- 混合精度训练:使用 amp(如tf.float16)减少显存占用。
六、资源与链接

1. 开源代码仓库
PEFT库(Hugging Face):
链接:
https://github.com/huggingface/peft
说明:提供LoRA、Adapter等PEFT方法的统一接口。
LoRA论文:
链接:
https://arxiv.org/abs/2106.09685
说明:提出LoRA的原始论文。
2. 数据集
IMDb数据集:https://ai.stanford.edu/
Hugging Face Datasets:https://huggingface.co/datasets
七、挑战与解决方案
|
挑战 |
解决方案 |
|
秩参数选择困难 |
通过实验选择 r(一般8-64),监控验证集性能。 |
|
任务适配性差异 |
对复杂任务(如多模态)增大 r 或结合其他 PEFT 方法。 |
|
推理速度下降 |
在推理前合并 LoRA 参数到原始权重(model.merge_and_unload())。 |
八、总结与展望
- 核心价值:
LoRA 在资源受限场景下(如边缘设备、小数据集)提供高性能与低资源消耗的平衡。
- 未来方向:
动态秩调整:根据任务动态调整 r。
多任务适配:结合 LoRA 与元学习(Meta-Learning)实现跨任务迁移。



















- 最新
- 最热
只看作者