一文搞懂激活函数
激活函数通过引入非线性特性,使得神经网络能够学习复杂的模式和特征。ReLU: 简单高效,适合大多数场景。: 改善了 ReLU 的“死亡神经元”问题。: 适合特定任务(如 RNN),但容易导致梯度消失。Softmax: 常用于多分类任务。Swish: 性能优越,适合深层网络。根据任务需求选择合适的激活函数,并结合其他组件(如卷积层、归一化层等),可以构建高效的深度学习模型。
激活函数(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 x≤0其中,(\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+e−x1
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+e−xex−e−x
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α(ex−1)if x>0if x≤0
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: 性能优越,适合深层网络。
根据任务需求选择合适的激活函数,并结合其他组件(如卷积层、归一化层等),可以构建高效的深度学习模型。
更多推荐


所有评论(0)