早停与正则:防过拟合实操

训练神经网络时,训练损失常一路下降,但验证损失会在某个时点后开始回升,说明模型开始「背下」训练集噪声,即过拟合。早停监控验证指标,在它不再改善时及时收手,用最少的额外成本起到正则作用。

怎么判断该停

每个 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、使用独立的验证集,并回滚到验证最优的权重而非最后一轮。

参考与延伸阅读

本文累计阅读