[深度學習-1.2] 神經網絡中常用的激活函數

激活函數的作用

  對於一個神經網絡中的神經元(節點),需要根據輸入計算這個神經元的輸出(節點激活值)。以下圖表示的這個神經元爲例,計算它的輸出包括兩步

  1. 對輸入值的線性加權,z=i=13wixi+bz=\sum_{i=1}^{3} w_{i} x_{i}+b
  2. 對加權和 zz 進行非線性變換y=f(z)y=f(z)

這裏 ff 是激活函數,一般爲非線性函數。那麼爲什麼一定要用非線性函數呢?原因在於如果使用了線性激活函數,無論這個神經網絡有多深,得到的輸出仍舊是輸入的線性組合,這樣的網絡對於線性不可分的問題是沒有作用的。

常用的激活函數

  神經網絡中常用的激活函數包括:sigmoid函數tanh函數ReLU函數

1. sigmoid函數

  Logistic中講到過sigmoid函數
g(z)=11+ezg(z)=\frac{1}{1+e^{-z}}它能夠將 (,+)(-\infty,+\infty) 中的值映射到 (0,1)(0,1),函數圖像如下

  sigmoid函數還有一個很優秀的特性就是它的導函數,對它求導可以發現g(z)=g(z)(1g(z))g'(z)=g(z)(1-g(z))這樣在用梯度下降法求梯度就很容易,推導過程很簡單,就不展開了。
  優點有了,但是缺點同樣也很明顯。從導函數的函數式和sigmoid的函數圖像也可以看出來,即當 zz 很大( g(z)1g(z)\approx1) 或者很小( g(z)0g(z)\approx0) 的時候 g(z)0g'(z)\approx0,這樣在使用梯度下降法優化權重的時候由於梯度接近0,權重更新十分緩慢,稱之爲梯度消失。因此一般不在神經網絡的隱層中使用sigmoid函數,但是對於二分類問題,將sigmoid用在輸出層作爲激活函數仍舊是一個不錯的選擇。

2. tanh函數

  另一個和sigmoid函數很像的激活函數是tanh函數,它將 (,+)(-\infty,+\infty) 中的值映射到 (1,1)(-1,1),函數式和函數圖像如下g(z)=ezezez+ez g(z)=\frac{e^{z}-e^{-z}}{e^{z}+e^{-z}}

   對tanh函數求導可以得到其導函數爲g(z)=1g2(z) g'(z)=1-g^2(z)
  可以看到在是用梯度下降法的時候也是很容易求梯度的。吳恩達老師的深度學習課程視頻裏說到tanh函數大多數情況下性能會比sigmoid函數的性能好,Emmm至於爲什麼好的原因視頻裏沒有講到(可能是因爲引入了負值之後放大了特徵???)。但是,結合函數表達式和圖像,以及導函數的表達式也可以看出使用tanh函數作爲激活函數的時候同樣存在梯度消失的問題。

3. ReLU函數

  針對sigmoid函數和tanh函數求梯度時存在的梯度下降的問題,ReLU被提出。ReLU全稱爲非線性修正單元(Rectified Liner Unit),目前已經是機器學習和深度學習裏非常受歡迎的一個函數,其表達式和圖像如下g(z)=max(0,z)g(z)=max(0,z )

  ReLU在 z>0z>0 時,輸出與輸入保持線性關係,因此梯度永遠存在 g(z)=1g‘(z)=1,在 z<0z<0 時梯度爲零,然後 z>0z>0z<0z<0 部分共同組成了非線性函數。RuLU函數在 z=0z=0 時倒數是沒有定義的,但是實際應用中,ReLU函數的輸入(即前一層網絡的線性加權和)爲0的概率非常非常低,因此不同擔心這一點,或者可以在程序中定義 z=0z=0 時的導數值爲0或1) 。

4. Leaky ReLU函數

  Leaky ReLU是ReLU的改進版本,表達式和圖像如下g(z)={0.001z,z<0z,z0g(z)=\left\{\begin{array}{c}{0.001 z, z<0} \\ {z \quad, z \geq 0}\end{array}\right.

  可以看到,在 z<0z<0函數的斜率不再爲0,而是一個很小的值,這樣能保證在 z<0z<0 時仍舊存在梯度。但是Leaky ReLU的使用頻率卻沒有ReLU那麼高,原因在於通常情況下有足夠多的來保證 z>0z>0

總結

  上面介紹了神經網路中常用的激活函數,但是事實上,在神經網絡中一般默認使用ReLU函數或者Leaky ReLU函數,因爲它們的梯度優勢會加快神經網絡的訓練速度。sigmoid函數一般僅僅用在二分類網絡的輸出層,其他情況下sigmoid函數都可以被性能更好的tanh函數代替。吳恩達老師在視頻中給的建議是,如果不知道選擇激活函數,那麼直接使用ReLU函數就OK了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章