激活函数是神经网络的核心组件之一,它决定了神经元的输出,为网络引入了非线性,使得神经网络能够拟合极其复杂的函数。
如果没有激活函数,无论网络多深,都等价于一个线性回归模型,无法解决像图像识别、自然语言处理这样的复杂问题。
下面我将激活函数分为三大类进行介绍:经典常用型、进阶高性能型、和特殊用途型。
一、 经典常用型
这类函数历史悠久,是入门必学且至今仍在广泛使用的函数。
1. Sigmoid(S型函数)
- 公式:
f(x) = 1 / (1 + e^(-x)) - 输出范围:(0, 1)
- 特点与场景:
- 优点:输出平滑,易于求导;将输出压缩到(0,1),可以解释为概率(例如,二分类输出的最后一层)。
- 缺点:
- 梯度消失:当输入值的绝对值很大时,梯度会接近于0,在反向传播中导致深层网络的权重几乎不更新。
- 非零中心:输出恒大于0,导致梯度更新呈“Z”字形下降,收敛慢。
- 计算量较大(涉及指数运算)。
- 应用场景:现在主要用于二分类模型的输出层,在隐藏层中已很少使用。
2. Tanh(双曲正切函数)
- 公式:
f(x) = (e^x - e^(-x)) / (e^x + e^(-x)) - 输出范围:(-1, 1)
- 特点与场景:
- 优点:零中心化,其输出以0为中心,收敛速度通常比Sigmoid快。
- 缺点:依然存在梯度消失的问题。
- 应用场景:在RNN(循环神经网络,如LSTM、GRU)的隐藏层中仍然比较常见,因其输出范围更适合表征序列数据的中间状态。在普通的前馈网络中,通常被ReLU及其变体所取代。
3. ReLU(整流线性单元)
- 公式:
f(x) = max(0, x) - 输出范围:[0, +∞)
- 特点与场景:
- 优点:
- 计算极其高效:只需比较和取最大值。
- 在正区间解决了梯度消失问题,梯度恒为1。
- 收敛速度远快于Sigmoid和Tanh。
- 缺点:
- Dying ReLU(神经元死亡):当输入为负时,梯度为0,对应的神经元永远无法被激活。
- 非零中心。
- 应用场景:目前最常用、默认的激活函数,尤其适用于CNN(卷积神经网络)和普通深度前馈网络的隐藏层。
- 优点:
二、 进阶高性能型
这类函数主要是为了克服ReLU的缺点而设计的,是现代深度网络的主流选择。
4. Leaky ReLU(带泄露ReLU)
- 公式:
f(x) = max(αx, x)(α是一个很小的常数,如0.01) - 输出范围:(-∞, +∞)
- 特点与场景:
- 优点:解决了Dying ReLU问题。在负区间有一个小的斜率α,使得负输入也有一个微小的梯度,神经元始终有被激活的可能。
- 缺点:需要手动设定或作为超参数学习α值。
- 应用场景:当担心出现“神经元死亡”时,可以作为ReLU的直接替代品。在实践中,效果有时优于ReLU。
5. PReLU(参数化ReLU)
- 公式:与Leaky ReLU相同,但α作为一个可学习的参数,由模型在训练中自己确定。
- 特点与场景:比Leaky ReLU更灵活,理论上性能更好,但增加了少量参数和计算量。在一些大型模型(如ImageNet上的大型CNN)中表现出色。
6. ELU(指数线性单元)
- 公式:
f(x) = x (if x > 0), α(e^x - 1) (if x <= 0) - 输出范围:(-α, +∞)
- 特点与场景:
- 优点:
- 具有ReLU的所有优点。
- 输出更接近零中心化。
- 在负区域是平滑的曲线,可能比Leaky ReLU有更快的收敛速度。
- 缺点:计算涉及指数运算,比ReLU慢。
- 应用场景:在需要更高精度和稳定性的任务中,可以作为ReLU的强力竞争者。
- 优点:
7. GELU(高斯误差线性单元)
- 公式:
f(x) = x * Φ(x),其中Φ(x)是标准高斯分布的累积分布函数。常用近似实现:0.5 * x * (1 + tanh[√(2/π) * (x + 0.044715 * x^3)]) - 特点与场景:
- 优点:这是一个随机正则化器,它的输出取决于输入相对于其他输入的概率。思想是“在概率上屏蔽掉一些神经元”,这与Dropout的思想一致,但更平滑。
- 应用场景:在Transformer模型中已成为标配,例如BERT、GPT等NLP领域的SOTA模型都使用GELU作为其前馈网络的激活函数。
三、 特殊用途型
这类函数为特定类型的网络结构或任务而设计。
8. Softmax
- 公式:将一组实数转换为概率分布,
S(y_i) = e^(y_i) / Σ(j=1 to n) e^(y_j) - 输出范围:(0, 1),且所有输出之和为1。
- 特点与场景:
- 应用场景:专用于多分类神经网络的输出层。它将网络的原始输出转换为每个类别的概率。
9. Swish(由Google搜索发现)
- 公式:
f(x) = x * sigmoid(βx)(β可以是常数或可学习参数) - 特点与场景:
- 优点:平滑、非单调。在实践中,它在某些深度模型上的表现被证明略优于ReLU。
- 缺点:计算量较大。
- 应用场景:在一些前沿研究和复杂模型中作为尝试,但尚未像ReLU那样成为绝对主流。
总结与选择指南
| 激活函数 | 优点 | 缺点 | 典型应用场景 |
|---|---|---|---|
| Sigmoid | 输出平滑,可表概率 | 梯度消失,非零中心,计算慢 | 二分类输出层 |
| Tanh | 零中心,收敛快于Sigmoid | 梯度消失 | RNN的隐藏层 |
| ReLU | 计算高效,缓解梯度消失 | Dying ReLU,非零中心 | CNN/深度前馈网络的隐藏层(默认首选) |
| Leaky ReLU/PReLU | 解决Dying ReLU问题 | 需调参/PReLU增加参数 | ReLU的替代方案,效果可能更好 |
| ELU | 近似零中心,收敛快 | 计算慢 | 对精度和稳定性要求高的网络 |
| GELU | 随机正则化思想,平滑 | 计算复杂 | Transformer/BERT/GPT等NLP模型 |
| Softmax | 输出概率分布 | 仅用于输出层 | 多分类输出层 |
实践建议:
- 入门与默认:对于大多数情况,从ReLU开始,它是很好的基准选择。
- 遇到问题:如果怀疑网络中存在大量“死亡神经元”(例如,很多层的输出为0),可以尝试Leaky ReLU或ELU。
- 特定架构:
- CNN/普通深度网络:隐藏层用 ReLU 或其变体。
- RNN:隐藏层常用 Tanh 或 Sigmoid。
- Transformer:隐藏层(特别是FFN)使用 GELU。
- 输出层:
- 二分类:Sigmoid。
- 多分类:Softmax。
- 回归:通常不使用激活函数(线性输出)。