微信登录

神经网络基础 - 激活函数 - ReLU、Sigmoid 等

PyTorch 神经网络基础 - 激活函数 - ReLU、Sigmoid 等

在神经网络的世界里,激活函数扮演着至关重要的角色。它们为神经网络赋予了非线性的能力,使得网络能够学习和表示复杂的模式和关系。本文将深入探讨 PyTorch 中一些常用的激活函数,包括 ReLU、Sigmoid 等,并通过实例展示它们的使用。

激活函数的作用

在理解具体的激活函数之前,我们先来了解一下激活函数的作用。在神经网络中,每一层的神经元会接收输入信号,并通过加权求和的方式进行计算。如果没有激活函数,那么无论网络有多少层,其整体的计算仍然是线性的。而激活函数的引入,打破了这种线性关系,使得神经网络能够学习到更加复杂的非线性映射。

常用激活函数及其在 PyTorch 中的实现

1. Sigmoid 函数

Sigmoid 函数是一种非常经典的激活函数,其数学表达式为:
[
\sigma(x) = \frac{1}{1 + e^{-x}}
]
Sigmoid 函数的输出范围在 $(0, 1)$ 之间,可以将输入映射到这个区间内,常用于二分类问题中表示概率。

在 PyTorch 中,可以使用 torch.nn.Sigmoid 类来实现 Sigmoid 激活函数。以下是一个简单的示例:

  1. import torch
  2. import torch.nn as nn
  3. # 创建一个 Sigmoid 激活函数实例
  4. sigmoid = nn.Sigmoid()
  5. # 输入数据
  6. input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
  7. # 应用 Sigmoid 激活函数
  8. output = sigmoid(input_tensor)
  9. print(output)

Sigmoid 函数的优点是输出具有很好的解释性,可以表示概率。然而,它也存在一些缺点,例如在输入值非常大或非常小时,函数的导数趋近于 0,会导致梯度消失的问题。

2. Tanh 函数

Tanh 函数是另一种常用的激活函数,其数学表达式为:
[
\tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}
]
Tanh 函数的输出范围在 $(-1, 1)$ 之间,与 Sigmoid 函数相比,它的输出关于原点对称。

在 PyTorch 中,可以使用 torch.nn.Tanh 类来实现 Tanh 激活函数。示例代码如下:

  1. import torch
  2. import torch.nn as nn
  3. # 创建一个 Tanh 激活函数实例
  4. tanh = nn.Tanh()
  5. # 输入数据
  6. input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
  7. # 应用 Tanh 激活函数
  8. output = tanh(input_tensor)
  9. print(output)

Tanh 函数虽然缓解了 Sigmoid 函数的部分问题,但仍然存在梯度消失的问题。

3. ReLU 函数

ReLU(Rectified Linear Unit)函数是目前深度学习中最常用的激活函数之一,其数学表达式为:
[
ReLU(x) = \max(0, x)
]
ReLU 函数的优点是计算简单,并且在正区间内不会出现梯度消失的问题。

在 PyTorch 中,可以使用 torch.nn.ReLU 类来实现 ReLU 激活函数。示例代码如下:

  1. import torch
  2. import torch.nn as nn
  3. # 创建一个 ReLU 激活函数实例
  4. relu = nn.ReLU()
  5. # 输入数据
  6. input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
  7. # 应用 ReLU 激活函数
  8. output = relu(input_tensor)
  9. print(output)

ReLU 函数也存在一些缺点,例如在负区间内导数为 0,可能会导致部分神经元永远无法被激活,即“神经元死亡”的问题。

4. Leaky ReLU 函数

Leaky ReLU 函数是 ReLU 函数的改进版本,其数学表达式为:
[
LeakyReLU(x) = \begin{cases}
x, & \text{if } x \geq 0 \
\alpha x, & \text{if } x < 0
\end{cases}
]
其中,$\alpha$ 是一个小于 1 的正数,通常取 0.01。Leaky ReLU 函数在负区间内保留了一个小的梯度,避免了“神经元死亡”的问题。

在 PyTorch 中,可以使用 torch.nn.LeakyReLU 类来实现 Leaky ReLU 激活函数。示例代码如下:

  1. import torch
  2. import torch.nn as nn
  3. # 创建一个 Leaky ReLU 激活函数实例
  4. leaky_relu = nn.LeakyReLU(negative_slope=0.01)
  5. # 输入数据
  6. input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
  7. # 应用 Leaky ReLU 激活函数
  8. output = leaky_relu(input_tensor)
  9. print(output)

激活函数的选择

选择合适的激活函数对于神经网络的性能至关重要。以下是一些选择激活函数的建议:

  • 输出层:在二分类问题中,通常使用 Sigmoid 函数;在多分类问题中,通常使用 Softmax 函数。
  • 隐藏层:ReLU 函数是最常用的选择,因为它计算简单且能有效缓解梯度消失的问题。如果遇到“神经元死亡”的问题,可以考虑使用 Leaky ReLU 函数。

总结

激活函数 数学表达式 输出范围 优点 缺点
Sigmoid $\sigma(x) = \frac{1}{1 + e^{-x}}$ $(0, 1)$ 输出可解释为概率 梯度消失
Tanh $\tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}}$ $(-1, 1)$ 输出关于原点对称 梯度消失
ReLU $ReLU(x) = \max(0, x)$ $[0, +\infty)$ 计算简单,无梯度消失 神经元死亡
Leaky ReLU $LeakyReLU(x) = \begin{cases}x, & \text{if } x \geq 0 \ \alpha x, & \text{if } x < 0\end{cases}$ $(-\infty, +\infty)$ 避免神经元死亡 增加了超参数 $\alpha$

通过本文的介绍,我们了解了 PyTorch 中一些常用的激活函数及其特点。在实际应用中,需要根据具体的问题和网络结构选择合适的激活函数,以提高神经网络的性能。

神经网络基础 - 激活函数 - ReLU、Sigmoid 等