深度學習筆記(三):啟用函式和損失函式

深度學習筆記(一):logistic分類
深度學習筆記(二):簡單神經網路,後向傳播演算法及實現
深度學習筆記(三):啟用函式和損失函式
深度學習筆記:優化方法總結(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
深度學習筆記(四):迴圈神經網路的概念,結構和程式碼註釋
深度學習筆記(五):LSTM
深度學習筆記(六):Encoder-Decoder模型和Attention模型


這一部分來探討下啟用函式和損失函式。在之前的logistic和神經網路中,啟用函式是sigmoid, 損失函式是平方函式。但是這並不是固定的。事實上,這兩部分都有很多其他不錯的選項,下面來一一討論


3. 啟用函式和損失函式


3.1 啟用函式

關於啟用函式,首先要搞清楚的問題是,啟用函式是什麼,有什麼用?不用啟用函式可不可以?答案是不可以。啟用函式的主要作用是提供網路的非線性建模能力。如果沒有啟用函式,那麼該網路僅能夠表達線性對映,此時即便有再多的隱藏層,其整個網路跟單層神經網路也是等價的。因此也可以認為,只有加入了啟用函式之後,深度神經網路才具備了分層的非線性對映學習能力。 那麼啟用函式應該具有什麼樣的性質呢?

可微性: 當優化方法是基於梯度的時候,這個性質是必須的。
單調性: 當啟用函式是單調的時候,單層網路能夠保證是凸函式。
輸出值的範圍: 當啟用函式輸出值是 有限 的時候,基於梯度的優化方法會更加 穩定,因為特徵的表示受有限權值的影響更顯著;當啟用函式的輸出是 無限 的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的learning rate

從目前來看,常見的啟用函式多是分段線性和具有指數形狀的非線性函式

3.1.1 sigmoid

f(x)=11 e−x

f(x)=\frac{1}{1 e^{-x}}

這裡寫圖片描述
sigmoid 是使用範圍最廣的一類啟用函式,具有指數函式形狀,它在物理意義上最為接近生物神經元。此外,(0, 1) 的輸出還可以被表示作概率,或用於輸入的歸一化,代表性的如Sigmoid交叉熵損失函式。

然而,sigmoid也有其自身的缺陷,最明顯的就是飽和性。從上圖可以看到,其兩側導數逐漸趨近於0

limx−>∞f′(x)=0

\lim_{x->\infty}f'(x)=0
具有這種性質的稱為軟飽和啟用函式。具體的,飽和又可分為左飽和與右飽和。與軟飽和對應的是硬飽和, 即

f′(x)=0,當|x|>c,其中c為常數。

f'(x)=0,當 |x| > c,其中 c 為常數。
sigmoid 的軟飽和性,使得深度神經網路在二三十年裡一直難以有效的訓練,是阻礙神經網路發展的重要原因。具體來說,由於在後向傳遞過程中,sigmoid向下傳導的梯度包含了一個 f′(x)f'(x) 因子(sigmoid關於輸入的導數),因此一旦輸入落入飽和區,f′(x)f'(x) 就會變得接近於0,導致了向底層傳遞的梯度也變得非常小。此時,網路引數很難得到有效訓練。這種現象被稱為梯度消失。一般來說, sigmoid 網路在 5 層之內就會產生梯度消失現象

此外,sigmoid函式的輸出均大於0,使得輸出不是0均值,這稱為偏移現象,這會導致後一層的神經元將得到上一層輸出的非0均值的訊號作為輸入。

3.1.2 tanh

f(x)=1−e−2×1 e−2x

f(x)=\frac{1-e^{-2x}}{1 e^{-2x}}

這裡寫圖片描述
tanh也是一種非常常見的啟用函式。與sigmoid相比,它的輸出均值是0,使得其收斂速度要比sigmoid快,減少迭代次數。然而,從途中可以看出,tanh一樣具有軟飽和性,從而造成梯度消失。

3.1.3 ReLU,P-ReLU, Leaky-ReLU

f(x)={x,ifx≥00,ifx<0f(x)=max(0,x)

f(x)=
\begin{cases}
x, \;if x\geq 0\\
0, \;if x<0
\end{cases}\\
f(x)=max(0,x)

這裡寫圖片描述
ReLU的全稱是Rectified Linear Units,是一種後來才出現的啟用函式。 可以看到,當x<0時,ReLU硬飽和,而當x>0時,則不存在飽和問題。所以,ReLU 能夠在x>0時保持梯度不衰減,從而緩解梯度消失問題。這讓我們能夠直接以監督的方式訓練深度神經網路,而無需依賴無監督的逐層預訓練。

然而,隨著訓練的推進,部分輸入會落入硬飽和區,導致對應權重無法更新。這種現象被稱為“神經元死亡”。與sigmoid類似,ReLU的輸出均值也大於0,偏移現象和 神經元死亡會共同影響網路的收斂性。

針對在x<0的硬飽和問題,我們對ReLU做出相應的改進,使得

f(x)={x,ifx≥0αx,ifx<0

f(x)=
\begin{cases}
x, \;\;\;if x\geq 0\\
\alpha x, \;if x<0
\end{cases}

這裡寫圖片描述
這就是Leaky-ReLU, 而P-ReLU認為,α\alpha也可以作為一個引數來學習,原文獻建議初始化a為0.25,不採用正則。

3.1.4 ELU

f(x)={x,ifx≥0α(ex−1),ifx<0

f(x)=
\begin{cases}
x, \;\;\;\;\;\;\;\;\;\;\;if x\geq 0\\
\alpha (e^x-1), \;if x<0
\end{cases}

這裡寫圖片描述
融合了sigmoid和ReLU,左側具有軟飽和性,右側無飽和性。右側線性部分使得ELU能夠緩解梯度消失,而左側軟飽能夠讓ELU對輸入變化或噪聲更魯棒。ELU的輸出均值接近於零,所以收斂速度更快。在 ImageNet上,不加 Batch Normalization 30 層以上的 ReLU 網路會無法收斂,PReLU網路在MSRA的Fan-in (caffe )初始化下會發散,而 ELU 網路在Fan-in/Fan-out下都能收斂

3.1.5 Maxout

f(x)=max(wT1x b1,wT2x b2,⋯,wTn bn)

f(x)=max(w_1^Tx b_1, w_2^Tx b_2,\cdots,w_n^T b_n)
在我看來,這個啟用函式有點大一統的感覺,因為maxout網路能夠近似任意連續函式,且當w2,b2,…,wn,bn為0時,退化為ReLU。Maxout能夠緩解梯度消失,同時又規避了ReLU神經元死亡的缺點,但增加了引數和計算量。


3.2 損失函式

在之前的內容中,我們用的損失函式都是平方差函式,即

C=12(a−y)2

C=\frac{1}{2}(a-y)^2
其中y是我們期望的輸出,a為神經元的實際輸出(a=σ(Wx b)a=\sigma(Wx b)。也就是說,當神經元的實際輸出與我們的期望輸出差距越大,代價就越高。想法非常的好,然而在實際應用中,我們知道引數的修正是與∂C∂W\frac{\partial C}{\partial W}和∂C∂b\frac{\partial C}{\partial b}成正比的,而根據

∂C∂W=(a−y)σ′(a)xT∂C∂b=(a−y)σ′(a)

\frac{\partial C}{\partial W}=(a-y)\sigma'(a)x^T \\
\frac{\partial C}{\partial b}=(a-y)\sigma'(a)

我們發現其中都有σ′(a)\sigma'(a)這一項。因為sigmoid函式的性質,導致σ′(z)在z取大部分值時會造成飽和現象,從而使得引數的更新速度非常慢,甚至會造成離期望值越遠,更新越慢的現象。那麼怎麼克服這個問題呢?我們想到了交叉熵函式。我們知道,熵的計算公式是

H(y)=−∑iyilog(yi)

H(y)=-\sum_i y_i log(y_i)
而在實際操作中,我們並不知道y的分佈,只能對y的分佈做一個估計,也就是算得的a值, 這樣我們就能夠得到用a來表示y的交叉熵

H(y,a)=−∑iyilog(ai)

H(y,a)=-\sum_i y_i log(a_i)
如果有多個樣本,則整個樣本的平均交叉熵為

H(y,a)=−1n∑n∑iyi,nlog(ai,n)

H(y,a)=-\frac{1}{n}\sum_n\sum_i y_{i,n} log(a_{i,n})
其中n表示樣本編號,i表示類別編。 如果用於logistic分類,則上式可以簡化成

H(y,a)=−1n∑nylog(a) (1−y)log(1−a)

H(y,a)=-\frac{1}{n}\sum_n{ylog(a) (1-y)log(1-a)}
與平方損失函式相比,交叉熵函式有個非常好的特質,

H′=1n∑(an−yn)=1n∑(σ(zn)−yn)

H’=\frac{1}{n}\sum(a_n-y_n)=\frac{1}{n}\sum(\sigma(z_n)-y_n)
可以看到其中沒有了σ′\sigma’這一項,這樣一來也就不會受到飽和性的影響了。當誤差大的時候,權重更新就快,當誤差小的時候,權重的更新就慢。這是一個很好的性質。

參考資料:
[1]ReLu(Rectified Linear Units)啟用函式
[2]神經網路之啟用函式面面觀
[3]深度學習中的啟用函式導引
[4]分類問題損失函式的資訊理論解釋
[5]交叉熵代價函式