大模型微调技术综述
概述
本文整理自多篇技术文章,系统介绍大模型微调的核心概念、主流技术和实践方法。
一、什么是微调?
微调(Fine-Tuning) 是指在已经训练好的大型预训练模型的基础上,进一步训练该模型以适应特定任务或特定领域的数据。
预训练 vs 微调
| 阶段 | 目标 | 数据 |
|---|---|---|
| 预训练 | 学习通用语言规律(语法、语义、常识) | 海量无标注文本 |
| 微调 | 适应下游任务(情感分析、客服问答等) | 特定领域标注数据 |
为什么需要微调?
- 避免从头训练的天价成本
- 快速高效地定制大模型能力
- 在特定任务上取得更好的性能
厨师比喻
预训练模型就像一位米其林大厨,精通法餐。微调就是让他用原有厨艺基础,再专门学习川菜,最后既能做法餐,也能做出地道的麻婆豆腐。
二、微调技术分类
微调技术
├── 全量微调 (Full Fine-tuning)
│ └── 调整所有参数
└── 参数高效微调 (PEFT)
├── 增加额外参数
│ ├── Adapter Tuning
│ └── Soft Prompts (Prompt/Prefix Tuning)
├── 选取部分参数更新
│ └── BitFit
└── 引入重参数化
└── LoRA / QLoRA / DoRA
三、全量微调 (Full Fine-Tuning)
原理
解锁预训练模型的所有参数,在目标数据集上进行额外训练。
优缺点
| 优点 | 缺点 |
|---|---|
| 理论上能达到最佳性能上限 | 计算成本巨高(数百GB显存) |
| 适合数据充足的场景 | 存储成本高(每个任务一份完整模型) |
| 灾难性遗忘风险 |
资源消耗对比
| 模型 | 全量微调 | PEFT-LoRA | PEFT-LoRA + DeepSpeed |
|---|---|---|---|
| T0_3B (3B) | 47.14GB GPU | 14.4GB GPU | 9.8GB GPU |
| bloomz-7b1 (7B) | OOM | 32GB GPU | 18.1GB GPU |
| mt0-xxl (12B) | OOM | 56GB GPU | 22GB GPU |
四、参数高效微调 (PEFT)
核心思想
仅微调极小部分参数(通常<1%),冻结绝大部分预训练权重,显著降低资源需求。
4.1 LoRA (Low-Rank Adaptation) 🔥最流行
原理
模型在适应新任务时的权重更新矩阵(ΔW)具有低秩特性。
原始权重 W (冻结)
↓
输出 = W·x + ΔW·x
↑
ΔW = B × A (低秩分解)
A ∈ R^{d×r}, B ∈ R^{r×k}, r << min(d,k)
关键参数
r(rank): LoRA秩,建议值 8, 16, 32, 64, 128lora_alpha: 通常设为 rank 或 rank×2target_modules: 常见为q_proj, k_proj, v_proj, o_proj, gate_proj, up_proj, down_proj
优点
- ✅ 显著减少可训练参数量
- ✅ 不改变模型架构,零推理延迟(合并后)
- ✅ 效果通常优于 Adapter/Prompt Tuning
- ✅ 极其灵活,可应用于任意权重矩阵
4.2 QLoRA (Quantized LoRA)
原理
结合量化(将预训练权重量化为4-bit,如NF4)和 LoRA。
优势
- 在 24GB GPU 上可微调 33B 模型
- 几乎不损失精度
4.3 Adapter Tuning
原理
在 Transformer 层的 FFN 模块之后插入小型神经网络模块(Adapter)。
Adapter 结构:
DownProject (d→r) → Activation (ReLU) → UpProject (r→d)
其中 r << d
特点
- ✅ 显著减少可训练参数量
- ✅ 模块化设计,便于添加/移除
- ❌ 增加推理延迟(串行计算)
4.4 Prompt Tuning / Prefix Tuning
原理
不修改模型内部权重,通过学习特定的”软提示”来引导模型。
| 方法 | 描述 |
|---|---|
| Prompt Tuning | 在输入 token 序列前添加可学习向量 |
| Prefix Tuning | 可学习向量参与每一层 Transformer 计算 |
特点
- ✅ 参数效率极高
- ✅ 零推理延迟
- ❌ 效果严重依赖模型规模(通常需10B+参数)
4.5 BitFit
原理
极简方法!仅微调模型中的偏差项(Bias Terms)。
- 参数量最少(<0.1%)
- 性能通常弱于其他 PEFT 方法
五、技术选型指南
| 技术 | 可训练参数 | 推理延迟 | 资源要求 | 适用场景 |
|---|---|---|---|---|
| 全量微调 | 100% | = | 极高 | 资源充足,追求极致性能 |
| LoRA | <1% | = | 低 | 通用推荐,平衡效率与效果 |
| RA** | <1% | = | 极低 | 资源严格受限(如单卡) |
| Adapter | <1% | ↑ | 低-中 | 需模块化设计 |
| Prompt/Prefix | 极低 | = | 极低 | 超大模型(10B+) |
| BitFit | <0.1% | = | 极低 | 快速基线实验 |
选型核心考量
- 计算资源:资源紧张首选 QLoRA/LoRA
- 任务复杂度:复杂任务选 LoRA/全量微调
- 推理延迟:要求严格时避免 Adapter
- 模型规模:Prompt Tuning 在超大模型上效果更好
六、实战工具推荐
Unsloth
- 训练速度提高 2 倍
- VRAM 使用减少 70%
- 支持 8 倍长的上下文
Axolotl
- 极简开源框架
- 支持分布式训练
- 丰富的配置选项
Hugging Face PEFT
- 最广泛的框架支持
- 社区实践丰富
七、Function Calling 微调
为什么需要微调 Function Calling?
- Custom API Integration — 确保模型可靠调用特定函数
- Multi-Function Handling — 动态调用多个函数
- Enhanced Conversational Flow — 更自然地执行函数调用
训练数据格式
{
"messages": [
{"role": "user", "content": "帮我预约周四下午3点的眼科检查"},
{"role": "assistant", "content": "好的,让我帮您预约。"},
{"role": "a "content": null, "function_call": {
"name": "schedule_appointment",
"arguments": "{\"date\": \"Thursday\", \"time\": \"3 PM\", \"specialty\": \"Ophthalmologist\"}"
}
}
]
}关键注意事项
- 平衡训练数据 — 防止模型过度使用或忽略特定函数
- 充足数据量 — 确保模型能正确泛化
- 显式函数映射 — 每个对话流程对应正确的函数调用