PEFT大模型高效微调概述
Parameter-Efficient Fine-Tuning(PEFT)是针对大型预训练模型的高效微调技术,通过只更新少量参数实现模型对下游任务的适配。
背景与动机
大模型微调的挑战
| 模型 | 参数量 | 全量微调显存需求 |
|---|---|---|
| GPT-2 | 1.5B | ~6GB |
| LLaMA-7B | 7B | ~28GB |
| GPT-3 | 175B | ~700GB |
| LLaMA-70B | 70B | ~280GB |
传统的全参数微调面临以下挑战:
- 计算成本高:需要计算所有参数的梯度
- 存储开销大:每个下游任务需要保存完整模型副本
- 训练不稳定:大模型全量微调容易导致灾难性遗忘
- 部署困难:难以在资源受限环境部署
PEFT的核心思想
PEFT的核心是在微调过程中保持预训练模型的大部分参数冻结(frozen),只更新少量额外参数或修改少量参数。
┌─────────────────────────────────────────────────────────────┐
│ 全量微调 (Full Fine-tuning) │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ 预训练模型 (全部参数可训练) → 任务适配模型 │ │
│ └─────────────────────────────────────────────────────┘ │
│ 参数量变化:175B → 175B │
└─────────────────────────────────────────────────────────────┘
┌─────────────────────────────────────────────────────────────┐
│ PEFT (Parameter-Efficient) │
│ ┌───────────────┐ ┌─────────────────────────┐ │
│ │ 预训练模型 │ + │ 少量可训练参数/模块 │ │
│ │ (冻结) │ │ (Adapter/LoRA/Prompt) │ │
│ └───────────────┘ └─────────────────────────┘ │
│ ↓ │
│ 任务适配模型 │
│ 参数量变化:175B → 冻结 + 几百万~几千万可训练参数 │
└─────────────────────────────────────────────────────────────┘
PEFT方法分类
根据操作方式,PEFT方法可分为四大类:
1. 加性微调(Additive PEFT)
在模型中添加额外的可训练模块或参数:
| 方法 | 描述 | 可训练参数量 |
|---|---|---|
| Adapter | 在Transformer层间插入瓶颈层 | 1-5% |
| Soft Prompt | 在输入嵌入前添加可学习向量 | 0.1-1% |
| Prefix Tuning | 在每层注意力添加前缀 | 0.1-3% |
2. 选择性微调(Selective PEFT)
从原模型中选择一部分参数进行微调:
| 方法 | 描述 |
|---|---|
| BitFit | 只微调偏置项 |
| 结构化Mask | 选择特定结构(如注意力头) |
3. 重参数化微调(Reparameterized PEFT)
将可训练参数重参数化为低维形式:
| 方法 | 描述 | 代表工作 |
|---|---|---|
| LoRA | 低秩分解 | Hu et al., ICLR 2022 |
| QLoRA | LoRA + 量化 | Dettmers et al., NeurIPS 2023 |
| DoRA | 权重分解 | Liu et al., 2024 |
4. 混合微调(Hybrid PEFT)
组合多种PEFT方法的优势:
# 混合PEFT示例
class HybridPEFT(nn.Module):
def __init__(self, base_model):
self.lora = LoRALinear(base_model) # LoRA组件
self.adapter = AdapterLayer(base_model) # Adapter组件
self.soft_prompt = SoftPrompt(...) # Soft Prompt组件方法对比
| 方法 | 可训练参数 | 推理开销 | 训练速度 | 效果 | 适用场景 |
|---|---|---|---|---|---|
| 全量微调 | 100% | 无 | 慢 | 最好 | 有充足资源 |
| LoRA | 0.1-5% | 略有增加 | 快 | 接近全量 | 通用首选 |
| QLoRA | 0.1-5% | 略有增加 | 中等 | 接近全量 | 资源受限 |
| Adapter | 1-5% | 有(层序贯) | 中等 | 良好 | 多任务 |
| Prefix Tuning | 0.1-3% | 无 | 快 | 良好 | 生成任务 |
| Prompt Tuning | <0.1% | 无 | 最快 | 较好 | 超大模型 |
| BitFit | <0.1% | 无 | 快 | 尚可 | 快速适配 |
核心原理
内在维度假说
LoRA的理论基础是**内在维度(Intrinsic Dimensionality)**假说:
预训练语言模型具有较小的内在维度,即存在一个低维度的参数子空间,足以实现有效学习。
设预训练权重 W₀ ∈ R^{d×k}
微调目标:学习 ΔW,使得 W₀ + ΔW 适配下游任务
内在维度假说:ΔW 可以被低秩分解
ΔW = BA,其中 B ∈ R^{d×r}, A ∈ R^{r×k}, r << min(d,k)
最终权重:W = W₀ + BA
任务相关性
不同PEFT方法捕捉不同类型的任务相关性:
┌────────────────────────────────────────────────────────────────┐
│ 任务相关性的层次 │
├────────────────────────────────────────────────────────────────┤
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Layer-1: 浅层特征(词嵌入、底层注意力) │ │
│ │ → 词法、句法信息 │ │
│ │ → 对应:Prompt Tuning, BitFit │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Layer-2: 中层特征(中间层注意力、前馈网络) │ │
│ │ → 语义信息、领域知识 │ │
│ │ → 对应:LoRA, Adapter │ │
│ └──────────────────────────────────────────────────────────┘ │
│ ↓ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ Layer-3: 深层特征(顶层注意力、输出层) │ │
│ │ → 任务特定知识、输出格式 │ │
│ │ → 对应:Last-layer FT, Full LoRA │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │
└────────────────────────────────────────────────────────────────┘
应用场景
1. 领域适配
# 医疗领域LLM适配
base_model = load_llm("llama-7b")
peft_config = LoraConfig(
r=8,
target_modules=["q_proj", "v_proj"],
task_type=TaskType.CAUSAL_LM
)
model = get_peft_model(base_model, peft_config)
# 只训练 ~0.1% 参数即可适配医疗领域2. 多任务学习
# 使用Adapter实现多任务
for task in ["sentiment", "ner", "qa"]:
adapter = AdapterLayer(d_model, reduction_factor=16)
# 每个任务独立一个Adapter3. 快速实验
# Prompt Tuning:最快的方式
model = load_model("gpt-3")
model.set_prompt(num_virtual_tokens=20) # 仅训练20个提示向量PEFT工具生态
| 工具 | 描述 | 支持方法 |
|---|---|---|
| HuggingFace PEFT | 最流行的PEFT库 | LoRA, QLoRA, Prefix, Prompt, AdaLoRA |
| torchtune | Meta的LLM微调库 | LoRA, QLoRA |
| peft | 通用PEFT框架 | 多种方法 |
| DeepSpeed | ZeRO优化 + PEFT | 分布式LoRA |
| LLaMA-Factory | 一站式微调平台 | 多种方法 + 量化 |