神经网络中的非线性是由激活层实现的,而激活层是由激活函数组成的,这里介绍四种常见的激活函数。
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)