[英]Why is the implementation of cross entropy different in Pytorch and Tensorflow?
我正在閱讀 Pytorch 和 Tensorflow 中的交叉熵文檔。 我知道他們正在修改交叉熵的幼稚實現來解決潛在的數字溢出/下溢。 但是,我無法理解這些修改是如何提供幫助的。
Pytorch 中交叉熵的實現遵循以下邏輯——
現在,我們將它與 Tensorflow 的實現進行對比(我從 Github 的討論中得到它。這可能是完全錯誤的)-
讓 是所有 k 個原始 logit 分數的向量。
雖然這解決了溢出的問題,但它遇到了下溢的問題,因為有可能 這將導致更小的
有人可以幫我理解這里發生了什么嗎?
為了社區的利益,通過結合評論部分的答案來回答這里。
由於您已經解決了PyTorch 中的數字溢出問題,因此可以通過減去最大值來處理,如下所示( 從這里)。
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 都使用這個技巧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.