激活函數(activation functions)的目標是,將神經網絡非線性化。激活函數是連續的(continuous),且可導的(differential)。
激活函數
常見的激活函數:sigmoid,tanh,relu。
sigmoidsigmoid是平滑(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)之間較為敏感,超過區間,則處於飽和狀態,
參考1、參考2
tanhtanh,即雙曲正切(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)。
參考1、參考2、參考3
relurelu,即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,參考。
作者:SpikeKing
連結:https://www.jianshu.com/p/857d5859d2cc
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。