大语言模型参数量动辄数十亿,全量微调需要极其昂贵的算力。LoRA(Low-Rank Adaptation,低秩适配) 通过冻结原模型、只训练少量低秩矩阵,把微调成本降低几个数量级。

核心思想

LoRA 认为模型权重的更新量具有低秩特性:对预训练权重 W0,增量 ΔW 可以分解为两个小矩阵的乘积:

W = W0 + ΔW = W0 + B·A

其中 B 的维度为 d×r、A 的维度为 r×k,秩 r 远小于 min(d, k)。训练时只更新 A、B,原权重冻结。

# 伪代码:LoRA 前向
def forward(x):
# h = W0 @ x + (B @ A) @ 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)
# 只有约 0.1% 的参数可训练!
model.print_trainable_parameters()

训练要点

  1. 秩 r 的选择:8~64 之间,任务越难越需要大秩
  2. 学习率:一般用全量微调的 5~10 倍(如 2e-4)
  3. 只训 LoRA 层:用 peft 后 optimizer 只接收可训练参数
  4. 合并权重:推理部署时执行 model.merge_and_unload() 恢复成单模型
merged = model.merge_and_unload()
merged.save_pretrained("./lora-merged")

LoRA 让个人开发者也能在消费级显卡上微调大模型,是当前 LLM 应用落地的关键技术之一。


欢迎来到极客小屋,这里记录着编程、运维与 AI 的学习与实践。

本站由 站长 使用 Stellar 主题创建。

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。