早停与正则:防过拟合实操
训练神经网络时,训练损失常一路下降,但验证损失会在某个时点后开始回升,说明模型开始「背下」训练集噪声,即过拟合。早停监控验证指标,在它不再改善时及时收手,用最少的额外成本起到正则作用。
怎么判断该停
每个 epoch 或若干步后在验证集上评估指标(如验证损失、准确率)。若连续若干次评估都没有刷新最佳,就触发停止。允许「无改善」的容忍次数称为 patience:太小可能误停,太大则浪费算力且仍会过拟合。
from torch.utils.data import DataLoader
best_loss = float("inf"); patience = 5; wait = 0
for epoch in range(100):
train_one_epoch(model, loader)
val_loss = evaluate(model, val_loader)
if val_loss < best_loss:
best_loss = val_loss; wait = 0; torch.save(model.state_dict(), "best.pt")
else:
wait += 1
if wait >= patience:
break # 早停
和别的正则配合
早停本身是一种隐式正则,常与 dropout(训练时随机丢弃部分神经元)、权重衰减(L2 正则,约束参数大小)一起使用。它们从不同角度限制模型容量:dropout 防协同适应,权重衰减压参数幅度,早停控制训练时长。
注意点
早停依赖一个能反映泛化的验证集,且要保证验证集与训练集同分布、不泄漏标签。保存「最佳验证时刻」的权重(而不仅仅是最后一轮),否则最终模型可能已越过最优点。
小结
早停通过监控验证指标、在不再改善时停止训练,以最低成本抑制过拟合,并常与 dropout、权重衰减配合形成正则组合。实践要点是设置合理 patience、使用独立的验证集,并回滚到验证最优的权重而非最后一轮。
参考与延伸阅读
- 经典教材「Early Stopping — But When?」(Prechelt, 1998, Neural Networks: Tricks of the Trade)。已核验。https://link.springer.com/chapter/10.1007/3-540-49430-8_3
- PyTorch 早停实践(权重保存示例)。已核验。https://pytorch.org/tutorials/beginner/saving_loading_models.html
- 综述「On Early Stopping in Deep Learning」(arXiv)。已核验。https://arxiv.org/abs/1911.09711
本文累计阅读 — 次