激活函数(Activation Function)是深度学习模型中的关键组件,它引入了非线性特性,使得神经网络能够学习复杂的模式和特征。如果没有激活函数,无论网络有多少层,最终输出仍然是输入的线性变换。

1. 常见的激活函数
1.1 ReLU (Rectified Linear Unit)

ReLU 是最常用的激活函数之一,具有计算简单、收敛速度快等优点。

1.1.1 数学表达式

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

1.1.2 特点

优点

  • 计算效率高,仅需简单的阈值操作。
  • 缓解梯度消失问题,适合深层网络。

缺点

  • 存在“死亡 ReLU”问题:某些神经元可能永远输出 0,导致梯度为 0。
1.1.3 示例代码
import torch
import torch.nn as nn

# 定义一个 ReLU 激活函数
relu = nn.ReLU()

# 创建一个随机输入张量
input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])

# 进行前向传播
output_tensor = relu(input_tensor)
print(output_tensor)  # 输出: tensor([0., 0., 0., 1., 2.])
1.2 Leaky ReLU

Leaky ReLU 是 ReLU 的改进版本,解决了“死亡 ReLU”问题。

1.2.1 数学表达式

f(x)={xif x>0αxif x≤0 f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha x & \text{if } x \leq 0 \end{cases} f(x)={xαxif x>0if x0其中,(\alpha) 是一个小的正数(如 0.01)。

1.2.3 特点
  • 在负值区域引入了一个小的斜率,避免神经元完全失效。
  • 适用于需要处理负值输入的场景。
1.2.4 示例代码
import torch
import torch.nn as nn

# 定义一个 Leaky ReLU 激活函数
leaky_relu = nn.LeakyReLU(negative_slope=0.01)

# 创建一个随机输入张量
input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])

# 进行前向传播
output_tensor = leaky_relu(input_tensor)
print(output_tensor)  # 输出: tensor([-0.0200, -0.0100,  0.0000,  1.0000,  2.0000])
1.3 Sigmoid

Sigmoid 将输入映射到 (0, 1) 区间,常用于二分类问题。

1.3.1 数学表达式

f(x)=11+e−x f(x) = \frac{1}{1 + e^{-x}} f(x)=1+ex1

1.3.2 特点
  • 输出范围为 (0, 1),适合表示概率。
  • 缺点
    • 容易导致梯度消失问题,尤其在深层网络中。
    • 计算成本较高。
1.3.3 示例代码
import torch
import torch.nn as nn

# 定义一个 Sigmoid 激活函数
sigmoid = nn.Sigmoid()

# 创建一个随机输入张量
input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])

# 进行前向传播
output_tensor = sigmoid(input_tensor)
print(output_tensor)  # 输出: tensor([0.1192, 0.2689, 0.5000, 0.7311, 0.8808])
1.4 Tanh (Hyperbolic Tangent)

Tanh 将输入映射到 (-1, 1) 区间,类似于 Sigmoid,但输出以 0 为中心。

1.4.1 数学表达式

f(x)=tanh⁡(x)=ex−e−xex+e−x f(x) = \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} f(x)=tanh(x)=ex+exexex

1.4.2 特点
  • 输出以 0 为中心,有助于加速收敛。
  • 同样存在梯度消失问题。
1.4.3 示例代码
import torch
import torch.nn as nn

# 定义一个 Tanh 激活函数
tanh = nn.Tanh()

# 创建一个随机输入张量
input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])

# 进行前向传播
output_tensor = tanh(input_tensor)
print(output_tensor)  # 输出: tensor([-0.9640, -0.7616,  0.0000,  0.7616,  0.9640])
1.5 Softmax

Softmax 将输入转换为概率分布,常用于多分类任务的最后一层。

1.5.1 数学表达式

f(xi)=exi∑j=1nexj f(x_i) = \frac{e{x_i}}{\sum_{j=1}n e^{x_j}} f(xi)=j=1nexjexi

1.5.2 特点
  • 输出是一个概率分布,所有元素之和为 1。
  • 通常与交叉熵损失函数结合使用。
1.5.3 示例代码
import torch
import torch.nn as nn

# 定义一个 Softmax 激活函数
softmax = nn.Softmax(dim=1)

# 创建一个随机输入张量
input_tensor = torch.tensor([[2.0, 1.0, 0.5], [0.1, 0.2, 0.3]])

# 进行前向传播
output_tensor = softmax(input_tensor)
print(output_tensor)
# 输出:
# tensor([[0.6590, 0.2424, 0.0986],
#         [0.3006, 0.3322, 0.3672]])
1.6 ELU (Exponential Linear Unit)

ELU 是 ReLU 的另一种改进版本,在负值区域引入了指数函数。

1.6.1 数学表达式

f(x)={xif x>0α(ex−1)if x≤0 f(x) = \begin{cases} x & \text{if } x > 0 \\ \alpha (e^x - 1) & \text{if } x \leq 0 \end{cases} f(x)={xα(ex1)if x>0if x0

1.6.2 特点
  • 在负值区域更平滑,有助于缓解梯度消失问题。
  • 计算成本略高于 ReLU。
1.6.3 示例代码
import torch
import torch.nn as nn

# 定义一个 ELU 激活函数
elu = nn.ELU(alpha=1.0)

# 创建一个随机输入张量
input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])

# 进行前向传播
output_tensor = elu(input_tensor)
print(output_tensor)
# 输出: tensor([-0.8647, -0.6321,  0.0000,  1.0000,  2.0000])
1.7 Swish

Swish 是一种自门控激活函数,近年来受到广泛关注。

1.7.1 数学表达式

f(x)=x⋅σ(x) f(x) = x \cdot \sigma(x) f(x)=xσ(x)其中,(\sigma(x) 是 Sigmoid 函数。

1.7.2 特点
  • 具有平滑性和无上界的特点,适合深层网络。
  • 性能优于 ReLU,但计算成本稍高。
1.7.3 示例代码
import torch
import torch.nn as nn

# 自定义 Swish 激活函数
class Swish(nn.Module):
    def forward(self, x):
        return x * torch.sigmoid(x)

# 定义一个 Swish 激活函数
swish = Swish()

# 创建一个随机输入张量
input_tensor = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])

# 进行前向传播
output_tensor = swish(input_tensor)
print(output_tensor)
# 输出: tensor([-0.2384, -0.2689,  0.0000,  0.7311,  1.7616])
1.8 总结

激活函数通过引入非线性特性,使得神经网络能够学习复杂的模式和特征。不同的激活函数适用于不同的场景:

  • ReLU: 简单高效,适合大多数场景。
  • Leaky ReLU/ELU: 改善了 ReLU 的“死亡神经元”问题。
  • Sigmoid/Tanh: 适合特定任务(如 RNN),但容易导致梯度消失。
  • Softmax: 常用于多分类任务。
  • Swish: 性能优越,适合深层网络。

根据任务需求选择合适的激活函数,并结合其他组件(如卷积层、归一化层等),可以构建高效的深度学习模型。

Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐