深度學習筆記(一):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...