微调技术(Fine-tuning)
微调是在预训练模型的基础上,用特定领域或任务的数据进一步训练模型,使其适应特定应用场景。如果说预训练让模型"通识百物",那微调就是让模型"专精一域"。本章详解各种微调方法,重点介绍当前最实用的 LoRA 系列技术。
微调是在预训练模型的基础上,用特定领域或任务的数据进一步训练模型,使其适应特定应用场景。如果说预训练让模型"通识百物",那微调就是让模型"专精一域"。本章详解各种微调方法,重点介绍当前最实用的 LoRA 系列技术。
建议完成第 02 章
微调 vs 预训练 vs RAG、全参数微调(Full Fine-tuning)、参数高效微调(PEFT)
能力扩展 · 大模型关键能力
文章导航
点击图中节点可定位到对应正文。
引言
微调是在预训练模型的基础上,用特定领域或任务的数据进一步训练模型,使其适应特定应用场景。如果说预训练让模型"通识百物",那微调就是让模型"专精一域"。本章详解各种微调方法,重点介绍当前最实用的 LoRA 系列技术。
1. 微调 vs 预训练 vs RAG
1.1 三者的定位
预训练(Pre-training):
目的:获取通用语言能力
数据:万亿 tokens 的通用文本
成本:数百万美元
频率:一次性(或定期重新训练)
微调(Fine-tuning):
目的:适应特定任务/领域/风格
数据:千到百万条标注数据
成本:数百到数万美元
频率:按需(新任务/新领域时)
RAG(检索增强生成):
目的:注入外部知识
数据:知识库文档
成本:低(不需要训练)
频率:实时更新知识库即可1.2 何时用微调,何时用 RAG
| 场景 | 推荐方案 | 理由 |
|---|---|---|
| 知识经常更新 | RAG | 更新文档即可,不需要重新训练 |
| 需要改变输出风格/格式 | 微调 | 改变模型行为,RAG 做不到 |
| 需要专业领域术语 | 微调 | 让模型内化领域语言 |
| 需要答案可溯源 | RAG | 可以指向具体文档来源 |
| 需要降低幻觉 | RAG + 微调 | RAG 提供事实,微调提升遵循能力 |
| 预算有限 | RAG | 不需要 GPU 训练资源 |
| 需要减少 prompt 长度 | 微调 | 模型已内化知识,不需要长提示 |
2. 全参数微调(Full Fine-tuning)
2.1 原理
直接对整个预训练模型的所有参数进行梯度更新:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
预训练模型(如 7B 参数)
↓
所有 7B 参数都参与梯度更新
↓
微调后的模型2.2 适用场景
- 有充足的计算资源
- 有大规模高质量标注数据(10 万条以上)
- 需要模型发生根本性的行为变化
- 构建领域专用基座模型(如医学、法律领域模型)
3. 参数高效微调(PEFT)
3.1 核心思想
不更新全部参数,而是训练少量"附加参数"来适配新任务:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
预训练模型(冻结大部分参数)+ 少量可训练参数
↓
只训练附加参数(通常 < 1% 的总参数)
↓
推理时合并附加参数,不增加推理延迟3.2 LoRA(Low-Rank Adaptation)
最流行的参数高效微调方法,由 Microsoft 在 2021 年提出。
核心原理:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
前向传播:
h = Wx + BAx
↑ ↑
原始输出 LoRA 增量LoRA 的关键优势:
| 优势 | 说明 |
|---|---|
| 参数高效 | 只需训练原参数量的 0.1-1% |
| 内存节省 | 70B 模型的 LoRA 只需 1-2 张 GPU |
| 无推理延迟 | 训练后可将 LoRA 权重合并到原模型 |
| 多任务切换 | 同一个基座模型 + 不同的 LoRA 适配器 |
| 存储节省 | 每个 LoRA 适配器只有几 MB |
3.3 QLoRA(Quantized LoRA)
在 LoRA 基础上结合量化,进一步降低显存需求:
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
1. 4-bit NormalFloat (NF4) 量化
- 将基础模型量化为 4-bit
- 信息论最优的量化方式
- 70B 模型从 140GB → ~35GB3.4 LoRA 配置参数
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=16, # LoRA 秩(rank),越大能力越强但参数越多
lora_alpha=32, # 缩放因子,通常设为 2*r
target_modules=[ # 对哪些层应用 LoRA
"q_proj", # 查询投影
"k_proj", # 键投影
"v_proj", # 值投影
"o_proj", # 输出投影
"gate_proj", # FFN 门控
"up_proj", # FFN 上升
"down_proj", # FFN 下降
],
lora_dropout=0.05, # Dropout 率,防止过拟合
bias="none", # 偏置的训练策略
task_type="CAUSAL_LM" # 任务类型
)
model = get_peft_model(base_model, lora_config)
model.print_trainable_parameters()
# 输出: trainable params: 20M || all params: 7B || trainable%: 0.28%3.5 其他 PEFT 方法
| 方法 | 原理 | 参数量 | 效果 |
|---|---|---|---|
| Adapter | 在 Transformer 层间插入小型适配器模块 | ~1-3% | 好 |
| Prefix Tuning | 在每层添加可学习的前缀向量 | ~0.1% | 中 |
| P-Tuning v2 | 在每层添加可学习的连续提示 | ~0.1-3% | 中-好 |
| LoRA | 低秩矩阵分解 | ~0.1-1% | 好(推荐) |
| QLoRA | 量化 + LoRA | ~0.1-1% | 好(最省显存) |
4. 微调数据准备
4.1 数据格式
**指令微调格式(最常用):**
[
{
"instruction": "将以下文本翻译成英文",
"input": "今天天气真好",
"output": "The weather is really nice today."
},
{
"instruction": "对以下文本进行情感分类",
"input": "这个产品太差了,完全不能用",
"output": "负面"
}
]对话格式:
{
"conversations": [
{"role": "system", "content": "你是一位专业的法律顾问"},
{"role": "user", "content": "租房合同到期房东不退押金怎么办?"},
{"role": "assistant", "content": "根据《民法典》第七百零三条..."}
]
}4.2 数据质量控制
高质量微调数据的特点:
1. 准确性:输出内容正确无误
2. 一致性:风格、格式、术语统一
3. 多样性:覆盖各种输入场景
4. 完整性:回答充分完整,不遗漏要点
5. 安全性:不包含有害内容
数据清洗建议:
- 去重(精确去重 + 模糊去重)
- 人工审核(至少抽检 5-10%)
- 使用 GPT-4 辅助检查质量
- 确保输入-输出配对的准确性4.3 数据量参考
| 场景 | 推荐数据量 | 说明 |
|---|---|---|
| 风格/格式调整 | 50-500 条 | 少量高质量示例即可 |
| 特定任务优化 | 1K-10K 条 | 如分类、抽取、总结 |
| 领域适应 | 10K-100K 条 | 如医疗、法律、金融 |
| 构建基座模型 | 100K-1M+ 条 | 如指令跟随的通用能力 |
5. 微调实践指南
5.1 训练流程
根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
1. 准备数据
├── 收集和清洗数据
├── 格式化为训练格式
└── 划分训练集/验证集(9:1 或 95:5)根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
2. 选择基座模型
├── 根据需求选择模型大小(7B/13B/70B)
└── 选择基座版本(Base 还是 Instruct/Chat)根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
3. 配置训练参数
├── 学习率:1e-5 ~ 3e-4(LoRA 可以大一些)
├── Batch Size:根据显存调整(通常 4-16)
├── Epoch:2-5 个 epoch(太多会过拟合)
└── Warmup:10% 的训练步数根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
4. 训练
├── 监控训练 loss 和验证 loss
├── 保存 checkpoint
└── 早停(验证 loss 不再下降时停止)根据原图的箭头、并列、分层与循环关系选择对应图形;可展开核对原文结构。
查看原文结构
5. 评估
├── 自动指标评估
├── 人工质量评估
└── A/B 测试(与原模型对比)5.2 常见问题与解决
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 训练 loss 不下降 | 学习率太小 / 数据有问题 | 增大学习率 / 检查数据 |
| 过拟合 | 数据太少 / epoch 太多 | 增加数据 / 减少 epoch / 加 dropout |
| 灾难性遗忘 | 微调过度 | 减少 epoch / 使用 LoRA / 混合通用数据 |
| 输出重复 | 数据中有重复模式 | 增加数据多样性 / 降低 temperature |
| 格式不一致 | 训练数据格式不统一 | 统一数据格式 / 增加格式示例 |
5.3 主流微调工具
| 工具 | 特点 | 适用场景 |
|---|---|---|
| LLaMA-Factory | 一站式,支持多种方法 | 快速实验和调参 |
| Axolotl | 灵活,YAML 配置 | 有经验的开发者 |
| Hugging Face TRL | 官方库,集成好 | SFT + RLHF/DPO |
| Unsloth | 极致速度优化 | 2-5 倍训练加速 |
| OpenAI Fine-tuning | 云端一键微调 | 不想管理基础设施 |
6. 本章小结
| 方法 | 训练参数 | 显存需求 | 效果 | 推荐场景 |
|---|---|---|---|---|
| 全参数微调 | 100% | 极高 | 最好 | 大团队,大数据 |
| LoRA | ~0.1-1% | 中等 | 接近全量 | 大多数场景(推荐) |
| QLoRA | ~0.1-1% | 低 | 接近 LoRA | 显存有限时 |
| Adapter | ~1-3% | 中等 | 好 | 多任务适配 |
核心建议: 大多数情况下,从 LoRA/QLoRA 开始尝试,只有在效果不满足要求时才考虑全参数微调。
相关章节
- 对齐技术(SFT-RLHF-DPO) — SFT 本质是一种指令微调
- 开源模型(LLaMA-Mistral-Qwen-DeepSeek) — 常见的微调对象与基座模型
- 模型选型与Agent适配 — 微调在模型选型中的考量
延伸阅读
- Hu, E.J. et al. (2022). "LoRA: Low-Rank Adaptation of Large Language Models". ICLR
- Dettmers, T. et al. (2023). "QLoRA: Efficient Finetuning of Quantized Language Models". NeurIPS
- Houlsby, N. et al. (2021). "Parameter-Efficient Transfer Learning for NLP". ACL