模型不收敛的原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了模型不收敛的原因相关的知识,希望对你有一定的参考价值。

参考技术A 1、反向传播链断裂

即其中有部分的变量可能被转换为 numpy 数组,虽然仍然能够参与计算,但却失去了梯度传播的能力,导致无法向后面的变量传播梯度

2、学习率设置不合理

如果学习率设置得太大,则容易造成 loss 变成 nan,导致模型不收敛,设置得太小,则会导致模型学习得很慢

3、神经网络层参数没有进行好的参数初始化

因为参数初始化会影响到模型的训练速度

4、神经网络层参数没有进行梯度裁剪

没有进行梯度裁剪的话可能会导致梯度爆炸,从而使得模型无法将有效的梯度反向传播

5、训练次数不足

模型要经过足够多的学习之后,才能够学习到好的特征,过早地暂停模型的训练,会导致模型并没有学习到好的特征

6、训练批次中的样本数量太少,导致 loss 值存在波动,从而造成模型不收敛的错觉

深度学习训练集的损失曲线收敛很快而且验证集不下降是啥原因导致的?

之前查资料说是有可能过拟合,我把dropout调成0.8了,并且把模型简化了一些,训练集和测试集的结果还是差的很多,而且最主要的时训练集在epoch等于1的时候就不下降了,之后一直保持平稳,会不会是因为我的数据相对于深度学习的模型来说过于简单,稍微训练一下就会过拟合?这种情况该如何解决,继续简化模型层数可以吗,还是通过调参的方式解决,求助!

参考技术A

请检查test set和train set是否相差巨大,一般情况下,要求training set跟testing set的数据的distribution都是差不多的,不能相差太大。 请通过可视化数据来检查,如果是图片,就检查图片是否出现异常。

然后调整模块。我建议先把dropout完全去掉试一下

然后一些常见的错误,比如evaluation的时候忘记把batchnorm和dropout层设置为eval mode,可能也会产生意想不到的错误效果。

当然也有可能是训练的时间不够长。请尝试训练更多的epochs,有可能测试集精度会进一步上升。因为不清楚你的loss用的是什么,我看到你的loss似乎才1.8左右,如果是交叉熵这种loss,那么很可能是你训练得还不够长,loss还能够更低一点,建议训多50个epoch再看看?

祝好运~

以上是关于模型不收敛的原因的主要内容,如果未能解决你的问题,请参考以下文章

机器学习经验总结-神经网络训练失败的一些常见原因

神经网络不收敛的 11 个原因及其解决办法

流量收敛

机器学习:思考神经网络训练失败的原因

梯度爆炸

梯度下降算法在 Haskell 中不收敛