总结一下神经网络中的激活函数


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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM