我现在正在使用Keras训练我的LSTM模型以解决时间序列问题。我的激活函数是线性的,优化器是Rmsprop。 然而,我观察到这样一种趋势,即当训练损失随着时间的推移缓慢下降,并且在一个小值附近波动时,验证损失会随着大的变化而上下跳动。
因此,我提出了两个问题: 1.验证损失是否会影响培训过程?该算法是否会查看验证损失并降低学习率,以防它大幅波动? 2.如何使模型更稳定,以便返回更稳定的验证损失值?
由于
答案 0 :(得分:2)
验证损失会影响培训过程吗?
没有。验证损失只是从培训过程中排除的一小部分数据。它在一个时代结束时通过网络运行,以测试训练的进展情况,以便您可以检查模型是否过度拟合(即训练损失很多&<验证损失)。
验证丢失的波动
如果没有网络或数据,这有点难以回答。这可能仅仅意味着您的模型不能很好地融合到看不见的数据,这意味着它没有看到从训练数据到验证数据的足够类似趋势,并且每次调整权重以更好地适应训练数据时,模型变得更少准确的验证集。您可能会降低学习率,但如果您的训练损失缓慢下降,学习率可能会很低。我认为在这种情况下,你必须问自己几个问题。我有足够的数据吗?我的数据中是否存在真正的时间序列趋势?我是否正确地规范了我的数据?我的网络对于我拥有的数据是否很大?
答案 1 :(得分:1)
我遇到了这个问题 - 虽然训练损失在减少,但验证损失并没有减少。我在使用 LSTM 时检查并发现:
(-1,1)
范围内缩放,而是选择了 (0,1)
,这将我的验证损失减少了一个数量级答案 2 :(得分:0)
与您经常发生的训练组相比,您的验证设置非常小。权重的一点变化使得验证损失的波动远远大于训练损失。这可能不是必要的意味着您的模型过度使用。只要验证损失的整体趋势不断下降。
可能您的列车和验证数据来自不同的来源,它们可能有不同的分布。当您的数据是时间序列时,可能会发生这种情况,并且您将列车/验证数据按特定时间戳分开。
不,验证(前向传递一次)和训练(前进和后退)是不同的过程。因此,单个forword pass不会改变你接下来的训练方式。
不,但我想你可以实现自己的方法来实现。但是,有一点需要注意的是,该模型试图学习仅通过训练数据来提供成本函数的最佳解决方案,因此通过观察验证损失来改变学习率并不是很有意义。
原因如上所述。如果是第一种情况,放大验证设置将使您的损失看起来更稳定,但并不意味着它更适合。我的建议是只要您确定您的模型没有过度拟合(火车损失和验证损失之间的差距不是太大),您可以保存模型,从而获得最低的验证损失。
如果是第二种情况,可以根据您的情况进行评估。您可以尝试排除训练集中的样本,这些样本不是类似的#34;使用验证集,或者如果您有足够的数据,可以扩大模型的容量。或者,perhapes会添加更多指标来监控培训情况。