簡體   English   中英

為什么 Pytorch 和 Tensorflow 中交叉熵的實現不同?

[英]Why is the implementation of cross entropy different in Pytorch and Tensorflow?

我正在閱讀 Pytorch 和 Tensorflow 中的交叉熵文檔。 我知道他們正在修改交叉熵的幼稚實現來解決潛在的數字溢出/下溢。 但是,我無法理解這些修改是如何提供幫助的。

Pytorch 中交叉熵的實現遵循以下邏輯——

在此處輸入圖片說明

在哪里在此處輸入圖片說明 是 softmax 分數和在此處輸入圖片說明 是原始分數。

這似乎不能解決問題,因為在此處輸入圖片說明 也會導致數值溢出。

現在,我們將它與 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM