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

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

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

定义 :

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

核心作用:

为神经网络引入非线性,增强模型表达能力。

需可微分(或近似可微),以支持梯度下降优化。

部分激活函数可能引发梯度消失 / 爆炸问题(如 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

用途 :限制激活范围,适合低精度设备(如移动端 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 = beta

def 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

用途 :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

输出概率分布,用于多分类任务

分类任务输出层

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

相关推荐

好多《星球大战》国外男女对看
365体育是正规的吗

好多《星球大战》国外男女对看

📅 08-08 👁️ 6860
南美蟛蜞菊
365体育是正规的吗

南美蟛蜞菊

📅 09-03 👁️ 3352
手机游戏分辨率怎么调
365体育是正规的吗

手机游戏分辨率怎么调

📅 09-17 👁️ 5016