文章目录
- 1. sigmoid
- 2. softmax
- 3. tanh
- 4. Relu
- 5. Leaky ReLU函数(PReLU)
- 6. ELU
1. sigmoid
sigmoid是很常用的非线性激活函数,其取值范围为[0,1],连续可导函数,因此,实际应用中可以把sigmoid的结果当成概率值。典型例子如逻辑回归
sigmoid的导数为:
图像如下:
- 当 z 值非常大或者非常小时,sigmoid函数的导数 g′(z) 将接近 0 。这会导致权重 W 的梯度接近 0 ,使得梯度更新十分缓慢,即梯度消失(sigmoid后值都在0-1之间,此时的导数值在0.2-0.25之间,一层层传递下去缩小的程度越来越大)。梯度消失的原因可见博客:
- 函数的输出不是以0为均值(均值0.5),将不便于下层的计算。sigmoid函数可用在网络最后一层,作为输出层进行二分类,尽量不在隐藏层
- sigmoid也会导致梯度爆炸,但概率较小。
sigmoid的输出为一概率值,对于二分类问题很常见;多分类问题中softmax更为普遍
2. softmax
假设一数组Z,表示Z中第i个元素,元素个数为n,则输出:
,其中j=1,2,…,n
softmax直白来说就是将原来输出是3,1,-3通过softmax函数一作用,就映射成为(0,1)的值,而这些值的累和为1(满足概率的性质),那么我们就可以将它理解成概率,在最后选取输出结点的时候,我们就可以选取概率最大(也就是值对应最大的)结点,作为我们的预测目标!
下面我们将简写成对softmax的损失函数进行求导:
3. tanh
tanh函数在 0 附近很短一段区域内可看做线性的。由于tanh函数均值为 0 ,因此弥补了sigmoid函数均值为 0.5 的缺点。取值范围为负无穷到正无穷。
tanh函数的缺点同sigmoid函数的第一个缺点一样,当 z 很大或很小时,g′(z) 接近于 0 ,会导致梯度很小,权重更新非常缓慢,即梯度消失问题,但它解决了Sigmoid函数的不是zero-centered输出问题。
4. Relu
ReLU函数其实就是一个取最大值函数,在0处不可导,但是我们可以取sub-gradient
- ReLU函数的优点:
- 在输入为正数的时候(对于大多数输入 z 空间来说),不存在梯度消失问题。
- 计算速度要快很多。ReLU函数只有线性关系,不管是前向传播还是反向传播,都比sigmod和tanh要快很多。(sigmod和tanh要计算指数,计算速度会比较慢)
- 收敛速度远快于sigmoid和tanh - ReLU函数的缺点:
- 当输入为负时,梯度为0,会产生梯度消失问题。
- Dead ReLU Problem,指的是某些神经元可能永远不会被激活,导致相应的参数永远不能被更新。有两个主要原因可能导致这种情况产生: (1) 非常不幸的参数初始化,这种情况比较少见 (2) learning rate太高导致在训练过程中参数更新太大,不幸使网络进入这种状态。解决方法是可以采用Xavier初始化方法,以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。
实际使用过程中,可以优先尝试Relu
5. Leaky ReLU函数(PReLU)
6. ELU
ELU和PRelu类似,都是为解决relu梯度消失的问题,理论上好于ReLU,但在实际使用中并没有证据证明ELU总是优于ReLU。且实际使用中还是以ReLU为主。
参考链接: