nan值出现的原因
NaN(Not a Number,非数)是计算机科学中数值数据类型的一类值,表示未定义或不可表示的值。常在浮点数运算中使用。首次引入NaN的是1985年的[IEEE 754](https://baike.baidu.com/item/IEEE 754/3869922)浮点数标准
看完这条百科其实大家就差不多明白问题出在哪里了,后面几点是比较具体的分析,和一些例子和实际踩坑。
出现原因
-
在使用log loss 出现了负数
这个我们很好理解 log(-1),
np.log(-1) nan
-
学习率太大
首先学习率太大,会出现震荡,出现震荡,会导致你的梯度值特别大,很可能出现溢出这种情况。这个梯度值可能是inf,-inf。
而以下这些操作都会导致nan的产生,这些都是不确定的操作。
>>> a = np.inf/np.inf >>> a nan >>> 0*np.inf nan
-
脏数据
一旦表达式中有了第一个nan,它就会传播,所以在调试时,通常需要找到第一个出错的
常见报错
也就是说nan和overflowError通常是相伴想随的。
-
OverflowError: int too large to convert to float
-
RuntimeWarning: overflow encountered in multiply
-
RuntimeWarning: invalid value encountered in reduce return ufunc.reduce(obj, axis, dtype, out, **passkwargs)
上面这句,提示你再进行矩阵运算时,已经出现了非法值。而这些非法值大概率是nan,那么之后所有的结果都就是null。
总结
总结:为了避免这种情况,调参时,大的不行就往小调(步子迈的大难免扯着蛋)。出现问题,不要慌,先找可能出现的非法操作。比如log loss的赋值和overflow inf。