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應該是現階段使用最多的激活函數。
參考 https://en.wikipedia.org/wiki/Activation_function
參考 https://www.zhihu.com/question/22334626
參考 http://cs231n.github.io/neural-networks-1/#actfun