我正在阅读 Pytorch 和 Tensorflow 中的交叉熵文档。我知道他们正在修改交叉熵的幼稚实现来解决潜在的数字溢出/下溢。但是,我无法理解这些修改是如何提供帮助的。
implementation of Cross Entropy in Pytorch遵循以下逻辑 -
哪里是 softmax 分数和 是原始分数。
这似乎不能解决问题,因为 也会导致数值溢出。
现在,我们将它与 Tensorflow 的实现进行对比(我得到了 from a discussion in Github 。这可能是完全错误的)-
让 是所有 k 个原始 logit 分数的向量。
虽然这解决了上溢的问题,但它遇到了下溢的问题,因为 可能是这将导致一个更小的
有人可以帮我理解这里发生了什么吗?
最佳答案
为了社区的利益,通过结合评论部分的答案来回答这里。
由于您已经在 中解决了数字溢出的问题。 PyTorch ,这是通过减去最大值来处理的,如下所示( from here )。
scalar_t z = std::exp(input_data[d * dim_stride] - max_input);
谈到 TensorFlow 的交叉熵实现,下溢问题并不是那么重要,因为它在数值上被忽略,而占主导地位的大值。
关于tensorflow - 为什么 Pytorch 和 Tensorflow 中交叉熵的实现不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63657247/