PEFT大模型高效微调概述

Parameter-Efficient Fine-Tuning(PEFT)是针对大型预训练模型的高效微调技术,通过只更新少量参数实现模型对下游任务的适配。

背景与动机

大模型微调的挑战

模型参数量全量微调显存需求
GPT-21.5B~6GB
LLaMA-7B7B~28GB
GPT-3175B~700GB
LLaMA-70B70B~280GB

传统的全参数微调面临以下挑战:

  1. 计算成本高:需要计算所有参数的梯度
  2. 存储开销大:每个下游任务需要保存完整模型副本
  3. 训练不稳定:大模型全量微调容易导致灾难性遗忘
  4. 部署困难:难以在资源受限环境部署

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
QLoRALoRA + 量化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%最好有充足资源
LoRA0.1-5%略有增加接近全量通用首选
QLoRA0.1-5%略有增加中等接近全量资源受限
Adapter1-5%有(层序贯)中等良好多任务
Prefix Tuning0.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)
    # 每个任务独立一个Adapter

3. 快速实验

# Prompt Tuning:最快的方式
model = load_model("gpt-3")
model.set_prompt(num_virtual_tokens=20)  # 仅训练20个提示向量

PEFT工具生态

工具描述支持方法
HuggingFace PEFT最流行的PEFT库LoRA, QLoRA, Prefix, Prompt, AdaLoRA
torchtuneMeta的LLM微调库LoRA, QLoRA
peft通用PEFT框架多种方法
DeepSpeedZeRO优化 + PEFT分布式LoRA
LLaMA-Factory一站式微调平台多种方法 + 量化

参考