121、YOLOv8改进实战:EMA指数移动平均与SWA随机权重平均——模型稳定训练与泛化提升

121、YOLOv8改进实战:EMA指数移动平均与SWA随机权重平均——模型稳定训练与泛化提升
121、YOLOv8改进实战:EMA指数移动平均与SWA随机权重平均——模型稳定训练与泛化提升做目标检测的兄弟应该都遇到过这种场景:模型在验证集上震荡得像心电图,明明训练loss已经收敛了,但mAP忽高忽低,最后保存的checkpoint往往不是最优的那个。更头疼的是,换一个数据集或者调一下学习率,这种震荡模式就完全变了,之前调好的EMA参数又得重新试。我去年做一个工业缺陷检测项目,YOLOv8训练到第80个epoch时,验证mAP在0.72到0.78之间反复横跳,最后保存的模型反而只有0.74,而中间某个epoch明明跑到了0.78。这种问题在数据量不大、类别不平衡的场景下尤其明显。后来我把EMA和SWA都加进去,最终提交的模型mAP稳定在了0.79,而且推理时几乎没增加额外计算量。今天就把这两个技巧的实战经验掰开揉碎讲清楚。EMA:给模型加个“记忆缓冲”EMA(Exponential Moving Average)的原理其实很简单:维护一组参数的影子变量,每次更新时让影子变量向当前模型参数靠近一步,而不是直接复制。这样影子变量相当于模型参数的“慢版本”,能平滑掉训练后期的震荡。YOLOv8官方代码里其实已经内置了EMA,但默认是关闭的。很多新手直接跑train.py,根本不知道这个开关。我踩过的坑是:以为开了EMA就能无脑用,结果在小数据集上反而掉点。后来发现EMA的衰减系数(decay)默认0.9999对于小数据集太保守了,影子变量几乎不动,等于没起作用。正确的打开方式:在训练脚本里加上em