image (3).png

激活函数是神经网络中至关重要的组成部分,它们赋予神经网络非线性能力。如果没有激活函数,无论神经网络有多少层,它都只能进行线性变换,无法解决复杂的非线性问题。 让我们一起深入了解激活函数的作用以及如何选择合适的激活函数。

为什么要使用激活函数?

简而言之,激活函数的主要作用是:

  • 引入非线性: 现实世界中的大多数问题都是非线性的,比如图像识别、语音识别等等。线性模型无法很好地处理这些问题。激活函数通过引入非线性因素,使得神经网络能够学习和表示复杂的非线性关系。

  • 限制输出范围: 某些激活函数可以将神经元的输出限制在特定的范围内,这有助于稳定训练过程,例如Sigmoid函数将输出限制在0和1之间。

🪧 Beginner Tips: 可以把激活函数想象成一个“开关”,只有当输入达到一定“阈值”时,它才会“激活”并输出一个信号。

常见的激活函数

接下来,我们来看几种常见的激活函数,了解它们的特点和适用场景。

1. Sigmoid 函数

  • 公式: σ(x) = 1 / (1 + exp(-x))

  • 图像: S 形曲线

  • 输出范围: (0, 1)

优点:

  • 输出范围有限,可以将输出解释为概率。

  • 函数光滑,易于求导。

缺点:

  • 梯度消失: 当输入值很大或很小时,Sigmoid函数的梯度接近于0,导致梯度在反向传播过程中逐渐消失,使得网络难以训练,尤其是在深层网络中。

  • 输出不是以0为中心: Sigmoid函数的输出总是正的,这会导致后一层的神经元接收到的输入总是正的,从而影响网络的收敛速度。

  • 计算复杂度高: Sigmoid函数包含指数运算,计算量相对较大。

适用场景:

  • 二分类问题的输出层(通常与其他损失函数配合使用,如二元交叉熵损失)。

🪧 Beginner Tips: 梯度消失是深度学习中一个常见的问题,指的是在反向传播过程中,梯度变得非常小,导致网络参数更新缓慢甚至停止更新。

2. Tanh 函数 (双曲正切函数)

  • 公式: tanh(x) = (exp(x) - exp(-x)) / (exp(x) + exp(-x))

  • 图像: S 形曲线,但以0为中心

  • 输出范围: (-1, 1)

优点:

  • 输出以0为中心,有助于加快收敛速度。

  • 函数光滑,易于求导。

缺点:

  • 梯度消失: 与Sigmoid函数类似,Tanh函数也存在梯度消失的问题,尤其是在输入值很大或很小时。

  • 计算复杂度高: Tanh函数也包含指数运算,计算量相对较大。

适用场景:

  • 隐藏层,特别是当需要输出值在-1到1之间的场景。

🪧 Beginner Tips: Tanh函数可以看作是Sigmoid函数的平移和缩放版本。

3. ReLU 函数 (修正线性单元)

  • 公式: ReLU(x) = max(0, x)

  • 图像: 当 x < 0 时,y = 0;当 x >= 0 时,y = x

  • 输出范围: [0, +∞)

优点:

  • 缓解梯度消失: 在正区间,ReLU函数的梯度恒为1,可以有效缓解梯度消失问题,使得网络能够训练得更深。

  • 计算速度快: ReLU函数只需要比较大小,计算速度非常快。

  • 稀疏性: ReLU函数在负区间输出为0,可以使一部分神经元处于非激活状态,从而增加网络的稀疏性,提高网络的泛化能力。

缺点:

  • Dead ReLU问题: 当某个神经元的输入始终为负数时,该神经元将永远不会被激活,导致梯度为0,无法参与训练。

  • 输出不是以0为中心: ReLU函数的输出总是正的,可能会影响网络的收敛速度。

适用场景:

  • 隐藏层,是目前最常用的激活函数之一。

🪧 Beginner Tips: Dead ReLU问题可以通过一些改进的ReLU函数来缓解,例如Leaky ReLU、ELU等。

4. Leaky ReLU 函数

  • 公式: LeakyReLU(x) = x if x > 0 else αx (其中 α 是一个很小的常数,例如 0.01)

  • 图像: 与 ReLU 类似,但当 x < 0 时,y = αx

  • 输出范围: (-∞, +∞)

优点:

  • 解决 Dead ReLU 问题: Leaky ReLU 在负区间引入了一个小的斜率,避免了神经元完全不激活的情况。

  • 缓解梯度消失: 与 ReLU 类似,Leaky ReLU 在正区间梯度为 1,有助于缓解梯度消失问题。

缺点:

  • α 的选择需要人工指定,不同的 α 值可能导致不同的结果。

适用场景:

  • 隐藏层,可以作为 ReLU 的替代品。

5. ELU 函数 (指数线性单元)

  • 公式: ELU(x) = x if x > 0 else α(exp(x) - 1) (其中 α 是一个常数,通常为 1)

  • 图像: 与 ReLU 和 Leaky ReLU 类似,但在负区间使用指数函数

  • 输出范围: (-α, +∞)

优点:

  • 解决 Dead ReLU 问题: ELU 在负区间使用指数函数,避免了神经元完全不激活的情况。

  • 输出接近于0: ELU 的输出均值接近于 0,有助于加快收敛速度。

  • 比 ReLU 更鲁棒: ELU 对输入的变化更敏感,可以学习到更丰富的特征。

缺点:

  • 计算复杂度高: ELU 包含指数运算,计算量相对较大。

  • α 的选择也会影响性能。

适用场景:

  • 隐藏层,可以作为 ReLU 的替代品。

6. Softmax 函数

  • 公式: Softmax(zi) = exp(zi) / Σj exp(zj) (其中 zi 是第 i 个神经元的输出)

  • 输出范围: (0, 1),且所有输出之和为 1

优点:

  • 可以将多个神经元的输出转化为概率分布,适用于多分类问题。

缺点:

  • 对输入的变化比较敏感。

适用场景:

  • 多分类问题的输出层。

🪧 Beginner Tips: Softmax 函数通常与交叉熵损失函数一起使用。

如何选择激活函数?

选择合适的激活函数需要考虑以下因素:

  • 问题类型: 二分类问题通常使用 Sigmoid 函数或 Tanh 函数作为输出层激活函数,多分类问题使用 Softmax 函数作为输出层激活函数。

  • 网络深度: 对于深层网络,ReLU 函数及其变种(Leaky ReLU、ELU 等)通常比 Sigmoid 函数和 Tanh 函数更有效,因为它们可以缓解梯度消失问题。

  • 计算资源: ReLU 函数的计算速度最快,Sigmoid 函数和 Tanh 函数的计算速度相对较慢。

  • 经验: 在实践中,可以尝试不同的激活函数,并根据实验结果选择最佳的激活函数。

一些通用建议:

  • ReLU 是一个不错的起点,可以尝试 ReLU 或其变种作为隐藏层激活函数。

  • 如果遇到 Dead ReLU 问题,可以尝试 Leaky ReLU 或 ELU。

  • 避免在深层网络中使用 Sigmoid 函数和 Tanh 函数。

  • Softmax 函数通常用于多分类问题的输出层。

🪧 Beginner Tips: 没有一个激活函数是万能的,最好的方法是根据具体问题进行实验和选择。

总结

激活函数是神经网络中不可或缺的一部分,它们赋予神经网络非线性能力,使得神经网络能够学习和表示复杂的非线性关系。 选择合适的激活函数对于神经网络的性能至关重要。 通过了解不同激活函数的特点和适用场景,我们可以更好地构建和训练神经网络。 希望本教程能够帮助你更好地理解激活函数的作用以及如何选择合适的激活函数。