【问题标题】:Multivariate LSTM Forecast Loss and evaluation多元 LSTM 预测损失和评估
【发布时间】:2018-03-10 23:08:37
【问题描述】:

我有一个用于时间序列回归问题的带有双向 LSTMS 的 CNN-RNN 模型架构。我的损失不会超过 50 个 epoch。每个 epoch 有 20k 个样本。损失在 0.001 - 0.01 之间不断波动。

batch_size=1
epochs = 50
model.compile(loss='mean_squared_error', optimizer='adam')   
trainingHistory=model.fit(trainX,trainY,epochs=epochs,batch_size=batch_size,shuffle=False)
  1. 我尝试使用配对不正确的 X 和 Y 数据来训练模型, loss 保持在 0.5 左右,我的 X 和 Y 是否合理的结论 有一个非线性关系,我的模型可以学习 更多纪元?
  2. 我的模型的预测捕获了模式,但有偏移,我使用动态时间扭曲距离手动检查预测的准确性,有没有更好的方法?

型号:

model = Sequential()
model.add(LSTM(units=128, dropout=0.05, recurrent_dropout=0.35, return_sequences=True, batch_input_shape=(batch_size,featureSteps,input_dim)))
model.add(LSTM(units=32, dropout=0.05, recurrent_dropout=0.35, return_sequences=False))
model.add(Dense(units=2, activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer=opt, metrics=['accuracy'])

【问题讨论】:

    标签: keras regression lstm rnn


    【解决方案1】:

    如果你测试过:

    • 错误数据:损失 ~0.5
    • 正确数据:损失 ~0.01

    那么你的模型实际上可以学习一些东西。

    有一些可能性:

    1. 您的输出数据不在最后一层激活的范围内
    2. 您的模型达到了当前学习率的限制(梯度更新步骤太大,无法再改进模型)。
    3. 您的模型不足以完成这项任务。
    4. 您的数据有一定程度的随机因素

    案例 1:

    确保您的Y 在您上次激活函数的范围内。

    • 对于tanh(LSTM 的默认值),所有 Y 数据应介于 -1 和 + 1 之间
    • 对于sigmoid,介于 0 和 1 之间
    • 对于softmax,介于 0 和 1 之间,但请确保您的最后一个维度不是 1,否则所有结果将始终为 1。
    • 对于relu,介于 0 和无穷大之间
    • 对于linear,任何值

    如果您的激活有限而不是无限激活,则收敛会更好。
    在第一种情况下,你可以重新编译(训练后)学习率较低的模型,通常我们将其除以 10,其中默认为0.0001

    案例 2:

    如果数据正常,请尝试在模型停滞后降低学习率。

    adam的默认学习率是0.0001,我们经常把它除以10:

    from keras.optimizers import Adam
    
    #after training enough with the default value: 
    model.compile(loss='mse', optimizer=Adam(lr=0.00001)
    trainingHistory2 = model.fit(.........)
    
    #you can even do this again if you notice that the loss decreased and stopped again:
    model.compile(loss='mse',optimizer=Adam(lr=0.000001)
    

    如果问题出在学习率上,这将使您的模型学得比现在更多(一开始可能会有一些困难,直到优化器自行调整)。

    案例 3:

    如果你没有成功,也许是时候增加模型的能力了。 也许向层添加更多单元,添加更多层甚至更改模型。

    案例 4:

    您可能对此无能为力...

    但是,如果您像案例 3 那样增加模型,请小心过度拟合(保留一些测试数据以比较测试损失与训练损失)。

    太好的模型可以简单地记住您的数据,而不是学习有关它的重要见解。

    【讨论】:

    • 你能评论一下这个训练历史吗:{'acc': [0.54, 0.62, 0.70, 0.77, 0.81, 0.84, 0.85, 0.86, 0.88, 0.89], 'loss': [0.69, 0.64, 0.56, 0.47, 0.40, 0.35, 0.32, 0.29, 0.27, 0.24], 'val_acc': [0.52, 0.52, 0.51, 0.50, 0.51, 0.50, 0.52, 0.53, 0.51, 0.49], 'val_loss': [0.52, 0.52, 0.51, 0.50, 0.51, 0.50] 0.69, 0.75, 0.81, 0.99, 1.03, 1.09, 1.04, 1.16, 1.13, 1.35]}
    • 听起来像是过拟合。当训练数据变得更好而测试数据变得更糟时。这意味着您的模型正在学习记忆训练数据。 (它有太多的参数,可能有太多的层,或者太多的单元)。人们经常使用“dropout”层来减少过拟合。您也可以尝试较小的型号。 (这是假设您的验证数据和您的训练数据是正确的,选择没有偏见等)
    • 我在问题中添加了我的模型。请看一看。由于我只是想证明我的 X 和 Y 中存在可学习的关系,并且我的正确匹配数据的准确性略高(2% @ 53%),我可以得出结论吗?我不确定的原因是因为我的损失曲线看起来不像流行的 L 形。
    • 就像我说的,你的曲线是过拟合曲线。你需要制作一个更小的模型。一个能力较差的模型。不幸的是,没有最佳尺寸的确切答案。您必须进行测试,直到您的曲线开始表现不同。你的模型目前正在记忆训练结果(因为你的模型太好了)。它没有学习任何关于测试数据的信息。
    猜你喜欢
    • 2023-03-06
    • 2021-11-19
    • 2020-05-15
    • 1970-01-01
    • 2021-04-04
    • 1970-01-01
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多