趋近智
非线性激活函数在深度学习模型中是不可或缺的,它们能帮助模型学习复杂模式。Sigmoid 函数,也称为逻辑函数,是最早且具有开创性历史地位的激活函数之一。
Sigmoid 函数的数学定义为:
σ(x)=1+e−x1x 是函数的输入(通常是神经元的加权输入和偏置之和)。该函数可以将任何实数值压缩到 0 到 1 的范围内。
Sigmoid 函数的显著特征是其“S”形曲线。
Sigmoid 函数将输入映射到 (0, 1) 区间。它在 x=0 附近呈现平滑过渡,对于大的负输入饱和趋近于 0,对于大的正输入饱和趋近于 1。
重要特性包括:
尽管 Sigmoid 函数具有历史地位,但由于一些明显不足,它已不再受青睐用于深层网络的隐藏层:
梯度消失: 这是最主要的问题。再次观察 Sigmoid 函数的形状。当输入为较大的正值或负值时(即神经元“饱和”时),函数曲线变得非常平坦。平坦的函数意味着导数(梯度)接近于零。
Sigmoid 函数的导数在 x=0 处最大(值为 0.25),随着输入远离 0 迅速趋近于零。
在反向传播过程中,梯度逐层相乘。如果多个层使用 Sigmoid 激活函数,并且它们的神经元在饱和区域运行,反向传播的梯度将重复乘以小数值(导数,小于或等于 0.25)。这会导致到达前面层的梯度变得非常小(“消失”),使得这些层的权重难以有效更新。网络实质上停止了在较深层的学习。
输出非零中心: Sigmoid 函数的输出始终为正(介于 0 和 1 之间)。这可能会带来问题。如果下一层神经元的输入始终为正,反向传播时该神经元权重的梯度将全部具有相同的符号(全部为正或全部为负,取决于损失函数相对于神经元输出的梯度)。这可能导致梯度下降过程中更新效率低下,呈锯齿状,与使用零中心输出的激活函数相比,会减缓收敛速度。
由于梯度消失和输出非零中心的问题,Sigmoid 通常不建议用于现代深度学习模型的隐藏层。ReLU 及其变体等函数(我们将在后面介绍)通常能带来更快、更有效的训练。
然而,Sigmoid 仍在特定情境下有其用处:
使用 torch.sigmoid 或 nn.Sigmoid 模块在 PyTorch 中应用 Sigmoid 函数非常简单。
import torch
import torch.nn as nn
# 示例输入张量(例如,线性层的输出)
x = torch.tensor([-2.0, -1.0, 0.0, 1.0, 2.0])
# 使用函数式 API 应用 Sigmoid
sigmoid_output_functional = torch.sigmoid(x)
print("使用 torch.sigmoid 的输出:", sigmoid_output_functional)
# 使用模块 API 应用 Sigmoid
sigmoid_module = nn.Sigmoid()
sigmoid_output_module = sigmoid_module(x)
print("使用 nn.Sigmoid 的输出:", sigmoid_output_module)
# 验证输出范围
print(f"最小输出: {sigmoid_output_module.min()}, 最大输出: {sigmoid_output_module.max()}")
# 示例输出:
# 使用 torch.sigmoid 的输出: tensor([0.1192, 0.2689, 0.5000, 0.7311, 0.8808])
# 使用 nn.Sigmoid 的输出: tensor([0.1192, 0.2689, 0.5000, 0.7311, 0.8808])
# 最小输出: 0.11920292109251022, 最大输出: 0.8807970285415649
尽管 Sigmoid 在神经网络的历史上扮演了重要角色,但其局限性,特别是梯度消失问题,促使研究人员寻求替代方案。在接下来的章节中,我们将了解 Tanh 和 ReLU 等其他激活函数,它们解决了其中一些问题。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造