参考
华为云学院
sigmoid函数
sigmoid函数的值域是(0,1),在远离中心点的位置,斜率会接近于0。随着反向传播层数的增多(大概是5层),会出现“梯度消失”的现象。也可以称作“失去敏感性”,“处于饱和状态”。
tanh函数
tanh函数取值在(-1,1)之间,跟sigmoid函数有相同的问题,就是在远离中心点的地方斜率接近于0,会出现“梯度消失”现象。但是tanh在训练过程的效率比sigmoid要好,因为sigmoid值域是(0,1),梯度值一直为同一个符号,容易出现“震荡现象”(zigzag)。
ReLU函数
ReLU也叫做线性整流单元。由于在x>0时,导数为1,所以在反向传播过程中,不会因为导数的连乘,而让梯度变得非常小,从而可以有效避免“梯度消失的问题”。但是ReLU会导致一个“神经元死亡”的问题,详情可参考https://www.zhihu.com/question/67151971。可以对ReLU进行优化,比如:Leaky ReLU,ELU,softplus,这些优化都基于ReLU非激活状态的基础上,加上了一个比较缓和的梯度。避免导数为0的情况。此外由于x=0处,ReLU不够平滑,所以可能不适合处理回归问题。
Softmax
Softmax的功能是将一个K维的任意实数向量映射成另一个K维的实数向量,具体一些来说,K就是类别数,元素值是样本属于该类别的概率,取值都介于(0,1)之间,所有元素加起来为1。关于softmax、softmax loss、cross entropy的更详细的解释可参考https://blog.csdn.net/u014380165/article/details/77284921。
激活函数设计需要考虑的因素
非线性
神经网络如果没有这些激活函数(非线性部分)的话,无论有多少层,都相当于单层的线性网络。
连续可微性
比如ReLU函数在x=0处没有导数,就需要强制定义。
有界性
有界的激活函数能让训练过程中更稳定
单调性
如果激活函数是“凸”的,说明可以解决“凸函数”的问题。
平滑性
单调平滑的激活函数已被证明了其泛化的效果更好