干貨|不同的損失函數(shù)會對深度神經(jīng)網(wǎng)絡帶來什么樣的影響?

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

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

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

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

(1)二次損失函數(shù)

(2)交叉熵損失函數(shù)

稍微解釋一下交叉熵損失函數(shù):

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

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

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

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

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

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

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

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

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

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

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

我們知道二次代價函數(shù)定義如下:

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

由鏈式求導法則得到:

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

sigmod函數(shù)曲線圖

sigmod導函數(shù)曲線。

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

引入交叉熵損失函數(shù)帶來的變化

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

進一步計算便得到:

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

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

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

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

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

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

鎂客網(wǎng)


科技 | 人文 | 行業(yè)

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

硬科技產(chǎn)業(yè)媒體

關注技術驅動創(chuàng)新

分享到