pytorch训练一段时间突然出现NaN

it2024-01-30  73

一、常见原因方法1

https://www.cnblogs.com/bonelee/p/8603750.html

一般来说,出现NaN有以下几种情况:

相信很多人都遇到过训练一个deep model的过程中,loss突然变成了NaN。在这里对这个问题做一个总结。 1.如果在迭代的100轮以内,出现NaN,一般情况下的原因是因为你的学习率过高,需要降低学习率。可以不断降低学习率直至不出现NaN为止,一般来说低于现有学习率1-10倍即可。 2.如果当前的网络是类似于RNN的循环神经网络的话,出现NaN可能是因为梯度爆炸的原因,一个有效的方式是增加“gradient clipping”(梯度截断来解决) 3.可能用0作为了除数; 4.可能0或者负数作为自然对数 5.需要计算loss的数组越界(尤其是自己,自定义了一个新的网络,可能出现这种情况) 6.在某些涉及指数计算,可能最后算得值为INF(无穷)(比如不做其他处理的softmax中分子分母需要计算exp(x),值过大,最后可能为INF/INF,得到NaN,此时你要确认你使用的softmax中在计算exp(x)做了相关处理(比如减去最大值等等))

二、常见原因方法

梯度爆炸,解决方法:调学习率、梯度剪裁、归一化

方法: 1、数据归一化(减均值,除方差,或者加入normalization,例如BN、L2 norm等) 2、更换参数初始化方法(对于CNN,一般用xavier或者msra的初始化方法); 3、减小学习率、减小batch size; 4、加入gradient clipping; 原因: 1、学习率太大问题导致梯度爆炸: 原因很简单,学习率较高的情况下,直接影响到每次更新值的程度比较大,走的步伐因此也会大起来。 如下图,过大的学习率会导致无法顺利地到达最低点,稍有不慎就会跳出可控制区域,此时我们将要面对的就是损失成倍增大(跨量级)。 这种情况很容易在网络层数比较深的时候出现,所以同样学习率res50可以,res101,会训练NaN ([https://blog.csdn.net/lrt366/article/details/97616926](https://blog.csdn.net/lrt366/article/details/97616926))

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

计算loss的时候有log0,可能是初始化的问题,也可能是数据的问题

loss突然变nan的原因,很可惜并不是这里其他所有答主所说的“因为梯度爆炸”、“lr过大”、“不收敛”等等原因, 而是因为training sample中出现了脏数据!脏数据的出现导致我的logits计算出了0,0传给 即nan。 所以我通过设置batch_size = 1,shuffle = False,一步一步地将sample定位到了所有可能的脏数据,删掉。 期间,删了好几个还依然会loss断崖为nan,不甘心,一直定位一直删。终于tm work out! 作者:Scofield 链接:https://www.zhihu.com/question/49346370/answer/309842972 来源:知乎

三、警惕!损失Loss为Nan或者超级大的原因,理由原理充分

https://blog.csdn.net/lrt366/article/details/97616926

最新回复(0)