啟用函式 sigmoid、tanh、relu
啟用函式(activation functions)的目標是,將神經網路非線性化。啟用函式是連續的(continuous),且可導的(differential)。
- 連續的:當輸入值發生較小的改變時,輸出值也發生較小的改變;
- 可導的:在定義域中,每一處都是存在導數;

啟用函式
常見的啟用函式:sigmoid,tanh,relu。
sigmoid
sigmoid是平滑(smoothened)的階梯函式(step function),可導(differentiable)。sigmoid可以將任何值轉換為0~1概率,用於二分類。細節可以參考。
公式:

導數:

導數2:

圖(紅色原函式,藍色導函式):

sigmoid
當使用sigmoid作為啟用函式時,隨著神經網路隱含層(hidden layer)層數的增加,訓練誤差反而加大。表現為:
- 靠近輸出層的隱含層梯度較大,引數更新速度快,很快就會收斂;
- 靠近輸入層的隱含層梯度較小,引數更新速度慢,幾乎和初始狀態一樣,隨機分佈;
- 在含有四個隱藏層的網路結構中,第一層比第四層慢了接近100倍!
這種現象就是梯度彌散(vanishing gradient)。而另一種情況,梯度爆炸(exploding gradient),則是前面層的梯度,通過訓練變大,導致後面層的梯度,以指數級增大。

sigmoid的更新速率
由於sigmoid的導數值小於1/4,x變化的速率要快於y變化的速率,隨著層數的增加,連續不斷執行sigmoid函式,就會導致,前面更新較大的幅度,後面更新較小的幅度,因此,網路在學習過程中,更傾向於,更新後面(靠近輸出層)的引數,而不是前面的引數(靠近輸入層)。

sigmoid的導函式
sigmoid缺點:
- 啟用函式的計算量較大,在反向傳播中,當求誤差梯度時,求導涉及除法;
- 在反向傳播中,容易就會出現梯度消失,無法完成深層網路的訓練;
- 函式的敏感區間較短,(-1,1)之間較為敏感,超過區間,則處於飽和狀態,
tanh
tanh,即雙曲正切(hyperbolic tangent),類似於幅度增大sigmoid,將輸入值轉換為-1至1之間。tanh的導數取值範圍在0至1之間,優於sigmoid的0至1/4,在一定程度上,減輕了梯度消失的問題。tanh的輸出和輸入能夠保持非線性單調上升和下降關係,符合BP(back propagation)網路的梯度求解,容錯性好,有界。
公式:


導數:

圖(紅色原函式,藍色導函式):

tanh
sigmoid和tanh:
- sigmoid在輸入處於[-1,1]之間時,函式值變化敏感,一旦接近或者超出區間就失去敏感性,處於飽和狀態,影響神經網路預測的精度值;
- tanh的變化敏感區間較寬,導數值漸進於0、1,符合人腦神經飽和的規律,比sigmoid函式延遲了飽和期;
- tanh在原點附近與y=x函式形式相近,當啟用值較低時,可以直接進行矩陣運算,訓練相對容易;
- tanh和sigmoid都是全部啟用(fire),使得神經網路較重(heavy)。
relu
relu,即Rectified Linear Unit,整流線性單元,啟用部分神經元,增加稀疏性,當x小於0時,輸出值為0,當x大於0時,輸出值為x.
公式:

圖:

relu
導數:

圖:

ReLU的導函式
relu對比於sigmoid:
- sigmoid的導數,只有在0附近,具有較好的啟用性,而在正負飽和區的梯度都接近於0,會造成梯度彌散;而relu的導數,在大於0時,梯度為常數,不會導致梯度彌散。
- relu函式在負半區的導數為0 ,當神經元啟用值進入負半區,梯度就會為0,也就是說,這個神經元不會被訓練,即稀疏性;
- relu函式的導數計算更快,程式實現就是一個if-else語句;而sigmoid函式要進行浮點四則運算,涉及到除法;
relu的缺點:
在訓練的時候,ReLU單元比較脆弱並且可能“死掉”。舉例來說,當一個很大的梯度,流過ReLU的神經元的時候,可能會導致梯度更新到一種特別的狀態,在這種狀態下神經元將無法被其他任何資料點再次啟用。如果這種情況發生,那麼從此所以流過這個神經元的梯度將都變成0。也就是說,這個ReLU單元在訓練中將不可逆轉的死亡,因為這導致了資料多樣化的丟失。
如果學習率設定得太高,可能會發現網路中40%的神經元都會死掉(在整個訓練集中這些神經元都不會被啟用)。通過合理設定學習率,這種情況的發生概率會降低。
在神經網路中,隱含層的啟用函式,最好選擇ReLU。
關於RNN中為什麼選擇tanh,而不是relu, 參考 。