激活函數作用:
- 做非線性映射
- 如果使用線性激活函數或者沒有使用一個激活函數,那麼無論神經網絡有多少層一直在做的只是計算線性函數。事實證明如果在隱藏層用線性激活函數,在輸出層用sigmoid函數,那麼這個模型的複雜度和沒有任何隱藏層的標準Logistic迴歸是一樣的
- 吳恩達說:不能在隱藏層用線性激活函數,可以用ReLU或者tanh或者leaky ReLU或者其他的非線性激活函數,唯一可以用線性激活函數的通常就是輸出層;會在隱層用線性函數的,除了一些特殊情況,比如與壓縮有關的,或者部分迴歸問題
激活函數的性質:
- 可微(梯度下降)
- 單調(保證單層網絡爲凸函數)
- 輸出值的範圍:
- 有限:基於GD的方法更穩定,因爲特徵的表示受有限權值的影響更顯著
- 無限:訓練高效,需要小的學習率
神經網絡常用激活函數:
sigmoid
公式:
導數:
反向傳播:
總結:
- 輸出在 (0, 1) ,可以表示概率
- 導數值域 (0 , 0.25) ,反向傳播梯度消失
- 偏移現象:輸出不是0均值
- 除了輸出層是一個二分類問題基本不會用它
tanh
- 輸出在 (-1, 1) ,均值接近0
- 導數值域 (0, 1),收斂比sigmoid快,但是反向傳播也可能產生梯度消失
- 比較優秀,幾乎適合所有場合
- 結果表明,如果在隱藏層上使用函數tanh,效果總是優於sigmoid函數
ReLU系列:(摘自:吳恩達)
- 最常用的默認函數,如果不確定用哪個激活函數,就使用ReLu或者Leaky ReLu。
- 在區間變動很大的情況下,激活函數的導數或者激活函數的斜率都會遠大於0,在程序實現就是一個if-else語句,而sigmoid函數需要進行浮點四則運算,在實踐中,使用ReLu激活函數神經網絡通常會比使用sigmoid或者tanh激活函數學習的更快。
- sigmoid和tanh函數的導數在正負飽和區的梯度都會接近於0,這會造成梯度彌散,而Relu和Leaky ReLu函數大於0部分都爲常數,不會產生梯度彌散現象。(同時應該注意到的是,Relu進入負半區的時候,梯度爲0,神經元此時不會訓練,產生所謂的稀疏性,而Leaky ReLu不會有這問題)
ReLU
- 輸出大於等於0,導數爲 0 或 1
- 分段線性函數
- 有良好的數學性質,運算比sigmoid、tanh快,而且可以避免梯度消失或梯度爆炸
- ReLU壞死:網絡中的神經元無法在正向傳播中起作用而永久死亡的現象
- ReLU壞死和偏移會影響網絡的收斂性
leaky-ReLU
- 解決了ReLU的硬飽和問題(在x趨近於負無窮時,導數=0,導數無限接近於0是軟飽和)
P-ReLU:
帶參數的ReLU,認爲a也可以作爲參數學習
BP更新ai時,採用的是帶動量的更新方式:
上式的兩個係數分別是動量和學習率,ai被初始化爲0.25。
需要特別注意的是:更新ai時不施加權重衰減(L2正則化),因爲這會把ai很大程度上push到0。事實上,即使不加正則化,試驗中ai也很少有超過1的。
- PReLU只增加了極少量的參數,也就意味着網絡的計算量以及過擬合的危險性都只增加了一點點。特別的,當不同channels使用相同的ai時,參數就更少了。
ELU
(a=0.7時)
- 融合了ReLU和sigmoid,左側具有軟飽和性,右側線性部分可以緩解梯度消失,左側軟飽和對輸入變化或噪聲更魯棒
- 輸出均值接近0,收斂快
Maxout
公式:
- 能夠近似任意連續函數
- 當
爲0時,退化爲ReLU
- 緩解梯度消失,避免ReLU壞死,增加了參數量和計算量