神經網絡從數學上來講,就是用來擬合一個函數。把數據扔進去,獲得一個預測結果,以此來解決分類和迴歸等問題。可是針對不一樣的問題,須要擬合不一樣的函數,包括線性函數和非線性函數。神經網絡中經常會見到各類激活函數,當須要擬合非線性函數時就須要激活函數登場了。算法
對於每一個神經元來講,都是先進行線性變換,再將線性變換的結果經過激活函數來進行激活。注意,這裏的有效激活函數必須是非線性函數。若是採用線性激活函數,則在前向傳播的過程當中,至關於一直作線性變換,這樣的話,不管多少隱藏層,都是線性變換,也就是隱藏層在這裏沒有發生做用,仍然是一個單層的感知機。固然對於最後一層的輸出層則沒有這個要求,能夠選擇線性或者非線性的激活函數。網絡
這裏主要介紹非線性激活函數,線性的激活函數也就是恆等函數,在座標軸表示爲一條直線,一般使用較少。常見的非線性激活函數一般能夠分爲兩類,一種是輸入單個變量輸出單個變量,如sigmoid函數,Relu函數;還有一種是輸入多個變量輸出多個變量,如Softmax函數,Maxout函數。機器學習
Sigmoid函數,也叫作S函數將值限定在 \((0,1)\) 之間,可以很好的做爲機率來解釋算法獲得的結果。目前在計算機視覺中不經常使用,只適用於二分類等問題。函數
缺點是當輸入較大的正數或者負數時,導數就會變爲0,這時候採用梯度降低方法就會降低很慢,使得神經網絡不能正常更新。同時不是以0爲對稱,容易在更新時產生 zigzag 路徑。性能
函數定義爲
\[ a = sigmoid(z) = \frac{1}{1+e^{-z}} \]
其求導結果爲
\[ a'=\frac{1}{1+e^{-z}}\left( 1 - \frac{1}{1+e^{-z}}\right)=a(1-a) \]
學習
thah函數可以將值限定在 \((-1,1)\) 之間,比sigmoid函數更爲經常使用。可是也存在與sigmoid函數同樣的缺點,當在z值較大或者較小時,斜率接近0,這時優化速度很慢,這種狀況下能夠考慮採用ReLU函數。優化
函數定義爲
\[ a = thah(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}} \]spa
求導結果爲
\[ a' = 1 - tanh^2(z) = 1 - a^2 \]3d
ReLU函數,也叫作線性整流函數,可以解決在值較大時產生的梯度爲0的問題,可以正常的更新,而且沒有複雜的指數計算,使得性能較好,收斂較快,是目前在視覺領域最爲常見的激活函數。blog
ReLU函數爲
\[ a = ReLU(z) = max(0,z) \]
其導數爲
\[ a' = \left\{\begin{matrix} 0 & x<0 \\ 1 & x>0 \end{matrix}\right. \]
LeakyReLU是爲了防止ReLU函數在負數時,斜率爲0的狀況,但在實際狀況中,很難到負數那邊去,因此基本採用ReLU就足夠了,不過也建議採用交叉驗證來試試這個函數。
Leaky ReLU爲
\[ a = LeakyReLU(z) = max(0.01z,z) \]
其導數爲
\[ a' = \left\{\begin{matrix} 0.01 & x<0 \\ 1 & x>0 \end{matrix}\right. \]
此外,還有幾種激活函數由算法來學習負數區域的學習率,如PReLU函數和ELU函數,原理與ReLU函數相似。
softmax函數與sigmoid函數很類似,也是將值變換到 \((0,1)\) 之間。可是能夠針對多個類別,預測出每一個類別的歸一化機率,因此一般softmax函數是在分類器的輸出層使用。
其函數表達式爲
\[ \sigma (z)_{j}= \frac{e^{z_j}}{\sum_{k=1}^{K}e^{z_k}} \]
選擇激活函數沒有固定的規則,每一個激活函數適用於不一樣的應用,好比分類和迴歸,多分類和二分類任務。但根據每一個激活函數的性質,也存在一些基本的規律
歡迎你們關注公衆號「計算機視覺與機器學習」