Fine-tuning 微调指南

Fine-tuning 微调指南

什么是 Fine-tuning?

在预训练模型基础上,用特定数据进一步训练。

Fine-tuning vs RAG

LoRA 代码

from peft import LoraConfig, get_peft_model

lora_config = LoraConfig(r=16, target_modules=["q_proj", "v_proj"])
model = get_peft_model(base_model, lora_config)
print(model.print_trainable_parameters())
# 0.06% 参数可训练

何时选择?

  • 需要学习特定风格
  • 任务格式固定
  • 有大量标注数据

Claude Code 生成

Fine-tuning 微调指南

🎛️
Fine-tuning(微调)是在预训练模型基础上,使用特定领域数据进行进一步训练,使模型适应特定任务或领域的技术。本文全面介绍 Fine-tuning 的原理、方法、适用场景和最佳实践。
预训练大模型虽然通用能力强,但可能在特定任务上表现不佳。Fine-tuning 通过在特定数据上继续训练,让模型学习特定领域的知识、风格或任务模式。

1. 何时使用 Fine-tuning

Fine-tuning 不是万能的,需要在合适的场景下使用。
适合 Fine-tuning 的场景: 1. 特定任务优化:需要模型在特定任务上达到更高准确率 2. 风格迁移:让模型采用特定的写作风格或语气 3. 格式规范:强制模型按特定格式输出(如 JSON、XML) 4. 专业领域:医疗、法律、金融等专业术语和知识 5. 成本优化:高频调用场景下,微调模型推理成本更低 不适合 Fine-tuning 的场景: 1. 数据量不足(少于几百条高质量样本) 2. 任务可以通过 Prompt 工程解决 3. 需要频繁更新知识的场景(用 RAG 更合适)

2. Fine-tuning vs RAG

Fine-tuning 和 RAG 是两种互补的技术,各有优劣。
⚖️
对比分析: Fine-tuning: - 优点:推理速度快、成本低、风格统一 - 缺点:需要高质量标注数据、无法实时更新 - 适合:学习新模式、风格、格式 RAG: - 优点:无需训练、数据可实时更新、可解释性强 - 缺点:推理时需要检索、增加延迟 - 适合:引入外部知识、事实性问答 选择建议: - 两者可以结合使用:RAG 提供知识,Fine-tuning 优化格式和风格

3. 数据准备

高质量的训练数据是 Fine-tuning 成功的关键。
📊
数据准备要点: 数据量: - 简单任务:几百到几千条 - 复杂任务:几万到几十万条 - 质量比数量更重要 数据格式: - 监督微调(SFT):Instruction-Response 对 - 格式示例:{"instruction": "问题", "output": "答案"} 质量要求: - 准确性:输出必须正确无误 - 一致性:格式和风格保持一致 - 多样性:覆盖各种输入情况 - 去除噪声:删除低质量或重复数据

4. 常用 Fine-tuning 方法

根据训练范围和资源需求,Fine-tuning 有多种方法可选。
🛠️
Fine-tuning 方法: 全量微调: - 更新所有模型参数 - 效果最好,但资源消耗大 - 需要高端 GPU 和大量显存 LoRA(Low-Rank Adaptation): - 只训练低秩适配器矩阵 - 参数减少 10-100 倍 - 效果接近全量微调 QLoRA: - 量化 + LoRA - 可在消费级 GPU 上微调大模型 - 4-bit/8-bit 量化 Prefix Tuning: - 在输入前添加可训练前缀 - 保持原模型参数不变 - 适合多任务学习 Prompt Tuning: - 只训练虚拟 token 向量 - 参数量最小 - 适合简单任务

5. LoRA 代码示例

使用 PEFT 库实现 LoRA 微调:
from transformers import AutoModelForCausalLM, AutoTokenizer
from peft import LoraConfig, get_peft_model, TaskType

model_name = "meta-llama/Llama-2-7b-hf"

# 加载模型和分词器
model = AutoModelForCausalLM.from_pretrained(model_name)
tokenizer = AutoTokenizer.from_pretrained(model_name)

# 配置 LoRA
lora_config = LoraConfig(
    task_type=TaskType.CAUSAL_LM,
    inference_mode=False,
    r=8,
    lora_alpha=32,
    lora_dropout=0.1,
    target_modules=["q_proj", "v_proj"]
)

# 应用 LoRA
model = get_peft_model(model, lora_config)
model.print_trainable_parameters()

# 训练配置和训练流程与常规训练相同

6. 超参数调优

🎯
关键超参数建议: 学习率: - 全量微调:1e-6 到 5e-6 - LoRA:1e-4 到 5e-4 - 从较低值开始,逐步增加 批次大小: - 尽可能大,受显存限制 - 可用梯度累积模拟大批次 训练轮数: - 通常 1-5 个 epoch - 关注验证集防止过拟合 Warmup: - 学习率预热通常 5-10% 训练步数 LoRA r 值: - 8-64,推荐 16 或 32 - 复杂任务用较大值

7. 评估指标

Fine-tuning 后需要全面评估模型性能。
📈
评估维度: 任务相关指标: - 分类:准确率、精确率、召回率、F1 - 生成:BLEU、ROUGE、Perplexity - 问答:EM(精确匹配)、F1 分数 通用能力: - 保持原有通用能力不被灾难性遗忘 - 使用 HellaSwag、MMLU 等基准测试 输出质量: - 人工评估格式、风格、连贯性 - 安全性评估(有害内容) 效率指标: -- 内存占用 推理延迟

8. 最佳实践

Fine-tuning 最佳实践: 1. 从小规模实验开始 先用少量数据验证流程,再扩展 2. 使用验证集 划分训练/验证集,监控过拟合 3. 保存检查点 定期保存模型,便于回滚和选择最优版本 4. 渐进式训练 先用较高学习率快速收敛,再精细调整 5. 混合预训练数据 在微调数据中混入通用数据,防止灾难性遗忘 6. 监控训练过程 关注损失曲线,及时发现异常 7. 评估泛化能力 用未见过的数据测试,避免过拟合训练集

总结

Fine-tuning 是在预训练模型上进一步训练以适应特定任务的技术。适合场景包括特定任务优化、风格迁移、格式规范和专业领域。常用方法有全量微调、LoRA、QLoRA 等。关键成功因素包括高质量数据、合适的超参数和全面评估。Fine-tuning 与 RAG 可结合使用,各取所长。
⚠️
声明:本文由 AI 生成,可能存在错误或不准确之处。
最后更新:2026-01-29