Skip to main content

1.3 Fine-tuning:模型微调技术

微调(Fine-tuning)是在已有预训练模型的基础上,用特定数据进行再训练,让模型更适合某个具体任务或场景的技术。

微调的核心原理

为什么需要微调?

预训练大模型虽然能力强大,但也有局限:

预训练模型 = 通用知识 + 通用能力
微调后的模型 = 通用知识 + 领域知识 + 特定任务能力

微调解决的核心问题

  1. 领域适配:让通用模型掌握特定领域的专业知识
  2. 行为对齐:让模型按照期望的方式输出和交互
  3. 风格统一:让模型输出符合特定的格式和风格
  4. 成本优化:对小模型微调可能比调用超大模型更经济

微调 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越大表达能力越强,但参数量和成本也越高
alphar × 2缩放因子,通常设为 r 的 2 倍
dropout0.05~0.1防止过拟合
target_modulesq, v对哪些模块应用 LoRA

进阶配置:对 q/k/v/o 都应用 LoRA 通常效果更好,但训练成本也会相应增加。

LoRA 的进阶变体

变体特点适用场景
QLoRA4bit 量化 + 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 更合适,微调更适合调整行为模式和输出风格。


微调是让模型从"通用"到"专用"的桥梁。它不创造智能,但它塑造智能。