198、YOLOv8改进实战:EMA指数移动平均与SWA随机权重平均在训练中的最佳实践
198、YOLOv8改进实战:EMA指数移动平均与SWA随机权重平均在训练中的最佳实践从一次模型抖动说起上个月调一个YOLOv8的工地安全帽检测模型,训练到第80个epoch,mAP曲线突然像心电图一样剧烈抖动。当时第一反应是学习率策略出了问题,调了半天余弦退火参数,抖动依旧。后来检查验证集loss,发现模型在最后几个epoch虽然loss降了,但泛化能力反而变差了——典型的过拟合前兆。这个问题让我重新审视了YOLOv8训练流程中一个容易被忽视的环节:模型权重的最终选择。大多数教程直接取最后一个checkpoint,或者简单保存验证集最优的权重。但实际工程中,这两种方式都有坑。今天聊的EMA和SWA,就是专门解决这类问题的。EMA:给模型装上阻尼器EMA(指数移动平均)的原理不复杂,但实现细节决定了效果。简单说就是维护一个影子模型,每个step用当前模型权重和影子权重的加权平均来更新影子。YOLOv8官方其实内置了EMA实现,但默认配置下很多人没注意到它的存在。看ultralytics源码里这段:# ultralytics/utils/torch_utils.py 中的 ModelEMA 类classModelEMA