当你对你的神经网络使用反向传播的时候,你真的需要计算激活函数的斜率或者导数,我们看看激活函数的选择,以及如何计算这些函数的斜率。
可以看到很熟悉的sigmoid激活函数,所以对于任意给定的z值,也许这个z的函数会有某个对应的斜率和导数。在图上某个点画一条线,用高度除以宽度,有一个小三角形,如果
g
(
z
)
g(z)
g(z)是
s
i
g
m
o
i
d
sigmoid
sigmoid函数,那么函数的斜率就是
d
d
z
g
(
z
)
\frac{d}{dz}g(z)
dzdg(z)。我们从微积分知道,这就是
g
(
x
)
g(x)
g(x)在z处的斜率,其求导结果为
d
d
z
g
(
z
)
=
g
(
z
)
∗
(
1
−
g
(
z
)
)
\frac{d}{dz}g(z)=g(z)*(1-g(z))
dzdg(z)=g(z)∗(1−g(z)),我们看一下这个式子是否合理。
首先,如果z非常大,比如说z=10,那么g(z)就很接近1,其求导公式告诉我们,在该点的导数很接近0.从图中也可以看出来,当z很大时,g(z)的斜率接近0。相反,如果z等于-10,那么g(z)很接近0,在此处的导数很接近0。在z=0处,g(z)=0.5,通过求导公式可知其导数值为0.25。
下面看一下tanh激活函数,其求导公式为
d
d
z
g
(
z
)
=
1
−
(
t
a
n
h
(
z
)
)
2
\frac{d}{dz}g(z)=1-(tanh(z))^2
dzdg(z)=1−(tanh(z))2,其中
t
a
n
h
(
z
)
=
e
z
−
e
−
z
e
z
+
e
−
z
tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}
tanh(z)=ez+e−zez−e−z。当z很大或者z很小时,其导数都接近0。当z=0时,tanh(z)=0,斜率实际上等于1。
最后看一下ReLU和带泄漏的ReLU激活函数的导数。对于ReLU,其公式为
g
(
x
)
=
m
a
x
(
0
,
z
)
g(x)=max(0,z)
g(x)=max(0,z),如果z小于0,其导数等于0,如果z大于0,其导数等于1。在z=0的地方斜率是没有定义的,因为此处不可导。但如果你在软件中实现这个算法,可能数学上不是百分之百正确,但实际上是可行的,如果z刚好在0,可以令导数为1或者令导数为0,这其实无关紧要的。
最后如果你在训练自己的网络时用带泄漏的ReLU激活函数,其公式为
g
(
z
)
=
m
a
x
(
0.01
∗
z
,
z
)
g(z)=max(0.01*z,z)
g(z)=max(0.01∗z,z),所以如果z小于0时,其导数为0.01,。如果z大于0,其导数为1。z等于0时,此处是不可导的,但是可以写一段代码去定义这个梯度,在z=0处令其导数为0.01或者1。