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. 激活函数选择的实用建议

  1. 默认选择

    • 隐藏层 → ReLU
    • 二分类输出 → Sigmoid
  2. 调参策略

    • 如果不确定哪种更好,在验证集上实验多种激活函数(ReLU、Leaky ReLU、Tanh)。
    • 深度学习中很多超参数(包括激活函数)依赖具体任务,需通过实验确定。
  3. 避免使用 Sigmoid 于隐藏层

    • Tanh 和 ReLU 在几乎所有情况下都更优。

5. 为什么必须使用非线性激活函数?

(预告内容)
如果所有层都使用线性激活(即 $a = z$),则无论多少层,整个网络仍等价于一个线性模型:

$$
y = W^{[L]}(W^{[L-1]}(\cdots(W^{[1]}x + b^{[1]})\cdots) + b^{[L]}) = W_{\text{eff}}x + b_{\text{eff}}
$$

无法解决非线性问题(如 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。”

  并在实际项目中通过验证集不断优化选择。祝你学习顺利!