1 Sigmoid Function
1.1 简介
Sigmoid 函数又名 Logistic 函数,值域为 (0, 1) ,可以将任意一个实数映射到一个介于 (0, 1) 区间之内的值,常用于隐层神经元输出,其函数表达式为:
S i g m o i d ( z ) = 1 1 + e − z Sigmoid(z) = \frac{1}{1+e^{-z}} Sigmoid(z)=1+e−z1
1.2 优缺点
-
优点:Sigmoid 函数求导简便,在在特征相差比较复杂或是相差不是特别大时效果比较
-
缺点:激活函数计算量大,在反向传播时容易出现梯度消失问题;当 z z z 很大或者很小时,函数变化的很慢,会拖慢梯度下降算法
★ 除非在二分类的输出层,否则尽量不要使用
1.3 函数图像
使用 matplotlib.pyplot
进行绘图,代码如下
import matplotlib.pyplot as plt
import math
import numpy as np
x = np.arange(-10, 10, 0.01) # 生成一个 [-10, 10] 之间差值为 0.01 的等差数列,代表图像中的 x axis
y = []
for num in x:
y.append(1/(1 + math.exp(-num)))
plt.title('Sigmoid Function')
plt.xlabel('z')
plt.ylabel('σ(z)')
plt.plot(x, y)
plt.show()
图像绘制结果如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/8afe8cba5ef9cddfbb969db4fb42eb57.png)
2 Tanh Function
2.1 简介
Tanh 函数叫做 反正切 函数,值域为 (-1, 1) ,可以将任意一个实数映射到一个介于 (-1, 1) 区间之内的值,其函数表达式为:
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
2.2 优缺点
-
优点:Tanh 函数几乎总比 Sigmoid 函数表现的好,因为函数输出介于 -1 和 1 之间,激活函数的平均值更接近 0,使用 Tanh 函数有类似数据中心化的效果,使得数据的平均值更接近 0,使得下一层的学习更加方便
-
缺点:在输出层时,我们更希望输出值 y ^ \hat{y} y^ 是一个介于 0 和 1 之间的数而不是 -1 和 1 之间; 在二元分类的时候, Tanh 函数作为输出层的表现也不如 Sigmoid 函数; 当 z z z 很大或者很小时,函数变化的很慢,会拖慢梯度下降算法
2.3 函数图像
使用 matplotlib.pyplot
进行绘图,代码如下
import matplotlib.pyplot as plt
import math
import numpy as np
x = np.arange(-10, 10, 0.01) # 生成一个 [-10, 10] 之间差值为 0.01 的等差数列,代表图像中的 x axis
y = []
for num in x:
y.append((math.exp(num) - math.exp(-num))/(math.exp(num) + math.exp(-num)))
plt.title('Tanh Function')
plt.xlabel('x')
plt.ylabel('tanh(x)')
plt.plot(x, y)
plt.show()
图像绘制结果如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/4b90bd2887fccb512a15f387e8722c21.png)
3 ReLU (Rectified Linear Unit)
3.1 简介
通常意义下,线性修正单元 ReLU 指代数学中的斜坡函数,即
R
e
L
U
(
z
)
=
m
a
x
{
0
,
z
}
ReLU(z) = max\{0, z\}
ReLU(z)=max{0,z}
而在神经网络中,ReLU 通常作为神经元的默认激活函数,定义了该神经元在线性变换
w
T
x
+
b
w^{T}x+b
wTx+b 之后的非线性输出结果。换言之,对于进入神经元的来自上一层神经网络的输入向量,使用线性整流激活函数的神经元会输出
R
e
L
U
(
z
)
=
m
a
x
{
0
,
w
T
x
+
b
}
ReLU(z) = max\{0, w^{T}x+b\}
ReLU(z)=max{0,wTx+b}
至下一层神经元或作为整个神经网络的输出
3.2 优缺点
- 优点:更加有效率的梯度下降以及反向传播:避免了梯度爆炸和梯度消失问题;简化计算过程:没有了其他复杂激活函数中诸如指数函数的影响;同时相较于 Sigmoid Function & Tanh Function, 神经网络整体计算成本下降,速度加快很多
- 缺点:在 z < 0 z<0 z<0 时导数为 0 ,在 z = 0 z=0 z=0 时不可导
3.3 函数图像
使用 matplotlib.pyplot
进行绘图,代码如下
import matplotlib.pyplot as plt
import math
import numpy as np
x = np.arange(-10, 10, 0.01) # 生成一个 [-10, 10] 之间差值为 0.01 的等差数列,代表图像中的 x axis
y = []
for num in x:
if num <= 0 :
y.append(0)
else:
y.append(num)
plt.title('Rectified Linear Unit')
plt.xlabel('z')
plt.ylabel('ReLU(z)')
plt.plot(x, y)
plt.show()
图像绘制结果如下所示:
![](https://i-blog.csdnimg.cn/blog_migrate/bc1180f5d277e5a1714a980299ba507d.png)
4 选择 Activation Functions 的经验法则
- 如果输出值是 0 和 1 (二元分类),Sigmoid Function 很适合作为输出层的激活函数,其他单元都用 ReLU 作为激活函数(如果你不知道隐层应该用什么激活函数)
- 如果愿意的话,也可以用 L e a k y R e L U ( z ) = m a x { 0.01 z , z } Leaky ReLU(z) = max\{0.01z,z\} LeakyReLU(z)=max{0.01z,z} ,与 ReLU 相比, Leaky ReLU 在 z < 0 z<0 z<0 的部分导数不为 0。当然,Leaky ReLU 中的系数 0.01 0.01 0.01 也可以把其看做一个需要学习的参数进行训练