微调评估
问题
如何评估微调模型的质量?有哪些评估方法和指标?
答案
一、评估维度
| 维度 | 指标 | 说明 |
|---|---|---|
| 训练指标 | Train/Val Loss | 基础收敛判断 |
| 任务指标 | 准确率、F1 | 特定任务效果 |
| 通用能力 | 标准 Benchmark | 是否遗忘预训练能力 |
| 人工评估 | 满意度评分 | 主观质量判断 |
二、训练指标监控
# 监控训练曲线
# ✅ 好的表现:Train Loss 下降,Val Loss 同步下降
# ❌ 过拟合:Train Loss 下降,Val Loss 上升
# ❌ 欠拟合:Train Loss 不下降
三、标准 Benchmark
| Benchmark | 评估内容 | 适用 |
|---|---|---|
| MMLU | 多学科知识 | 通用知识保持 |
| HumanEval | 代码生成 | 编程能力 |
| GSM8K | 数学推理 | 推理能力 |
| MT-Bench | 对话质量(LLM 打分) | 对话能力 |
| AlpacaEval | 指令遵循 | 微调后总体质量 |
四、A/B 对比评估
COMPARE_PROMPT = """对比以下两个回答,哪个更好?
问题:{question}
回答 A:{answer_a}
回答 B:{answer_b}
请从准确性、完整性、有用性三个维度判断。
输出:A 或 B,以及简短理由。
"""
def ab_evaluation(test_set, model_a, model_b, judge_llm):
results = {"A": 0, "B": 0, "Tie": 0}
for item in test_set:
answer_a = model_a.generate(item["question"])
answer_b = model_b.generate(item["question"])
verdict = judge_llm.invoke(COMPARE_PROMPT.format(
question=item["question"],
answer_a=answer_a,
answer_b=answer_b,
))
results[parse_verdict(verdict)] += 1
return results
五、评估检查表
| 检查项 | 通过标准 | 工具 |
|---|---|---|
| Val Loss 收敛 | 持续下降或平稳 | TensorBoard |
| 通用能力保持 | MMLU 下降 < 5% | lm-eval-harness |
| 目标任务提升 | 优于基线模型 | 自定义评测集 |
| 格式遵循 | 输出格式正确率 > 95% | 规则检查 |
| 安全性 | 无有害输出 | 安全评测集 |
常见面试问题
Q1: 微调后 MMLU 下降很多怎么办?
答案:说明发生了灾难性遗忘。解决方法:
- 降低学习率(1e-5 → 5e-6)
- 减少训练轮次
- 混入 20-30% 通用数据
- 使用 LoRA 替代全量微调(LoRA 天然减少遗忘)