PyTorch nn模块中的常用激活函数解析
【免费下载链接】nn 项目地址: https://gitcode.com/gh_mirrors/nn/nn
激活函数概述
在深度学习中,激活函数(Transfer Functions)是神经网络中不可或缺的组成部分。它们通常被应用在参数化层(如Linear、Convolution等)之后,为网络引入非线性特性。这种非线性使得神经网络能够学习并表达比简单逻辑回归更复杂的问题空间。
PyTorch的nn模块提供了丰富的激活函数实现,本文将详细介绍这些激活函数的特性、数学表达式以及使用场景。
常用激活函数详解
1. HardTanh函数
HardTanh是Tanh函数的硬饱和版本,定义如下:
f(x) =
\begin{cases}
1, & \text{如果 } x > 1 \\
-1, & \text{如果 } x < -1 \\
x, & \text{其他情况}
\end{cases}
特点:
- 默认线性区域范围为[-1,1]
- 可通过参数调整线性区域范围
- 计算效率高于Tanh函数
使用示例:
m = nn.HardTanh(min_val=-0.5, max_val=0.5)
output = m(input)
2. ReLU系列函数
标准ReLU
f(x) = max(0, x)
特点:
- 计算简单高效
- 存在"神经元死亡"问题
LeakyReLU
f(x) = max(0, x) + negval * min(0, x)
特点:
- 解决了ReLU的神经元死亡问题
- negval通常设置为0.01
PReLU
f(x) = max(0, x) + a * min(0, x)
特点:
- 参数a可学习
- 可以是共享参数或每通道独立参数
RReLU
f(x) = max(0, x) + a * min(0, x), a \sim U(l, u)
特点:
- 训练时a为随机值
- 测试时a固定为(l+u)/2
3. Sigmoid系列函数
Sigmoid
f(x) = \frac{1}{1 + e^{-x}}
特点:
- 输出范围(0,1)
- 存在梯度消失问题
LogSigmoid
f(x) = log(\frac{1}{1 + e^{-x}})
特点:
- 计算更稳定
- 常用于分类任务
4. SoftMax系列函数
SoftMax
f_i(x) = \frac{e^{x_i - shift}}{\sum_j e^{x_j - shift}}, shift = max_i(x_i)
特点:
- 输出概率分布
- 常用于多分类问题
LogSoftMax
f_i(x) = log(\frac{e^{x_i}}{\sum_j e^{x_j}})
特点:
- 数值稳定性更好
- 通常与NLLLoss配合使用
5. 其他重要激活函数
ELU
f(x) =
\begin{cases}
x, & \text{如果 } x > 0 \\
\alpha(e^x - 1), & \text{其他情况}
\end{cases}
特点:
- 缓解梯度消失问题
- 输出均值接近0
Gated Linear Unit
f([x1, x2]) = x1 \otimes \sigma(x2)
特点:
- 将输入分为两部分
- 常用于自然语言处理
激活函数选择建议
- ReLU:默认首选,适用于大多数情况
- LeakyReLU/PReLU:当遇到神经元死亡问题时使用
- Sigmoid/Tanh:RNN等特定架构中使用
- SoftMax:多分类输出层使用
- ELU:需要更强非线性时考虑
实际应用示例
import torch
import torch.nn as nn
# 构建一个简单的CNN网络
class SimpleCNN(nn.Module):
def __init__(self):
super(SimpleCNN, self).__init__()
self.conv1 = nn.Conv2d(3, 32, 3)
self.relu1 = nn.ReLU(inplace=True)
self.conv2 = nn.Conv2d(32, 64, 3)
self.leaky_relu = nn.LeakyReLU(0.1)
self.fc = nn.Linear(64*6*6, 10)
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
x = self.relu1(self.conv1(x))
x = self.leaky_relu(self.conv2(x))
x = x.view(x.size(0), -1)
x = self.fc(x)
return self.softmax(x)
总结
PyTorch的nn模块提供了丰富的激活函数实现,每种激活函数都有其特定的适用场景。理解这些激活函数的数学特性和行为表现,对于构建高效的神经网络至关重要。在实际应用中,应根据具体问题和网络架构选择合适的激活函数组合。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



