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

2021-07-22 19:00:45 字數 4321 閱讀 3388

深度學習筆記(一):logistic分類

深度學習筆記(二):簡單神經網路,後向傳播演算法及實現

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

深度學習筆記:優化方法總結(bgd,sgd,momentum,adagrad,rmsprop,adam)

深度學習筆記(四):迴圈神經網路的概念,結構和**注釋

深度學習筆記(五):lstm

深度學習筆記(六):encoder-decoder模型和attention模型

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

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

可微性: 當優化方法是基於梯度的時候,這個性質是必須的。

單調性: 當啟用函式是單調的時候,單層網路能夠保證是凸函式。

輸出值的範圍: 當啟用函式輸出值是 有限 的時候,基於梯度的優化方法會更加 穩定,因為特徵的表示受有限權值的影響更顯著;當啟用函式的輸出是 無限 的時候,模型的訓練會更加高效,不過在這種情況小,一般需要更小的learning rate

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

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

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

limx

−>∞f

′(x)

=0具有這種性質的稱為軟飽和啟用函式。具體的,飽和又可分為左飽和與右飽和。與軟飽和對應的是硬飽和, 即 f′

(x)=

0,當|

x|>c,

其中c為

常數。

sigmoid 的軟飽和性,使得深度神經網路在二三十年裡一直難以有效的訓練,是阻礙神經網路發展的重要原因。具體來說,由於在後向傳遞過程中,sigmoid向下傳導的梯度包含了乙個 f′

(x) 因子(sigmoid關於輸入的導數),因此一旦輸入落入飽和區,f′

(x) 就會變得接近於0,導致了向底層傳遞的梯度也變得非常小。此時,網路引數很難得到有效訓練。這種現象被稱為梯度消失。一般來說, sigmoid 網路在 5 層之內就會產生梯度消失現象

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

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

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

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

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

這就是leaky-relu, 而p-relu認為,

α 也可以作為乙個引數來學習,原文獻建議初始化a為0.25,不採用正則。f(

融合了sigmoid和relu,左側具有軟飽和性,右側無飽和性。右側線性部分使得elu能夠緩解梯度消失,而左側軟飽能夠讓elu對輸入變化或雜訊更魯棒。elu的輸出均值接近於零,所以收斂速度更快。在 imagenet上,不加 batch normalization 30 層以上的 relu 網路會無法收斂,prelu網路在msra的fan-in (caffe )初始化下會發散,而 elu 網路在fan-in/fan-out下都能收斂f(

x)=m

ax(w

t1x+

b1,w

t2x+

b2,⋯

,wtn

+bn)

在我看來,這個啟用函式有點大一統的感覺,因為maxout網路能夠近似任意連續函式,且當w2,b2,…,wn,bn為0時,退化為relu。maxout能夠緩解梯度消失,同時又規避了relu神經元死亡的缺點,但增加了引數和計算量。

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

12(a

−y)2

其中y是我們期望的輸出,a為神經元的實際輸出(a=

σ(wx

+b) 。也就是說,當神經元的實際輸出與我們的期望輸出差距越大,代價就越高。想法非常的好,然而在實際應用中,我們知道引數的修正是與∂c

∂w 和∂

c∂b 成正比的,而根據 ∂c

∂w=(

a−y)

σ′(a

)xt∂

c∂b=

(a−y

)σ′(

a)我們發現其中都有σ′

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

y)=−

∑iyi

log(

yi)

而在實際操作中,我們並不知道y的分布,只能對y的分布做乙個估計,也就是算得的a值, 這樣我們就能夠得到用a來表示y的交叉熵 h(

y,a)

=−∑i

yilo

g(ai

) 如果有多個樣本,則整個樣本的平均交叉熵為 h(

y,a)

=−1n

∑n∑i

yi,n

log(

ai,n

) 其中n表示樣本編號,i表示類別編。 如果用於logistic分類,則上式可以簡化成 h(

y,a)

=−1n

∑nyl

og(a

)+(1

−y)l

og(1

−a)

與平方損失函式相比,交叉熵函式有個非常好的特質, h′

=1n∑

(an−

yn)=

1n∑(

σ(zn

)−yn

) 可以看到其中沒有了σ′

這一項,這樣一來也就不會受到飽和性的影響了。當誤差大的時候,權重更新就快,當誤差小的時候,權重的更新就慢。這是乙個很好的性質。

參考資料:

[1]relu(rectified linear units)啟用函式

[2]神經網路之啟用函式面面觀

[3]深度學習中的啟用函式導引

[4]分類問題損失函式的資訊理論解釋

[5]交叉熵代價函式

啟用函式和損失函式

啟用函式 在之前的logistic和神經網路中,啟用函式是sigmoid,損失函式是平方函式。但是這並不是固定的。啟用函式的主要作用是提供網路的非線性建模能力。只有加入了啟用函式之後,深度神經網路才具備了分層的非線性對映學習能力。常見的啟用函式多是分段線性和具有指數形狀的非線性函式。損失函式 其中y...

深度學習 啟用函式 損失函式 優化函式的區別

啟用函式 將神經網路上一層的輸入,經過神經網路層的非線性變換轉換後,通過啟用函式,得到輸出。常見的啟用函式包括 sigmoid,tanh,relu等。損失函式 度量神經網路的輸出的 值,與實際值之間的差距的一種方式。常見的損失函式包括 最小二乘損失函式 交叉熵損失函式 回歸中使用的smooth l1...

深度學習 啟用函式 損失函式 優化函式的區別

啟用函式 將神經網路上一層的輸入,經過神經網路層的非線性變換轉換後,通過啟用函式,得到輸出。常見的啟用函式包括 sigmoid,tanh,relu等。損失函式 度量神經網路的輸出的 值,與實際值之間的差距的一種方式。常見的損失函式包括 最小二乘損失函式 交叉熵損失函式 回歸中使用的smooth l1...