文章

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 ReLUReLU 训练快、效果好
输出层取决于任务类型: 
- 二分类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。”

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

本文由作者按照 CC BY 4.0 进行授权