簡單來講,激活函數在神經網絡裏的做用就是引入Non-linearity。假如沒有激活函數的話,一個多層的神經網絡等同於一個一層的神經網絡。簡單來講,一個神經網絡的層能夠寫成$act(WX)$,其中$W$是權重,$act$是激活函數。兩層也就是 $act(W_2(act(W_1X)))$,若是如今沒有了$act$,那這兩層就能寫成$W_2W_1X$,而後咱們簡單的用$W=W_2W_1$替換,就變成了$WX$。也就是一個兩層的神經網絡退化成了一個單層的神經網絡。網絡
因此說激活函數在神經網絡裏面是必要的,但不一樣的激活函數有各自的優缺點,在不一樣的任務中,你們會選擇不一樣的激活函數。如今很難一律而論說哪一個激活函數必定就最好。因此最好仍是多試幾個,找到最適合本身任務的。dom
因此這篇文章也不會給出一個最好的激活函數,也就是講講每種激活函數的特性。看看激活函數是如何引入非線性的,以及神經網絡如何利用這個非線性作而分類的。ide
Sigmoid函數是神經網絡初期的激活函數。更早的是在Percepton裏面使用的threshold函數,不過threshold函數零點不可導,其餘部分導數又全是0,沒法經過Backpropagation(BP)訓練,故這裏不作介紹。Sigmoid函數能夠看做threshold函數的soft版本,它從0平滑的過渡到1。在以後又發展出多種S形的激活函數,先上公式和圖像(函數圖$f(x)$及導數圖$f'(x)$):wordpress
$$\text{Sigmoid: } f(x) = \frac{1}{1+e^{-x}}$$
$$\text{Tanh: } f(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$$
$$\text{Arctan: } f(x) = arctan(x)$$
$$\text{Softsign: } f(x) = \frac{x}{1 + |x|}$$
$$\text{ISRU: } f(x)={\frac {x}{\sqrt {1+\alpha x^{2}}}}$$函數
從圖中能夠看到sigmoid導數小,最大的地方導數才0.25,這樣在BP的時候,日後乘一乘梯度就沒有嘞,也就是深層網絡常常會遇到的Gradient Vanishing(梯度消失)。另外sigmoid的輸出在0-1之間,而神經網絡更好的輸入的值是關於原點對稱的。學習
tanh做爲sigmoid的改進版,必定程度上減輕了以上的兩個問題,tanh在原點附近接近$f(x)=x$,關於原點對稱且在原店附近導數接近1。就是但願可以作到原點附近的數據不被壓縮可以很好的傳遞到下一層,而周邊的數據被必定程度的壓縮來引入非線性。測試
其餘不經常使用的激活函數如反正切$arctan$,$softsign$,以及Inverse Square Root Unit(ISRU)一樣減輕了以上問題。從導數的函數圖中能夠看到$arctan$的導數較大,估計對學習速度應該會有幫助。sigmoid和tanh被普遍使用聽說是由於導數比較好求(來自這裏)。$\sigma'(x) = \sigma(x) (1-\sigma(x)) $,$tanh'(x) = 1 - tanh^2(x) $。優化
上面說的Sigmoidal函數都或多或少都存在梯度消失的問題,這使得深層的網絡難以訓練。後來出現的ReLU(Rectified Linear Unit)基本解決了這個問題,它保證了至少在$x>0$的時候導數是不會減小的。這樣在BP的過程當中梯度就不會莫名消失。只不過ReLU有個dead neuron的問題,從函數圖上能夠看到,負半軸的值爲0導數也爲0,也就是forward pass和backward pass都不能傳遞任何信息。在使用ReLU的時候不要用太大的learning rate,不然很容易形成一堆dead neuron。spa
後來出現了Leaky ReLU(LReLU)解決了dead neuron的問題,並且使得輸出數據分佈在0的兩側,必定程度上對學習有幫助。後來有人作了一些改進如Parametric ReLU (PReLU)以及Randomized ReLU (RReLU)。在PReLU裏,下面公式裏的$\alpha$是變量,可經過BP學習,Randomized ReLU則是在訓練時隨機在必定範圍內選擇$\alpha$,而在測試中則是使用均值。如訓練時$\alpha$在 $\left[0.1,0.3\right]$ 範圍內隨機選擇,則在測試時$\alpha$的值即爲$0.2$。設計
$$ \text{ReLU: }f(x) = \begin{cases} 0, & \text{x < 0} \\ x, & \text{x $\ge$ 0} \end{cases} $$
$$ \text{ReLU6: }f(x) = \begin{cases} 0, & \text{x < 0} \\ x, & \text{0 $\le$ x $\le$ 6} \\ 6, & \text{x > 6} \end{cases} $$
$$ \text{Leaky ReLU: }f(x) = \begin{cases} \alpha x, & \text{x < 0} \\ x, & \text{x $\ge$ 0} \end{cases}, \text{ where $0 < \alpha < 1$} $$
形狀差很少的還有Softplus,Swish,Exponential Linear Unit (ELU),以及Scaled ELU(SELU),公式以下:
$$\text{Softplus: } f(x) = log(1 + e^x)$$
$$ \text{ELU: }f(x) = \begin{cases} \alpha e^x -1, & \text{x < 0} \\ x, & \text{x $\ge$ 0} \end{cases} $$
$$ \text{SELU: }f(x) = \begin{cases} s(\alpha e^x -1), & \text{x < 0} \\ sx, & \text{x $\ge$ 0} \end{cases} $$
其中SELU的$a = 1.6732632423543772848170429916717$,$s = 1.0507009873554804934193349852946$。這兩個數字都是做者在論文中算出來的。90頁的推導過程,簡直神通常。
Softplus相對ReLU的好處是其在每一個點的導數都不爲0,避免了使用ReLU出現的dead neuron的問題。ELU相對於ReLU的優勢是其輸出在原點兩側且在每一個點導數都不爲0。SELU在論文中介紹的優勢是,若是輸入是均值爲0,標準差爲1的話,通過SELU激活以後,輸出的均值也爲0,標準差也爲1,若是是這樣的話,不知道是否是能少用幾層Batch Norm。這三個激活函數的計算時間較ReLU,Leaky ReLU要長,當想要極限的優化網絡速度的時候,這也能是一個優化點。
上圖!
Swish是最近(2017.10) Google Brain提出的激活函數,聽說效果不錯,Tanh-shrink和Bent-identity分別是在pytorch內建的激活函數庫和Wikipedia上看到的,在此也附上圖。後續想作個測試,應該也蠻有意思的!在這兒就先附上公式和圖。
$$\text{Swish: } f(x) = x\sigma(x), \text{ where $\sigma$ is sigmoid function}$$
$$\text{Tanh-shrink: } f(x) = x - tanh(x)$$
$$\text{Bent-identity: } f(x) = \frac{\sqrt{x^2 + 1} - 1}{2} +x$$
上面的分析給出了激活函數的定義,接下來咱們看看激活函數如何改變數據分佈。這裏用一箇中心點在原點的螺旋狀的數據(見下圖中identity一列)來表示數據分佈,爲了讓圖形簡單一點,我們忽略bias,因而一個層能夠寫做$H=act(WX)$。從公式能夠看出,神經網絡的一層會對輸入的數據先作一個線形的變換,而後再經過激活函數作非線性的變換。以後咱們再把激活後的數據映射回原來的空間($X' = W^{-1}H$)。這麼作的結果是,對於激活函數不改變的點,它該在什麼位置就還在什麼位置,也就能夠和原圖的螺線比較着看激活函數的效果。
這個螺線的數據的$x, y$能夠做爲兩個節點的輸入層的輸入數據。這裏的$W$的維度能夠有多種理解。
1\. 假設$W$是一個$n\times2$的矩陣,那麼這個$act(WX)$就至關與一個$n$個節點的隱層; 2\. 從空間的角度上說,這至關於把數據映射到一個$n$維的空間後,再在新的空間中作非線性變換; 3\. 把$W$拆成$n$個$1\times2$的矩陣,就還能夠理解成$n$個$X$的線形組合,在思考決策邊界的時候有用。
這裏主要採用第二種思惟,下面這張圖各列顯示了不一樣的激活函數在$n=2,5,30$時對應的變換。讓$W$的值都在$[-1,1]$之間取值,這樣$W$就能在映射到$2,5,30$維空間時產生旋轉、縮放、斜切、拉伸等效果(不包括平移)。
這裏我就選了幾種激活函數玩玩。能夠看到identity函數($f(x)=x$)是不改變數據形狀的,無論映射到多少維。S型函數將周圍的一圈都映射到了一塊兒去,其中sigmoid擠壓的最甚(因此輸入的時候必定得standardize,不然信息全都被壓縮了)。ReLU很好的保留了其中的一部分信息,且醉着維度的增長,保留的信息也增長(MobileNet V2就是基於這種想法設計了Inverted Residual Block)。ELU其實在低維就可以保存很多信息,看起來圖形會稍微好看一些,實際的效果仍是有待驗證。tanhshrink以爲比較有意思也就加上去了。
上面給出了神經網絡如何扭曲數據分佈的,其實在$W$隨機取值的狀況下,咱們很難去理解神經網絡如何去學習的,下面來看看神經網絡如何根據標籤改變扭曲的過程。這裏就選了ReLU和Sigmoid,4個節點的隱層。最後使用了softmax作分類,下圖顯示了輸入數據和對應的神經網絡。
不一樣於以上的圖在輸入數據$(x, y)$的二維空間,下面這些圖的橫座標和縱座標分別是$x', y'$,這兩個值是unnormalized probability。對於一個座標點$(x', y')$,假如 $x'>y'$,則預測類別爲藍點,反之則爲紅點。因此這裏咱們也把$y'=x'$這條線畫出來,表明了在$x', y'$這個平面的決策邊界。如下是以ReLU爲激活函數的神經網絡學習的過程,從螺線能夠看出來原始的數據分佈正在慢慢的被扭曲,直到這條黑線可以穿過紅線和藍線之間。在訓練的過程當中,每一個紅點都會把它周圍的空間(藍線)往左上角拉,相反每一個藍點都會往右下角拉,在這兩個力以及權重衰減的力的做用下,空間就會被扭曲成須要的樣子(如右下角所示)。
下面這張圖顯示了Sigmoid學習的過程。和ReLU的狀況很像,只是它扭曲的方式不太同樣
兩個學習的過程都特別的像摺紙,對,就是摺紙!當你發現直直的一剪刀剪不出個圓的時候,你就能夠考慮折出幾個皺褶,而後再給一剪刀。再提一下,若是是多個隱層的話,至關於把上面的圖看成輸入再進行扭曲。從摺紙的角度上說,就相似於「對摺再對摺再對摺」這種作法,這樣就能用少許的隱層節點作出更多的非線性(褶子)。
最後來看看不一樣激活函數的決策邊界(下圖)。此次的座標仍是原始輸入的$(x, y)$,這至關於把上面的圖往回展平之後,上圖的黑線所在的位置。Sigmoid 4的意思就是對於一個4個節點的隱層,使用Sigmoid做爲激活函數的神經網絡。能夠看出決策邊界是由3個不一樣斜率的決策邊界組成的(實際上這裏有4條邊界,有兩個決策邊界太近了就沒體現出來)。Softplus能夠看出來這4條邊,ReLU這張圖雖然只有6個邊界,但它其實能夠有8條,這是由於當兩個ReLU造成的決策邊界相交時,會產生兩個轉折點,4個決策邊界能產生8條線。
最後試了一下300個隱層的狀況,能夠看出來決策邊界已經很接近圓了。是的!等於多折幾下,再給一刀。
若是想玩動圖,就上這兒http://playground.tensorflow....
因此說,神經網絡就像剪紙,激活函數決定怎麼折,節點數決定在原圖上折幾個摺痕,隱層的數量決定折幾回。
若是想讓結果在$(0,1)$之間,使用sigmoid(如LSTM的各類gates);若是想訓練的很深,不要用S系的;ReLU,LReLU什麼的多試幾個,不會錯的。
須要注意若是使用ReLU,則最好使用He Initialization。實際上此次的實驗中全部ReLU系的激活函數(除了Softplus),使用He Initialization都收斂的比較快。若是使用Sigmoid,則使用Xavier Initialization,要不真的能把空間扭曲成一個奇怪的形狀,而後長時間不收斂。