sigmoid
-
容易出現gradient vanishing
-
函數輸出並不是zero-centered
-
冪運算相對來講比較耗時
-
Gradient Vanishing
優化神經網絡的方法是Back Propagation,即導數的后向傳遞:先計算輸出層對應的loss,然后將loss以導數的形式不斷向上一層網絡傳遞,修正相應的參數,達到降低loss的目的。 Sigmoid函數在深度網絡中常常會導致導數逐漸變為0,使得參數無法被更新,神經網絡無法被優化。
原因在於兩點:
-
在上圖中容易看出,當中較大或較小時,導數接近0,而后向傳遞的數學依據是微積分求導的鏈式法則,當前層的導數需要之前各層導數的乘積,幾個小數的相乘,結果會很接近0
-
Sigmoid導數的最大值是0.25,這意味着導數在每一層至少會被壓縮為原來的1/4,通過兩層后被變為1/16,…,通過10層后為1/1048576。請注意這里是“至少”,導數達到最大值這種情況還是很少見的。
輸出不是zero-centered
Sigmoid函數的輸出值恆大於0,這會導致模型訓練的收斂速度變慢。
舉例來講,對,如果所有均為正數或負數,那么其對的導數總是正數或負數,這會導致如下圖紅色箭頭所示的階梯式更新,這顯然並非一個好的優化路徑。深度學習往往需要大量時間來處理大量數據,模型的收斂速度是尤為重要的。所以,總體上來講,訓練深度學習網絡盡量使用zero-centered數據 (可以經過數據預處理實現) 和zero-centered輸出。

tanh
解決了sigmoid中的zero-centered的輸出問題
Relu
有以下幾大優點:
-
解決了gradient vanishing問題 (在正區間)
-
計算速度非常快,只需要判斷輸入是否大於0
-
收斂速度遠快於sigmoid和tanh
- 第三,Relu會使一部分神經元的輸出為0,這樣就造成了網絡的稀疏性,並且減少了參數的相互依存關系,緩解了過擬合問題的發生
ReLU也有幾個需要特別注意的問題:
-
ReLU的輸出不是zero-centered
-
Dead ReLU Problem,指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的參數初始化,這種情況比較少見 (2) learning rate太高導致在訓練過程中參數更新太大,不幸使網絡進入這種狀態。解決方法是可以采用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的算法。
ReLU 的缺點: 當然 ReLU 也有缺點,就是訓練的時候很”脆弱”,很容易就”die”了. 什么意思呢?
舉個例子:一個非常大的梯度流過一個 ReLU 神經元,更新過參數之后,這個神經元再也不會對任何數據有激活現象了。
如果這個情況發生了,那么這個神經元的梯度就永遠都會是0.
