26 神经网络中的激活函数(Activation Functions)
26 神经网络中的激活函数(Activation Functions)
在构建神经网络时,一个非常重要的设计选择是隐藏层和输出层应使用哪种激活函数。激活函数决定了神经元如何将加权输入 $z$ 转换为输出激活值 $a$。
1. 激活函数的作用
- 引入非线性,使神经网络能够拟合复杂函数。
- 若没有非线性激活函数,多层网络等价于单层线性模型,无法表达复杂模式。
2. 常见激活函数详解
(1) Sigmoid 函数(逻辑函数)
公式:
\[\sigma(z) = \frac{1}{1 + e^{-z}}\]- 输出范围:$(0, 1)$
用途:
- 传统上用于二分类问题的输出层(因为输出可解释为概率)。
缺点:
梯度消失问题:当 $ z $ 很大时,导数趋近于 0,导致反向传播时梯度极小,训练缓慢。 - 输出均值偏向 0.5,不利于后续层的学习(数据未“中心化”)。
- 结论:几乎从不在隐藏层使用,仅在二分类输出层保留。
(2) Tanh 函数(双曲正切)
公式:
\[\tanh(z) = \frac{e^z - e^{-z}}{e^z + e^{-z}}\]- 输出范围:$(-1, 1)$
特点:
- 是 sigmoid 的缩放和平移版本:$\tanh(z) = 2\sigma(2z) - 1$
- 输出以 0 为中心(均值接近 0),更利于下一层学习。
优点:
- 在隐藏层中通常优于 sigmoid。
缺点:
同样存在梯度消失问题(当 $ z $ 很大时导数趋近 0)。
- 使用建议:可用于隐藏层,但已被 ReLU 大幅取代。
(3) ReLU(Rectified Linear Unit,修正线性单元)
公式:
\[\text{ReLU}(z) = \max(0, z)\]- 图像:当 $z > 0$ 时,输出为 $z$;当 $z \leq 0$ 时,输出为 0。
导数:
\[\frac{d}{dz}\text{ReLU}(z) = \begin{cases} 1, & z > 0 \\ 0, & z < 0 \\ \text{未定义(实践中可设为 0 或 1)}, & z = 0 \end{cases}\]优点:
- 计算简单,导数在正区间恒为 1,缓解梯度消失。
- 实践中训练速度显著快于 sigmoid/tanh。
缺点:
- “Dead ReLU” 问题:若某些神经元始终接收负输入,则梯度恒为 0,不再更新(“死亡”)。
- 使用建议:默认首选隐藏层激活函数。
(4) Leaky ReLU(带泄漏的 ReLU)
公式:
\[\text{Leaky ReLU}(z) = \max(0.01z, z)\](也可写作:$a = \begin{cases} z, & z > 0 \ 0.01z, & z \leq 0 \end{cases}$)
特点:
- 对负值赋予一个小斜率(如 0.01),避免神经元“死亡”。
优点:
- 理论上比标准 ReLU 更鲁棒。
缺点:
- 实际提升有限,使用不如 ReLU 广泛。
变体:可将 0.01 设为可学习参数(Parametric ReLU, PReLU),但工业界较少采用。
3. 不同层的激活函数选择策略
| 层类型 | 推荐激活函数 | 原因说明 |
|---|---|---|
| 隐藏层 | ReLU(首选) ,其次 Tanh 或 Leaky ReLU | ReLU 训练快、效果好 |
| 输出层 | 取决于任务类型: | |
| - 二分类 | Sigmoid | 输出 ∈ (0,1),可解释为概率 |
| - 多分类 | Softmax(本节未详述) | 输出为概率分布 |
| - 回归 | 无激活 / 线性 | 输出需覆盖全体实数 |
✅ 注意:不同层可使用不同激活函数,记作:
- 隐藏层:$g^{[1]}(z^{[1]})$
- 输出层:$g^{[2]}(z^{[2]})$
4. 激活函数选择的实用建议
默认选择:
- 隐藏层 → ReLU
- 二分类输出 → Sigmoid
调参策略:
- 如果不确定哪种更好,在验证集上实验多种激活函数(ReLU、Leaky ReLU、Tanh)。
- 深度学习中很多超参数(包括激活函数)依赖具体任务,需通过实验确定。
避免使用 Sigmoid 于隐藏层:
- Tanh 和 ReLU 在几乎所有情况下都更优。
5. 为什么必须使用非线性激活函数?
(预告内容)
\[y = W^{[L]}(W^{[L-1]}(\cdots(W^{[1]}x + b^{[1]})\cdots) + b^{[L]}) = W_{\text{eff}}x + b_{\text{eff}}\]
如果所有层都使用线性激活(即 $a = z$),则无论多少层,整个网络仍等价于一个线性模型:无法解决非线性问题(如 XOR)。因此,非线性激活函数是深度学习表达能力的核心。
✅ 总结表格:激活函数对比
| 激活函数 | 公式 | 输出范围 | 是否可导 | 梯度消失 | 推荐使用场景 |
|---|---|---|---|---|---|
| Sigmoid | $\displaystyle \frac{1}{1+e^{-z}}$ | (0, 1) | 是 | 严重 | 二分类输出层 |
| Tanh | $\displaystyle \frac{e^z - e^{-z}}{e^z + e^{-z}}$ | (-1, 1) | 是 | 严重 | 隐藏层(次选) |
| ReLU | $\max(0, z)$ | $[0, \infty)$ | 分段可导 | 轻微(仅负区) | 隐藏层(首选) |
| Leaky ReLU | $\max(0.01z, z)$ | $(-\infty, \infty)$ | 是 | 极轻微 | 隐藏层(可尝试) |
希望这份总结能帮助你系统掌握激活函数的核心知识!如果你正在搭建神经网络,记住:
“不确定时,先用 ReLU;做二分类,输出用 Sigmoid。”
并在实际项目中通过验证集不断优化选择。祝你学习顺利!
本文由作者按照 CC BY 4.0 进行授权