softmax数值溢出 与 softmax-loss问题

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也就差不多都理解了。

猜你喜欢

转载自www.cnblogs.com/deepllz/p/9046157.html