在神经网络中,激活函数通过引入非线性变换,使模型能够学习复杂的数据模式。以下是常见的激活函数分类及其详细说明,包括公式、特性、应用场景和优缺点:
一、基础激活函数
1. Sigmoid(Logistic)
公式:σ(x)=11+e−x\sigma(x) = \frac{1}{1 + e^{-x}}
σ(x)=1+e−x1
输出范围:(0, 1)
特性:
连续、光滑、可微。
将输入压缩到0到1之间,适合表示概率(如二分类输出层)。
缺点:
梯度消失:当输入绝对值较大时,梯度接近0,导致深层网络训练困难。
输出非零中心:可能引发梯度更新方向不稳定(如所有输出为正时,梯度更新偏向同一方向)。
应用:
二分类问题的输出层(如逻辑回归)。
早期神经网络(现多被ReLU替代)。
2. Tanh(双曲正切)
公式:tanh(x)=ex−e−xex+e−x=2σ(2x)−1\tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} = 2\sigma(2x) - 1
tanh(x)=ex+e−xex−e−x=2σ(2x)−1
输出范围:(-1, 1)
特性:
类似Sigmoid,但输出零中心,梯度消失问题仍存在(但比Sigmoid轻)。
应用:
隐藏层(比Sigmoid更常用,因零中心性更好)。
3. ReLU(Rectified Linear Unit)
公式:ReLU(x)=max(0,x)\text{ReLU}(x) = \max(0, x)
ReLU(x)=max(0,x)
输出范围:[0, +∞)
特性:
计算高效:仅需比较和阈值操作。
缓解梯度消失:正区间梯度恒为1,加速收敛。
缺点:
神经元死亡:当输入始终为负时,梯度为0,神经元无法更新(权重永久失效)。
应用:
隐藏层的默认选择(如CNN、MLP)。
二、改进型激活函数(解决ReLU问题)
1. Leaky ReLU
公式:LeakyReLU(x)={xif x≥0αxif x<0(α∈(0,1),如0.01)\text{LeakyReLU}(x) =
\begin{cases}
x & \text{if } x \geq 0 \\
\alpha x & \text{if } x < 0 \quad (\alpha \in (0, 1), \text{如0.01})
\end{cases}
LeakyReLU(x)={xαxif x≥0if x<0(α∈(0,1),如0.01)
特性:
为负输入引入小斜率(如0.01),避免神经元死亡。
应用:
图像分类(如ResNet中常用)。
2. Parametric ReLU (PReLU)
公式:PReLU(x)={xif x≥0αxif x<0(α为可学习参数)\text{PReLU}(x) =
\begin{cases}
x & \text{if } x \geq 0 \\
\alpha x & \text{if } x < 0 \quad (\alpha \text{为可学习参数})
\end{cases}
PReLU(x)={xαxif x≥0if x<0(α为可学习参数)
特性:
通过反向传播自动学习负区间的斜率,比Leaky ReLU更灵活。
应用:
需精细调参的任务(如某些计算机视觉任务)。
3. Exponential Linear Unit (ELU)
公式:ELU(x)={xif x≥0α(ex−1)if x<0(α>0)\text{ELU}(x) =
\begin{cases}
x & \text{if } x \geq 0 \\
\alpha (e^x - 1) & \text{if } x < 0 \quad (\alpha > 0)
\end{cases}
ELU(x)={xα(ex−1)if x≥0if x<0(α>0)
特性:
负区间平滑(指数函数),输出均值接近零,缓解梯度消失。
计算成本略高于ReLU。
应用:
需稳定训练的深层网络(如某些RNN变体)。
4. Swish
公式:Swish(x)=x⋅σ(βx)(β可学习或固定为1)\text{Swish}(x) = x \cdot \sigma(\beta x) \quad (\beta \text{可学习或固定为1})
Swish(x)=x⋅σ(βx)(β可学习或固定为1)
特性:
自门控机制(类似LSTM中的门控),平滑且非单调。
在深度网络中表现优于ReLU(如Google的MobileNetV3)。
缺点:
计算成本较高(需Sigmoid和乘法操作)。
应用:
计算机视觉和自然语言处理(如BERT的变体)。
三、特殊场景激活函数
1. Softmax
公式:Softmax(xi)=exi∑j=1Kexj(对K维向量操作)\text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^K e^{x_j}} \quad \text{(对K维向量操作)}
Softmax(xi)=∑j=1Kexjexi(对K维向量操作)
输出范围:(0, 1),且所有输出之和为1。
特性:
将向量转换为概率分布,适合多分类输出层。
应用:
多分类任务的输出层(如图像分类、语言模型)。
2. GELU(Gaussian Error Linear Unit)
公式:GELU(x)=x⋅Φ(x)(Φ(x)为标准正态分布的CDF)\text{GELU}(x) = x \cdot \Phi(x) \quad (\Phi(x) \text{为标准正态分布的CDF})
GELU(x)=x⋅Φ(x)(Φ(x)为标准正态分布的CDF)
近似形式:GELU(x)≈0.5x(1+tanh(2/π(x+0.044715x3)))\text{GELU}(x) \approx 0.5x(1 + \tanh(\sqrt{2/\pi}(x + 0.044715x^3)))
GELU(x)≈0.5x(1+tanh(2/π(x+0.044715x3)))
特性:
结合ReLU的稀疏激活和ELU的平滑性,在Transformer中表现优异。
应用:
BERT、GPT等Transformer模型。
3. Mish
公式:Mish(x)=x⋅tanh(softplus(x))=x⋅tanh(ln(1+ex))\text{Mish}(x) = x \cdot \tanh(\text{softplus}(x)) = x \cdot \tanh(\ln(1 + e^x))
Mish(x)=x⋅tanh(softplus(x))=x⋅tanh(ln(1+ex))
特性:
平滑、非单调、自正则化,在深层网络中表现稳定。
应用:
计算机视觉(如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 ]]
通过理解不同激活函数的特性,可以更灵活地设计神经网络结构,提升模型性能。