我正在使用 Keras 为我的项目训练神经网络。 Keras 提供了提前停止的功能。我可以知道应该观察哪些参数来避免我的神经网络通过使用提前停止来过度拟合吗?
https://i.stack.imgur.com/wkK5f.gif
早期停止基本上是在您的损失开始增加(或者换句话说验证准确性开始降低)时停止训练。根据documents,它的用法如下;
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=0,
verbose=0, mode='auto')
值取决于您的实现(问题、批量大小等),但通常是为了防止我会使用过度拟合;
通过将 monitor 参数设置为“val_loss”来监控验证损失(需要使用交叉验证或至少训练/测试集)。 min_delta 是一个阈值,用于将某个时期的损失量化为改进与否。如果 loss 的差异低于 min_delta,则量化为没有改善。最好将其保留为 0,因为我们对损失何时变得更糟感兴趣。耐心参数表示一旦您的损失开始增加(停止改善),在停止之前的时期数。这取决于你的实现,如果你使用非常小的批次或大的学习率,你的损失之字形(准确度会更嘈杂)所以最好设置一个大的耐心参数。如果您使用大批量和小学习率,您的损失会更平滑,因此您可以使用较小的耐心参数。无论哪种方式,我都会将其保留为 2,因此我会给模型更多机会。详细决定要打印的内容,将其保留为默认值 (0)。 mode 参数取决于您监控的数量的方向(应该是减少还是增加),因为我们监控损失,我们可以使用 min.但是让我们让 keras 为我们处理它并将其设置为 auto
所以我会使用这样的东西,并通过在有和没有提前停止的情况下绘制误差损失来进行实验。
keras.callbacks.EarlyStopping(monitor='val_loss',
min_delta=0,
patience=2,
verbose=0, mode='auto')
对于回调如何工作可能存在的歧义,我将尝试解释更多。在模型上调用 fit(... callbacks=[es])
后,Keras 会调用给定的回调对象预定函数。这些函数可以称为 on_train_begin
、on_train_end
、on_epoch_begin
、on_epoch_end
和 on_batch_begin
、on_batch_end
。在每个时期结束时调用提前停止回调,将最佳监测值与当前值进行比较,如果满足条件则停止(自观察到最佳监测值以来已经过去了多少时期,是否超过耐心参数,两者之间的差异最后一个值大于 min_delta 等..)。
正如@BrentFaust 在评论中指出的那样,模型的训练将继续,直到满足早期停止条件或满足 fit()
中的 epochs
参数(默认 = 10)。设置 Early Stopping 回调不会使模型训练超出其 epochs
参数。因此,使用较大的 epochs
值调用 fit()
函数将从 Early Stopping 回调中受益更多。
下面是另一个项目 AutoKeras (https://autokeras.com/) 中的 EarlyStopping 示例,它是一个自动化机器学习 (AutoML) 库。该库设置了两个 EarlyStopping 参数:patience=10
和 min_delta=1e-4
AutoKeras 和 Keras 监控的默认数量是 val_loss
:
https://github.com/keras-team/keras/blob/cb306b4cc446675271e5b15b4a7197efd3b60c34/keras/callbacks.py#L1748 https://autokeras.com/image_classifier/
不定期副业成功案例分享
min_delta
是一个阈值,用于将监测值的变化量化为改进与否。所以是的,如果我们给出monitor = 'val_loss'
,那么它将指当前验证损失和先前验证损失之间的差异。在实践中,如果你给min_delta=0.1
一个小于 0.1 的验证损失(当前 - 以前)的减少将不会量化,因此会停止训练(如果你有patience = 0
)。callbacks=[EarlyStopping(patience=2)]
无效,除非将 epochs 赋予model.fit(..., epochs=max_epochs)
。epoch=1
调用 fit (对于各种用例),在这种情况下,此回调会失败。如果我的回答有歧义,我会尝试以更好的方式提出。restore_best_weights
参数(文档中还没有),它会在训练后加载具有最佳权重的模型。但是,出于您的目的,我将使用带有save_best_only
参数的ModelCheckpoint
回调。您可以查看文档,它可以直接使用,但您需要在训练后手动加载最佳权重。