Mse

自編碼器的損失函數

  • November 11, 2016

我正在嘗試一些自動編碼器,並使用 tensorflow 創建了一個嘗試重建 MNIST 數據集的模型。

我的網絡非常簡單:X, e1, e2, d1, Y,其中 e1 和 e2 是編碼層,d2 和 Y 是解碼層(Y 是重建的輸出)。

X 有 784 個單位,e1 有 100,e2 有 50,d1 再次有 100,Y 再次有 784。

我使用 sigmoids 作為層 e1、e2、d1 和 Y 的激活函數。輸入在 [0,1] 中,輸出也應該是。

好吧,我嘗試使用交叉熵作為損失函數,但輸出總是一個 blob,我注意到從 X 到 e1 的權重總是會收斂到一個零值矩陣。

另一方面,使用均方誤差作為損失函數,會產生一個不錯的結果,我現在能夠重建輸入。

為什麼呢?我以為我可以將這些值解釋為概率,因此使用交叉熵,但顯然我做錯了什麼。

我認為最好的答案是交叉熵損失函數並不適合這個特定的任務。

在採用這種方法時,您實際上是在說真正的 MNIST 數據是二進制的,並且您的像素強度表示每個像素“打開”的概率。但我們知道事實並非如此。這種隱含假設的不正確性導致了我們的問題。

我們還可以查看成本函數,看看為什麼它可能不合適。假設我們的目標像素值為 0.8。如果我們繪製 MSE 損失和交叉熵損失(將其標準化,使其最小值為零),我們得到:

交叉熵與 mse 損失

我們可以看到交叉熵損失是不對稱的。我們為什麼要這個?為這個 0.8 像素預測 0.9 真的比預測 0.7 更糟糕嗎?我會說這可能會更好,如果有的話。

我們可能會更詳細地了解為什麼這會導致您看到的特定斑點。我冒險猜測這是因為在您看到斑點的區域中像素強度平均高於 0.5。但總的來說,這是您所做的隱式建模假設不適合數據的情況。

希望有幫助!

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

comments powered by Disqus