1. 程式人生 > >[深度學習] 神經網路中的啟用函式(Activation function)

[深度學習] 神經網路中的啟用函式(Activation function)

20180930 在研究調整FCN模型的時候,對啟用函式做更深入地選擇,記錄學習內容

啟用函式(Activation Function),就是在人工神經網路的神經元上執行的函式,負責將神經元的輸入對映到輸出端。

在這裡插入圖片描述

  • 線性啟用函式:最簡單的linear function就是f(x) = x,不對輸入進行修改就直接輸出
  • 非線性啟用函式:這些函式用於對不可線性分離的資料進行分離,是最常用的啟用函式。非線性方程控制從輸入到輸出的對映。常用的非線性啟用函式的例子是Sigmoid,tanH,ReLU,LReLU,PReLU,Swish等。

使用啟用函式的原因

  • 單層感知機 Perceptron

這是一個單層的感知機,也是我們最常用的神經網路組成單元,用它可以在平面中劃出一條線,把平面分割開,進行二分類。

在這裡插入圖片描述

  • 多感知機組合 Perceptron

多個感知機組合,能夠在平面中進行更復雜的分割,獲得更強的分類能力。

在這裡插入圖片描述

由感知機的結構來看,如果不用激勵函式,每一層輸出都是上層輸入的線性函式,無論神經網路有多少層,輸出都是輸入的線性組合,無法直接進行非線性分類

在這裡插入圖片描述

所以,我們要加入一種方式來完成非線性分類,這個方法就是啟用函式。

  • 單層感知機
    在這裡插入圖片描述
  • 多層感知機
    在這裡插入圖片描述

如果使用的話,啟用函式給神經元引入了非線性因素,使得神經網路可以任意逼近任何非線性函式,這樣神經網路就可以應用到眾多的非線性模型中。

  • 使用step啟用函式的線性模型(step下面有介紹)
    在這裡插入圖片描述
  • 使用其他啟用函式的非線性模型,可能學習出更多的平滑分類
    在這裡插入圖片描述

總結,使用啟用函式可以在神經網路中引入非線性分類方式,從而完成線性模型所不能完成的分類,解決真正的實際問題。

常用的啟用函式

  • step

    • 圖形
      在這裡插入圖片描述
      在這裡插入圖片描述
  • Sigmoid

    • 圖形
      在這裡插入圖片描述
      在這裡插入圖片描述
    • 導數
      在這裡插入圖片描述
    • Tensorflow中tf.sigmoid
    • 缺點
      • Sigmoid有一個非常致命的缺點,當輸入非常大或者非常小的時候(saturation),這些神經元的梯度是接近於0的。如果你的初始值很大的話,神經元可能會停止梯度下降過程,這會導致網路變的無法學習。
      • Sigmoid的曲線均值不為0,這會導致後一層的神經元將得到上一層輸出的非0均值的訊號作為輸入。 產生的一個結果就是:如果資料進入神經元的時候是正的,那麼計算出的梯度也會始終都是正的。如果是進行批訓練,訓練過程中會得到不同的訊號,這樣會緩解非0均值帶來的影響。
  • TanH

    • 圖形
      在這裡插入圖片描述
      在這裡插入圖片描述
    • 導數
      在這裡插入圖片描述
    • Tensorflow使用tf.tanh
    • 缺點:實際上從根本上是sigmoid函式的變形體,解決了非0均值的問題,但不能解決過大或者過小時候導數接近於0的問題
  • Rectified linear unit (ReLU)

    • 圖形
      在這裡插入圖片描述
      在這裡插入圖片描述
    • 導數
      在這裡插入圖片描述
    • Tensorflow使用tf.nn.relu(features, name = None)
    • 缺點:不幸的是,使用ReLU的神經元在訓練期間可能很脆弱並且可能“死亡”。 例如,經過ReLU神經元的梯度過大的下降可能導致權重可能不在更新(因為x<0時,y的值和導數都為0),即神經元將永遠不再在任何資料點上啟用。如果發生這種情況,那麼經過該神經元的梯度將從該點開始永遠為0。 也就是說,ReLU神經元可以在訓練期間不可逆轉地死亡。 例如,如果學習率設定得太高,您可能會發現多達40%的網路可能“死”(即永遠不會在整個訓練資料集中啟用的神經元)。 通過適當設定學習率,這也不是一個問題。
  • Leaky ReLU

    • 圖形
      在這裡插入圖片描述
      在這裡插入圖片描述
    • Tensorflow使用 tf.nn.leaky_relu(features, alpha=0.2, name=None),其中alpha為x<0時的斜率
    • 解決了ReLU的“死”神經元問題
  • 更多啟用函式詳細內容

在這裡插入圖片描述

ReLU應該是現階段使用最多的啟用函式。