PyTorch中的激活函数详解
在深度学习中,**激活函数(Activation Function)**是至关重要的一环。它的主要作用是引入非线性,使神经网络能够拟合和学习复杂的非线性关系。如果没有激活函数,即使叠加多层神经网络,最终依然只是一个线性模型,无法处理真实世界中的复杂问题。
本文将结合理论、公式和PyTorch代码,详细介绍几种常见的激活函数及其使用方法。
1. 为什么需要激活函数?
假设一个神经网络每一层都只包含线性变换:
经过多层叠加,最终输出依然是输入的线性组合:

这说明:无论多少层的线性组合,本质上还是一个线性模型,并不能学习数据中的非线性特征。
因此我们需要在隐藏层引入非线性------这就是激活函数的价值。
推荐一个直观的可视化工具 👉 TensorFlow Playground。
2. PyTorch中常见的激活函数
PyTorch 提供了多种激活函数,主要在 torch.nn
和 torch.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.Module
或 F.functional
。