6 激活函数

在前一篇中,我们讨论了神经网络的结构,理解了神经元的基本组成以及如何连接形成网络。在这一篇中,我们将深入探讨神经网络中的关键组成部分之一——激活函数。激活函数在神经网络中起着至关重要的作用,它决定了神经元的输出,从而影响整个网络的性能。

什么是激活函数?

激活函数是一种非线性函数,应用于每个神经元的输出,以决定最终的激活值。通过引入非线性,激活函数允许网络捕捉更复杂的数据特征,进而提高模型的表达能力。如果没有激活函数,整个神经网络就等同于一层线性变换,无法解决复杂的问题。

激活函数的类型

激活函数有多种形式,下面介绍一些常用的激活函数及其特点。

1. Sigmoid 激活函数

Sigmoid 函数的数学表达式为:

$$
f(x) = \frac{1}{1 + e^{-x}}
$$

  • 特点
    • 输出值范围在 (0, 1) 之间。
    • 可用于二分类任务的输出层。
  • 缺点
    • 在极值区间(接近 0 或 1 时)梯度趋近于 0,容易出现“梯度消失”问题。

2. ReLU(修正线性单元)

ReLU 的数学表达式为:

$$
f(x) = \max(0, x)
$$

  • 特点
    • 输出值范围为 [0, +∞)。
    • 计算简单且收敛速度快,当前在卷积神经网络中广泛应用。
  • 缺点
    • 输入值小于 0 时,输出恒为 0,可能导致“死亡神经元”现象。

3. Leaky ReLU

Leaky ReLU 在 ReLU 的基础上引入了一个小的斜率以解决“死亡神经元”问题,其数学表达式为:

$$
f(x) = \begin{cases}
x & \text{if } x > 0 \
\alpha x & \text{otherwise}
\end{cases}
$$

其中 $\alpha$ 是一个小于 1 的常数。

4. Softmax 函数

Softmax 函数通常用于多分类任务的输出层。其数学表达式为:

$$
f(x_i) = \frac{e^{x_i}}{\sum_{j=1}^{K} e^{x_j}}
$$

  • 特点
    • 将输出值转化为概率分布,总和为 1。
    • 在多分类问题中表现良好。

激活函数的选择

选择合适的激活函数对于网络性能至关重要。尽量避免在隐藏层中使用 Sigmoid 函数,推荐使用 ReLU 或 Leaky ReLU。对于输出层,选择激活函数取决于具体任务:

  • 二分类问题:Sigmoid
  • 多分类问题:Softmax
  • 回归问题:线性激活函数(即不使用激活函数)

实际案例

下面是一个简单的 Python 示例,展示如何使用 TensorFlow 构建一个包含 ReLU 激活函数的神经网络。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import tensorflow as tf
from tensorflow.keras import layers, models

# 构建模型
model = models.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=(input_shape,))) # 输入层,使用 ReLU 激活
model.add(layers.Dense(64, activation='relu')) # 隐藏层
model.add(layers.Dense(1, activation='sigmoid')) # 输出层,二分类任务

# 编译模型
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train, epochs=10, batch_size=32)

在这个示例中,我们创建了一个包含两个隐藏层和一个输出层的简单神经网络,其中所有隐藏层使用 ReLU 激活函数,而输出层使用 Sigmoid 激活函数。

总结

在本篇中,我们深入探讨了 激活函数 的概念、常用类型及其特点。合理选择激活函数是提升深度学习模型表现的关键之一。在下一篇中,我们将继续探讨深度学习的工作原理,具体分析前向传播与反向传播的过程。

希望本教程能为你在深度学习的探索中提供帮助。如果对激活函数有其他疑问,欢迎在评论区与我交流!

作者

IT教程网(郭震)

发布于

2024-08-10

更新于

2024-08-10

许可协议

分享转发

交流

更多教程加公众号

更多教程加公众号

加入星球获取PDF

加入星球获取PDF

打卡评论