15.2 激活函数¶
周末的游乐园入口有三种闸机:一种必须用力推到某个点才会打开,一种会随着力度慢慢打开,还有一种刚开始很顺,后来几乎开到头。小率站在闸机前突然明白:同样是“输入一个力度,输出一个开门程度”,不同闸机会给出不同的响应曲线。
这就是激活函数(Activation Function)的味道。它把神经元的线性分数 \(z\) 变成新的信号 \(a=g(z)\),让模型不再只是直线。
15.2.1 非线性让网络学到弯曲边界¶
如果网络只有线性层,那么无论堆多少层,本质仍是:
\[
\mathbf{W}_3(\mathbf{W}_2(\mathbf{W}_1\mathbf{x})) = \mathbf{W}\mathbf{x}
\]
激活函数把每层输出“掰弯”:
\[
\mathbf{h}^{(l)} = g(\mathbf{W}^{(l)}\mathbf{h}^{(l-1)}+\mathbf{b}^{(l)})
\]
这一步很小,却是深度学习的核心开关。没有它,网络只能画直线或平面;有了它,网络才能拼出弯曲边界和复杂模式。
15.2.2 常见激活函数像几种不同的闸门¶
| 激活函数 | 公式 | 直觉 | 常见位置 |
|---|---|---|---|
| Sigmoid | \(\sigma(x)=\frac{1}{1+e^{-x}}\) | 压到 0 到 1 | 二分类输出、早期网络 |
| Tanh | \(\tanh(x)\) | 压到 -1 到 1 | 早期 RNN |
| ReLU | \(\max(0,x)\) | 小于 0 关门,大于 0 放行 | CNN、MLP 隐藏层 |
| GELU | \(x\Phi(x)\) | 平滑版放行 | Transformer 常见 |
别让闸门一直卡住
Sigmoid 和 Tanh 在两端会变得很平,导数接近 0,深层网络里容易出现梯度消失。ReLU 简单高效,但若神经元长期输出 0,也可能变成“死 ReLU”。
15.2.3 画出几条响应曲线¶
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5, 5, 400)
sigmoid = 1 / (1 + np.exp(-x))
tanh = np.tanh(x)
relu = np.maximum(0, x)
plt.figure(figsize=(7, 4))
plt.plot(x, sigmoid, label="Sigmoid")
plt.plot(x, tanh, label="Tanh")
plt.plot(x, relu, label="ReLU")
plt.axhline(0, color="gray", linewidth=0.8)
plt.axvline(0, color="gray", linewidth=0.8)
plt.legend()
plt.title("Activation functions")
plt.show()
看图时不要只看函数值,还要看斜率。斜率就是梯度能不能顺利传回去的线索。
小率的笔记本
激活函数把线性打分变成非线性信号。ReLU 是最常用的基础选择;Sigmoid 更适合输出概率;Transformer 中常见 GELU。选择激活函数时,要同时关心表达能力和梯度传播。
