《Python 应用机器学习:代码实战指南》笔记30 深度学习核心 | 激活函数完全指南:Sigmoid、Tanh、ReLU 到现代变体
深度学习核心 | 激活函数完全指南:Sigmoid、Tanh、ReLU 到现代变体
当你第一次接触神经网络时,有没有这样一个困惑:
为什么神经网络必须使用“激活函数”?
它到底做了什么?又为什么存在那么多不同形式?
本文将系统讲清楚这些问题,并带你理解每一种常见激活函数的优缺点及适用场景。
一、激活函数到底是什么?
激活函数(Activation Function)是神经网络中每个神经元的非线性变换器。
它决定了一个神经元在接收到加权和之后究竟输出什么。
简单来说:
-
如果没有激活函数,所有层都是线性的运算,那么 无论多少层叠加,整个网络只不过是一个线性变换。
-
只有加入激活函数,网络才具备拟合复杂非线性关系的能力,是深度学习强大表达力的关键。
二、常见激活函数解析
下面我们从经典到现代、从简单到进阶,一一解释:
1. Sigmoid 函数 — “概率型开关”
公式:
f(x) = 1 / (1 + e⁻ˣ)
它能把任意实数压缩到 0 到 1 之间。
优点:
-
输出固定在 (0, 1) 之间,适合用作 输出概率。
-
可微分,对梯度下降友好。
缺点:
-
当输入值很大或很小时梯度接近 0,会导致 梯度消失。
-
输出不是以 0 为中心,可能减缓训练速度。
👉 因此在现代深度网络中,Sigmoid 更多用于输出层二分类场景,而不是隐藏层。
2. Tanh 函数 — “对称 S 形”
公式:
tanh(x) = (eˣ − e⁻ˣ) / (eˣ + e⁻ˣ)
输出范围是 –1 到 1,比 Sigmoid 有更好的中心对称性。
优点:
-
输出以 0 为中心,有助于梯度平衡传播。
-
相比 Sigmoid,训练更稳定一些。
缺点:
-
仍然会遭遇梯度消失问题,特别在深层网络中。
3. ReLU(修正线性单元) — 当前最常用
定义:
f(x) = max(0, x)
直观理解:
-
所有正数原样输出
-
所有负数输出 0
优点:
-
计算简单,收敛快
-
在隐藏层里能有效缓解梯度消失
缺点:
-
可能出现所谓的 “死神经元” 问题:某些神经元输出恒等于 0,无法参与学习。
4. Leaky ReLU / PReLU 等变体
为了修复 ReLU 的“死神经元”问题:
-
Leaky ReLU:在 x < 0 时,让它输出一个很小的负斜率值
-
PReLU:让这个负斜率变成可学习参数
这些变种能让网络学习到更丰富的特征,尤其在深层模型中更稳定。
5. Softmax — 多分类的概率输出
在最后一层常用:
它将一组实数转换为概率分布,所有输出加和为 1。
比 Sigmoid 更适合 多分类任务。
三、激活函数对模型训练有什么影响?
激活函数不仅决定输出范围,还影响着:
✔ 梯度传播效率
✔ 训练稳定性
✔ 收敛速度
✔ 最终性能表现
换句话说,每一次你选择激活函数,都是在为整个模型的学习轨迹下注。
四、简单选函数指南
如果你现在在做模型或项目,可以参考:
🚀 隐藏层默认首选 ReLU / Leaky ReLU — 既快又稳
🔢 二分类输出层用 Sigmoid — 输出概率
🎯 多分类输出层用 Softmax
⚡ 尝试更进阶的函数(如 Swish、GELU) 在特定任务可能有提升
五、结语:激活函数为什么那么重要?
很少有网络结构设计会像激活函数那样看似简单,却对最终效果影响巨大。
它看似是一个小函数,却决定了“非线性学习能力”的底层逻辑。
从 Sigmoid 到 ReLU,从简单到复杂,每一次进化都代表着对更高效率、更稳定训练的不断追求。
如果你想真正掌握深度学习,那么对激活函数的理解,不应停留在公式,而是要理解它在 数据流与梯度传播中的角色。
(本文内容基于Pyrcz, M.J., 2024, Applied Machine Learning in Python: A Hands-on Guide with Code [e-book]. Zenodo. doi:10.5281/zenodo.15169138章节整理) (https://geostatsguy.github.io/MachineLearningDemos_Book/)







