Python学习笔记_神经网络常见激活函数整理及其 Python 绘图

本文介绍了三种常见的激活函数以及激活函数的选择方式。

1 Sigmoid Function

1.1 简介

Sigmoid 函数又名 Logistic 函数,值域为 (0, 1) ,可以将任意一个实数映射到一个介于 (0, 1) 区间之内的值,常用于隐层神经元输出,其函数表达式为:

1.2 优缺点

  • 优点:Sigmoid 函数求导简便,在在特征相差比较复杂或是相差不是特别大时效果比较

  • 缺点:激活函数计算量大,在反向传播时容易出现梯度消失问题;当 $z$ 很大或者很小时,函数变化的很慢,会拖慢梯度下降算法

★ 除非在二分类的输出层,否则尽量不要使用

1.3 函数图像

使用 matplotlib.pyplot 进行绘图,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()

图像绘制结果如下所示:

2 Tanh Function

2.1 简介

Tanh 函数叫做 反正切 函数,值域为 (-1, 1) ,可以将任意一个实数映射到一个介于 (-1, 1) 区间之内的值,其函数表达式为:

2.2 优缺点

  • 优点:Tanh 函数几乎总比 Sigmoid 函数表现的好,因为函数输出介于 -1 和 1 之间,激活函数的平均值更接近 0,使用 Tanh 函数有类似数据中心化的效果,使得数据的平均值更接近 0,使得下一层的学习更加方便

  • 缺点:在输出层时,我们更希望输出值 $\hat{y}$ 是一个介于 0 和 1 之间的数而不是 -1 和 1 之间; 在二元分类的时候, Tanh 函数作为输出层的表现也不如 Sigmoid 函数; 当 $z$ 很大或者很小时,函数变化的很慢,会拖慢梯度下降算法

2.3 函数图像

使用 matplotlib.pyplot 进行绘图,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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()

图像绘制结果如下所示:

3 ReLU (Rectified Linear Unit)

3.1 简介

通常意义下,线性修正单元 ReLU 指代数学中的斜坡函数,即

而在神经网络中,ReLU 通常作为神经元的默认激活函数,定义了该神经元在线性变换$w^{T}x+b$ 之后的非线性输出结果。换言之,对于进入神经元的来自上一层神经网络的输入向量,使用线性整流激活函数的神经元会输出

至下一层神经元或作为整个神经网络的输出

3.2 优缺点

  • 优点:更加有效率的梯度下降以及反向传播:避免了梯度爆炸和梯度消失问题;简化计算过程:没有了其他复杂激活函数中诸如指数函数的影响;同时相较于 Sigmoid Function & Tanh Function, 神经网络整体计算成本下降,速度加快很多
  • 缺点:在 $z<0$ 时导数为 0 ,在 $z=0$ 时不可导

3.3 函数图像

使用 matplotlib.pyplot 进行绘图,代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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()

图像绘制结果如下所示:

4 选择 Activation Functions 的经验法则

  • 如果输出值是 0 和 1 (二元分类),Sigmoid Function 很适合作为输出层的激活函数,其他单元都用 ReLU 作为激活函数(如果你不知道隐层应该用什么激活函数)
  • 如果愿意的话,也可以用 $Leaky ReLU(z) = max\{0.01z,z\}$ ,与 ReLU 相比, Leaky ReLU 在 $z<0$ 的部分导数不为 0。当然,Leaky ReLU 中的系数 $0.01$ 也可以把其看做一个需要学习的参数进行训练
打赏
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2024 lgc0208@foxmail.com
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信