Sigmoid 激活函数简介

Sigmoid 函数是深度学习中常用的非线性激活函数之一,其数学表达式为:

$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$

Sigmoid 函数将输入值压缩到 (0, 1) 区间内,常用于二分类问题的输出层或中间层的激活函数。它的特点是输出平滑且易于求导,但存在梯度消失问题。

PyTorch 中的 Sigmoid 实现

PyTorch 提供了两种方式实现 Sigmoid 激活函数:通过 torch.sigmoid() 函数或 nn.Sigmoid() 模块。

使用 torch.sigmoid() 函数
import torch

# 定义输入张量
x = torch.tensor([-1.0, 0.0, 1.0])

# 应用 sigmoid 函数
output = torch.sigmoid(x)
print(output)

输出结果类似:

tensor([0.2689, 0.5000, 0.7311])

使用 nn.Sigmoid() 模块
import torch.nn as nn

# 创建 Sigmoid 模块
sigmoid = nn.Sigmoid()

# 应用 sigmoid 模块
output = sigmoid(x)
print(output)

Sigmoid 在神经网络中的应用案例

二分类问题输出层

在二分类任务中,Sigmoid 常用于输出层,将模型的原始输出转换为概率值。

model = nn.Sequential(
    nn.Linear(10, 5),
    nn.ReLU(),
    nn.Linear(5, 1),
    nn.Sigmoid()
)

# 假设输入数据
input_data = torch.randn(1, 10)
output = model(input_data)
print(output)  # 输出概率值

自定义损失函数

Sigmoid 常与 BCELoss (Binary Cross Entropy Loss) 结合使用:

criterion = nn.BCELoss()

# 假设预测值和真实标签
pred = torch.tensor([0.9, 0.2, 0.8], requires_grad=True)
target = torch.tensor([1.0, 0.0, 1.0])

loss = criterion(pred, target)
print(loss)

Sigmoid 的梯度特性

Sigmoid 函数的导数为:

$$ \sigma'(x) = \sigma(x)(1 - \sigma(x)) $$

在 PyTorch 中,自动微分可以自动计算 Sigmoid 的梯度:

x = torch.tensor(1.0, requires_grad=True)
y = torch.sigmoid(x)
y.backward()
print(x.grad)  # 输出梯度值

Sigmoid 与其他激活函数的比较

  1. ReLU:计算更简单,缓解梯度消失问题,但不适合输出层
  2. Tanh:输出范围 (-1, 1) 更适合某些场景
  3. Softmax:多分类问题的首选,而 Sigmoid 更适合二分类

使用注意事项

  1. 深层网络中谨慎使用 Sigmoid,可能导致梯度消失
  2. 输出层使用 Sigmoid 时,注意配合适当的损失函数
  3. 对于大型网络,ReLU 等激活函数通常表现更好

可视化示例

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(-10, 10, 100)
y = torch.sigmoid(torch.tensor(x)).numpy()

plt.plot(x, y)
plt.title("Sigmoid Function")
plt.xlabel("x")
plt.ylabel("sigmoid(x)")
plt.grid(True)
plt.show()

这段代码将绘制出 Sigmoid 函数的曲线,直观展示其将输入压缩到 (0,1) 区间的特性。

更多推荐