如何解决为什么Pytorch和Tensorflow中的交叉熵实现不同?
我正在阅读Pytorch和Tensorflow中的交叉熵文档。我知道他们正在修改交叉熵的简单实现,以解决潜在的数字上溢/下溢问题。但是,我完全无法理解这些修改如何提供帮助。
implementation of Cross Entropy in Pytorch遵循以下逻辑-
现在,我们将其与Tensorflow的实现进行对比(我得到了from a discussion in Github。这可能是完全错误的)-
让是所有k个原始logit得分的向量。
尽管这解决了溢出问题,但由于可能导致甚至更小https://humanwhocodes.com/blog/2009/07/28/the-best-way-to-load-external-javascript/
有人可以帮助我了解这里发生的事情吗?
解决方法
在这里通过组合评论部分的答案来为社区造福。
既然您已经解决了 PyTorch 中的数字溢出问题,可以通过减去以下最大值(from here)来解决。
scalar_t z = std::exp(input_data[d * dim_stride] - max_input);
在TensorFlow的交叉熵实现中,下溢并不是一个主要问题,因为它在数值上被较大的数值忽略。
,在PyTorch中
loss = F.cross_entropy(x,target)
等效于:
lp = F.log_softmax(x,dim=-1)
loss = F.nll_loss(lp,target)
对于log_softmax
,我们不直接计算softmax的对数,而是使用log-sum-exp技巧:
def log_softmax(x):
return x - x.exp().sum(-1).log().unsqueeze(-1)
在数字上是黑貂。 PyTorch和Tensorflow都使用此技巧。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。