激活函数
介绍激活函数及其特性
- Sigmoid
- Tanh
- ReLU
- Leaky ReLU
- Maxout
Sigmoid
Sigmoid
函数是最早出现的激活函数,估计是因为逻辑回归模型的缘故
它能够将输入数据压缩到[0,1]
之间,值越小,越接近于0
;值越大,越接近于1
。数学公式如下:
目前基本不使用Sigmoid
作为激活函数,主要有两个缺陷
- 当激活值处于饱和(
saturate
)状态(接近0
或1
),此时得到的梯度几乎为0
(如下图所示),也就是说无法在反向传播过程中对权重进行有效更新,网络也将停止学习。所以初始化权重值不能过大,否则会导致激活函数饱和 - 因为
Sigmoid
的取值范围是[0,1]
,所以其输出不是零中心(zero-centered
)。如果输入的数据总是正值,会导致计算得到的梯度值变为全正或全负(依赖于线性运算的表达式 )。非零中心会导致权重更新时呈 字形下降,这个问题可以通过初始化权重时平衡正负值来减轻影响
1 | def sigmoid(x): |
Tanh
Tanh
(全局正切)函数在Sigmoid
函数的基础上进一步发展,其将取值压缩在[-1,1]
之间,值越小,越接近于-1
;值越大,越接近于1
。数学公式如下:
其中
所以
根据公式可知,
1 | def tanh(x): |
ReLU
ReLU
(Rectified Linear Unit
,整流线性单元)激活函数是因为在AlexNet网络中的使用而得到了推广。当输入小于0
时,输出为0
;否则,输入为输出值。其数学公式如下:
优势如下:
- 计算高效。达到同样训练误差率的时间,使用
ReLU
能够比tanh
快6
倍 - 实现简单。相比于
sigmoid/tanh
需要指数运算,ReLU
仅是线性阈值操作
缺陷如下:
- 输出值没有零中心
- 当输入值小于
0
时,梯度消失,权值不再更新
如果步长(learning rate
,学习率)设置过大,有可能导致梯度更新后,神经元线性计算结果永远小于0
,无法再次更新权值,也就是说这个神经元在训练过程中死亡了,所以需要合理设置步长大小
1 | def relu(x): |
Leaky ReLU
Leaky ReLU
试图解决ReLU
单侧梯度消失的问题,其实现公式如下:
其中
1 | def leaky_relu(x, a=0.01): |
小结
推荐使用顺序:ReLU > Leaky ReLU > Tanh > Sigmoid
Gitalk 加载中 ...