为什么交叉熵在 Pytorch 和 Tensorflow 中的实现不同?

kus*_*sur 5 precision neural-network tensorflow pytorch

我正在浏览 Pytorch 和 Tensorflow 中的交叉熵文档。据我所知,他们正在修改交叉熵的简单实现,以解决潜在的数字上溢/下溢问题。然而,我根本无法理解这些修改有何帮助。

Pytorch 中交叉熵的实现遵循以下逻辑 -

在此输入图像描述

在哪里在此输入图像描述是 softmax 分数,在此输入图像描述是原始分数。

这似乎并不能解决问题,因为在此输入图像描述也会导致数字溢出。

现在,我们将它与 Tensorflow 的实现进行对比(我从 Github 的讨论中得到它。这可能是完全错误的) -

在此输入图像描述是所有 k 个原始 Logit 分数的向量。
在此输入图像描述

虽然这解决了溢出问题,但它遇到了下溢问题,因为有可能在此输入图像描述这将导致更小的在此输入图像描述

有人可以帮助我理解这里发生了什么吗?

小智 1

为了社区的利益,通过结合评论部分的答案来回答这里。

由于您已经解决了PyTorch中的数字溢出问题,因此可以通过减去最大值来处理,如下所示(来自此处)。

scalar_t z = std::exp(input_data[d * dim_stride] - max_input);
Run Code Online (Sandbox Code Playgroud)

对于 TensorFlow 的交叉熵实现来说,下溢问题并不是那么严重,因为在数值上它在占主导地位的大值中被忽略了。