大语言模型参数量动辄数十亿,全量微调需要极其昂贵的算力。LoRA(Low-Rank Adaptation,低秩适配) 通过冻结原模型、只训练少量低秩矩阵,把微调成本降低几个数量级。
核心思想
LoRA 认为模型权重的更新量具有低秩特性:对预训练权重 W0,增量 ΔW 可以分解为两个小矩阵的乘积:
其中 B 的维度为 d×r、A 的维度为 r×k,秩 r 远小于 min(d, k)。训练时只更新 A、B,原权重冻结。
def forward(x): return W0(x) + scaling * (B @ (A @ x))
|
用 PEFT 实战微调
from transformers import AutoModelForCausalLM from peft import LoraConfig, get_peft_model
model = AutoModelForCausalLM.from_pretrained("Qwen/Qwen2.5-7B")
lora_config = LoraConfig( r=8, lora_alpha=32, target_modules=["q_proj", "k_proj", "v_proj", "o_proj"], lora_dropout=0.05, )
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()
|
训练要点
- 秩 r 的选择:8~64 之间,任务越难越需要大秩
- 学习率:一般用全量微调的 5~10 倍(如 2e-4)
- 只训 LoRA 层:用
peft 后 optimizer 只接收可训练参数
- 合并权重:推理部署时执行
model.merge_and_unload() 恢复成单模型
merged = model.merge_and_unload() merged.save_pretrained("./lora-merged")
|
LoRA 让个人开发者也能在消费级显卡上微调大模型,是当前 LLM 应用落地的关键技术之一。