🌟 激活函数的作用
1. 引入非线性
- 核心作用:让神经网络能够学习复杂模式。若无激活函数,多层网络等价于单层线性变换。
- 类比:就像用不同颜色的滤镜叠加,让画面呈现丰富色彩。
2. 控制输出范围
- 将神经元输出限制在合理区间(如概率值在
0~1
之间)。 - 示例:Sigmoid 函数将任意输入映射到
(0,1)
。
3. 影响梯度传播
- 激活函数的导数决定了反向传播中梯度的大小,直接影响参数更新效率。
- 典型问题:梯度消失(如 Sigmoid 两端饱和区梯度趋近于 0)。
🔥 常见激活函数详解
1. Sigmoid(逻辑函数)
-
公式:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1 -
特点:
- 输出范围:
(0, 1)
,适合二分类输出层。 - 缺点:梯度消失严重,输出不以 0 为中心。
- 输出范围:
-
代码示例:
import torch.nn as nn activation = nn.Sigmoid()
-
示意图:
2. Tanh(双曲正切)
- 公式:
tanh ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+e−xex−e−x - 特点:
- 输出范围:
(-1, 1)
,以 0 为中心,缓解了 Sigmoid 的部分问题。 - 缺点:仍存在梯度消失,适合 RNN 等网络。
- 输出范围:
- 示意图:
3. ReLU(修正线性单元)
-
公式:
f ( x ) = max ( 0 , x ) f(x) = \max(0, x) f(x)=max(0,x) -
特点:
- 优点:计算高效,缓解梯度消失(正区间梯度为 1)。
- 缺点:负输入时梯度为 0(神经元死亡)。
-
代码示例:
from tensorflow.keras.layers import Activation layer = Activation('relu')
-
示意图:
4. Leaky ReLU(带泄露的 ReLU)
- 公式:
f ( x ) = { x x > 0 0.01 x 其他 f(x) = \begin{cases} x & x > 0 \\ 0.01x & \text{其他} \end{cases} f(x)={x0.01xx>0其他 - 特点:
- 解决神经元死亡问题,适合深层网络。
- 变体:Parametric ReLU(PReLU),可学习泄露系数。
- 示意图:
5. Softmax
- 公式:
Softmax ( x i ) = e x i ∑ j = 1 n e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j=1}^n e^{x_j}} Softmax(xi)=∑j=1nexjexi - 特点:
- 输出总和为 1 的概率分布,专用于多分类输出层。
- 常与交叉熵损失函数配合使用。
- 示意图:
🚀 激活函数对比与选择指南
激活函数 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
Sigmoid | 输出概率值 | 梯度消失严重 | 二分类输出层 |
Tanh | 输出以 0 为中心 | 梯度消失问题仍存在 | RNN 隐藏层 |
ReLU | 计算高效,缓解梯度消失 | 神经元死亡 | CNN 隐藏层(默认选择) |
Leaky ReLU | 解决神经元死亡 | 需调参(如泄露系数) | 深层网络、GAN |
Softmax | 生成概率分布 | 仅用于输出层 | 多分类任务 |
💡 使用技巧与注意事项
- 隐藏层首选 ReLU:计算快且效果稳定,需配合 He 初始化。
- 输出层按任务选择:
- 二分类:Sigmoid
- 多分类:Softmax
- 回归任务:无激活(或线性激活)
- 监控神经元活性:若使用 ReLU,检查死亡神经元比例。
- 尝试新型函数:Swish、GELU 在特定任务中表现更优(如 NLP 中的 GELU)。
🌈 一句话总结:
激活函数是神经网络的“灵魂开关”,选择合适函数可显著提升模型性能。新手优先从 ReLU 开始实验,逐步探索更复杂的变体!🚀