神經網絡中的非線性是由激活層實現的,而激活層是由激活函數組成的,這里介紹四種常見的激活函數。
1.Sigmoid函數首當其沖,該函數區別了神經網絡與感知器(激活函數是階躍函數),很明顯它將輸出限制在了(0,1)之間,因此可以與概率分布聯系起來,也能用於輸入的歸一化,該函數的輸出值始終大於0,函數的形式及圖如下所示,同時它的導數形式是y’=y(1-y),即導數值小於1/4,網絡深時易出現梯度消失。
\[y=\frac{1}{\left(1+e^{-x}\right)} \]

2.tanh函數形狀與Sigmoid相同,只不過tanh關於原點對稱,導數取值范圍在0和1之間,一定程度上減輕了梯度消失的現象,但還是會出現梯度消失且與Sigmoid一樣具有飽和性,如下所示 $$ y=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}} $$

3.Relu函數則是激活部分神經元,增加了稀疏性,而它的導數在大於0時為常數,不會發生梯度消失,同時計算速度也更快,但該函數輸入小於0時輸出值為0,可能會導致部分神經元處於不可逆的‘死亡’狀態-即該神經元無效了,參數不更新了 $$ y=\left\{\begin{array}{l} x(x>0) \\ 0(x \leqslant 0) \end{array}\right. $$

4.為了解決Relu神經元死亡的問題,提出了Leaky Relu,它的形式如下 $$ y=\left\{\begin{array}{ll} x & (x>0) \\ \alpha x & (x \leq 0) \end{array}\right. $$

上圖的超參數alpha=0.3,雖然緩解了死區現象,但該超參數的值卻很難設值,就是說Leaky Relu性能不會一直都比Relu好
點擊查看代碼
困了,暫時總結到這。
附各激活函數的實現代碼(Leaky Relu中的0.3可設置成適合的值)
def sigmoid(x):
return 1/(1+np.exp(-x))
def tanh(x):
return (np.exp(x)-np.exp(-x))/(np.exp(x)+np.exp(-x))
def Relu(x):
return np.maximum(0,x)
def LeakyRelu(x):
return np.maximum(0,x)+0.3*np.minimum(0,x)