在训练LSTM和LSTM的稳定性时,keras中的验证丢失

时间:2017-08-21 12:00:54

标签: keras lstm activation-function

我现在正在使用Keras训练我的LSTM模型以解决时间序列问题。我的激活函数是线性的,优化器是Rmsprop。 然而,我观察到这样一种趋势,即当训练损失随着时间的推移缓慢下降,并且在一个小值附近波动时,验证损失会随着大的变化而上下跳动。

因此,我提出了两个问题: 1.验证损失是否会影响培训过程?该算法是否会查看验证损失并降低学习率,以防它大幅波动? 2.如何使模型更稳定,以便返回更稳定的验证损失值?

由于

3 个答案:

答案 0 :(得分:2)

  1. 验证损失会影响培训过程吗?

    没有。验证损失只是从培训过程中排除的一小部分数据。它在一个时代结束时通过网络运行,以测试训练的进展情况,以便您可以检查模型是否过度拟合(即训练损失很多&<验证损失)。

  2. 验证丢失的波动

    如果没有网络或数据,这有点难以回答。这可能仅仅意味着您的模型不能很好地融合到看不见的数据,这意味着它没有看到从训练数据到验证数据的足够类似趋势,并且每次调整权重以更好地适应训练数据时,模型变得更少准确的验证集。您可能会降低学习率,但如果您的训练损失缓慢下降,学习率可能会很低。我认为在这种情况下,你必须问自己几个问题。我有足够的数据吗?我的数据中是否存在真正的时间序列趋势?我是否正确地规范了我的数据?我的网络对于我拥有的数据是否很大?

答案 1 :(得分:1)

我遇到了这个问题 - 虽然训练损失在减少,但验证损失并没有减少。我在使用 LSTM 时检查并发现:

  • 我简化了模型 - 我选择了 8 层而不是 20 层。
  • 我没有在 (-1,1) 范围内缩放,而是选择了 (0,1),这将我的验证损失减少了一个数量级
  • 我将批量大小从 500 减少到 50(只是反复试验)
  • 我添加了更多功能,我直觉上认为这些功能会为 X->y 对添加一些新的智能信息

答案 2 :(得分:0)

可能的原因:

  1. 与您经常发生的训练组相比,您的验证设置非常小。权重的一点变化使得验证损失的波动远远大于训练损失。这可能不是必要的意味着您的模型过度使用。只要验证损失的整体趋势不断下降。

  2. 可能您的列车和验证数据来自不同的来源,它们可能有不同的分布。当您的数据是时间序列时,可能会发生这种情况,并且您将列车/验证数据按特定时间戳分开。

  3. 验证损失是否会影响培训过程?

    不,验证(前向传递一次)和训练(前进和后退)是不同的过程。因此,单个forword pass不会改变你接下来的训练方式。

    算法是否会查看验证丢失并降低学习率以防万一波动?

    不,但我想你可以实现自己的方法来实现。但是,有一点需要注意的是,该模型试图学习仅通过训练数据来提供成本函数的最佳解决方案,因此通过观察验证损失来改变学习率并不是很有意义。

    如何使模型更稳定,以便返回更稳定的验证损失值?

    原因如上所述。如果是第一种情况,放大验证设置将使您的损失看起来更稳定,但并不意味着它更适合。我的建议是只要您确定您的模型没有过度拟合(火车损失和验证损失之间的差距不是太大),您可以保存模型,从而获得最低的验证损失。

    如果是第二种情况,可以根据您的情况进行评估。您可以尝试排除训练集中的样本,这些样本不是类似的#34;使用验证集,或者如果您有足够的数据,可以扩大模型的容量。或者,perhapes会添加更多指标来监控培训情况。