019、训练基础概念Epoch Batch LearningRate Warmup EMA 的直观理解上周帮同事调一个YOLOv8的模型他跑了一百个epochloss曲线看着挺漂亮结果mAP只有0.3。我一看训练日志learning rate从0.01直接干到0.001warmup阶段压根没起作用EMA权重也没保存。这种坑我踩过不止一次今天把这些基础概念掰开揉碎了讲清楚。Epoch不是跑完就完事Epoch就是整个训练集完整过一遍模型。很多人以为epoch越多越好这是典型的误区。我见过有人把YOLOv5跑300个epoch结果最后50个epoch的验证集mAP反而下降了——过拟合了。实际调试中我习惯先跑50个epoch看趋势。如果loss还在明显下降继续加如果loss震荡或者验证集指标停滞就该停了。YOLOv8默认300个epoch但你的数据集如果只有几百张图片100个epoch可能就足够了。踩坑记录有一次我训练一个行人检测模型前50个epoch mAP从0.1涨到0.3550到80个epoch涨到0.3880之后基本不动了。这时候继续跑就是浪费算力。所以别迷信固定epoch数用early stopping更靠谱。Batch Size显存和收敛的博弈Batch size决定了每次更新参数时看多少张图片。YOLO系列默认batch size是16但很多人直接照搬结果显存爆了。别这样写batch_size64然后发现OOM又改成batch_size2。batch size太小比如1或2会导致梯度估计噪声大训练不稳定。我实测过YOLOv8在batch size8和batch size32之间收敛速度差了一倍。经验值如果你的GPU是8GB显存YOLOv8s模型用batch size16比较稳如果是24GB可以上batch size64。但注意batch size翻倍时learning rate也要相应调整——一般按比例缩放比如batch size从16变32lr从0.01调到0.02。Learning Rate最容易被忽视的调参项Learning rate是训练过程中最重要的超参数没有之一。YOLO默认的lr0.01是针对COCO这种大数据集的。你的数据集如果只有几千张0.01可能太大了。真实案例有个项目用YOLOv5训练口罩检测lr0.01loss直接炸到NaN。降到0.001后训练正常了。后来我习惯先跑几个epoch观察loss曲线如果loss震荡剧烈说明lr太大如果loss下降缓慢说明lr太小。YOLO的lr调度策略是余弦退火Cosine Annealing但很多人不知道的是这个调度器是从warmup结束后才开始生效的。所以warmup阶段的设计直接影响后续训练。Warmup给模型一个热身期Warmup就是在训练初期让learning rate从0或很小的值逐渐增加到目标值。YOLOv8默认warmup_epochs3warmup_momentum0.8。为什么需要warmup刚初始化时模型权重是随机的梯度方向不稳定。如果直接给大lr模型会“跑偏”。就像你刚睡醒就让你跑百米冲刺肯定摔跤。我踩过最深的坑是有一次把warmup_epochs设成0结果前10个epoch的loss曲线像心电图一样上下跳动后面虽然稳定了但最终mAP比有warmup的低了5个点。实用建议对于小数据集1000张warmup_epochs可以设到5-10大数据集10000张3个epoch就够了。warmup_momentum从0.8逐渐增加到0.937YOLO默认值这个参数影响不大保持默认就行。EMA模型参数的“滑动平均”EMAExponential Moving Average是YOLO系列的一个隐藏大招。它维护一份模型参数的指数移动平均副本推理时用这个副本而不是原始模型。直观理解原始模型参数像股票价格的实时波动EMA就像它的移动平均线更平滑、更稳定。训练过程中原始模型负责探索EMA负责记录“共识”。YOLOv8默认启用EMA但很多人不知道它怎么工作的。代码里是这样实现的# 这里踩过坑EMA的decay参数默认是0.9999# 意味着当前参数只占0.0001的权重历史参数占99.99%# 所以EMA更新很慢但最终效果很稳self.decay0.9999别这样写把EMA的decay设成0.9这样EMA几乎等于原始模型失去了平滑效果。也别设成0.99999更新太慢训练结束了EMA还没跟上。实际调试中我习惯在训练结束后分别用原始模型和EMA模型做推理对比。通常EMA模型的mAP会高1-2个点尤其是小目标检测场景。这些概念如何协同工作训练一个YOLO模型流程是这样的初始化模型参数设置lr0.01前3个epochwarmup阶段lr从0线性增加到0.01每个epoch遍历所有训练数据按batch size分组每个batch计算loss反向传播更新原始模型参数同时更新EMA模型参数原始参数的滑动平均每个epoch结束后用EMA模型在验证集上评估根据余弦退火策略调整lr重复直到达到设定的epoch数关键点验证集评估一定要用EMA模型而不是原始模型。YOLOv8的验证脚本默认就是这么做的但如果你自己写训练脚本很容易忽略这一点。个人经验总结Epoch不是越多越好用early stopping当验证集mAP连续10个epoch不提升就停止Batch size选能承受的最大值但别超过64再大收益递减Learning rate从0.01开始如果loss震荡降到0.001如果收敛慢升到0.02Warmup一定要开至少3个epoch小数据集可以更多EMA一定要用推理时用EMA模型mAP能提升1-2个点最后说一句这些参数不是孤立的。比如你增大batch sizelr也要跟着调你减少epoch数warmup也要相应缩短。多跑几次实验记录下每次的参数和结果慢慢就能找到感觉。别指望一次调参就完美训练深度学习模型本身就是个迭代过程。