从tf.math.log_softmax和tf.keras.losses.SparseCategoricalCrossentropy看softmax的上溢和下溢问题

什么是softmax的上溢和下溢问题

从公式可以看出,对于电脑计算指数函数exp(x)时,

  1. 如果x过于大,比如1000,则会变为inf,无穷大,这就是softmax的上溢问题;

  1. 同样,如果x过于小,比如-1000,则exp(-1000)会直接收敛为0,当softmax的分母的每一项都是0时,就是对应的softmax的下溢问题。

解决这个问题的方法就是利用softmax的冗余性。即,softmax(x-a)=softmax(x)。注明,tf.math.softmax已经默认使用了此方法来解决上溢和下溢问题。详情见:(12条消息) softmax上溢和下溢问题_会飞的猩猩。的博客-CSDN博客_softmax 下溢

但是虽然通过冗余性可以解决上溢和下溢问题,但是数值的近似化已经生成,log(exp(-1000))的结果也就不对了。

而对于softmax的结果都是在(0,1)之间,在对softmax激活函数后的结果进行交叉熵损失计算时,则很容易出现大量的0结果,从而使得结果的可靠性受到挑战,为此,出现了tf.math.log_softmax和tf.math.log_sigmoid。在模型上的体现上,例如tf.keras.losses.SparseCategoricalCrossentropy中有一个参数from_logits,其就是在将模型的最后一个激活层移动到损失函数的计算上来,从而减少数值溢出问题导致的模型可靠性不足。关于tf.keras.losses.SparseCategoricalCrossentropy的介绍,见(12条消息) tf.keras.losses.SparseCategoricalCrossentropy 学习总结_会发paper的学渣的博客-CSDN博客

特别注意如下数值问题:

tf.math.exp(tf.constant([1000.]))的结果为inf,即无穷大

tf.math.exp(tf.constant([-1000.]))的结果为0

tf.math.log(tf.constant([[1e-40]]))的结果为-inf,即负无穷小

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会发paper的学渣

您的鼓励和将是我前进的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值