1.sigmoid激活函数
sigmoid函数公式定义:
s(x)=11+e−x
s
(
x
)
=
1
1
+
e
−
x
其对x的倒数用自身表示为:
S′(x)=e−x(1+e−x)2=s(x)∗(1−s(x))
S
′
(
x
)
=
e
−
x
(
1
+
e
−
x
)
2
=
s
(
x
)
∗
(
1
−
s
(
x
)
)
sigmoid函数图像:
(1).sigmoid函数将实数映射到[0,1]上,导数取值范围是[0,0.25]
(2).sigmoid函数适用于前向传播
(3).sigmoid作为激活函数存在的问题:
- 梯度饱和:当函数激活值接近0或1时,函数的剃度接近0.反向传播计算梯度时,每层残差接近0,计算出的剃度接近0.于是在参数微调过程中,会引起参数弥散问题,传到前几层的梯度会非常接近0,参数基本不会再更新,不利于深层网络的训练。
- 函数输出不是以0为中心。我们更偏向于激活函数输入0,输出也是0。
以上问题的存在导致参数收敛速度慢,严重影响函训练效率。
- 幂运算比较耗时。
2.tanh激活函数(双曲正切函数)
tanh函数定义:
tanh(x)=sinh(x)cosh(x)=ex−e−xex+e−x
t
a
n
h
(
x
)
=
s
i
n
h
(
x
)
c
o
s
h
(
x
)
=
e
x
−
e
−
x
e
x
+
e
−
x
tanh函数对x的倒数:
tanh′(x)=1−tanh2(x)
t
a
n
h
′
(
x
)
=
1
−
t
a
n
h
2
(
x
)
tanh函数图像:
(1).tanh函数将实数映射到[-1,1]上,导数取值范围是[0,1]
(2).取值范围满足零中心化,当输入为零时,tanh函数输出也为零,满足我们对激活函数的要求。
(3).tanh激活函数存在的问题:
- 梯度饱和。
- 幂运算比较耗时。
3.Relu激活函数(Rectified Linear Units)
Relu函数定义:
f(x)=max(0,x)
f
(
x
)
=
m
a
x
(
0
,
x
)
Relu函数对x的导数:
f′(x)={0,1,x<=0x>0
f
′
(
x
)
=
{
0
,
x<=0
1
,
x>0
Relu函数图像:
(1).Relu计算复杂度低,不需要进行指数运算。
(2).收敛速度比sigmoid和tanh快,梯度不饱和,因此在反向传播中,减轻梯度弥散问题,神经网络前几层的参数可以很快更新,适用于后向传播。
(3).Relu作为激活函数存在的问题:
- Relu的输出不是“零中心”。
- Relu单元比较脆弱。当一个很大的梯度流过ReLU神经元的时候,可能会导致梯度更新到一种特别的状态,在这种状态下神经元将无法被其他任何数据点再次激活。如果这种情况发生,那么从此流过这个神经元的梯度将都变成0。通过合理设置学习率(学习率不要设置的太高),这种情况的发生概率会降低。