AI神经网络的“灵魂” 常见激活函数 ReLU Sigmoid Tanh
摘要:本文深入介绍了三种常见激活函数(ReLU、Sigmoid、Tanh)的特性与应用。ReLU计算简单、缓解梯度消失,是CNN等现代网络隐藏层的首选;Sigmoid输出(0,1)适合概率输出,但存在梯度消失问题;Tanh零中心化(-1,1),在RNN中表现较好。文章通过函数公式、导数范围、优缺点对比及可视化代码,阐明了不同场景下的选择策略:隐藏层优先ReLU(或变体),输出层根据任务选择Sigm
·
常见的激活函数 ReLU、Sigmoid 和 Tanh。首先,让我们通过一个表格来快速把握它们的核心特性:
| 特性 | ReLU | Sigmoid | Tanh |
|---|---|---|---|
| 函数公式 | f(x) = max(0, x) |
f(x) = 1 / (1 + e⁻ˣ) |
f(x) = (eˣ - e⁻ˣ) / (eˣ + e⁻ˣ) |
| 输出范围 | [0, +∞) | (0, 1) | (-1, 1) |
| 导数范围 | {0, 1} | (0, 0.25] | (0, 1] |
| 优点 | - 计算简单,收敛快 - 缓解梯度消失(x>0) |
- 输出平滑,适合概率 - 易于求导 |
- 零中心化 - 梯度比Sigmoid大 |
| 缺点 | - “死亡ReLU”问题(x<0) - 非零中心 |
- 梯度消失 - 非零中心 - 幂运算耗时 |
- 梯度消失(饱和区) - 幂运算耗时 |
| 典型应用 | 隐藏层(CNN, Transformer等现代网络) | 输出层(二分类、多标签分类) | 隐藏层(RNN, LSTM等) |
接下来,我们将深入探讨它们的原理、实现与使用场景。
⚡ 激活函数的作用
在深入每个函数之前,我们首先要明白为什么需要激活函数。如果没有激活函数,神经网络无论有多少层,其整体仍然等价于一个线性变换(矩阵乘法),无法学习复杂的非线性模式。激活函数的核心作用是为神经网络引入非线性因素,使其能够拟合现实世界中各种复杂的曲线和曲面,从而解决图像识别、自然语言处理等非线性问题。
🔵 1. Sigmoid函数
原理与特点
Sigmoid函数将任意实数输入压缩到(0,1)的开区间内,其曲线呈S形。
- 数学公式:σ(x)=11+e−xσ(x) = \frac{1}{1 + e^{-x}}σ(x)=1+e−x1
- 导数:σ′(x)=σ(x)(1−σ(x))σ'(x) = σ(x)(1 - σ(x))σ′(x)=σ(x)(1−σ(x)),当其输出接近0或1时,导数会趋近于0。
优势与局限
- 优点:
- 输出平滑且易于求导。
- 输出值在0到1之间,适合用来表示概率,例如二分类任务的输出层。
- 缺点:
- 梯度消失:当输入值的绝对值很大时,函数会进入饱和区,梯度变得非常小,这可能导致深层网络在反向传播时梯度无法有效回传,从而难以训练。
- 非零中心:其输出恒为正,这可能导致后续层输入的均值不为零,进而使得权重更新呈“之”字形摆动,降低训练效率。
- 计算量较大:涉及指数运算。
实现代码
import numpy as np
import matplotlib.pyplot as plt
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 可视化
x = np.linspace(-10, 10, 100)
y = sigmoid(x)
plt.plot(x, y)
plt.title("Sigmoid Function")
plt.grid(True)
plt.show()
应用场景
- 二分类或多标签分类问题的输出层,将输出解释为概率。
- 传统循环神经网络(如LSTM)中的门控机制。
- 注意:由于其缺点,Sigmoid通常不推荐用于深层网络的隐藏层。
🟠 2. Tanh函数(双曲正切)
原理与特点
Tanh函数可以看作是Sigmoid函数的缩放和平移版本,它将输入压缩到(-1, 1)的区间内。
- 数学公式:tanh(x)=ex−e−xex+e−x=2σ(2x)−1tanh(x) = \frac{e^{x} - e^{-x}}{e^{x} + e^{-x}} = 2σ(2x) - 1tanh(x)=ex+e−xex−e−x=2σ(2x)−1
- 导数:tanh′(x)=1−tanh2(x)tanh'(x) = 1 - tanh²(x)tanh′(x)=1−tanh2(x),其最大梯度为1,比Sigmoid的0.25更大,梯度消失问题有所缓解。
优势与局限
- 优点:
- 零中心化:输出范围以0为中心,数据的平均值是0,这使得下一层接收到的输入均值更接近0,有助于加速收敛。
- 缺点:
- 仍然存在梯度消失问题(在饱和区)。
- 同样涉及指数运算,计算成本较高。
实现代码
def tanh(x):
return np.tanh(x) # 或 (np.exp(x) - np.exp(-x)) / (np.exp(x) + np.exp(-x))
# 可视化
y_tanh = tanh(x)
plt.plot(x, y_tanh)
plt.title("Tanh Function")
plt.grid(True)
plt.show()
应用场景
- 在传统神经网络(如MLP)和循环神经网络(如RNN、LSTM)的隐藏层中,Tanh通常比Sigmoid表现更好,因为它具有零均值的优势。
- 一般不用于输出层,除非任务需要输出在(-1, 1)范围内的值。
🟢 3. ReLU函数(修正线性单元)
原理与特点
ReLU是现代深度学习中最常用的激活函数,其设计非常简单:对于正输入直接输出,对于负输入则输出为零。
- 数学公式:ReLU(x)=max(0,x)ReLU(x) = max(0, x)ReLU(x)=max(0,x)
- 导数:当 x>0x > 0x>0 时,导数为1;当 x<0x < 0x<0 时,导数为0。
优势与局限
- 优点:
- 计算效率极高:仅需比较和取最大值操作,无复杂数学运算。
- 缓解梯度消失:在正区梯度恒为1,有效解决了深层网络中的梯度消失问题。
- 稀疏激活:负输入输出为0,使得网络变得稀疏,这可能有助于模型的泛化能力。
- 缺点:
- 死亡ReLU问题:一旦输入落入负区,梯度为0,可能导致某些神经元“死亡”且无法恢复。
- 非零中心:输出恒大于等于0。
- 在负区域的梯度为零,可能影响模型对一些模式的学习。
实现代码
def relu(x):
return np.maximum(0, x)
# 可视化
y_relu = relu(x)
plt.plot(x, y_relu)
plt.title("ReLU Function")
plt.grid(True)
plt.show()
应用场景
- 是绝大多数深度前馈神经网络(如CNN、Transformer)隐藏层的默认选择。
- 不适用于输出层,因为其输出范围无界,无法直接表示概率或固定范围的输出。
🔄 改进的ReLU变体
为了解决ReLU的“死亡”问题,研究者们提出了一些变体:
- Leaky ReLU:在负区域赋予一个很小的斜率(如0.01),而不是直接置零。公式为:f(x)=max(αx,x)f(x) = max(αx, x)f(x)=max(αx,x),其中α是一个小的正常数(如0.01)。这使得负输入区域也有微小的梯度,神经元有机会被重新激活。
- Parametric ReLU (PReLU):与Leaky ReLU类似,但负区域的斜率α不再是预定义的超参数,而是通过反向传播从数据中学习得到,更具适应性。
- Exponential Linear Unit (ELU):尝试通过使用指数函数来处理负值,使得输出的均值更接近零,可能获得比ReLU更快的收敛速度。
💎 总结与选择指南
在选择激活函数时,可以遵循以下实用原则:
-
隐藏层:
- 首选ReLU:对于大多数深度神经网络(特别是CNN和MLP),ReLU因其计算高效和能有效缓解梯度消失而成为默认选择。使用时需注意学习率不宜过大,并考虑使用改进的初始化方法(如He初始化)以减少“死亡ReLU”的风险。
- 尝试Leaky ReLU或PReLU:如果怀疑网络存在较多的“死亡神经元”,可以尝试使用Leaky ReLU或其变体。
- 传统网络可考虑Tanh:在某些传统的循环神经网络(如RNN、LSTM)中,Tanh仍有其应用。
-
输出层:
- 二分类问题:输出层通常使用 Sigmoid,将输出解释为概率。
- 多分类问题:输出层使用 Softmax,将输出转化为概率分布。
- 回归问题:输出层通常使用线性激活函数(恒等函数)。
希望这份详细的介绍能帮助你全面理解这些常见的激活函数。如果你对某个特定的变体(如GELU,在Transformer中常用)或者其他深度学习概念有进一步的兴趣,我很乐意继续探讨。
更多推荐



所有评论(0)