深度学习中常用的激活函数详解及对比分析(sigmoid)
深度学习中常用的激活函数详解及对比分析(sigmoid)
Sigmoid函数:
特性:
1.当变量值远离中心轴时,梯度几乎为0,在神经网络的反向传播过程中,链式求导导致经过sigmoid函数之后的梯度
很小,权重值更新较慢
2.计算机执行指数运算较慢
3.sigmoid在压缩数据幅度方面有优势,在深度网络中,在前向传播中,sigmoid可以保证数据幅度在[0,1]内,这样数据幅度稳住了,不会出现数据扩散,不会有太大的失误。
4.定义域(0, 1) 可以表示作概率,或者用于输入的归一化,如Sigmoid交叉熵损失函数。
5.如图像所示其值域在[0,1]之间,函数输出不是0均值的,权重更新效率降低,因为这会导致后层的神经元的输入是非0均值的信号,这会对梯度产生影响:假设后层神经元的输入都为正(e.g. x>0 elementwise in ),那么对w求局部梯度则都为正,这样在反向传播的过程中w要么都往正方向更新,要么都往负方向更新,导致有一种捆绑的效果,使得收敛缓慢。 当然了,如果你是按batch去训练,那么每个batch可能得到不同的符号(正或负),那么相加一下这个问题还是可以缓解。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。
Tanh函数:
特性:
1.Tanh 网络的收敛速度要比 Sigmoid 快。因为 Tanh 的输出均值为 0,SGD 会更接近 natural gradient(一种二次优化技术),从而降低所需的迭代次数。
2.Tanh 激活函数与sigmoid函数一样也具有软饱和性,没有改变Sigmoid函数的最大问题——由于饱和性产生的梯度消失。
Relu函数(Rectified linear unit):
特性:
1.当输入值小于0时,出现硬饱和,梯度消失为0;
2.解决了梯度消失的问题 :在正区间当输入值大于0时,梯度保持不变,没有sigmoid及Tanh函数的梯度消失的问题。
3.计算速度快,只需要判断输入是否大于0
4.收敛速度远快于sigmoid和tanh
5.输出不是zero-centered
6.Dead ReLU Problem:
Dead ReLU Problem指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) 学习速率太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。
Leaky ReLU函数
Leaky ReLU是为了解决ReLU函数的Dead ReLU Problem而提出的激活函数。为了解决Dead ReLU Problem,Leaky ReLU提出了将ReLU的前半段设为0.01x0.01x而非0。另外一种直观的想法是基于参数的方法,即Parametric ReLU:
其中α可由back propagation学出来。理论上来讲,Leaky ReLU有ReLU的所有优点,外加不会有Dead ReLU问题,但是在实际操作当中,并没有完全证明Leaky ReLU总是好于ReLU。
ELU函数
特性:
ELU(Exponential Linear Units)函数也是为解决ReLU存在的问题而提出,显然,ELU有ReLU的基本所有优点,以及:
- 不会有Dead ReLU问题
- 输出的均值接近0,zero-centered
它的一个小问题在于计算量稍大。类似于Leaky ReLU,理论上虽然好于ReLU,但在实际使用中目前并没有好的证据ELU总是优于ReLU。