Machine learning LSTM验证损失越大,验证精度越高(Python:Keras)

Machine learning LSTM验证损失越大,验证精度越高(Python:Keras),machine-learning,keras,lstm,loss,Machine Learning,Keras,Lstm,Loss,在培训我的LSTM(使用Python中的Keras库)时,验证损失不断增加,尽管它最终获得了更高的验证精度。这就引出了两个问题: 它如何/为什么在(显著)较高的验证损失下获得(显著)较高的验证精度 验证损失增加是否有问题?(因为无论哪种方式,最终都会获得良好的验证精度) 这是适用于我的LSTM的历史记录示例: 将历元0与历元430进行比较时可见: 1.1 val损失时的val准确率为52%,而1.8 val损失时的val准确率为61% 对于损失函数,我使用tf.keras.loss.Categ

在培训我的LSTM(使用Python中的Keras库)时,验证损失不断增加,尽管它最终获得了更高的验证精度。这就引出了两个问题:

  • 它如何/为什么在(显著)较高的验证损失下获得(显著)较高的验证精度
  • 验证损失增加是否有问题?(因为无论哪种方式,最终都会获得良好的验证精度)
  • 这是适用于我的LSTM的历史记录示例:

    将历元0与历元430进行比较时可见:

    1.1 val损失时的val准确率为52%,而1.8 val损失时的val准确率为61%

    对于损失函数,我使用tf.keras.loss.CategoricalCrossentropy,我使用SGD优化器,学习率高达50-60%(因为它获得了最佳的验证精度)

    起初我认为这可能是过度拟合,但后来我不明白验证的准确度最终是如何变得相当高,几乎是验证损失的2倍

    任何见解都将不胜感激

    编辑:另一个不同运行的示例,验证精度波动较小,但随着验证损失的增加,验证精度仍显著提高:

    在这次跑步中,我使用了低辍学率而不是高辍学率。

    正如你所说的,“在50-60%的高学习率下”,这可能是图表振荡的原因。降低学习速率或增加正则化可以解决振荡问题

    更一般地说

    交叉熵损失不是一个有界损失,所以有非常严重的异常值会使它爆炸

    • 精度可能会更高,这意味着您的模型能够学习除异常值之外的数据集的其余部分
    • 验证集有太多导致损失值振荡的异常值
    为了得出是否过度拟合的结论,您应该检查验证集是否存在异常值。

    如您所述,“在50-60%的高学习率下”,这可能是图形振荡的原因。降低学习速率或增加正则化可以解决振荡问题

    更一般地说

    交叉熵损失不是一个有界损失,所以有非常严重的异常值会使它爆炸

    • 精度可能会更高,这意味着您的模型能够学习除异常值之外的数据集的其余部分
    • 验证集有太多导致损失值振荡的异常值

    为了得出是否过度拟合的结论,您应该检查验证集是否存在异常值。

    感谢您的输入,我将首先查看验证集中的异常值。我认为它可能确实在异常值上做得更糟(但导致相同的预测/分类),同时在其接近预测正确的其余数据上改进acc。至于高学习率,降低学习率会导致验证准确率显著降低。将学习率设置为50-60%似乎是我的模型获得最佳验证精度的最佳选择。顺便说一句,我确实有用于调节的辍学层,但即使辍学值很高,“问题”仍然存在。关于如何识别异常值,你有什么建议吗?例如,仅确定正确类别的预测概率最低的样本?(所以损失最高的是哪个)就你的情况而言,学习率似乎是个问题。你们超过了上下波动的最小值。你需要降低它或使用另一个优化器,或者如果你坚持使用SGD,你需要按时代调整你的LR。通过调整LR,您可以在不超调的情况下获得更好的结果。您也可以尝试L2正则化。关于第二个问题,您可以使用基于集群的异常检测(我假设您正在处理时间序列),我将研究基于集群的异常检测!至于LR,有没有办法衡量我的LR是否(仍然)过高?例如,您提到过,因为它波动很大,但为了优化结果,验证精度应该波动多少,是否有具体限制?(或者使用另一种正式方法来确定我的LR是否过高)编辑:我添加了另一个示例运行,其中验证精度波动不大,但在较高的验证损失下仍然会增加。如果没有数据集的详细信息,很难判断,但您可以使用ReduceLROnPlateu回调,LR调度程序。如果LR调整没有帮助,我会更改优化器并查看差异。感谢您的输入,我将首先查看验证集中的异常值。我认为它可能确实在异常值上做得更糟(但导致相同的预测/分类),同时在其接近预测正确的其余数据上改进acc。至于高学习率,降低学习率会导致验证准确率显著降低。将学习率设置为50-60%似乎是我的模型获得最佳验证精度的最佳选择。顺便说一句,我确实有用于调节的辍学层,但即使辍学值很高,“问题”仍然存在。关于如何识别异常值,你有什么建议吗?例如,仅确定正确类别的预测概率最低的样本?(所以损失最高的是哪个)就你的情况而言,学习率似乎是个问题。你们超过了上下波动的最小值。你需要降低它或使用另一个优化器,或者如果你坚持使用SGD,你需要按时代调整你的LR。通过调整LR,您可以在不超调的情况下获得更好的结果。您也可以尝试L2正则化。关于您的第二个问题,您可以使用基于集群的异常检测(我假设是