一、Sigmoid、Tanh、ReLU激活函数及导数推理过程
1、Sigmoid激活函数
f
(
z
)
=
1
1
+
e
−
z
f(z)=\frac{1}{1+e^{-z}}
f(z)=1+e−z1
f
′
(
z
)
=
0
−
1
∗
(
1
+
e
−
z
)
′
(
1
+
e
−
z
)
2
=
−
e
−
z
∗
−
1
(
1
+
e
−
z
)
2
=
e
−
z
(
1
+
e
−
z
)
2
=
1
+
e
−
z
−
1
(
1
+
e
−
z
)
2
=
1
(
1
+
e
−
z
)
−
1
(
1
+
e
−
z
)
2
=
f
(
z
)
(
1
−
f
(
z
)
)
f^{'}(z)=\frac{0-1*(1+e^{-z})^{'}}{(1+e^{-z})^2}\\ =\frac{-e^{-z}*-1}{(1+e^{-z})^2}\\=\frac{e^{-z}}{(1+e^{-z})^2}\\ =\frac{1+e^{-z}-1}{(1+e^{-z})^2}\\ =\frac{1}{(1+e^{-z})}-\frac{1}{(1+e^{-z})^2}\\ =f(z)(1-f(z))
f′(z)=(1+e−z)20−1∗(1+e−z)′=(1+e−z)2−e−z∗−1=(1+e−z)2e−z=(1+e−z)21+e−z−1=(1+e−z)1−(1+e−z)21=f(z)(1−f(z))上图为sigmoid图像注意取值范围 (0,1),下图为其导数图像注意取值范围 (0,0.25] :
2、Tanh激活函数
f
(
z
)
=
t
a
n
h
(
z
)
=
e
z
−
e
−
z
e
z
+
e
−
z
f(z)=tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}
f(z)=tanh(z)=ez+e−zez−e−z
由
f
(
z
)
=
e
z
−
e
−
z
e
z
+
e
−
z
令
u
=
e
z
−
e
−
z
,
v
=
e
z
+
e
−
z
则
(
u
v
)
′
=
u
′
v
−
u
v
′
v
2
u
′
v
=
(
e
z
+
e
−
z
)
(
e
z
+
e
−
z
)
=
v
2
u
v
′
=
(
e
z
−
e
−
z
)
(
e
z
−
e
−
z
)
=
u
2
则
(
u
v
)
′
=
v
2
−
u
2
v
2
=
1
−
(
e
z
−
e
−
z
)
2
(
e
z
+
e
−
z
)
2
=
1
−
(
f
(
z
)
)
2
由f(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}\\ 令u=e^z-e^{-z},v=e^z+e^{-z}\\ 则(\frac{u}{v})^{'}=\frac{u^{'}v-uv^{'}}{v^2}\\ u^{'}v=(e^z+e^{-z})(e^z+e^{-z})=v^2\\ uv^{'}=(e^z-e^{-z})(e^z-e^{-z})=u^2\\ 则(\frac{u}{v})^{'}=\frac{v^2-u^2}{v^2}\\ =1-\frac{(e^z-e^{-z})^2}{(e^z+e^{-z})^2}\\ =1-(f(z))^2
由f(z)=ez+e−zez−e−z令u=ez−e−z,v=ez+e−z则(vu)′=v2u′v−uv′u′v=(ez+e−z)(ez+e−z)=v2uv′=(ez−e−z)(ez−e−z)=u2则(vu)′=v2v2−u2=1−(ez+e−z)2(ez−e−z)2=1−(f(z))2实际上Tanh相当于Sigmoid的平移:
t
a
n
h
(
x
)
=
2
s
i
g
m
o
i
d
(
2
x
)
−
1
tanh(x)=2sigmoid(2x)-1
tanh(x)=2sigmoid(2x)−1上图为Tanh图像注意取值范围i (-1,1),下图为其导数图像注意取值范围 (0,1]:
3、ReLU激活函数
f
(
z
)
=
m
a
x
(
0
,
z
)
f(z)=max(0,z)
f(z)=max(0,z)
f
′
(
z
)
=
{
1
,
z
>
0
0
,
z
≤
0
f^{'}(z)=\begin{cases}1,z>0\\0,z≤0\end{cases}
f′(z)={1,z>00,z≤0上图为Tanh图像,下图为其导数图像:
二、python绘制图像代码
import numpy as np
import matplotlib.pyplot as plt
def activate_func(x):
#sigmoid、sigmoid_grads
y = 1 / (1 + np.exp(-x))
dy=y*(1-y)
#tanh、tanh_grads
# y = (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
# dy = 1-y*y
#relu、relu_grads
#y=np.where(x<0,0,x)
return y
def plot_sigmoid():
# param:起点,终点,间距
x = np.arange(-8, 8, 0.2)
y = activate_func(x)
#relu
# x = np.linspace(-2, 0)
# y = np.linspace(0, 0)
# plt.plot(x, y, color='b')
# x = np.linspace(0, 2)
# y = np.linspace(1, 1)
# plt.plot(x, y, color='b', label="derivative")
plt.plot(x, y)
plt.show()
if __name__ == '__main__':
plot_sigmoid()
三、特点及使用场景
0、为什么要使用激活函数?
如果不使用非线性激活函数,那么每一层输出都是上层输入的线性组合。此时无论网络有多少层,其整体也将是线性的,无法进行有效的近似。
1、Sigmoid、Tanh出现梯度消失的原因?
由上面图像可知,Sigmoid值域在(0,1),Tanh值域在(-1,1)。对于他们的导数,当自变量x趋于正无穷或负无穷,导数都会趋于0,由此出现了梯度消失的问题。
2、ReLU如何避免梯度消失?
ReLU在一定程度上能够防止梯度消失,但防止梯度消失不是用它的主要原因,主要原因是求导数简单。一定程度是指,右端的不会趋近于饱和,求导数时,导数不为零,从而梯度不消失,但左端问题依然存在,一样掉进去梯度也会消失。所以出现很多改进的ReLU(如Leaky ReLU)。
3、ReLU相较于Sigmoid的优势?
加速计算:ReLU 的求导不涉及浮点运算(exp指数运算),所以速度更快
避免梯度消失:sigmoid的导数,当自变量x趋于正无穷或负无穷,导数都会趋于0,由此出现了梯度消失的问题。ReLU 的导数始终是一个常数,负半区为 0,正半区为 1,所以不会发生梯度消失现象。
减缓过拟合:ReLU 在负半区的输出为 0。一旦神经元的激活值进入负半区,那么该激活值就不会产生梯度/不会被训练,造成了网络的稀疏性——稀疏表达,这有助于减少参数的相互依赖,缓解过拟合问题的发生。见4、ReLU与dropout的区别。
4、ReLU与dropout的区别?
从输出的结果上来看,relu激活函数的作用是决定那个神经元有效即那个神经元被激活,但并不修改其值,而dropout的作用不光是激活那个神经元,而且还保证了其期望值不会变。
5、为什么 ReLU 不是全程可导也能用于基于梯度的学习?
虽然从数学的角度看 ReLU 在 0 点不可导,因为它的左导数和右导数不相等;但是在实现时通常会返回左导数或右导数的其中一个,而不是报告一个导数不存在的错误。
6、ReLU局限性、Leaky ReLU对其的改进?
导致神经元死亡:负梯度被置为0,而且之后也不会被任何数据激活,该神经元梯度永远为0
Leaky ReLU:既实现了单侧抑制、又保留了负梯度信息不会丢失。
f
(
z
)
=
{
z
,
z
>
0
a
z
,
z
≤
0
f(z)=\begin{cases}z,z>0\\az,z≤0\end{cases}
f(z)={z,z>0az,z≤0