激活函数:条件路由

本节要解决什么问题

后端工程师对"路由"不陌生:API 网关根据请求特征决定放行还是拒绝,消息队列根据配置决定路由到哪个队列。路由的本质是根据输入决定是否触发某种行为

激活函数就是神经网络里的"条件路由":根据加权求和的结果,决定这个神经元是"放行"还是"屏蔽"。没有它,神经网络无论堆多少层,都只是一次线性变换——堆再多服务器,也只是把请求从一个负载均衡器转发到另一个,效果等于只有一台。

这个工具/机制是怎么工作的

为什么线性堆叠等于没用

把多层线性变换合在一起:

y = W_2(W_1x + b_1) + b_2 = (W_2 W_1)x + (W_2 b_1 + b_2) 这等价于只做一次线性变换。无论堆多少层,结果都一样。

用后端工程师的思维理解:如果你只是把多个没有业务逻辑的代理串联起来,整个系统和一个直接代理没有任何区别。

激活函数做了什么:打破封闭性

激活函数引入非线性,使得多层网络在数学上不再等价于单层网络。

以 ReLU 为例理解"路由"的本质:

ReLU(x) = max(0, x)

y
│        /
│       /
│      /
│_____/________ x
      0
  • 输入 ≤ 0:这个神经元被"屏蔽"(输出恒为 0),不对下游产生任何影响
  • 输入 > 0:这个神经元"放行",输出等于输入(恒等映射)

这就像一个开关:低于阈值的请求直接丢弃,高于阈值的请求原样通过。

三种主流激活函数:各司其职

1. ReLU — 隐藏层主力

ReLU(x) = max(0, x)

优点:
- 计算极简:max(0, x),比任何指数函数都快
- 正区间梯度恒为 1:深层网络梯度不会衰减
- 稀疏激活:部分神经元永久关闭,减少过拟合风险

代价:
- 负区间"神经元死亡"(Dead ReLU):一旦输出为 0,梯度也为 0,永不恢复

现代大模型的隐藏层几乎全部使用 ReLU 及其变体(GELU、SiLU)。

2. Sigmoid — 二分类输出层

σ(x) = 1 ÷ (1 + e^(−x))

y
1 |        _____
  |       /
  |      /
0 |_____/________ x
        0
  • 输出范围 (0, 1),天然对应概率
  • 两端饱和:梯度接近 0,深层网络几乎无法训练
  • 主要用于二分类的输出层(配合二分类交叉熵)

3. Tanh — 对称版本

tanh(x) = (e^x − e^(−x)) ÷ (e^x + e^(−x))

y
 1 |      _____
   |     /
 0 |____/_____
   |    \
-1 |     \____
            x
  • 输出范围 (-1, 1),零中心
  • 比 Sigmoid 梯度更广(最大梯度 1 vs 0.25)
  • 历史遗留:早期 RNN 和部分序列模型使用,如今多被 GELU 替代

从路由视角理解激活函数的选择

激活函数 路由策略 适用场景
ReLU 硬阈值路由(低于 0 就丢弃) 隐藏层,深层网络
Sigmoid 软概率路由(任何输入都有输出,但被压缩到 0~1) 二分类输出层
Tanh 软对称路由(-1 到 1 的软阈值) 历史 RNN / 需要零中心输出的场景

形式化

三种激活函数的数学定义和导数:

函数 定义 导数
ReLU max(0, x) 1 (x>0), 0 (x≤0)
Sigmoid 1/(1+exp(-x)) σ(x)(1-σ(x))
Tanh (exp(x)-exp(-x))/(exp(x)+exp(-x)) 1 - tanh²(x)

本节小结

激活函数是神经网络中引入非线性的关键机制,没有它,多层网络在数学上退化为单层网络。ReLU 通过"硬阈值路由"成为现代深度学习隐藏层的标准选择,Sigmoid 和 Tanh 则各自承担输出层和历史模型的职责。

延伸阅读

  • 感知机学习 — 激活函数如何与权重配合,通过梯度学习来自动调整这些"路由阈值"
  • 梯度消失与梯度爆炸 — Sigmoid 的两端饱和为何是梯度消失的元凶,ReLU 如何缓解这一问题

results matching ""

    No results matching ""