经验驱动。微调完如果只盯着 training loss 下降,很容易自我感动。本文用我本机真跑的一个评测脚本讲清楚:该看哪些指标、以及指标会怎么骗你。下方数字来自真实运行,含一个教科书级的”指标失真”案例。

评测前先想清楚:你的任务是什么

不同任务的”好”定义完全不一样,指标选错等于没评:

  • 分类 / 抽取:accuracy、F1(macro / weighted)、实体级 P/R/F1(seqeval)。
  • 生成 / 摘要 / 翻译:BLEU、ROUGE(ROUGE-L 最常用)、BERTScore、人工评测。
  • 对话 / 开放生成:自动指标相关性弱,必须上人工评测或 LLM-as-judge。

真跑一个评测脚本

我写了个最小可用的评测,对”微调后模型”在几个验证样本上的预测和人工标注对比,算 EM(完全匹配)、token-F1、ROUGE-L。本机真实输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[样本1] 概括任务
参考: 微调是在特定任务数据上继续训练预训练模型。
预测: 微调是在特定任务数据上继续训练预训练模型。
EM=1.00 F1=1.000 ROUGE-L=1.000

[样本2] 情感判断
参考: 负面
预测: 负面
EM=1.00 F1=1.000 ROUGE-L=1.000

[样本3] 实体抽取
参考: 马云/人物 阿里巴巴/组织
预测: 马云/人名 阿里巴巴/公司
EM=0.00 F1=0.750 ROUGE-L=0.750

[样本4] 翻译
参考: The weather is really nice today.
预测: The weather is nice today.
EM=0.00 F1=0.880 ROUGE-L=0.880

汇总(验证集):
样本数: 4
平均 EM : 0.500
平均 token-F1: 0.907
平均 ROUGE-L : 0.907

真实教训:样本3 暴露了”指标失真”

样本3 里,预测和参考语义完全一致(马云是人、阿里巴巴是公司),只是标注口径不同(”人物/组织” vs “人名/公司”)。结果 EM=0(要求逐字一致),但 F1/ROUGE-L 还有 0.75。

这说明:

  • EM 太严,对标注口径零容忍——一个同义别名就能把分打到 0,不适合开放抽取。
  • F1/ROUGE-L 更宽容,能部分反映”对了但写得不一样”,但也会高估。
  • 根本问题在标注规范不统一:评测之前,必须先和标注团队对齐”人名 vs 人物、公司 vs 组织”算不算对。规范不统一,指标再花哨也是失真。

样本4 同理:差一个 “really”,EM=0 但 ROUGE-L=0.88——翻译这种任务就不该用 EM,BLEU/ROUGE 才是合适口径。

评测体系的三个真实踩坑

  1. 别用训练集自欺。loss 在训练集上掉得漂亮没意义,必须在预留的验证/测试集上看;最好做 k 折或多次随机切分,避免单次切分的偶然性。
  2. 小样本指标波动大。上面只有 4 个样本,单个样本就能让均分跳 0.25。真实评测要足够样本量,或用 bootstrap 报告置信区间。
  3. 离线指标高 ≠ 线上好。ROUGE 高不代表用户满意、不代表没有幻觉或安全风险。生成类任务一定要补人工评测 / LLM-as-judge,抽样看相关性、事实性、安全性。

面试常考点

  • 过拟合怎么判断:训练 loss 持续降、验证 loss 拐头升,就是过拟合信号;早停(early stopping)在验证指标开始变差时停。
  • 评估指标怎么选:任务决定指标;抽取类用实体级 P/R/F1,生成类用 ROUGE/BLEU/BERTScore,开放类必须人工。
  • 为什么实体级而不是 token 级:token 级会把”标错一个字但整体对”重罚,且看不出边界错;seqeval 要求类型和边界都对齐才算对,更接近真实抽取质量。
  • human eval 为什么不可替代:自动指标和人工判断相关性有限,尤其涉及”有用、安全、不胡说”这些维度。

小结

评测微调效果,第一步是选对和你任务匹配的指标,第二步是统一标注规范——样本3 那个”语义对但 EM=0”的案例就是规范没对齐的典型。再小的评测集也要区分训练/验证,再高的离线分也要补人工抽检。loss 下降只是开始,指标不骗人(前提是规范先对齐)。