1. 程式人生 > >《TensorFlow實戰Google深度學習框架》——4.2.1 經典損失函式(交叉熵、均方差)

《TensorFlow實戰Google深度學習框架》——4.2.1 經典損失函式(交叉熵、均方差)

目錄

1、交叉熵

1、交叉熵

交叉熵分類問題中使用比較廣的一種損失函式,刻畫了兩個概率分佈之間的距離。

給定兩個概率分佈p和q,通過q來表示p的交叉熵為:

交叉熵刻畫的是兩個概率分佈之間的距離,然而神經網路的輸出卻不一定是一個概率分佈。Softmax迴歸就是一個非常常用的方法,用來將神經網路前向傳播得到的結果變成概率分佈。

交叉熵刻畫的是通過概率分佈q來表達概率分佈p的困難程度。因為正確答案是希望得到的結果,所以當交叉熵作為神經網路的損失函式時,p代表的是正確答案,q代表的是預測值交叉熵刻畫的是兩個概率分佈的距離,也就是說交叉熵值越小, 兩個概率分佈越接近。

圖4-10展示了加上Softmax迴歸的神經網路結構圖。

假設原始的神經網路輸出為y_{1}y_{2},…,y_{n},那麼經過Sotmax迴歸處理之後的輸出為:

 假設有一個分類問題,某個樣例的正確答案是(1,0,0)。某模型經過Softmax迴歸之後的預測答案是(0.5,0.4,0.1),那麼這個預測和正確答案之間的交叉熵為:

如果另外一個模型的預測是(0.8,0.1 ,0.1),那麼這個預測值和真實值之間的交叉娟是:

從直觀上可以很容易地知道第二個預測答案要優於第一個 。

TensorFlow實現交叉熵程式碼:

cross_entyopy=-tf.reduce_mean(y_*tf.log(tf.clip_by_balue(y,1e-10,1.0)))

其中y_代表正確結果,y代表預測結果。(有對tf.clip_by_value函式不懂的,請參考本部落格對其的介紹

TensorFlow函式之tf.clip_by_value()

因為交叉煽一般會與softmax迴歸一起使用,所以TensorFlow對這兩個功能進行了統一封裝,並提供了tf.nn.softmax_cross_entropy_with_logits函式。

Softmax迴歸之後的交叉熵損失函式:

cross_entropy = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y )

其中y代表了原始神經網路的輸出結果,而 y_給出了標準答案 。

在只有一個正確答案的分類問題中,TensorFlow提供了tf.nn.sparse_softmax_cross_entropy_with_logits函式來進一步加速計算過程。(部落格

《TensorFlow:實戰Google深度學習框架》--5.2.1 MNIST手寫識別問題(程式已改進)有此方法的詳細案例。)

2、均方誤差 

與分類問題不同,迴歸問題解決的是對具體數值的預測。比如房價預測、銷量預測等都是迴歸問題。這些問題需要預測的不是一個事先定義好的類別,而是一個任意實數。解決迴歸問題的神經網路一般只有一個輸出節點,這個節點的輸出值就是預測值。
 

對於迴歸問題,最常用的損失函式是均方誤差(MSE,mean squared error)。定義如下:

 其中y_{i}為一個batch中第i個數據的正確答案,而y_{i}^{'}為神經網路給出的預測值。

TensorFlow實現均方誤差函式:

mse=tf.reduce_mean(tf.square(y_-y))

其中y代表了神經網路的輸出答案,y_代表了標準答案 。