激活函数 (Activation Functions)

神经网络里的"决策开关"——
五个经典激活函数,到底有什么区别?怎么选?

1 什么是激活函数?

神经网络里的每个神经元都在做同一件事:把输入信号加权求和后,通过一个"决策函数"输出一个结果。这个决策函数就叫激活函数

x₁ · w₁
x₂ · w₂
x₃ · w₃
激活函数
输出
直觉理解:就像员工收到一堆信息后要做决策——"激活 / 不激活?激活多少?" 激活函数决定了这个转换规则。选择不同的激活函数,网络的表现会有天壤之别。
💡 为什么非要有激活函数? 如果没有它(或只用线性函数),无论神经网络堆多少层,效果都等同于一层——因为线性函数的叠加还是线性函数。激活函数的非线性是神经网络强大的根源。

2 一图看懂五兄弟

下面是 4 个最常用的激活函数画在同一个坐标系上(Softmax 因为涉及多输入,单独讲)。拖动滑块看它们在不同 x 上的输出:

x = 1.0
观察:x = 0 附近是每个函数差异最明显的区域。x 越大/越小,大家的行为越接近(要么"饱和"在某个值,要么线性增长)。梯度消失就是在"饱和区"发生的——斜率接近 0,反向传播时几乎学不到东西。

3 阶跃函数 (Step):最原始的开关

f(x) = 1  if  x ≥ 0   else  0
🎯 生活比喻:像门禁系统——刷卡成功就"开"(1),失败就"关"(0),没有中间状态

✅ 优点

  • 概念最简单,最符合"神经元要么激活要么不激活"的生物直觉
  • 计算极快,纯逻辑判断

❌ 缺点

  • 不可微分:x=0 处不连续,梯度处处为 0 或不存在
  • 无法用梯度下降训练——这是致命缺点
  • 输出只有 0/1,无法表达"激活的程度"

📌 用途

1943 年 McCulloch-Pitts 神经元的激活函数,1958 年感知机(Perceptron) 用它。现代深度学习基本不用,但理解它是理解神经网络起源的关键。

x = 0.5 1

4 Sigmoid:平滑的"概率"

σ(x) = 1 / (1 + e⁻ˣ)
🎯 生活比喻:像调光灯——输入越大,灯越亮(接近 1);输入越小,灯越暗(接近 0)。平滑过渡,可以表达任何"亮度"。

✅ 优点

  • 平滑可导,每一点都有定义良好的梯度
  • 输出范围 (0, 1),可以直接解读为概率
  • 严格单调递增,输出有界

❌ 缺点

  • 梯度消失:|x| 稍大时导数就接近 0,深层网络传不下去
  • 输出恒为正,不是零中心,梯度更新有偏
  • 涉及指数运算,计算比 ReLU 慢

📌 用途

经典神经网络的默认激活函数。现代深度学习在隐藏层已很少用,主要用在二分类问题的输出层(输出一个 0-1 概率)。

x = 0.0 0.500

5 Tanh:以 0 为中心的 S 曲线

tanh(x) = (eˣ - e⁻ˣ) / (eˣ + e⁻ˣ)
🎯 生活比喻:像温度调节旋钮——输入很大时输出 +1(热)、很小时输出 -1(冷)、中间为 0(不冷不热)。正负对称

✅ 优点

  • 零中心化:输出范围 (-1, 1),均值接近 0,训练更稳定
  • 梯度比 sigmoid 大(最大斜率 1,sigmoid 只有 0.25),学得更快
  • 同样平滑可导

❌ 缺点

  • 仍然有梯度消失问题(在 |x| 较大时饱和)
  • 同样涉及指数运算,计算较慢

📌 用途

在 ReLU 流行之前,tanh 是隐藏层的主流选择。现在仍常用于 RNN/LSTM 等循环网络的内部门控。

x = 0.0 0.000

6 ReLU:深度学习时代的主角

ReLU(x) = max(0, x)
🎯 生活比喻:像单向阀门——正数原样通过,负数全部截断为 0。"只接收正能量"

✅ 优点

  • 计算极快:一个比较运算,比指数运算快数倍
  • 正区间梯度恒为 1,不会梯度消失,深层网络也能训练
  • 产生稀疏激活(很多神经元输出 0),接近生物神经元特性
  • 在实践中收敛速度比 sigmoid/tanh 快很多

❌ 缺点

  • Dead ReLU 问题:如果某个神经元输入一直为负,梯度始终为 0,参数永远不更新("死了")
  • 不是零中心化
  • 输出无上界(通常不是问题)

📌 用途

现代 CNN、Transformer、MLP 隐藏层的默认选择。也有很多变体:Leaky ReLU、PReLU、ELU、GELU 等,解决 Dead ReLU 问题。

x = 1.0 1.000

7 Softmax:把一组数变成"概率分布"

Softmax 和前面 4 个不一样——它不是针对单个数的变换,而是针对一组数(向量)的变换。它把任意一组实数,归一化成一个概率分布(每个都在 0-1 之间,加起来等于 1)。

softmax(zᵢ) = eᶻⁱ / Σⱼ eᶻʲ
🎯 生活比喻:像"切蛋糕"——给你几个数字(比如每个类别的得分),Softmax 帮你算出每个类别占多大比例,所有比例加起来刚好是 100%。得分越高,分到的"蛋糕"越大;得分差距越大,"赢家"吃得越多(指数放大效应)。

✅ 优点

  • 输出是一个合法的概率分布,所有输出和为 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 常用
ReLU
现代隐藏层主力
快、不消失
Softmax
向量→概率分布
多分类输出层

选激活函数不是数学游戏——输出层看任务(二分类 sigmoid,多分类 softmax,回归不用),隐藏层看效率(默认 ReLU 及其变体)。