神经网络中,激活函数有哪些种类
【摘要】 在神经网络中,激活函数通过引入非线性变换,使模型能够学习复杂的数据模式。以下是常见的激活函数分类及其详细说明,包括公式、特性、应用场景和优缺点: 一、基础激活函数 1. Sigmoid(Logistic)公式:σ(x)=11+e−x\sigma(x) = \frac{1}{1 + e^{-x}}σ(x)=1+e−x1输出范围:(0, 1)特性:连续、光滑、可微。将输入压缩到0到1之间,适合...
在神经网络中,激活函数通过引入非线性变换,使模型能够学习复杂的数据模式。以下是常见的激活函数分类及其详细说明,包括公式、特性、应用场景和优缺点:
一、基础激活函数
1. Sigmoid(Logistic)
- 公式:
- 输出范围:
(0, 1)
- 特性:
- 连续、光滑、可微。
- 将输入压缩到0到1之间,适合表示概率(如二分类输出层)。
- 缺点:
- 梯度消失:当输入绝对值较大时,梯度接近0,导致深层网络训练困难。
- 输出非零中心:可能引发梯度更新方向不稳定(如所有输出为正时,梯度更新偏向同一方向)。
- 应用:
- 二分类问题的输出层(如逻辑回归)。
- 早期神经网络(现多被ReLU替代)。
2. Tanh(双曲正切)
- 公式:
- 输出范围:
(-1, 1)
- 特性:
- 类似Sigmoid,但输出零中心,梯度消失问题仍存在(但比Sigmoid轻)。
- 应用:
- 隐藏层(比Sigmoid更常用,因零中心性更好)。
3. ReLU(Rectified Linear Unit)
- 公式:
- 输出范围:
[0, +∞)
- 特性:
- 计算高效:仅需比较和阈值操作。
- 缓解梯度消失:正区间梯度恒为1,加速收敛。
- 缺点:
- 神经元死亡:当输入始终为负时,梯度为0,神经元无法更新(权重永久失效)。
- 应用:
- 隐藏层的默认选择(如CNN、MLP)。
二、改进型激活函数(解决ReLU问题)
1. Leaky ReLU
- 公式:
- 特性:
- 为负输入引入小斜率(如0.01),避免神经元死亡。
- 应用:
- 图像分类(如ResNet中常用)。
2. Parametric ReLU (PReLU)
- 公式:
- 特性:
- 通过反向传播自动学习负区间的斜率,比Leaky ReLU更灵活。
- 应用:
- 需精细调参的任务(如某些计算机视觉任务)。
3. Exponential Linear Unit (ELU)
- 公式:
- 特性:
- 负区间平滑(指数函数),输出均值接近零,缓解梯度消失。
- 计算成本略高于ReLU。
- 应用:
- 需稳定训练的深层网络(如某些RNN变体)。
4. Swish
- 公式:
- 特性:
- 自门控机制(类似LSTM中的门控),平滑且非单调。
- 在深度网络中表现优于ReLU(如Google的MobileNetV3)。
- 缺点:
- 计算成本较高(需Sigmoid和乘法操作)。
- 应用:
- 计算机视觉和自然语言处理(如BERT的变体)。
三、特殊场景激活函数
1. Softmax
- 公式:
- 输出范围:
(0, 1)
,且所有输出之和为1。 - 特性:
- 将向量转换为概率分布,适合多分类输出层。
- 应用:
- 多分类任务的输出层(如图像分类、语言模型)。
2. GELU(Gaussian Error Linear Unit)
- 公式:
近似形式:
- 特性:
- 结合ReLU的稀疏激活和ELU的平滑性,在Transformer中表现优异。
- 应用:
- BERT、GPT等Transformer模型。
3. Mish
- 公式:
- 特性:
- 平滑、非单调、自正则化,在深层网络中表现稳定。
- 应用:
- 计算机视觉(如YOLOv4)。
四、激活函数对比与选择建议
激活函数 | 输出范围 | 梯度特性 | 计算成本 | 适用场景 |
---|---|---|---|---|
Sigmoid | (0, 1) | 梯度消失 | 低 | 二分类输出层 |
Tanh | (-1, 1) | 梯度消失 | 低 | 隐藏层(早期) |
ReLU | [0, +∞) | 梯度恒定(正) | 极低 | 隐藏层默认选择 |
Leaky ReLU | (-∞, +∞) | 梯度恒定(全区间) | 低 | 避免神经元死亡 |
Swish | (-∞, +∞) | 自适应门控 | 高 | 深度CNN/Transformer |
Softmax | (0, 1) | 概率归一化 | 中 | 多分类输出层 |
选择建议:
- 默认选择:隐藏层用ReLU或Leaky ReLU(简单高效)。
- 深层网络:尝试Swish、GELU或Mish(需权衡计算成本)。
- 输出层:二分类用Sigmoid,多分类用Softmax。
- RNN/LSTM:Tanh或ReLU变体(如Gated ReLU)。
五、代码示例(PyTorch实现)
import torch
import torch.nn as nn
import torch.nn.functional as F
# 定义激活函数
activations = {
"Sigmoid": nn.Sigmoid(),
"Tanh": nn.Tanh(),
"ReLU": nn.ReLU(),
"LeakyReLU": nn.LeakyReLU(0.1),
"Swish": lambda x: x * torch.sigmoid(x), # 近似Swish
"Softmax": nn.Softmax(dim=1)
}
# 测试输入
x = torch.tensor([-1.0, 0.0, 1.0])
# 打印各激活函数输出
for name, func in activations.items():
if name == "Softmax":
output = func(x.unsqueeze(0)) # Softmax需2D输入
else:
output = func(x)
print(f"{name:10}: {output.numpy()}")
输出示例:
Sigmoid : [0.26894143 0.5 0.7310586 ]
Tanh : [-0.7615942 0. 0.7615942]
ReLU : [0. 0. 1.]
LeakyReLU : [-0.1 0. 1. ]
Swish : [-0.2689414 0. 0.7310586]
Softmax : [[0.09003057 0.24472848 0.6652409 ]]
通过理解不同激活函数的特性,可以更灵活地设计神经网络结构,提升模型性能。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)