微调前后基线评估

「微调提升了 20%」只有在同一条件下对比才有意义。本篇把 04 评估指标 落到可复现的 before/after 流程;模式与 AMD 实战 Step 10/15 同构。

系列索引:微调技术路线导读


一、为什么必须先跑基线

不做基线 后果
只看 train loss 不知任务是否真提升
微调后才定 test 易间接调参泄漏
改 prompt 再评估 delta 不可比
换 decode 参数 F1 波动误判为微调效果

铁律:test 集、system prompt、tokenizer、decode、parse 全程锁定


二、评估流水线

1
2
3
4
5
6
7
8
9
test 集(封存)

├─ apply_chat_template(add_generation_prompt=True)
├─ model.generate(**固定 decode 参)
├─ parse / normalize → 预测标签或文本
└─ compute_metrics → accuracy / F1 / invalid / EM ...

├─ before:基座(无 adapter)
└─ after:PeftModel 或 merged

三、必须固定的变量

变量 示例 文档
test 子集 limit=400, seed=42 01-02 划分
SYSTEM_PROMPT 与训练完全一致 01-01
max_new_tokens 8(分类)/ 256(生成)
temperature 0 或 0.1 分类用 0 或 greedy
do_sample False(分类)
parse 函数 strip + lower + 允许集 04-12 Invalid
1
2
3
4
5
6
DECODE_KW = dict(max_new_tokens=8, do_sample=False, temperature=0.0)

def evaluate(model, tokenizer, ds, limit=None):
rows = ds.select(range(min(limit or len(ds), len(ds))))
# 同一函数用于 before / after
...

四、报告模板

指标 微调前 微调后 Δ
accuracy 0.42 0.91 +0.49
macro F1 0.38 0.89 +0.51
invalid 率 0.12 0.02 -0.10

并列:混淆矩阵04-06)、每类 P/R(04-05)。

训练侧可同时记录 eval_loss(04-01),但上线决策以任务指标为准


五、分类 vs 生成任务

任务 主指标 注意
生成式分类 macro F1 + invalid generate() 评估
抽取 QA EM / token F1 04-09
摘要翻译 ROUGE/BLEU 04-07/08
代码 pass@1 04-10

六、对齐阶段(DPO)的基线

DPO 前:报告 SFT checkpoint 的 win rate / 任务指标。
DPO 后:同一 test、同一 judge 规则对比。勿换评判标准。


七、常见踩坑

现象 原因
基线虚低 基座未用 chat template
微调后虚高 test 泄漏进 train
invalid 飙升 parse 规则与训练标签不一致
两次 limit 不同 对比样本集不一致

八、小结

基线评估 = 封存 test + 固定四件套(prompt/decode/parse/模型加载)+ before/after 同脚本。通过后再考虑 merge 与 部署

下一步:02-04 保存 adapter | 08-02 遗忘与版本管理 | 04 指标详解

-------------本文结束感谢您的阅读-------------