微调后,怎样确认模型真的更好?
你让模型学会了新方言,却发现原来能听懂的普通话变差了。训练曲线在下降,文件名也叫 best,为什么仍不能放心上线?要回答的不是“训得顺不顺”,而是“用同一把可信的尺子,业务有没有变好”。
下面用一个合成案例说明:A 的整体 CER 为 12.4%,B 为 12.9%,但 A 在粤语自发口语上退化了 6 个百分点。所有数字都是教学构造,没有运行声学训练,也不是 SenseVoice 的测量结果。
最低 loss、最低整体 CER 和可上线是三个不同结论。通过本文的例子不等于真实模型通过验收;旧域退化阈值必须由你的业务提前决定。
第一步:先确认尺子,再比较模型
在 一次 SenseVoice 持续微调反馈中,开发者主动撤回了早期的新方言 CER:参考文本和训练标签来自同一套未经独立核验的流程,连“逐字转写还是书面语意译”都没有先确认。这种错误不一定让训练报错,却会让选点依据失效。
先抽样回听,并写下标注规范:数字怎么写、语气词留不留、方言词如何记录、是否允许意译。训练与评估要隔离说话人,也要检查参考文本来源。把模型自己的转写再次当参考答案,并不能独立验证它。
区分用于调参和选点的验证集,以及最终验收时才使用的独立测试集。修改了参考文本或 CER 归一化规则,就在同一新口径下重测原模型和所有候选;不要把旧基线与新分数直接相减。若总在同一测试集上试配置,它实际上已经参与了选点。
第二步:不要让一个总分替你做决定
假设业务同时服务普通话、粤语和新方言。下面每一格都恰有 1,000 个参考字符,CER 是替换、删除、插入错误数之和除以参考字符数。这个合成例子把旧域每格的允许退化设为 最多 1 个百分点,只是演示,不是官方推荐阈值。
| 验证切片 | 原模型 | A | B |
|---|---|---|---|
| 普通话 · 朗读 | 6% | 5% | 6% |
| 普通话 · 自发口语 | 8% | 8% | 8.5% |
| 粤语 · 朗读 | 9% | 9% | 9.5% |
| 粤语 · 自发口语 | 12% | 18% | 12.5% |
| 新方言 | 60% | 22% | 28% |

按总错误数除以总参考字符数计算,原模型、A、B 分别为 19%、12.4%、12.9%。A 的整体和新方言分数都更好,却违反旧域约束;B 只获得进入独立测试与服务验收的资格,不是自动获准上线。真实切片大小不同时,不能直接平均各格百分比;同时报告每格样本量,避免大集合掩盖小语种。
也不要混淆单位:CER 从 12% 到 18% 是增加 6 个百分点,相对增加 50%。如果原基线为零,相对退化没有定义。少量样本上的小差异也可能只是波动,需要更多独立说话人和误例回听,不能把小数位当成可靠性的证明。
第三步:认清 best,再验证真正的出口
FunASR #3677修复了选点指标缺失被当作零的路径,已包含在 1.4.15。维护中的 SenseVoice 微调脚本明确按总验证 loss 排名;acc_rich 不等于 ASR 准确率或 CER。因此 model.pt.best 的“best”只对应所配置的有效指标,不能代替上面的业务约束。
更换排名指标要用新输出目录。升级软件不会恢复已删掉的 checkpoint,也不能自动纠正历史虚假零值排名。对仍保留的候选重新评估;平均权重也应作为一个新的候选复测,而不是默认优于参与平均的模型。
最后用固定音频穿过模型输出 → 导出或服务端 → 客户端。新增语言 tag 后,模型可能正确输出,下游旧白名单却把结果丢掉。保留各层原始结果,核对 tokenizer、模型映射和解析约定;不要为得到非空文本而关掉所有校验,也不要把词表中已有的 token 当作可随意复用的空闲槽位。
留下一份可回滚的验收记录:基线与候选权重散列、数据与标注规范版本、归一化规则、每格结果、固定请求及客户端输出。样本须有合法使用授权。先确认真实链路没有旧域回退和静默空输出,再逐步放量;这不是对灾难性遗忘或 CTC blank 偏置已经解决的承诺。
下一步,打开固定版本的SenseVoice 持续微调指南,先写好你的验证切片、独立测试集和接受阈值,再开始下一轮训练。