当前位置: 首页 > news >正文

激活函数全解析:定义、分类与 17 种常用函数详解

一、激活函数的定义与作用

定义
激活函数是添加到人工神经网络中的函数,用于帮助网络学习数据中的复杂模式,决定神经元的输出。
核心作用

  1. 为神经网络引入非线性,增强模型表达能力。
  2. 需可微分(或近似可微),以支持梯度下降优化。
  3. 部分激活函数可能引发梯度消失 / 爆炸问题(如 Sigmoid、Tanh)。

分类

  • 饱和激活函数:当输入趋近正 / 负无穷时,导数趋近于 0(如 Sigmoid、Tanh)。
  • 非饱和激活函数:至少一侧导数不为 0(如 ReLU、Leaky ReLU、ELU)。
二、17 种常用激活函数详解

以下按类别整理,包含公式、图像描述、优缺点及 PyTorch 代码实现。

饱和激活函数

1. Sigmoid 函数

公式:f(x)=1+e−x1​,f′(x)=f(x)(1−f(x))
图像:S 型曲线,值域 [0,1],导函数最大值 0.25。
优点

  • 输出范围适合表示概率(如二分类输出层)。
  • 连续可导,梯度平滑。
    缺点
  • 梯度消失问题严重(|x|>5 时导数接近 0)。
  • 输出非零中心,影响权重更新效率。
  • 指数运算计算量大。
    PyTorch 代码

python

运行

import torch.nn as nn
m = nn.Sigmoid()
input = torch.randn(2)
print("原:", input)       # 示例输入
print("结果:", m(input))  # 输出在(0,1)之间
2. Tanh 函数

公式:f(x)=ex+e−xex−e−x​,f′(x)=1−[f(x)]2
图像:S 型曲线,值域 [-1,1],关于原点对称。
优点

  • 输出以 0 为中心,优于 Sigmoid 的隐藏层表现。
  • 可微分,反对称性有助于打破线性关系。
    缺点
  • 仍存在梯度消失问题(输入过大 / 小时导数趋近 0)。
  • 指数运算计算量大。
    PyTorch 代码

python

运行

import torch.nn as nn
m = nn.Tanh()
input = torch.randn(2)
print("原:", input)       # 示例输入
print("结果:", m(input))  # 输出在(-1,1)之间

非饱和激活函数(ReLU 及其变体)

3. ReLU 函数

公式:f(x)={x,0,​x≥0x<0​,f′(x)={1,0,​x>0x<0​
图像:x≥0 时线性输出,x<0 时恒为 0,导函数为 0 或 1。
优点

  • 计算速度快,无指数运算。
  • 避免梯度消失(x>0 时梯度为 1)。
    缺点
  • 负输入导致神经元 “死亡”(Dead Neuron 问题)。
  • 输出非零中心。
    PyTorch 代码

python

运行

import torch.nn as nn
m = nn.ReLU()
input = torch.randn(2)
print("原:", input)       # 示例输入
print("结果:", m(input))  # 负输入置0,正输入保留
4. Leaky ReLU 函数

公式:f(x)={x,λx,​x≥0x<0​,λ∈(0,1)
改进:负半轴引入小斜率 λ(默认 0.01),避免 Dead Neuron。
缺点:λ 为固定超参数,可能影响模型灵活性。
PyTorch 代码

python

运行

import torch.nn as nn
m = nn.LeakyReLU(negative_slope=0.1)  # λ=0.1
input = torch.randn(2)
print("结果:", m(input))  # 负输入按λ缩放
5. PReLU 函数

公式:为可训练参数
改进:α 作为参数学习,而非固定值(如 Leaky ReLU)。
PyTorch 代码

python

运行

import torch.nn as nn
m = nn.PReLU(num_parameters=1)  # α为可训练参数
input = torch.randn(2)
print("结果:", m(input))  # 负输入按学习到的α缩放
6. RReLU 函数

公式:为随机值(范围如)
改进:训练时 α 随机取值,测试时固定,增强模型鲁棒性。
PyTorch 代码

python

运行

import torch.nn as nn
m = nn.RReLU(lower=0.1, upper=0.3)  # α∈(0.1, 0.3)
input = torch.randn(2)
print("结果:", m(input))  # 负输入按随机α缩放
7. ELU 函数

公式:为常数(默认)
优点

  • 负半轴指数平滑,均值趋近于 0,加速收敛。
  • 缓解梯度消失,抗噪声能力强。
    缺点:计算复杂度高于 Leaky ReLU。
    PyTorch 代码

python

运行

import torch.nn as nn
m = nn.ELU(alpha=1.0)  # 默认α=1
input = torch.randn(2)
print("结果:", m(input))  # 负输入按α(e^x-1)计算
8. SELU 函数

公式:(默认)
改进

  • 自标准化特性,确保各层输出趋近标准正态分布,避免梯度消失 / 爆炸。
    PyTorch 代码

python

运行

import torch.nn as nn
m = nn.SELU()  # 自动应用默认λ和α
input = torch.randn(2)
print("结果:", m(input))  # 输出均值趋近于0
9. CELU 函数

公式:为常数(默认)
特点:负半轴指数缩放,平滑性优于 ELU,但实际应用较少。
PyTorch 代码

python

运行

import torch.nn as nn
m = nn.CELU(alpha=1.0)  # 默认α=1
input = torch.randn(2)
print("结果:", m(input))  # 负输入按α(e^{x/α}-1)计算
10. GELU 函数

公式:GELU(x)=0.5x(1+tanh(π2​​(x+0.044715x3)))
优点

  • 平滑版 ReLU,引入概率统计思想(输入的累积分布函数)。
  • 泛化能力强,适合深层网络。
    PyTorch 代码

python

运行

import torch.nn as nn
m = nn.GELU()
input = torch.randn(2)
print("结果:", m(input))  # 输出非线性且平滑
11. ReLU6 函数

公式:f(x)=⎩⎨⎧​0,x,6,​x≤00<x<6x≥6​
用途:限制激活范围,适合低精度设备(如移动端 float16/int8),避免数值溢出。
PyTorch 代码

python

运行

import torch.nn as nn
m = nn.ReLU6()
input = torch.tensor([-1.0, 5.0, 7.0])
print("结果:", m(input))  # 输出[0, 5, 6]

其他非饱和激活函数

12. Swish 函数

公式:为常数(默认)
优点

  • 平滑非单调,无上界有下界,缓解过拟合。
  • 深层模型中性能优于 ReLU。
    PyTorch 代码(自定义实现):

python

运行

class Swish(nn.Module):def __init__(self, beta=1):super().__init__()self.beta = betadef forward(self, x):return x * torch.sigmoid(self.beta * x)
m = Swish()
input = torch.randn(2)
print("结果:", m(input))
13. Hardswish 函数

公式:f(x)=⎩⎨⎧​0,6x(x+3)​,x,​x≤−3−3<x<3x≥3​
用途:MobileNet V3 中替代 ReLU6,基于 Swish 的分段线性近似,计算效率更高。
PyTorch 代码

python

运行

import torch.nn as nn
m = nn.Hardswish()
input = torch.tensor([-4.0, 0.0, 4.0])
print("结果:", m(input))  # 输出[0, 0, 4]
14. SiLU 函数

公式:f(x)=x⋅sigmoid(x)
特点:Swish 的特例(β=1),平滑且非单调,PyTorch 中已内置。
PyTorch 代码

python

运行

import torch.nn as nn
m = nn.SiLU()  # 等价于nn.Swish(beta=1)
input = torch.randn(2)
print("结果:", m(input))
15. Softplus 函数

公式:f(x)=ln(1+ex)
特点:ReLU 的平滑版本,输出非负,0 点可导,但计算量较大。
PyTorch 代码

python

运行

import torch.nn as nn
m = nn.Softplus()
input = torch.randn(2)
print("结果:", m(input))  # 输出平滑逼近ReLU
16. Mish 函数

公式:f(x)=x⋅tanh(ln(1+ex))
优点

  • 无上界有下界,避免梯度饱和。
  • 光滑性好,提升模型泛化能力。
    PyTorch 代码(自定义实现):

python

运行

class Mish(nn.Module):def forward(self, x):return x * torch.tanh(F.softplus(x))
m = Mish()
input = torch.randn(2)
print("结果:", m(input))

多分类专用激活函数

17. Softmax 函数

公式:f(xi​)=∑j​exj​exi​​
用途:多分类任务输出层,将 logits 转化为概率(值域 [0,1],和为 1)。
缺点

  • 指数运算可能导致数值溢出。
  • 负输入梯度为 0,权重无法更新。
    PyTorch 代码

python

运行

import torch.nn as nn
m = nn.Softmax(dim=0)  # 沿维度0归一化
input = torch.tensor([1.0, 2.0, 3.0])
print("结果:", m(input))  # 输出概率分布

总结对比

类型代表函数核心特点适用场景
饱和激活函数Sigmoid/Tanh输出有界,梯度易消失,适合简单模型或输出层二分类输出、早期神经网络
非饱和激活函数ReLU 系列计算高效,缓解梯度消失,负半轴处理方式各异大多数深层神经网络
平滑激活函数Swish/GELU光滑非单调,泛化能力强,适合复杂模型Transformer、BERT 等模型
多分类激活函数Softmax输出概率分布,用于多分类任务分类任务输出层

为方便大家学习 除配套资料外还给大家整理了一份超详细的​编辑资料包 需要的小伙伴

http://www.xdnf.cn/news/480259.html

相关文章:

  • 奥运数据可视化:探索数据讲述奥运故事
  • VulnHub | Breach - 1
  • 顶层设计-IM系统架构
  • Leetcode刷题 | Day64_图论09_dijkstra算法
  • linux,我启动一个springboot项目, 用java -jar xxx.jar ,但是没多久这个java进程就会自动关掉
  • android vlc播放rtsp
  • 2025春训第十九场
  • 多通道电源管理芯片在分布式能源系统中的优化策略
  • 打卡习惯,记录坚持:我用 CodeBuddy 做了个毛玻璃风格的习惯打卡小应用
  • gflags 安装及使用
  • 精准掌控张力动态,重构卷对卷工艺设计
  • 用户现场不支持路由映射,如何快速将安防监控EasyCVR视频汇聚平台映射到公网?
  • 移除链表元素数据结构oj题(力扣题206)
  • 基于MATLAB的人脸识别,实现PCA降维,用PCA特征进行SVM训练
  • 无线攻防实战指南:Wi-Fi默认密码
  • 【未】[启发式算法]含初始解要求的有:TS, GA, SA, DPSO
  • WebSocket 客户端 DLL 模块设计说明(基于 WebSocket++ + Boost.Asio)
  • Core Web Vitals 全链路优化:从浏览器引擎到网络协议深度调优
  • linux下tcp/ip网络通信笔记1,
  • uniapp-商城-57-后台 新增商品(弹窗属性数据添加父级)
  • uniapp婚纱预约小程序
  • 一键清理功能,深度扫描本地存储数据
  • RK3588 ADB使用
  • 品铂科技在UWB行业地位综述(2025年更新)
  • Python线性回归:从理论到实践的完整指南
  • 大语言模型 10 - 从0开始训练GPT 0.25B参数量 补充知识之模型架构 MoE、ReLU、FFN、MixFFN
  • 学习海康VisionMaster之直方图工具
  • MySQL中innodb的ACID
  • python中函数定义下划线代表什么意思,一个下划线,两个下划线什么意思
  • entity线段材质设置