1.3 Fine-tuning:模型微调技术
微调(Fine-tuning)是在已有预训练模型的基础上,用特定数据进行再训练,让模型更适合某个具体任务或场景的技术。
微调的核心原理
为什么需要微调?
预训练大模型虽然能力强大,但也有局限:
预训练模型 = 通用知识 + 通用能力
微调后的模型 = 通用知识 + 领域知识 + 特定任务能力
微调解决的核心问题:
- 领域适配:让通用模型掌握特定领域的专业知识
- 行为对齐:让模型按照期望的方式输出和交互
- 风格统一:让模型输出符合特定的格式和风格
- 成本优化:对小模型微调可能比调用超大模型更经济
微调 vs 提示词工程
| 维度 | 提示词工程 | 微调 |
|---|---|---|
| 成本 | 低,只需设计提示词 | 高,需要数据、算力、时间 |
| 效果 | 引导为主,不改变模型能力 | 真正改变模型的行为和知识 |
| 灵活性 | 可随时调整,灵活度高 | 一旦训练完成,调整成本高 |
| 适用场景 | 通用任务、快速原型 | 专业领域、高一致性要求 |
| 延迟 | 提示词长增加延迟 | 推理时无需额外提示词 |
什么时候应该做微调?
✅ 推荐做微调:
- 需要模型持续输出特定风格或格式
- 需要掌握大量专业领域知识
- 提示词已经很长但效果仍不理想
- 需要降低推理时的 token 消耗
- 需要统一团队使用的模型行为
❌ 不推荐做微调:
- 任务还在快速变化中
- 没有足 够的高质量标注数据
- 只是偶尔使用的小众场景
- 可以通过 RAG 解决的知识问题
LoRA:低秩适配算法深度解析
LoRA(Low-Rank Adaptation)是当下最主流的微调技术,大幅降低了微调的成本和门槛。
传统微调的问题
传统微调需要更新模型的全部参数:
7B 模型 → 70 亿参数全部需要更新
→ 需要大量显存(几十 GB)
→ 训练速度慢
→ 每个任务保存一份完整模型权重
LoRA 的核心思想
低秩假设:模型权重的变化可以用低秩矩阵来近似。
原始权重 W (d × k)
↓
ΔW = BA,其中 B (d × r),A (r × k)
↓
r 是秩,远小于 d 和 k(通常 r=8~64)
只训练 ΔW,冻结原始权重 W
LoRA 的优势
1. 极低的训练成本
7B 模型全参数微调: 需要 80GB+ 显存
7B 模型 LoRA 微调:只需要 8-16GB 显存
2. 极轻量的模型文件
全量微调:每个任务保存 13GB 权重
LoRA 微调:每个任务只保存 10-100MB
3. 无推理开销
训练完成后,可以将 LoRA 权重合并到原始权重中,推理时没有任何额外计算。
4. 任务切换灵活
可以在推理时动态加载/卸载不同的 LoRA 权重,实现多任务切换。
LoRA 的关键参数
| 参数 | 推荐值 | 说明 |
|---|---|---|
| r(秩) | 8~64 | 越大表达能力越强,但参数量和成本也越高 |
| alpha | r × 2 | 缩放因子,通常设为 r 的 2 倍 |
| dropout | 0.05~0.1 | 防止过拟合 |
| target_modules | q, v | 对哪些模块应用 LoRA |
进阶配置:对 q/k/v/o 都应用 LoRA 通常效果更好,但训练成本也会相应增加。
LoRA 的进阶变体
| 变体 | 特点 | 适用场景 |
|---|---|---|
| QLoRA | 4bit 量化 + LoRA | 消费级显卡训练大模型 |
| LoRA+ | 自适应学习率 | 加速收敛,提升最终效果 |
| DoRA | 权重分解式 LoRA | 更接近全量微调的效果 |
微调的完整流程
第一步:数据准备
数据质量 > 数据数量
高质量数据 100 条 > 低质量数据 10000 条
好的微调数据应该具备:
- ✅ 多样化:覆盖各种典型场景
- ✅ 一致性:回答风格和质量统一
- ✅ 正确性:没有错误信息或幻觉
- ✅ 代表性:真实反映实际使用场景
常见数据源:
- 历史对话日志(经过筛选和清洗)
- 人工标注的高质量问答对
- 领域专家编写的示例
- 公开的高质量数据集
第二步:数据格式化
对话格式(最常用):
{"messages": [
{"role": "system", "content": "你是一位专业的客服助手..."},
{"role": "user", "content": "我的订单什么时候发货?"},
{"role": "assistant", "content": "您好,请问您的订单号是多少?"}
]}
输入输出格式:
{"prompt": "用户问题...", "response": "期望回答..."}
第三步:训练配置
base_model: "meta-llama/Llama-3-8B-Instruct"
training_method: "lora"
lora_config:
r: 32
lora_alpha: 64
target_modules: ["q_proj", "v_proj"]
lora_dropout: 0.05
training_args:
learning_rate: 2e-4
batch_size: 8
epochs: 3
max_steps: -1
第四步:评估 与迭代
自动评估指标:
- 困惑度(Perplexity):模型生成文本的"自然程度"
- BLEU/ROUGE:与参考答案的相似度
- 准确率:针对分类等可量化任务
人工评估维度:
- 事实正确性
- 回答质量
- 风格一致性
- 遵循指令能力
微调的最佳实践
1. 从小处开始
先跑 100 条数据的小样本
↓ 测试效果
再扩展到 1000 条
↓ 迭代优化
最终全量 训练
2. 保守设置学习率
过大 → 模型"失忆",灾难性遗忘
过小 → 训练太慢,效果不明显
推荐起始值:1e-5 ~ 5e-4
3. 避免过拟合
- 数据量足够大且多样化
- 适当的 dropout 和权重衰减
- 监控验证集指标,早停(Early Stopping)
- 不要训练太多 epoch
4. 模型合并策略
合并到基础模型:
- 优点:推理无额外开销
- 缺点:无法动态切换
动态加载 LoRA:
- 优点:多任务灵活切换
- 缺点:推理时有微小延迟
微调的常见误区
误区 1:微调可以解决所有问题
真相:微调不是"炼丹",不能无中生有。它只能"唤醒"和"引导"模型已有的能力,不能让模型学到预训练中完全没有的知识。
误区 2:数据越多越好
真相:低质量、重复的数据只会伤害模型效果。如果数据有偏差,模型也会学到偏差。
误区 3:训练越久效果越好
真相:超过某个点后,继续训练只会导致过拟合,效果反而下降。
误区 4:用微调来注入知识
真相:注入知识用 RAG 更合适,微调更适合调整行为模式和输出风格。
微调是让模型从"通用"到"专用"的桥梁。它不创造智能,但它塑造智能。