出现Nan

作者: guanghuixu | 来源:发表于2018-04-28 17:16 被阅读0次

原因一:除0错误

  1. 数据原因:由于路径或脏数据等原因,造成数据读取出差
    解决方法:判断出现nan的数据的id,剔除,简单粗暴
  2. 代码原因:数据本身就存在0值,代码在执行过程中将其置为分母
    注意:很多代码都存在隐式除0操作,因为现成的损失函数有不少采用了log函数,如CrossEntropyLoss和log_softmax。使用log函数的优点可以拖到最底部,后文会描述。
y = log(softmax(x))
y' = 1/softmax(x)   ##出现除0操作,softmax的值域区间为[0,1]

解决方法: 令y= log(softmax(x)+EPS), 其中EPS可以取1e-12(极小值)

原因二:学习策略、超参设置不当

  1. 学习速率过大,尝试调小
  2. batch_size过大,尝试调小
  3. 尝试使用batch normalization和instance normalization

为什么很多损失函数都以log函数为原型?

令X表示我们模型的输出,而我们希望的预测类别是c,
则有预测概率P=softmax(X)
其中Pc:输出X属于c类的概率
一般来说,我们希望输出概率Pc越大越好,如何优化?
最简单的做法就是令损失函数
loss_f = -Pc
这样的做法在理解上十分直观,当我们优化loss_f取得最小值时,即Pc取得最大值
但我们还是需要使用log函数!!!

为方便讲解,我们暂时忽略损失函数前面的符号,
令loss_f = Pc
loss_g = log(Pc)

  1. 等价性
    loss_f与loss_g均为单调递增函数,优化loss_f与loss_g等价
  2. 惩罚力度
    loss_f是斜率为1的直线函数,具有梯度不变形,意味着不管Pc的值为0.9还是0.1,惩罚力度都是一样的
    而loss_g是曲线函数,接近0的地方值接近”无穷大“,接近1的地方值接近0,意味着当Pc=0.9时惩罚力度更小,而Pc接近0的时候表示偏差太大,惩罚力度非常大。

相关文章

  • 出现Nan

    原因一:除0错误 数据原因:由于路径或脏数据等原因,造成数据读取出差解决方法:判断出现nan的数据的id,剔除,简...

  • CALayer position contains NaN: [

    CALayer position contains NaN: [nan nan] 出现这样的报错原因有一般是在作除...

  • [TensorFlow] 常见问题汇总

    loss为何会出现nan? Deep-Learning Nan loss reasonshttps://stack...

  • python LIST转numpy后求均值出现nan

    aa = [1, nan, 2, 5] np.mean(aa)后出现nan 作法:去除List中的nan 然后再求...

  • NaN错误

    NaN的全称是not a number, 0作为除数时会出现NaN错误(比如10 / 0)

  • 出现NAN的情况

    1.任何值和NAN运算都是NAN 2.字符串进行算术运算(除了加法)数字返回NAN

  • pytorch loss 出现 nan

    排查问题: 调整学习率为0,loss还为NAN---->与学习率无关 模型内关于除、log等可能出现异常的操作,加...

  • IOS和安卓差异性表现

    1.ios下不支持 2017-07-08日期格式,会出现NaN-NaN-NaN乱码,因此进行转换 var to...

  • NaN

    matlab 出现NaN是因为求解器不对

  • JS中的NaN和isNaN

    一、NaN:not a number 不是个数字的数字类型 但是属于数字类型 注意:一旦程序出现NaN,肯定进行...

网友评论

      本文标题:出现Nan

      本文链接:https://www.haomeiwen.com/subject/ldlilftx.html