模型在训练集上准确率 99%,换一批新采集的数据直接掉到 70%,第一反应往往是代码有 bug,排查一圈没毛病,其实多数情况是泛化能力不行——模型把训练样本连同噪声一起背了下来,没学到真正的规律。图像分类项目里这事最常见:训练全用清晰摆拍,上线后用户传的是各种模糊随手拍和逆光照片,分数自然跳水。

训练误差和测试误差的缺口

泛化能力指模型对没见过的数据还能保持多好的表现。训练误差低、测试误差高,叫过拟合,好比背题背得滚瓜烂熟、换套新题就懵;两边都差叫欠拟合,连题都没背会。评估时把数据切成训练集、验证集、测试集,8:1:1 是常见比例。想更稳一点就做 k 折交叉验证:把训练数据分成 5 份或 10 份,轮流拿一份当验证集,分数求平均,比单次划分可靠。学习曲线是个直观工具,训练损失和验证损失画在一张图上,缺口大且不再收窄,基本就是过拟合;两条线都降不下去,是欠拟合。还可以换个随机种子多跑几遍,分数忽高忽低也说明泛化不稳。

提升泛化的常用手段

  • 加数据或做数据增强:图像随机翻转、裁剪、加噪声、调亮度,等于免费扩充样本,文本场景还有同义替换和回译
  • 正则化:L1、L2 惩罚过大的权重,强度是个要调的系数,太大模型直接欠拟合,用验证集扫一组值挑
  • dropout:训练时随机丢一部分神经元,逼模型别依赖某条通路
  • 早停:盯着验证集损失,一回升就停训练,别硬练到底
  • 简化模型:参数量远超数据量时先减层减宽度

背后的逻辑是偏差方差权衡:欠拟合偏差大,模型太简单;过拟合方差大,模型对新数据的波动太敏感。

一个容易忽略的坑:数据泄漏

标准化时把测试集的信息一起算进去、按时间排列的数据被随机切分,都算泄漏,离线分数虚高、线上拉胯,查起来还特别隐蔽。另外真实数据的分布会漂移,模型上线后要持续监控指标,隔段时间用新数据重训,人工抽复核发现的离谱错误,回流当新训练数据正好。

看模型行不行,永远以没见过的数据上的表现为准,训练集分数再漂亮也只是背课文的成绩单。