解释神经网络的火车验证损失

时间:2018-10-01 03:34:12

标签: python neural-network keras lstm loss

我已经为时间序列预测训练了LSTM模型。我已经使用了150个耐心的早期停止方法。 我使用的dropout为0.2,这是训练损失和验证损失的图: enter image description here

早期停止方法在650个历元之后停止训练,并在第460历元(最好是验证损失最大)周围保存最佳体重。

我的问题是: 火车损失始终高于验证损失是否正常? 我知道,如果情况相反(火车上方的验证损失),那将是过度拟合的迹象。 但是这种情况呢?

编辑: 我的数据集是具有每小时时频的时间序列。它由35000个实例组成。我将数据分为80%的训练和20%的验证,但按时间顺序排列。因此,例如,培训将包含直到2017年初的数据,并验证从2017到年底的数据。 我通过对15天内的数据进行平均来创建该图,结果如下:enter image description here

所以也许是因为您所说的,验证数据具有更简单的模式。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

在大多数情况下,由于模型可以访问训练集中的标签,因此验证损失应高于训练损失。实际上,训练新网络的一个好习惯是使用一小部分数据,然后查看训练损失是否可以收敛到0(完全适合训练集)。如果不是这样,则意味着该模型无法以某种方式记住数据。

让我们回到您的问题上。我认为确认损失小于训练损失的观察发生了。 但这可能不是因为您的模型,而是因为您如何分割数据。请考虑数据集中有两种类型的模式(A和B)。如果以训练集同时包含模式A和模式B的方式进行拆分,而小的验证集仅包含模式B。在这种情况下,如果B易于识别,则可能会导致较高的训练损失。 / p>

在一个更极端的示例中,模式A几乎无法识别,但在数据集中只有模式的1%。并且模型可以识别所有模式B。如果验证集恰好只有模式B,则验证损失将较小。

正如alex所提到的,使用K折是确保每个样本都将用作验证和训练数据的好方法。另外,打印出混淆矩阵以确保所有标签都相对平衡是另一种尝试的方法。

答案 1 :(得分:1)

通常情况恰好相反。但是由于您使用的是辍学,因此验证损失通常少于训练损失。就像其他人建议尝试k倍交叉验证