0.前言
常见的激活函数
- Sigmoid(S形函数)
- Tanh(双曲正切,双S形函数)
- ReLU
- Leaky ReLU
- ELU
- Maxout
为什么时候激活函数
参考: 一文详解激活函数
如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合,这种情况就是最原始的感知机(Perceptron)。如果使用的话,激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以应用到众多的非线性模型中。
1.Sigmoid(Logistic函数)
它可以将一个实数映射到(0,1)的范围内,可以用来做二分类。
计算公式
图像
优点:
缺点
- 梯度消失:两端梯度约等于0,容易饱和和终止梯度传递(“死神经元”)
- 没有0中心化:一般来说分支在(-1,1)会好一点
- 计算成本高昂:exp() 函数与其他非线性激活函数相比,计算成本高昂
2.Tanh激活函数
解决了sigmoid没有0中心化的问题。
计算公式:
图像:
优点
- 0中心化:取值范围(-1~1)
缺点
- 没有解决梯度消失的问题
3.ReLU
对于输入的x以0为分界线,左侧的均为0,右侧的为y=x这条直线,是一个分段函数。比较常用ReLu,以及ReLu的变体。
计算公式:
函数图像:
优点:
- 相比于Sigmoid和Tanh,提升收敛速度;大于0这一部分,导函数一直等于1
- 梯度求解公式简单,大于0这一部分不会产生梯度消失和梯度爆炸
缺点:
- 没有边界,不会对大于0的输入进行缩放
- 比较脆弱,比较容易陷入出现”死神经元”的情况。小于0这一部分梯度等于0.
4.Leaky ReLU
在ReLU函数的基础上,对x≤0的部分进行修正;目的是为了解决ReLU激活函数中容易存在的”死神经元”情况的;不过实际场景中:效果不是太好。α是超参数。当α在反向传播时可以更新的时候,Leaky ReLU就成可P-ReLu。
计算公式:
对小于这一部分做了极大的抑制。
图像:
优点:
- ReLu的改进,理论上能稍微一直成为‘死神经元’的可能。
5.ELU激活函数
指数线性激活函数,同样属于对ReLU激活函数的x≤0部分的转换进行指数修正,而不是和Leaky ReLU中的线性修正。
计算公式:
图像:
小于0这一部分的对比图
leaky_relu的negative_slope=0.01
参考: Mish激活函数
Mish = x*tanh(ln(1+e^x))
思想和其他ReLU的变种都差不多,我在小于0的这一部分不做直接的截断,而是大幅度的压缩。以此来避免梯度消失的问题。
7.Maxout激活函数(自己的理解,可能不准确)
可以看作是在深度学习网络中加入一层激活函数层,包含一个参数k,拟合能力特别强。特殊在于:增加了k个神经元进行激活,然后输出激活值最大的值。
计算公式:
注意这里的x仍然是一个标量,权重和偏执是在反向传播过程中更新的。
优点:
- 不容易出现死神经元的情况
缺点:
- 计算复杂