神經網絡的提升方法(1)——交叉熵

本文是電子書Neural Networks and Deep Learning的讀書筆記,我不能保證自己理解是否有偏誤或者忽略了原文的精彩地方,如有請讀者指出,另外還是推薦英文閱讀能力較強的讀者直接去閱讀原書,因爲寫得真的不錯。原書地址:http://neuralnetworksanddeeplearning.com/#_motz_

神經網絡訓練的提升可以由四個方面進行:使用能反饋更大誤差信號的交叉熵(cross entropy)作爲損失函數、能使網絡具備更好泛化能力的四種正則化(L1、L2、DropOut和人工擴充訓練數據)以及對超參數的一些啓發式選取。本文先介紹交叉熵部分。

 

交叉熵損失函數

在訓練過程要使網絡更快的收斂,必須要使錯誤更明顯。錯誤明顯就是誤差信號越強烈,如此反向傳播纔會更大限度的對網絡參數進行調整。我們傳統是使用二次損失函數

在使用sigmoid激活函數的情況下(此處不考慮現在最流行的ReLU激活函數)

因此,

通過sigmoid函數(下圖)的形狀不難看出,在sigmoid函數輸出值接近0或1的區間內梯度比較平緩,out'會很接近於0,如此會大大削弱誤差信號的反饋。交叉熵則可以避免sigmoid梯度飽和的問題。

交叉熵損失函數表達形式爲:

其中n表示記錄數,表示對訓練樣本的誤差彙總再取平均,此處僅考慮一個輸出單元。

 

交叉熵損失函數有兩個很重要的性質:第一,它是非負的。由於對sigmoid函數輸出不能大於1,而對數的底爲e,因此ln(out)絕對小於0,而最後乘上-1/n可以保證結果非負;第二,如果輸出結果out與期望輸出y很接近,那麼交叉熵的值會很接近0,這是由ln(1) = 0這個性質得出的。

以權值更新規則來看,W(k) = W(k - 1) + η * ∂L/∂W。

交叉熵對權值W的偏導數:

由於

因此

與二次損失函數對比,交叉熵對權值的偏導數少了out'這個一項,這樣即便激活函數是否會飽和對權值訓練也沒有太大影響。

 

以上我們都是在一個輸出單元的基礎上進行討論,但其實也可以很容易推廣到多個輸出單元的情況:

j表示第j個輸出單元,也就是多個輸出單元交叉熵需要把多個輸出單元的損失值彙總到一起。

 

其實如果單從交叉熵的性質來討論的話,二次損失函數和交叉熵並沒有太大的區別,因爲二次損失函數也包含了交叉熵上述的兩個性質。但如果使用sigmoid激活函數的情況下,交叉熵可以避免了激活函數飽和而帶來的梯度消失問題(當然,如果使用ReLu之類的分段線性函數,這個也不是問題)。

 

接着作者在文中拋出了兩個問題,歡迎讀者一起討論:

1.交叉熵的表達式很可能因記不準而被記成

,這一表達式與真正的交叉熵會有什麼區別?

2.在分類問題中,上述如果實際輸出跟期望輸出(0或1)很接近時,損失值會很靠近0,但如果在迴歸等其他問題中,實際輸出可以有無數種(這裏主要想表達的是像迴歸這樣的問題不能像分類問題一樣如果期望與實際輸出靠近時損失值趨向ln(1)),嘗試證明在其他問題中,當y=out時損失值依然是最小的。

作爲一段小結,就讓我們稍微整理一下思路,以及稍微探索一下交叉熵提出的意義:在傳統神經網絡一般是用sigmoid作爲激活函數,而這種激活函數有個很大問題就是存在飽和區間,一旦落在飽和區間內將會對誤差反饋信號打了大大的折扣,從而影響網絡的訓練速度。這個對誤差信號打折扣的因素在於out',如果我們能有一個△W項上沒有out'的就可以避免這個影響了,這樣交叉熵就被提出來了,因爲在交叉熵損失函數對W的偏導數不包含這一個項。值得注意的是,假如我們使用的是Pure Line(y = w*x+b)激活函數或ReLU激活函數,同樣不存在飽和區間,所以可以說,交叉熵是在使用Sigmoid函數的時候被提出的。

 

Softmax層

通常在每層神經網絡都會以W·input + b的方式把所有輸入加權彙總,經過激活函數(很經典的做法就是用sigmoid)變換而輸出。但在網絡輸出層,如果我們現在面臨一個多分類問題,按傳統的做法我們應該把最後一個隱層的輸出加權彙總再經過激活產生一個單一的結果,不過我們能如何使用一個激活函數使得輸出與期望輸出很接近呢?當然我們可以使用pure line,但是我們並不能很好的保證激活函數輸出後的值域跟我們期望輸出大致相同。

這裏引入一個softmax層,它的表達式爲:

它是基於一個多輸出節點的考慮,分母是一個歸一化因子,不難發現如果把所有輸出節點加起來結果會是1,分子是e的指數,它又能保證輸出值大於0,因此每個輸出節點的輸出將會表達爲該節點對應類別的概率,所以softmax層輸出的就是一個概率分佈。

原文作者讓我們根據softmax的表達式證明兩個問題:

1.當j = k 時∂outj/ ∂zk爲正,而當j ≠ k時爲負

2.在傳統的激活函數中例如sigmoid,out = σ(z),輸出時跟加權輸入z有關係的,而softmax中輸出out跟加權輸入卻爲什麼並沒有關係?

softmax層通常使用的是對數極大似然損失函數:

當P(out|X)越接近期望輸出的時候,損失會越小。這樣,其實跟交叉熵損失函數是如出一轍的,同樣可以避免激活函數的飽和問題,因此softmax輸出層+對數極大似然損失跟sigmoid輸出層+交叉熵損失作用是很類似的。

softmax和對數似然損失的誤差反饋:errj = ∂C / ∂zj ->errj = outj - yj。附上另外一位深度學習愛好者關於softmax求導的博客文章:http://blog.csdn.net/acdreamers/article/details/44663305

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章