码迷,mamicode.com
首页 > 其他好文 > 详细

softmax数值溢出 与 softmax-loss问题

时间:2018-05-26 17:51:55      阅读:2058      评论:0      收藏:0      [点我收藏+]

标签:代码   cal   xen   last   一个   特殊   flow   eric   编程   

1.在阅读tensorflow源码的softmax实现过程中,可以看到它的实现有两个特殊地方:

①计算e指数的时候,所有logits都减去了每行的最大值

②其softmax_op_functor.h中,可以看到根据传入的log参数不同分别有两种不同计算方法。log为true时,计算LogSoftmax,log为false时,计算Softmax

其中这两个特殊的地方一个是为了解决数值上溢的问题,一个是解决数值下溢的问题。

具体参考:https://www.codelast.com/%E5%8E%9F%E5%88%9B-%E5%A6%82%E4%BD%95%E9%98%B2%E6%AD%A2softmax%E5%87%BD%E6%95%B0%E4%B8%8A%E6%BA%A2%E5%87%BAoverflow%E5%92%8C%E4%B8%8B%E6%BA%A2%E5%87%BAunderflow/文章描述的很详细,就不重复写了,直接引用。

注:很多传统的数学算法都不能用在实践中,因为数学推导是一种理想情况,而实际的编程要考虑数值稳定性的问题,即不能上溢也不能下溢。

2.在tensorflow中,计算交叉熵损失的函数是tf.nn.softmax_cross_entropy_with_logits,除了用这个你还可以先计算出softmax的输出,然后利用reduce_sum自己定义损失,很多tensorflow教程也是这样的。但是tf更建议使用softmax_cross_entropy_with_logits,按理来说有了softmax的输出,自己定义交叉熵损失也是可行的,为什么还要搞一个softmax_cross_entropy_with_logits。原因就在于softmax_cross_entropy_with_logits函数可以减少计算量。在tf源码的xent_op.h(一开始找了半天cross_entropy的文件,发现没有,没想到它给缩写成了xent,x应该代表cross,ent就是entropy)中可以看到其注释,说的就是虽然代码和softmax_op的代码有重复,但是这样可以减少计算量。具体如何减少的参考:http://freemind.pluskid.org/machine-learning/softmax-vs-softmax-loss-numerical-stability/.

  将这两篇文章理解透,那么softmax也就差不多都理解了。

softmax数值溢出 与 softmax-loss问题

标签:代码   cal   xen   last   一个   特殊   flow   eric   编程   

原文地址:https://www.cnblogs.com/deepllz/p/9046157.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!