前言
训练或者预测过程中经常会遇到训练损失值或者验证损失值不正常、无穷大、或者直接nan的情况:

遇到这样的现象,通常有以下几个原因导致:
梯度爆炸造成Loss爆炸
原因很简单,学习率较高的情况下,直接影响到每次更新值的程度比较大,走的步伐因此也会大起来。如下图,过大的学习率会导致无法顺利地到达最低点,稍有不慎就会跳出可控制区域,此时我们将要面对的就是损失成倍增大(跨量级)。

另外,这种情况很容易在网络层数比较深的时候出现,借用gluon的一段话:

这就是典型的梯度爆炸,解决方法也很简单,降低初始的学习率,并设置学习率衰减。
检查输入数据和输出数据
通常我们都会保证输入的数据是否正确(这个要是不能保证那么后续也就没必要继续了..)。一般输入不正确的话可以立马观察出来。
有两种情况可能并不是那么容易检测到:
数据比较多,99%的数据是对的,但有1%的数据不正常,或者损坏,在训练过程中这些数据往往会造成nan或者inf,这时候需要仔细挑选自己的数据,关于如何挑选数据(https://oldpan.me/archives/how-to-use-tricks-to-train-network)。
训练过程中跳出了错误的数据,这是需要在IDE或者通过其他途径对运行中的程序进行分析。
这时我们要注意的是在训练过程中的输入和输出是否正确:

本文探讨了训练或预测过程中遇到损失值不正常、无穷大或nan的现象,分析了梯度爆炸、输入数据错误、损失函数设计不当、batchNorm问题以及数据加载时的Shuffle等因素可能导致这种情况,并给出了相应的解决建议,如调整学习率、检查数据、自定义检测函数等。
最低0.47元/天 解锁文章

624

被折叠的 条评论
为什么被折叠?



