一、sigmoid函数
1、输出范围为(0,1),输出范围有限,优化稳定,可以作用于输出层。
2、连续函数,求导方便。
f
(
x
)
=
1
1
+
e
−
x
f
′
(
x
)
=
f
(
x
)
[
1
−
f
(
x
)
]
f(x)= \frac{1}{1+e^{-x}}\\ f'(x) = f(x)[1-f(x)]
f(x)=1+e−x1f′(x)=f(x)[1−f(x)]
3、当输入变量是绝对值比较大的正负数时会出现饱和现象,函数对输入的微小改变变得不敏感。在反向传播时当梯度接近于零时,权重基本不会更新,很容易出现梯度消失的情况,从而网络无法更新。
4、函数的输出不是0均值,导致后层的神经网络输出是非零均值,影响权重的更新。
二、双曲正切函数tanh
1、输出范围为[-1,1]
2、导数
f
(
x
)
=
1
−
e
−
x
1
+
e
−
x
f
′
=
1
−
f
2
(
x
)
f(x)= \frac{1-e^{-x}}{1+e^{-x}}\\ f'=1-f^2(x)
f(x)=1+e−x1−e−xf′=1−f2(x)
三、Relu函数
1、使用relu的SGD算法比sigmoid和tanh快。
2、在x>0的区域上,不会出现梯度消失和梯度饱和的现象。
3、计算复杂度低,不需要进行指数运算,只要一个阈值就可以得到激活函数。
4、输出不是0均值。
5、Dead rely problem(神经元坏死现象),relu在负数区域被kill的现象叫做dead relu. 在x<0时,梯度为零,神经元及之后的神经元梯度均为0,导致相应参数永远不会被更新。
产生该原因的因素有两个:参数初始化不合理;learning rate太高,导致训练过程参数更新太大。
解决方法:采用xavier初始化参数,避免将learning rate设置过大或使用adagrad自动调节learning rate.