Neural-Networks

損失函數自動編碼器與變分自動編碼器或 MSE 損失與二進制交叉熵損失

  • June 7, 2018

當我們的標籤向量中有實值條目(例如,在 0 和 1 之間浮動作為灰度值從 0 到 256 的標準化表示)時,我一直認為如果我們想測量之間的距離/誤差,我們會使用 MSE(R2-loss)輸入和輸出或網絡的一般輸入和標籤。另一方面,我也一直認為,只有在我們嘗試預測概率並且地面實況標籤條目是實際概率時才使用二元交叉熵。

現在,當使用通過 tensorflow 加載的 mnist 數據集時,如下所示:

from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)

每個條目都是一個 float32,範圍在 0 和 1 之間。

自動編碼器的 tensorflow教程使用 R2-loss/MSE-loss 來測量重建損失。

其中變分自動編碼器的 tensorflow教程使用二元交叉熵來測量重建損失。

有人可以告訴我為什麼,基於具有相同值的相同數據集(它們都是實際上代表像素值的數值),它們對自動編碼器使用 R2-loss/MSE-loss,對變分使用 Binary-Cross-Entropy 損失自動編碼器。

我認為不用說,這兩個損失函數都應用於 sigmoid 輸出。

我不相信這裡有某種深刻的、有意義的理由——這是一個在 MNIST 上運行的展示示例,它非常容錯。


針對 MSE 進行優化意味著您生成的輸出強度對稱地接近輸入強度。高於訓練強度的懲罰與同等價值的低強度懲罰相同。


交叉熵損失是不對稱的。

如果您的真實強度很高,例如 0.8,則生成強度為 0.9 的像素比生成強度為 0.7 的像素受到更多懲罰。

相反,如果它很低,例如 0.3,則預測強度為 0.4 的懲罰低於預測強度 0.2。

你現在可能已經猜到了——只要基本事實不是二元的,交叉熵損失就會**偏向於 0.5 。**對於 0.5 的基本事實,每像素零歸一化損失等於 2*MSE。

這顯然是錯誤的!最終結果是您正在訓練網絡以始終生成比輸入更模糊的圖像。您正在積極懲罰任何會提高輸出清晰度的結果,而不是那些使輸出清晰度更差的結果!


MSE 也不能倖免於這種行為,但至少它只是不偏不倚,沒有偏向完全錯誤的方向

然而,在你開始編寫具有相反偏差的損失函數之前 - 請記住,將輸出推離 0.5 反過來意味著解碼圖像將具有非常硬的像素化邊緣。

那就是 - 或者至少我非常強烈懷疑 - 為什麼對抗性方法會產生更好的結果 - 對抗性組件本質上是(可能是變分的)自動編碼器的可訓練的“智能”損失函數。

引用自:https://stats.stackexchange.com/questions/350211

comments powered by Disqus