softmax数值溢出 与 softmax-loss问题
Posted 灰太狼锅锅
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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也就差不多都理解了。
以上是关于softmax数值溢出 与 softmax-loss问题的主要内容,如果未能解决你的问题,请参考以下文章
softmax与CrossEntropyLoss(),log_softmax与 NLLLoss()
softmax与CrossEntropyLoss(),log_softmax与 NLLLoss()
softmax与CrossEntropyLoss(),log_softmax与 NLLLoss()