055、EMA 指数移动平均模型平滑原理与 YOLO 超参数设置
一个让我熬夜到凌晨三点的抖动问题
去年做工业缺陷检测项目,模型在验证集上mAP已经刷到0.89,但部署到产线后,每跑几百张图就会突然出现一次漏检。我盯着监控面板上的loss曲线看了三个小时——训练时明明很稳,怎么推理时就抽风了?后来发现,问题出在模型权重上:最后几个epoch的权重震荡太剧烈,保存的checkpoint恰好落在了一个“坏点”上。这个坑让我意识到,EMA(指数移动平均)不是锦上添花,而是生产环境的刚需。
EMA到底在干什么
简单说,EMA就是给模型权重加了一个“记忆衰减”的滑动平均。训练过程中,每个step更新后的权重θ_t,我们并不直接用它做推理,而是维护一个影子变量θ_ema:
θ_ema = decay * θ_ema + (1 - decay) * θ_t
这个decay系数(通常0.999或0.9999)决定了历史权重的衰减速度。decay越接近1,影子变量更新越慢,对历史信息的保留越久。别小看这个公式,它背后是贝叶斯视角下的参数平滑——把训练过程中的随机梯度噪声给滤掉了。
我习惯把EMA理解成“模型权重的高通滤波器”。训练后期,梯度更新已经很小,但权重仍然在最优解附近来回跳动。EMA相当于把这些高频抖动给抹平了,让最终保存的权重更接近真实的局部最优。
YOLO里EMA的坑,我踩了个遍
YOLOv8官方代码