#科技新星创作营# #机器学习# #深度学习# #神经网络#
背景
我正在使用Keras为我的项目训练一个神经网络。keras提供了early-stopping的功能。那我应该设置哪些参数来实现early-stopping避免神经网络过度拟合呢?
函数介绍
early-stopping一般是在损失开始增加时(或者换句话说,验证集上的准确性开始下降)停止训练的。
根据官方文档,keras的相关函数如下所示:
keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=0, verbose=0, mode='auto')
一般情况下,为了防止过拟合,我们可以如下使用:
- 通过将monitor参数设置为"val_loss"来监控模型在验证集上的损失值(需要使用交叉验证或至少要有train/test集合划分)。
- min_delta是衡量在epoch过程中计算的损失是否作为模型改善的一个阈值。如果损失的变化小于min_delta,则视作对网络改善没有帮助。最好将它置为为0,因为我们对损失变得糟糕时感兴趣。
- patience参数表示一旦损失开始增加(停止改善),在停止之前的epoch数。这取决于网络的实现,如果你使用非常小的batch_size或较大的学习率,你的损失便会是锯齿状(准确率将会有更多噪声),此时最好设置一个大的patience。如果你使用大批量和小学习率,你的损失将更平稳,因此你可以使用一个较小的patience。不管怎样,我一般都将其保留为2,这样我就可以给模型更多的试验机会。
- verbose决定打印什么,保留默认值(0)。
- mode参数取决于监视数量的方向(应该是减少还是增加),因为我们监视损失,所以可以使用min。但是一般都是让keras为我们自动处理,将其设置为auto即可。
所以我会用这样的方法,通过绘制错误损失图来进行实验,包括提前停止和不提前停止。
所以,一般我会使用下面的参数:
keras.callbacks.EarlyStopping(monitor='val_loss', min_delta=0, patience=2, verbose=0, mode='auto')
在keras中回调函数可以在on_train_begin, on_train_end, on_epoch_begin, on_epoch_end,on_batch_begin, on_batch_end等环节进行调用,而early stopping的回调一般是在每个epoch结束的时候调用的,将最佳监视值与当前值进行比较,并在满足条件时停止(自观察到最佳监视值以来已过去了多少个epoch,是否超过了耐心参数,最后一个值之间的差异是否大于最小增量等)。
模型的训练将持续到满足early stopping条件或满足fit函数定义中的epochs参数(默认值为10)为止。设置early stopping回调不会使模型的训练超出其epochs参数。因此,使用更大的epochs值调用fit函数将从early stopping回调中获益更多。