簡單談談Cross Entropy Loss

Candy_GL發表於2018-11-01

版權宣告:本文為博主原創文章,未經博主允許不得轉載。    https://blog.csdn.net/xg123321123/article/details/80781611
寫在前面

分類問題和迴歸問題是監督學習的兩大種類:分類問題的目標變數是離散的;迴歸問題的目標變數是連續的數值。 
神經網路模型的效果及優化的目標是通過損失函式來定義的。

迴歸問題解決的是對具體數值的預測。比如房價預測、銷量預測等都是迴歸問題。這些問題需要預測的不是一個事先定義好的類別,而是一個任意實數。解決回顧問題的神經網路一般只有一個輸出節點,這個節點的輸出值就是預測值。對於迴歸問題,常用的損失函式是均方誤差( MSE,mean squared error )。

分類問題常用的損失函式為交叉熵( Cross Entropy Loss)。

這篇部落格我們簡單談談交叉熵損失函式。

交叉熵描述了兩個概率分佈之間的距離,當交叉熵越小說明二者之間越接近。[關於交叉熵的原理,我這有一篇簡單明白的部落格]

儘管交叉熵刻畫的是兩個概率分佈之間的距離,但是神經網路的輸出卻不一定是一個概率分佈。為此我們常常用Softmax迴歸將神經網路前向傳播得到的結果變成概率分佈。

softmax常用於多分類過程中,它將多個神經元的輸出,歸一化到( 0, 1) 區間內,因此Softmax的輸出可以看成概率,從而來進行多分類。

假設我們有一個包含k個元素的陣列V,i
表示V中的第i
個元素,那麼這i
個元素的softmax輸出就是:
Si=ei∑kj=1ej
為了舉一個具體例子,特意盜了一張圖,如下:[關於Softmax更簡單明白的原理闡述,特意負責任地推薦我這篇部落格]

注:在TensorFlow中使用Cross Entropy Loss時,主要是使用tf.nn.softmax_cross_entropy_with_logits這類函式,但這類函式需要輸入的是未經過Softmax的Logits。而所謂的unscaled logits就可以粗略理解為沒有經過Softmax的變數。這一點要與數學上的logits ( 一個事件發生與該事件不發生的比值的對數) 進行區分。

進入主題

簡單複習了Softmax,開始進入主題:損失函式為什麼要用Cross Entropy Loss。

出於直覺,人們會覺得可以使用classification error來做損失函式:
classification−error=count−of−error−itemscount−of−all−items
我們不置可否,先來看兩個模型:

以上兩個模型,computed 是預測結果,targets 是預期結果。 二者的數字,都可以理解為概率。 correct 一欄表示預測是否正確。

模型 1 中,item 1 和 2 以非常微弱的優勢判斷正確,item 3 則徹底錯誤,計算其classification error:
classification−error=1/3=0.33

模型 2 中,item 1 和 2 的判斷非常精準,item 3 判錯,但比較輕,計算其classification error:
classification−error=1/3=0.33
如果僅僅從2 個模型的 classification error 來判斷,那這兩個模型效能相同,但實際情況是:模型 2 要明顯優於模型 1。所以說,classification error 很難精確描述模型與理想模型之間的距離。

如果使用 ACE ( average cross-entropy error )?

首先,我們給出Cross Entropy Loss的公式:
Hy‘(y):=−∑iy′ilog(yi)
其中yi
是預測結果,y′i
是ground truth。
那麼根據公式, 模型中 1 第一項的 cross-entropy 是:
−((ln(0.3)∗0)+(ln(0.3)∗0)+(ln(0.4)∗1))=−ln(0.4)

以此類推,模型1的 ACE ( average cross-entropy error ) 是:
−(ln(0.4)+ln(0.4)+ln(0.1))/3=1.38
模型 2 的 ACE 是:
−(ln(0.7)+ln(0.7)+ln(0.3))/3=0.64
這樣一來ACE的結果準確的體現了模型 2 要優於模型 1的事實,所以說 Cross-Entropy Loss 更清晰的描述了模型與理想模型的距離。

為何不用 Mean Squared Error (平方和)

如果使用 MSE(mean squared error),則模型 1 第1項的 loss 是:
(0.3−0)2+(0.3−0)2+(0.4−1)2=0.09+0.09+0.36=0.54
模型 1 的 loss 是:
(0.54+0.54+1.34)/3=0.81
模型 2 的 loss 是:
(0.14+0.14+0.74)/3=0.34
MSE 看起來也是蠻不錯的。為何不採用?

分類問題最後必須是 one hot 形式算出各 label 的概率, 然後通過 argmax 選出最終的分類。

在本篇部落格最開始我們講到,在計算各個 label 概率的時候,用的是 softmax 函式。

如果用 MSE 計算 loss, 通過 Softmax後 輸出的曲線是波動的,有很多區域性的極值點,即非凸優化問題 (non-convex),如下圖 [ MSE是凸函式,logits先經過Softmax,再經過MSE形成的為非凸函式,姑且給個疑似解答連結]:

而用 Cross Entropy Loss 計算 loss,就還是一個凸優化問題,用梯度下降求解時,凸優化問題有很好的收斂特性。

注:TensorFlow中的loss函式定義在gen_nn_ops.py這個檔案裡,這個檔案在原始碼裡找不到,是編譯時由C++檔案生成的,如果真想看_softmax_cross_entropy_with_logits函式的原始碼,給你個連結:https://stackoverflow.com/questions/47987202/where-is-softmax-cross-entropy-with-logits-defined-in-tensorflow?noredirect=1&lq=1

最後的結論

分類問題用 One Hot Label + Cross Entropy Loss

Training 過程,分類問題用 Cross Entropy Loss,迴歸問題用 Mean Squared Error。

validation / testing 過程,使用 Classification Error更直觀,也正是我們最為關注的指標。

題外話- 為什麼迴歸問題用 MSE[可看可不看]

Cross Entropy Loss 對於神經網路的分類問題可以很好的應用,但是對於迴歸問題 [請自行翻閱上面的Cross Entropy Loss 公式],預測結果任意取一個值,比如 -1.5,就沒法計算 log(-1.5),所以一般不用交叉熵來優化迴歸問題。

為什麼用 MSE

最小二乘是在歐氏距離為誤差度量的情況下,由係數矩陣所張成的向量空間內對於觀測向量的最佳逼近點。

為什麼用歐式距離作為誤差度量 (即 MSE),09 年 IEEE Signal Processing Magzine 的 《Mean squared error: Love it or leave it?》這篇文章做了很好的討論。這篇文章在 “WHY DO WE LOVE THE MSE?” 中說,MSE:

1. 它簡單。

2. 它提供了具有很好性質的相似度的度量。

1)它是非負的;

2)唯一確定性。只有 x=y 的時候,d(x,y)=0;

3)它是對稱的,即 d(x,y)=d(y,x);

4)符合三角性質。即 d(x,z)<=d(x,y)+d(y,z).

3. 物理性質明確,在不同的表示域變換後特性不變,例如帕薩瓦爾等式。

4. 便於計算。通常所推導得到的問題是凸問題,具有對稱性,可導性。通常具有解析解,此外便於通過迭代的方式求解。

5. 和統計和估計理論具有關聯。在某些假設下,統計意義上是最優的。

但 MSE 也有缺點 
並不是所有的問題都可以套用該準則,在“IMPLICIT ASSUMPTIONS WHEN USING THE MSE”說,它基於了以下幾點對於訊號的假設:

1. 訊號的保真度和該訊號的空間和時間順序無關。即,以同樣的方法,改變兩個待比較的訊號本身的空間或時間排列,它們之間的誤差不變。例如,[1 2 3], [3 4 5] 兩組訊號的 MSE 和 [3 2 1],[5 4 3] 的 MSE 一樣。

2. 誤差訊號和原訊號無關。只要誤差訊號不變,無論原訊號如何,MSE 均不變。例如,對於固定誤差 [1 1 1],無論加在 [1 2 3] 產生 [2 3 4] 還是加在 [0 0 0] 產生 [1 1 1],MSE 的計算結果不變。

3. 訊號的保真度和誤差的符號無關。即對於訊號 [0 0 0],與之相比較的兩個訊號 [1 2 3] 和[-1 -2 -3] 被認為和 [0 0 0] 具有同樣的差別。

4. 訊號的不同取樣點對於訊號的保真度具有同樣的重要性。

本篇部落格主要參考自以下文章: 
神經網路的分類模型 Loss 函式為什麼要用 cross entropy 
詳解softmax函式以及相關求導過程 
為什麼分類問題用 cross entropy,而回歸問題用 MSE 
Where is _softmax_cross_entropy_with_logits defined in tensorflow? 
looking for source code of from gen_nn_ops in tensorflow
--------------------- 
作者:時光雜貨店 
來源:CSDN 
原文:https://blog.csdn.net/xg123321123/article/details/80781611 
版權宣告:本文為博主原創文章,轉載請附上博文連結!

相關文章