干貨|不同的損失函數會對深度神經網絡帶來什么樣的影響?

鎂客 8年前 (2017-02-09)

二次損失函數會在神經元犯了明顯錯誤的情況下使得網絡學習緩慢,而使用交叉熵損失函數則會在明顯犯錯的時候學的更快。

今天,我們主要來談談不同的損失函數會對深度神經網絡帶來什么樣的影響?(可以參考英文文獻:http://neuralnetworksanddeeplearning.com/index.html)

首先,我將列出兩種重要的損失函數:

(1)二次損失函數

(2)交叉熵損失函數

稍微解釋一下交叉熵損失函數:

我們定義a=f(z),f是激活函數,z是某個神經元的輸入,即,

對于一個輸出非0即1的問題,我們定下交叉熵損失函數如下:

N是訓練樣本容量,y 是對應樣本輸出標簽,a是樣本對應的目標輸出。至于為什么這樣的一個定義函數能被看作成代價損失函數,這里不予證明。

我們回到二次損失函數,舉個例子(單神經元模型),我們期望輸入為1時,輸出為0;反之,輸入為0時,輸出為1。首先將權重和偏執初始化為0.6、0.9。剛開始神經元的輸出是0.82,如圖所示:

然后,我們開始訓練這個網絡,經過一段時間的學習,得到如下所示:

我們看到經過300個epoch后,網絡基本能達到我們的學習要求。從圖中可以看出:學習曲線起初下降的很快,網絡收斂的很快,在大概80epoch左右可以收斂。

但是,如果我們改變權重和偏置的初始值(w=2.00,b=2.00),我們將得到如下的學習曲線:

從上圖可以看出,網絡在300epoch同樣達到收斂,但是曲線在起初的時候,學習的很緩慢,幾乎沒有什么學習能力。同時,我們可以明銳的觀察到起初學的很慢時,其對應的cost同樣處于很大的一個值,這就會引入我們深思,明明誤差很大,為什么還要學習的那么慢。打個比方,你在學習投籃時,第一次投,發現球與籃筐偏的很離譜,下一步,你很快就知道如何調整方向,并且大概知道需要調整多少角度,而在你投的時候,你也會根據上次的偏差調整好適當的角度以達到一個滿意的結果。

其實,這就是人的學習能力,就是在你犯了很大錯誤的時候,你的調整能力是最強的,而上面的二次損失函數似乎表現的差強人意。

那么,為什么人工神經網絡中會出現這樣的情況呢?也就是為什么人工神經元在其犯很大錯誤的情況下,反而學習的更加緩慢?

我們還是從數學的角度來分析這個問題,我們知道我們的輸入依賴于輸入、權重以及偏置。我們真正學習的是那些“權重系數”,這才是“特征”。輸入是一定的,關鍵在于權重系數。權重系數初始化后,由《深度學習之c++實現反向傳播算法》知道其更新的變化依賴于損失函數的偏導數。我們說曲線學的很平坦,學習緩慢時,實際上反映出來的結果就是這些對于權重系數的偏導數很小。那么,為什么這些偏導數會變得如此的小以至于網絡收斂很慢呢?

我們知道二次代價函數定義如下:

a是輸出,y 是目標標簽值。

由鏈式求導法則得到:

下面給出激活函數是sigmod的曲線及其導函數曲線圖:

sigmod函數曲線圖

sigmod導函數曲線。

顯然,當神經元輸出接近1或者0的時候,曲線相當平坦,對應是其導函數曲線值很小,最大導數值是0.25,實際上就是深度神經網絡進入了《如何優雅地對深度神經網絡進行訓練》文中所說的飽和狀態了,學習相當緩慢。

引入交叉熵損失函數帶來的變化

同樣地,由鏈式求導法則得到:

進一步計算便得到:

對于激活函數是sigmod的情況,我們可以得到更簡潔的形式(σ′(z) = σ(z)(1 − σ(z))):

這是一個令人興奮的表達式,優雅而富有深意。讓我們注意一下這個式子中最為關鍵的一項σ(z)−y ,它其實是告訴我們學習的誤差越大,你得到的導數值越大,曲線下降的越快,你的學習速度更快,網絡收斂的更快。而且損失對于權重系數的偏導師只與誤差有關,且激活函數的導數值無關(還記得那個最大值0.25嘛?)。此時,你可以感嘆一下:交叉熵損失函數真的很好。對于初始值w=2.0,b=2.0的那個例子,利用交叉熵損失函數得到的學習曲線如下:

這里,網絡收斂的很快,解決了學習緩慢的問題,而且相比于二次損失函數,其收斂速度更快。

結論:不同的損失函數的選擇帶來的學習效率的不同,二次損失函數會在神經元犯了明顯錯誤的情況下使得網絡學習緩慢,而使用交叉熵損失函數則會在明顯犯錯的時候學的更快。

本文轉自全球人工智能,作者徐鵬。

最后,記得關注微信公眾號:鎂客網(im2maker),更多干貨在等你!

鎂客網


科技 | 人文 | 行業

微信ID:im2maker
長按識別二維碼關注

硬科技產業媒體

關注技術驅動創新

分享到