PyTorch中的激活函数

PyTorch中的激活函数详解

在深度学习中,**激活函数(Activation Function)**是至关重要的一环。它的主要作用是引入非线性,使神经网络能够拟合和学习复杂的非线性关系。如果没有激活函数,即使叠加多层神经网络,最终依然只是一个线性模型,无法处理真实世界中的复杂问题。

本文将结合理论、公式和PyTorch代码,详细介绍几种常见的激活函数及其使用方法。


1. 为什么需要激活函数?

假设一个神经网络每一层都只包含线性变换:

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​

经过多层叠加,最终输出依然是输入的线性组合:

这说明:无论多少层的线性组合,本质上还是一个线性模型,并不能学习数据中的非线性特征。

因此我们需要在隐藏层引入非线性------这就是激活函数的价值。

推荐一个直观的可视化工具 👉 TensorFlow Playground


2. PyTorch中常见的激活函数

PyTorch 提供了多种激活函数,主要在 torch.nntorch.nn.functional 模块中实现。

2.1 Sigmoid

​​​​​​​ ​​​​​​​ ​​​​​​​

  • 输出范围在 (0,1),适合概率问题

  • 常用于二分类输出层

  • 缺点:梯度消失

python 复制代码
import torch
import torch.nn as nn
import matplotlib.pyplot as plt

x = torch.linspace(-10, 10, 100)
sigmoid = nn.Sigmoid()
y = sigmoid(x)

plt.plot(x.numpy(), y.numpy())
plt.title("Sigmoid 激活函数")
plt.show()

2.2 Tanh

​​​​​​​ ​​​​​​​​​​​​​​

  • 输出范围 (-1,1),零均值

  • 收敛快,效果比Sigmoid好

  • 缺点:仍有梯度消失

python 复制代码
tanh = nn.Tanh()
y = tanh(x)

plt.plot(x.numpy(), y.numpy())
plt.title("Tanh 激活函数")
plt.show()

2.3 ReLU

​​​​​​​ ​​​​​​​ ​​​​​​

  • 简单高效

  • 缓解梯度消失

  • 稀疏激活

  • 缺点:Dying ReLU

python 复制代码
import torch.nn.functional as F

y = F.relu(x)
plt.plot(x.numpy(), y.numpy())
plt.title("ReLU 激活函数")
plt.show()

2.4 Leaky ReLU

​​​​​​​​​​​​​​ ​​​​​​​

python 复制代码
leaky_relu = nn.LeakyReLU(negative_slope=0.01)
y = leaky_relu(x)

plt.plot(x.numpy(), y.numpy())
plt.title("Leaky ReLU 激活函数")
plt.show()

2.5 Softmax

​​​​​​​ ​​​​​​​​​​​​​​

常用于多分类输出层。

python 复制代码
input_tensor = torch.tensor([[-1.0, 2.0, -3.0, 4.0],
                             [-2.0, 3.0, -3.0, 9.0]])
softmax = nn.Softmax(dim=1)
output_tensor = softmax(input_tensor)
print(output_tensor)

3. 激活函数选择指南

  • 隐藏层

    • 优先 ReLU

    • ReLU 不好时尝试 Leaky ReLU

    • 避免 Sigmoid,Tanh可在部分场景用

  • 输出层

    • 二分类 → Sigmoid

    • 多分类 → Softmax


4. 总结

激活函数的主要作用:

  • 引入非线性

  • 解决梯度问题

  • 改变分布,提高收敛

PyTorch 调用方式灵活:nn.ModuleF.functional