激活函數的作用
對於一個神經網絡中的神經元(節點),需要根據輸入計算這個神經元的輸出(節點激活值)。以下圖表示的這個神經元爲例,計算它的輸出包括兩步
- 對輸入值的線性加權,;
- 對加權和 進行非線性變換,
這裏 是激活函數,一般爲非線性函數。那麼爲什麼一定要用非線性函數呢?原因在於如果使用了線性激活函數,無論這個神經網絡有多深,得到的輸出仍舊是輸入的線性組合,這樣的網絡對於線性不可分的問題是沒有作用的。
常用的激活函數
神經網絡中常用的激活函數包括:sigmoid函數,tanh函數和ReLU函數。
1. sigmoid函數
Logistic中講到過sigmoid函數
它能夠將 中的值映射到 ,函數圖像如下
sigmoid函數還有一個很優秀的特性就是它的導函數,對它求導可以發現這樣在用梯度下降法求梯度就很容易,推導過程很簡單,就不展開了。
優點有了,但是缺點同樣也很明顯。從導函數的函數式和sigmoid的函數圖像也可以看出來,即當 很大( ) 或者很小( ) 的時候 ,這樣在使用梯度下降法優化權重的時候由於梯度接近0,權重更新十分緩慢,稱之爲梯度消失。因此一般不在神經網絡的隱層中使用sigmoid函數,但是對於二分類問題,將sigmoid用在輸出層作爲激活函數仍舊是一個不錯的選擇。
2. tanh函數
另一個和sigmoid函數很像的激活函數是tanh函數,它將 中的值映射到 ,函數式和函數圖像如下
對tanh函數求導可以得到其導函數爲
可以看到在是用梯度下降法的時候也是很容易求梯度的。吳恩達老師的深度學習課程視頻裏說到tanh函數大多數情況下性能會比sigmoid函數的性能好,Emmm至於爲什麼好的原因視頻裏沒有講到(可能是因爲引入了負值之後放大了特徵???)。但是,結合函數表達式和圖像,以及導函數的表達式也可以看出使用tanh函數作爲激活函數的時候同樣存在梯度消失的問題。
3. ReLU函數
針對sigmoid函數和tanh函數求梯度時存在的梯度下降的問題,ReLU被提出。ReLU全稱爲非線性修正單元(Rectified Liner Unit),目前已經是機器學習和深度學習裏非常受歡迎的一個函數,其表達式和圖像如下
ReLU在 時,輸出與輸入保持線性關係,因此梯度永遠存在 ,在 時梯度爲零,然後 與 部分共同組成了非線性函數。RuLU函數在 時倒數是沒有定義的,但是實際應用中,ReLU函數的輸入(即前一層網絡的線性加權和)爲0的概率非常非常低,因此不同擔心這一點,或者可以在程序中定義 時的導數值爲0或1) 。
4. Leaky ReLU函數
Leaky ReLU是ReLU的改進版本,表達式和圖像如下
可以看到,在 函數的斜率不再爲0,而是一個很小的值,這樣能保證在 時仍舊存在梯度。但是Leaky ReLU的使用頻率卻沒有ReLU那麼高,原因在於通常情況下有足夠多的來保證 。
總結
上面介紹了神經網路中常用的激活函數,但是事實上,在神經網絡中一般默認使用ReLU函數或者Leaky ReLU函數,因爲它們的梯度優勢會加快神經網絡的訓練速度。sigmoid函數一般僅僅用在二分類網絡的輸出層,其他情況下sigmoid函數都可以被性能更好的tanh函數代替。吳恩達老師在視頻中給的建議是,如果不知道選擇激活函數,那麼直接使用ReLU函數就OK了!