機器學習筆記-神經網絡中激活函數(activation function)對比--Sigmoid、ReLu,tanh

爲什麼激活函數是非線性的?

如果不用激勵函數(相當於激勵函數是f(x)=x),在這種情況下,每一層的輸出都是上一層的線性函數,無論神經網絡有多少層,輸出都是輸入的線性組合,這與一個隱藏層的效果相當(這種情況就是多層感知機MPL)。

但當我們需要進行深度神經網絡訓練(多個隱藏層)的時候,如果激活函數仍然使用線性的,多層的隱藏函數與一層的隱藏函數作用的相當的,就失去了深度神經網絡的意義,所以引入非線性函數作爲激活函數。


對比激活函數Sigmoid、ReLu,tanh



Sigmoid函數




Sigmoid函數是深度學習領域開始時使用頻率最高的激活函數,它是便於求導的平滑函數,能夠將輸出值壓縮到0-1範圍之內。



但是Sigmoid函數有3大缺點:
  • 容易出現梯度消失
優化神經網絡的方法是Back Propagation,即導數的後向傳遞:先計算輸出層對應的loss,然後將loss以導數的形式不斷向上一層網絡傳遞,修正相應的參數,達到降低loss的目的。但當x較大或較小時,導數接近0;並且Sigmoid函數導數的最大值是0.25,導數在每一層至少會被壓縮爲原來的1/4。正是因爲這兩個原因,從輸出層不斷向輸入層反向傳播訓練時,導數很容易逐漸變爲0,使得權重和偏差參數無法被更新,導致神經網絡無法被優化。
  • 輸出不是zero-centered
Sigmoid函數的輸出值恆大於0,假設後層的輸入都是非0的信號,在反向傳播過程中,weight要麼是都往正方向更新,要麼都往負方向更新,按照圖中所示的階梯式更新,並非好的優化路徑,計算量較大,模型收斂的速度減慢。

  • 冪運算相對耗時
相對於前兩項,這其實並不是一個大問題,我們目前是具備相應計算能力的,但之後我們會看到,在ReLU函數中,計算機需要做的僅僅是一個thresholding,相對於冪運算來講會快很多。


tanh函數






  • 優點
    全程可導;輸出區間爲-1到1;解決了zero-centered的輸出問題。

  • 缺點
    梯度消失的問題和冪運算的問題仍然存在。

ReLU函數



ReLU函數(Rectified Linear Units)其實就是一個取最大值函數,注意這並不是全區間可導的,但是我們可以取次梯度(subgradient)。









  • 優點
    • 解決了梯度消失的問題 (在正區間)
    • 計算速度非常快,只需要判斷輸入是否大於0
    • 收斂速度遠快於sigmoid和tanh
    • Relu會使一部分神經元的輸出爲0,這樣就造成了網絡的稀疏性,並且減少了參數的相互依存關係,緩解了過擬合問題的發生
  • 缺點
    • 輸出不是zero-centered
    • Dead ReLU Problem
      Dead ReLU Problem指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新。有兩個主要原因可能導致這種情況產生: (1) 非常不幸的參數初始化,這種情況比較少見 (2) 學習速率太高導致在訓練過程中參數更新太大,不幸使網絡進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將學習速率設置太大或使用adagrad等自動調節學習速率的算法。

儘管存在這兩個問題,ReLU目前仍是最常用的激活函數。

現在也有一些對relu的改進,比如prelu,random relu等,在不同的數據集上會有一些訓練速度上或者準確率上的改進,在此就不展開討論了。