激活函数作为深度学习中引入非线性特征的重要工具,能够增加网络的表达能力,下面参考各位博主的文章,整理了常用的激活函数,留作复习备用。
(1)sigmoid函数
sigmoid(x) = 1/(1+exp(-x))
最早使用的激活函数,将输入映射到0到1之间,现在基本没人使用。
输出均值非0,同时当输入x过大或过小时,容易出现过饱和现象,此时梯度趋近于0,反向传播时,无法进行参数传递。
(2)tanh
tanh(x) = 2/(1+exp(-2x))-1
输出均值为0,仍然有梯度饱和效应
(3)ReLu
ReLu(x) = max{0,x}
x>0时部分,梯度为1,消除梯度饱和现象。
计算简单,使用ReLu有助于SGD收敛
缺点:对于x<0的部分,梯度为0,容易进入死区。
(4)Leaky-ReLu
Leaky-ReLu(x) = max{0,x} +alpha* min{0,x} alpha 为较小的正数
保留部分负数信息,能够缓解ReLu的死区现象
alpha较难确定,且较为敏感,性能不稳定
(5)P-ReLu
参数化ReLu将Leaky-ReLu中的alpha参数作为可学习的变量融入训练过程,解决参数不稳定的问题。
参数化ReLu在带来更大自由度的同时,可能增加模型过拟合风险。
(6)Random-ReLu
Random-ReLu(x) = max{0,x} +alpha* min{0,x} alpha~U(l,u) l,u∈[0,1)
(7)ELU
ELU(x) = max{0,x} +alpha*(exp(min{0,x})-1) alpha一般设置为1
能缓解死区问题
增加了计算量
(8) Maxout
将激活函数通过增加隐藏层,并求最大值来进行拟合。
为一个分段线性函数,能够通过学习来拟合任意凸函数
参数量较大
实际使用中建议选择常用的ReLu,需要注意参数初始化和学习率
为了进一步提升模型精度,可以尝试改进的ReLu系列方法和Maxout,具体问题具体分析。
[1] https://blog.csdn.net/YZXnuaa/article/details/79733568
[2] https://blog.csdn.net/hjimce/article/details/50414467
[3]: 魏秀参 《解析卷积神经网络——深度学习实践手册》