1. 什么是激活函數
在神經網絡中,我們經常可以看到對於某一個隱藏層的節點,該節點的激活值計算一般分為兩步:
(1)輸入該節點的值為 x1,x2x1,x2 時,在進入這個隱藏節點后,會先進行一個線性變換,計算出值 z[1]=w1x1+w2x2+b[1]=W[1]x+b[1]z[1]=w1x1+w2x2+b[1]=W[1]x+b[1] ,上標 11 表示第 11 層隱藏層。
(2)再進行一個非線性變換,也就是經過非線性激活函數,計算出該節點的輸出值(激活值) a(1)=g(z(1))a(1)=g(z(1)) ,其中 g(z)g(z) 為非線性函數。

2. 常用的激活函數
在深度學習中,常用的激活函數主要有:sigmoid函數,tanh函數,ReLU函數。下面我們將一一介紹。
2.1 sigmoid函數
在邏輯回歸中我們介紹過sigmoid函數,該函數是將取值為 (−∞,+∞)(−∞,+∞) 的數映射到 (0,1)(0,1) 之間。sigmoid函數的公式以及圖形如下:

對於sigmoid函數的求導推導為:

sigmoid函數作為非線性激活函數,但是其並不被經常使用,它具有以下幾個缺點:
(1)當 zz 值非常大或者非常小時,通過上圖我們可以看到,sigmoid函數的導數 g′(z)g′(z) 將接近 00 。這會導致權重 WW 的梯度將接近 00 ,使得梯度更新十分緩慢,即梯度消失。下面我們舉例來說明一下,假設我們使用如下一個只有一層隱藏層的簡單網絡:

對於隱藏層第一個節點進行計算,假設該點實際值為 aa ,激活值為 a[1]a[1] 。於是在這個節點處的代價函數為(以一個樣本為例): $$ J^{[1]}(W) = \frac{1}{2} (a{[1]}-a)2 $$
而激活值 a[1]a[1] 的計算過程為:
於是對權重 w11w11 求梯度為:
由於 $ g'(z^{[1]}) =g(z{[1]})(1-g(z{[1]})) ,當,當 z^{[1]} $ 非常大時,g(z[1])≈1,1−g(z[1])≈0g(z[1])≈1,1−g(z[1])≈0 因此, g′(z[1])≈0,ΔJ[1](W)Δw11≈0g′(z[1])≈0,ΔJ[1](W)Δw11≈0。當 z[1]z[1] 非常小時,g(z[1])≈0g(z[1])≈0 ,亦同理。(本文只從一個隱藏節點推導,讀者可從網絡的輸出開始,利用反向傳播推導)
(2)函數的輸出不是以0為均值,將不便於下層的計算,具體可參考引用1中的課程。
sigmoid函數可用在網絡最后一層,作為輸出層進行二分類,盡量不要使用在隱藏層。
2.2 tanh函數
tanh函數相較於sigmoid函數要常見一些,該函數是將取值為 (−∞,+∞)(−∞,+∞) 的數映射到 (−1,1)(−1,1) 之間,其公式與圖形為:

tanh函數在 00 附近很短一段區域內可看做線性的。由於tanh函數均值為 00 ,因此彌補了sigmoid函數均值為 0.50.5 的缺點。
對於tanh函數的求導推導為:

tanh函數的缺點同sigmoid函數的第一個缺點一樣,當 zz 很大或很小時,g′(z)g′(z) 接近於 00 ,會導致梯度很小,權重更新非常緩慢,即梯度消失問題。
2.3 ReLU函數
ReLU函數又稱為修正線性單元(Rectified Linear Unit),是一種分段線性函數,其彌補了sigmoid函數以及tanh函數的梯度消失問題。ReLU函數的公式以及圖形如下:

對於ReLU函數的求導為:
ReLU函數的優點:
(1)在輸入為正數的時候(對於大多數輸入 zz 空間來說),不存在梯度消失問題。
(2) 計算速度要快很多。ReLU函數只有線性關系,不管是前向傳播還是反向傳播,都比sigmod和tanh要快很多。(sigmod和tanh要計算指數,計算速度會比較慢)
ReLU函數的缺點:
(1)當輸入為負時,梯度為0,會產生梯度消失問題。
2.4 Leaky ReLU函數
這是一種對ReLU函數改進的函數,又稱為PReLU函數,但其並不常用。其公式與圖形如下:

其中 aa 取值在 (0,1)(0,1) 之間。
Leaky ReLU函數的導數為:
Leaky ReLU函數解決了ReLU函數在輸入為負的情況下產生的梯度消失問題。
3. 為什么要用非線性激活函數?
我們以這樣一個例子進行理解。
假設下圖中的隱藏層使用的為線性激活函數(恆等激活函數),也就是說 g(z)=zg(z)=z 。

於是我們可以得出:
可以看出,當激活函數為線性激活函數時,輸出 y^y^ 不過是輸入特征 xx 的線性組合(無論多少層),而不使用神經網絡也可以構建這樣的線性組合。而當激活函數為非線性激活函數時,通過神經網絡的不斷加深,可以構建出各種有趣的函數。