第3课_激活函数
热度🔥:52 免费课程
授课语音
激活函数及常见激活函数的优缺点
激活函数是神经网络中用于引入非线性因素的函数。通过激活函数,神经网络能够学习和拟合更复杂的数据模式。没有激活函数,神经网络即使有多层,也只能模拟线性关系,无法有效解决实际问题。
1. 激活函数的作用
在神经网络中,激活函数的作用是决定每个神经元的输出值。激活函数通常位于每一层的神经元输出和下一层的输入之间,通过对输入的加权和应用激活函数,决定是否激活某个神经元。
神经元的计算公式为:
z = w * x + b
其中:
w
是权重x
是输入b
是偏置
激活函数通常是对 z
进行处理,产生神经元的输出 a
:
a = activation_function(z)
2. 常见激活函数及其优缺点
2.1 Sigmoid 激活函数
Sigmoid函数的输出范围是(0, 1)
,适用于输出为概率值的任务(如二分类)。
sigmoid(x) = 1 / (1 + exp(-x))
优点
- 输出在
(0, 1)
之间,适合用于概率输出。 - 导数简单,便于计算。
缺点
- 梯度消失问题:当输入较大或较小时,导数接近零,导致梯度消失,训练变慢。
- 输出不以零为中心,可能导致梯度下降时更新缓慢。
2.2 Tanh 激活函数
Tanh函数是Sigmoid函数的改进版,输出范围是(-1, 1)
。
tanh(x) = (2 / (1 + exp(-2x))) - 1
优点
- 输出范围
(-1, 1)
,使得数据居中,减轻了梯度消失问题。 - 相比Sigmoid,收敛速度更快。
缺点
- 同样存在梯度消失问题,特别是当
x
的值过大或过小时。
2.3 ReLU 激活函数
ReLU(Rectified Linear Unit)是最常用的激活函数,输出为max(0, x)
。
relu(x) = max(0, x)
优点
- 计算效率高:计算非常简单,适合深度网络的训练。
- 缓解梯度消失问题:正区间的梯度恒为1,有助于快速收敛。
缺点
- 死神经元问题:当输入为负值时,输出恒为零,导致神经元“死亡”,无法更新。
- 对小于零的输入没有梯度,可能导致训练过程中部分神经元不更新。
2.4 Leaky ReLU 激活函数
Leaky ReLU是对ReLU的改进版本,允许在x < 0
时有一个小的负斜率。
leaky_relu(x) = max(α * x, x)
其中α
是一个小的常数,通常设置为0.01
。
优点
- 解决了ReLU的死神经元问题,允许负输入也能有一个小的梯度。
缺点
- 即便是负斜率,也不能完全消除死神经元问题,仍然可能存在部分神经元不更新。
2.5 Softmax 激活函数
Softmax通常用于多分类任务,将输出转化为概率分布,输出值范围在(0, 1)
之间,并且总和为1。
softmax(x_i) = exp(x_i) / Σ(exp(x_j))
优点
- 输出为概率分布,适合用于多分类任务。
- 通过最大化概率来分类。
缺点
- 计算复杂度较高,尤其是在类别数较多时。
3. 代码实现:常见激活函数的应用
以下是使用Python
和NumPy
实现常见激活函数的代码示例。
3.1 安装必要的库
pip install numpy
3.2 代码实现
import numpy as np
import matplotlib.pyplot as plt
# Sigmoid 激活函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# Tanh 激活函数
def tanh(x):
return np.tanh(x)
# ReLU 激活函数
def relu(x):
return np.maximum(0, x)
# Leaky ReLU 激活函数
def leaky_relu(x, alpha=0.01):
return np.maximum(alpha * x, x)
# Softmax 激活函数
def softmax(x):
exp_x = np.exp(x - np.max(x)) # 减去最大值以避免溢出
return exp_x / np.sum(exp_x, axis=0, keepdims=True)
# 绘制不同激活函数的图形
x = np.linspace(-10, 10, 100)
# 绘制各激活函数的图形
plt.figure(figsize=(10, 6))
plt.subplot(231)
plt.plot(x, sigmoid(x), label='Sigmoid')
plt.title('Sigmoid')
plt.grid(True)
plt.subplot(232)
plt.plot(x, tanh(x), label='Tanh')
plt.title('Tanh')
plt.grid(True)
plt.subplot(233)
plt.plot(x, relu(x), label='ReLU')
plt.title('ReLU')
plt.grid(True)
plt.subplot(234)
plt.plot(x, leaky_relu(x), label='Leaky ReLU')
plt.title('Leaky ReLU')
plt.grid(True)
plt.subplot(235)
plt.plot(x, softmax(x), label='Softmax')
plt.title('Softmax')
plt.grid(True)
plt.tight_layout()
plt.show()
3.3 输出示例
- 每个激活函数都会绘制一张图,展示其不同输入下的输出变化。
4. 总结
激活函数是神经网络中至关重要的组件,它们为神经网络模型引入了非线性因素,使得神经网络可以拟合复杂的数据模式。常见的激活函数如Sigmoid、Tanh、ReLU等各有优缺点,需要根据具体任务选择合适的激活函数。在深度学习中,ReLU及其变种(如Leaky ReLU)因其简单且高效,常常成为默认选择。