激活函数:条件路由
本节要解决什么问题
后端工程师对"路由"不陌生: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 则各自承担输出层和历史模型的职责。