tf.nn.sigmoid_cross_entropy_with_logits & tf.losses.log_loss
Swift Lv6

在训练模型的过程中,使用tf.losses.log_loss计算二分类loss,随着训练的深入,loss值为NaN,最终模型训练失败。排查下来发现是该函数存在数值不稳定的情况。

假设DNN模型输出的$loggits=x$,概率$p=\sigma(x)$,标签$label=y$

tf.losses.log_loss原理

计算过程非常直接,当$p$极大或者极小时,float32下会精确等于1或者0,$log(0)$就会导致NaN/Inf,尽管$\epsilon$会做兜底,但梯度信息已经严重失真。

tf.nn.sigmoid_cross_entropy_with_logits原理

上述公式通过两个trick确保了数值计算的稳定:

  1. 1法:$log(1+z)$保证最小值为0,而不是-inf
  2. max拆分:由于$e^x$也会导致值溢出,将其转换成max和$e^{-|x|}$,保证极值情况下$e^{-|x|}\approx0$
Powered by Hexo & Theme Keep
This site is deployed on
Unique Visitor Page View