参考 https://www.jiqizhixin.com/articles/2017-11-02-26
https://senitco.github.io/2017/09/05/deep-learning-activation-function/
在神经网络中,我们使用非线性激活函数,如果采用的是线性激活函数或者不采用激活函数,则还是等价于上一步进行的线性变化,网络再深,也和一层是等价的。
- sigmoid:
- tanh:
- relu:
- leaky-relu:
,其中
是人为事先设定的
- parametric relu:
,其中
是参数,网络进行学习的
- softplus:
- swish:
- randomized relu:
,其中
是从均匀分布里随机采样的
- maxout:
,本质是一个线性分段函数
1.sigmoid激活函数
sigmoid的曲线如下:
可以看到sigmoid的输出范围被压缩到(0,1),而且sigmoid的导数十分方便:
但是它有一些缺点:
- 梯度消失:当输入非常大或者非常小的时候,梯度趋近于0。
- 输出不以零为中心。
- 计算成本高:exp()函数计算成本较高。
2. tanh激活函数
tanh曲线如下:
可以看到tanh函数将输出压缩到(-1,1),与sigmoid不同的是,tanh是以零为中心的。因此在实践中,tanh函数的效果好于sigmoid函数。
缺点是:
tanh函数也有饱和区,即梯度趋近于0。
3. Relu修正线性单元
最近常用的是Relu激活函数,曲线如下图所示:
优点:
- Relu可以使网络更快速地收敛,在正区域(x>0)梯度为1,不会饱和
- Relu计算效率很高
缺点:
- 输出不以零为中心
- 在x<0区域,输出为0,同时梯度为0,这样权重无法得到更新。当x=0时,可以采用左侧或者右侧的梯度。
注意:当learning rate很大时,一些神经元的参数进行参数更新后,再次前向传播时,可能落入x<0的区域,这个神经元dead了。因此要小心设置learning rate,不要让网络出现很多的dead神经元。也可以使用下面的Leaky Relu。
4. Leaky Relu
Leaky Relu试图修复Relu中dead的问题。既修正了数据分布,又保留了一些负轴的值。
5. parametric relu
,其中
是参数,通过网络训练获得。
if(y>0), else =y
6. randomized relu
suggested by the NDSB competition winner, the random in training is sampled from 1/U(3,8) and in test time it is fixed as its expectation, i.e., 2/(l+u)=2/11.
7. swish
由谷歌的研究者发布,论文里提到swish函数的性能优于relu函数。
8. maxout
maxout的缺点是参数变成了k倍。
9. softplus
可以看到,softplus是relu的平滑