了解神经网络中的早期停止及其在使用交叉验证时的影响

机器算法验证 机器学习 神经网络 交叉验证 超参数
2022-03-22 14:36:02

我对如何定义早期停止技术的想法感到有些困扰和困惑。如果你看一下它Wikipedia,它的定义如下:

  1. 将训练数据分成训练集和验证集,例如以 2 比 1 的比例。
  2. 仅在训练集上进行训练,并偶尔评估验证集上的每个示例错误,例如在每五个 epoch 之后。
  3. 一旦验证集上的错误高于上次检查时,立即停止训练。
  4. 使用网络在上一步中作为训练运行的结果的权重。

我自己在实验中使用了这种方法(使用 10 倍交叉验证)。我正在检查每个时期的验证错误(并计算验证准确性)并将耐心参数设置为 2。这意味着,如果验证错误连续 2 个时期增加 - > 停止训练。然后我在模型完成时使用了最后一个 epoch 的结果。

Ian Goodfellow 在他的深度学习书中使用了另一个定义。作为第四步,他建议使用最佳工作模型的权重(即每次检查验证错误时保存模型)。

我不需要保存的模型,我只需要我工作的结果。所以对我来说,Goodfellow 提议的提前停止意味着我将采用我为最终结果达到的最高验证准确度?不知何故,这似乎不合法。在没有开发集的情况下,我没有这些信息。但是在那种情况下,首先使用提前停止的原因是什么?通过例如平均折叠的时期数来确定时期数并将其用于稍后的测试运行?

2个回答

通过例如平均折叠的时期数来确定时期数并将其用于稍后的测试运行?

最短的答案:是的!但是让我添加一些上下文......

我相信您指的是深度学习书中关于 Early Stopping 的第 7.8 节,第 246 页。但是,那里描述的程序与您的程序有很大不同。古德费罗等人。建议首先将您的数据分成三组:训练集、开发集和测试集。然后,您(在训练集上)进行训练,直到该模型的误差增加(在开发集上),此时您停止。最后,您使用具有最低开发集误差的训练模型并在测试集上对其进行评估。根本不涉及交叉验证。

但是,您似乎正在尝试在同一个集合上同时进行提前停止 (ES) 和交叉验证 (CV)以及模型评估也就是说,您似乎将所有数据用于 CV,使用 ES 对每个拆分进行训练,然后使用这些 CV 拆分的平均性能作为您的最终评估结果。如果是这种情况,那确实是严重的过度拟合(当然不是 Goodfellow 等人所描述的),并且您的方法为您提供了与 ES 的含义完全相反的结果——作为一种正则化技术来防止过拟合。如果不清楚原因:因为您在训练期间在最终评估实例中“达到顶峰”,以确定何时(“提前”)停止训练;也就是说,您在训练期间针对评估实例进行优化,根据定义,这(过度)拟合您的模型(在该评估数据上)。

所以到现在为止,我希望已经回答了你的其他[两个]问题。

higgs broson 的回答(对您的最后一个问题,如上所述)已经提供了一种将 CV 和 ES 结合起来以节省一些训练时间的有意义的方法:您可以将全部数据仅分成两组 - 一个开发集和一个测试集- 并在每次拆分时应用 ES 时使用开发集进行 CV。也就是说,您在开发集的每个拆分上进行训练,并在您为评估该拆分留出的训练实例上达到最低错误时停止 [1]。然后,您平均需要从每个拆分中达到最低误差所需的 epoch 数,并针对该(平均)epoch 数在完整的开发集上进行训练。最后,您在您搁置但尚未触及的测试集上验证该结果。

[1] 虽然与希格斯布罗森不同,但我建议在每个epoch 之后进行评估。原因有二:(1)与训练相比,评估时间可以忽略不计。(2),想象你的分钟。错误出现在 51 纪元,但您在 50 纪元和 60 纪元进行评估。60 纪元的误差不太可能低于 50 纪元;然而,你会选择 60 作为你的 epoch 参数,这显然是次优的,实际上甚至有点违背最初使用 ES 的目的。

您可以使用交叉验证来确定提前停止训练的最佳 epoch 数的方法是:假设我们正在训练 1 到 100 个 epoch。对于每一折,训练你的模型并每隔 10 个 epoch 记录一次验证错误。保存这些验证错误轨迹与训练的 epoch 数,并将它们在所有折叠中平均起来。这将产生“平均测试误差与时代”曲线。使用的停止点是最小化平均测试误差的时期数。然后,您可以在那么多时期的完整训练集(无交叉验证)上训练您的网络。

提前停止的目的是避免过拟合。您使用 N 折交叉验证通过创建 N 个合成训练/测试集并(通常)将结果平均在一起来估计模型的泛化误差。希望稍后给您的测试集(又名新的真实世界数据)将与您使用 CV 生成的综合测试集足够相似,以便您之前找到的停止点在新测试的情况下接近最优数据。