激活函数 (Activation Functions)
神经网络里的"决策开关"——
五个经典激活函数,到底有什么区别?怎么选?
1 什么是激活函数?
神经网络里的每个神经元都在做同一件事:把输入信号加权求和后,通过一个"决策函数"输出一个结果。这个决策函数就叫激活函数。
x₁ · w₁
x₂ · w₂
x₃ · w₃
→
激活函数
→
输出
直觉理解:就像员工收到一堆信息后要做决策——"激活 / 不激活?激活多少?" 激活函数决定了这个转换规则。选择不同的激活函数,网络的表现会有天壤之别。
💡 为什么非要有激活函数? 如果没有它(或只用线性函数),无论神经网络堆多少层,效果都等同于一层——因为线性函数的叠加还是线性函数。激活函数的非线性是神经网络强大的根源。
2 一图看懂五兄弟
下面是 4 个最常用的激活函数画在同一个坐标系上(Softmax 因为涉及多输入,单独讲)。拖动滑块看它们在不同 x 上的输出:
观察:x = 0 附近是每个函数差异最明显的区域。x 越大/越小,大家的行为越接近(要么"饱和"在某个值,要么线性增长)。梯度消失就是在"饱和区"发生的——斜率接近 0,反向传播时几乎学不到东西。
3 阶跃函数 (Step):最原始的开关
f(x) = 1 if x ≥ 0 else 0
✅ 优点
- 概念最简单,最符合"神经元要么激活要么不激活"的生物直觉
- 计算极快,纯逻辑判断
❌ 缺点
- 不可微分:x=0 处不连续,梯度处处为 0 或不存在
- 无法用梯度下降训练——这是致命缺点
- 输出只有 0/1,无法表达"激活的程度"
📌 用途
1943 年 McCulloch-Pitts 神经元的激活函数,1958 年感知机(Perceptron) 用它。现代深度学习基本不用,但理解它是理解神经网络起源的关键。
4 Sigmoid:平滑的"概率"
σ(x) = 1 / (1 + e⁻ˣ)
✅ 优点
- 平滑可导,每一点都有定义良好的梯度
- 输出范围 (0, 1),可以直接解读为概率
- 严格单调递增,输出有界
❌ 缺点
- 梯度消失:|x| 稍大时导数就接近 0,深层网络传不下去
- 输出恒为正,不是零中心,梯度更新有偏
- 涉及指数运算,计算比 ReLU 慢
📌 用途
经典神经网络的默认激活函数。现代深度学习在隐藏层已很少用,主要用在二分类问题的输出层(输出一个 0-1 概率)。
5 Tanh:以 0 为中心的 S 曲线
tanh(x) = (eˣ - e⁻ˣ) / (eˣ + e⁻ˣ)
✅ 优点
- 零中心化:输出范围 (-1, 1),均值接近 0,训练更稳定
- 梯度比 sigmoid 大(最大斜率 1,sigmoid 只有 0.25),学得更快
- 同样平滑可导
❌ 缺点
- 仍然有梯度消失问题(在 |x| 较大时饱和)
- 同样涉及指数运算,计算较慢
📌 用途
在 ReLU 流行之前,tanh 是隐藏层的主流选择。现在仍常用于 RNN/LSTM 等循环网络的内部门控。
6 ReLU:深度学习时代的主角
ReLU(x) = max(0, x)
✅ 优点
- 计算极快:一个比较运算,比指数运算快数倍
- 正区间梯度恒为 1,不会梯度消失,深层网络也能训练
- 产生稀疏激活(很多神经元输出 0),接近生物神经元特性
- 在实践中收敛速度比 sigmoid/tanh 快很多
❌ 缺点
- Dead ReLU 问题:如果某个神经元输入一直为负,梯度始终为 0,参数永远不更新("死了")
- 不是零中心化
- 输出无上界(通常不是问题)
📌 用途
现代 CNN、Transformer、MLP 隐藏层的默认选择。也有很多变体:Leaky ReLU、PReLU、ELU、GELU 等,解决 Dead ReLU 问题。
7 Softmax:把一组数变成"概率分布"
Softmax 和前面 4 个不一样——它不是针对单个数的变换,而是针对一组数(向量)的变换。它把任意一组实数,归一化成一个概率分布(每个都在 0-1 之间,加起来等于 1)。
softmax(zᵢ) = eᶻⁱ / Σⱼ eᶻʲ
✅ 优点
- 输出是一个合法的概率分布,所有输出和为 1
- 可导,配合交叉熵损失函数训练效果极佳
- 指数放大效应,让"高分选项"更突出
❌ 缺点
- 只适合多分类输出层,不适合放在隐藏层
- 当某个 zᵢ 很大时,eᶻⁱ 会数值溢出(工程上通过减去 max(z) 解决)
📌 用途
多分类问题的输出层。比如手写数字识别(10 类)、图像分类(1000 类)、语言模型预测下一个词(词表中上万个词)等。
🎮 试试看:调整三个得分
z₁ =
3.0
z₂ =
1.0
z₃ =
0.0
三项之和 = 1.000
8 五兄弟性质对比
| 性质 | 阶跃 | Sigmoid | Tanh | ReLU | Softmax |
|---|---|---|---|---|---|
| 输出范围 | {0, 1} | (0, 1) | (-1, 1) | [0, +∞) | (0, 1), 和=1 |
| 可导? | 否 | 是 | 是 | 是* | 是 |
| 零中心化? | 否 | 否 | 是 | 否 | 否 |
| 梯度消失? | 完全消失 | 严重 | 中等 | 不消失 | 有 |
| 计算速度 | 极快 | 慢 | 慢 | 极快 | 慢 |
| 输入类型 | 单值 | 单值 | 单值 | 单值 | 向量 |
| 典型用途 | 感知机(历史) | 二分类输出 | RNN 隐藏层 | 现代隐藏层 | 多分类输出 |
* ReLU 在 x=0 处严格来说不可导,但实践中约定梯度取 0 或 1 即可。
9 实战选用指南
面对具体的任务,应该选哪个激活函数?下面是经验法则:
🏗️ 搭建普通网络的
隐藏层
隐藏层
ReLU
默认首选。训练快、梯度不消失。如果遇到 Dead ReLU 问题,换成 Leaky ReLU / GELU。
🎯 二分类问题的
输出层
输出层
Sigmoid
输出 0-1 之间的概率,配合二元交叉熵损失使用。例如:是/否垃圾邮件。
🎨 多分类问题的
输出层
输出层
Softmax
把得分变成概率分布,每类概率加起来=1。例如:手写数字 0-9。
🔄 RNN / LSTM
的门控单元
的门控单元
Tanh
输出零中心化,有界,适合长序列的状态传递。常和 sigmoid 配合使用。
📚 理论学习 /
研究神经网络起源
研究神经网络起源
阶跃
理解感知机、生物神经元的起点。实际训练不用,但必须知道。
🔬 回归问题的
输出层
输出层
不用激活函数
回归任务(如预测房价) 输出是连续实数,直接线性输出即可,不需要激活函数。
🎓 一句话总结
阶跃
最原始的 0/1 开关
现在基本不用
现在基本不用
Sigmoid
平滑的"概率"
二分类输出层
二分类输出层
Tanh
零中心版 sigmoid
RNN 常用
RNN 常用
ReLU
现代隐藏层主力
快、不消失
快、不消失
Softmax
向量→概率分布
多分类输出层
多分类输出层
选激活函数不是数学游戏——输出层看任务(二分类 sigmoid,多分类 softmax,回归不用),隐藏层看效率(默认 ReLU 及其变体)。