高效微调(PEFT)是指在不修改原始大模型参数或仅训练少量新增参数的前提下,使模型适应下游任务的技术。它解决了全参数微调(Full Fine-Tuning)显存消耗大、成本高的问题

一、LoRA(Low-Rank Adaptation) —— 最主流

1. 原理

在注意力层的权重矩阵 W 上添加一个低秩矩阵 ΔW=BA ,其中:

  • B\in R^{d\times r}

  • A\in R^{r\times k}

  • r≪d,k (典型 r=8,16,64 )

只训练 A 和 B ,参数量大幅减少。

2. 优点

  • 显存节省 70%~90%

  • 训练速度快

  • 支持多任务(不同任务用不同 LoRA 权重)

  • 可与 SFT、DPO 结合

3. 示例代码

from peft import LoraConfig, get_peft_model

lora_config = LoraConfig(
    r=64,
    lora_alpha=16,
    target_modules=["q_proj", "v_proj"],  # Qwen/VL 模型常用
    lora_dropout=0.1,
    bias="none",
    task_type="CAUSAL_LM"
)

model = get_peft_model(model, lora_config)

二、QLoRA(Quantized LoRA) —— 单卡微调百亿模型

1. 原理

在 LoRA 基础上,使用 4-bit 量化(来自 bitsandbytes 库),将模型权重压缩为 NF4 或 FP4 格式。

2. 优点

  • 可在 24GB 显存上微调 65B 模型

  • 推理时可合并 LoRA 权重,无性能损失

3. 实现

from transformers import BitsAndBytesConfig

quantization_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_compute_dtype=torch.bfloat16
)

model = AutoModelForCausalLM.from_pretrained(
    "meta-llama/Llama-3.1-8B",
    device_map="auto",
    quantization_config=quantization_config
)

model = get_peft_model(model, lora_config)

三、Adapter Tuning

  • 结构:在 Transformer 层中插入小型神经网络模块(Adapter),即MLP(通常维度256→768→256)

  • 保持原始模型参数冻结,仅更新新增模块

四、Prefix Tuning / Prompt Tuning

1. 原理

  • Prefix Tuning:在输入前添加可学习的“前缀向量”

  • Prompt Tuning:类似,但只在输入层添加

2. 优点

  • 完全冻结模型

  • 参数极小

3. 缺点

  • 效果不如 LoRA 稳定

  • 难以跨任务迁移

五、核心区别拆解

维度

全参数微调

LoRA

Adapter

Prompt Tuning

可训练参数比例

100%

0.01%-0.1%

0.1%-1%

0.001%-0.01%

核心操作

权重全量更新

低秩矩阵注入

小模块插入

可学习前缀添加

存储开销

保存完整模型

仅存A/B矩阵

存储模块参数

存储prefix embedding

推理延迟

无额外开销

矩阵乘法叠加

模块串联计算

输入拼接处理

典型代表

BERT微调

[lora_rank=64]

[中间层MLP]

P-Tuning v2

六、LoRA为何不适用于所有模型结构?

→ 限制场景:

  1. Embedding层(低秩假设不成立)

  2. 深度CNN(通道维度低秩受限)

  3. 动态架构(如Switch Transformer)

更多推荐