Sigmoid 函数
神经网络激活函数之一,3Blue1Brown 课程中用于解释神经元工作原理。
数学定义
$$ \sigma(x) = \frac{1}{1 + e^{-x}} $$
其中 e ≈ 2.718(自然常数)。
一句话理解
把任意实数「挤压」到 0 到 1 之间。
为什么是 e 而不是别的底数?
你可能想过:用 2^(-x) 或 10^(-x) 不也能把数压到 0~1 吗?为什么一定是 e?
数学起源:logistic regression 的推导
sigmoid 函数不是为神经网络发明的,它来自统计学中的 逻辑斯蒂回归(Logistic Regression)。
出发点是把「几率(odds)」取对数,建立线性关系:
P P
odds = ───── ln(odds) = ln(───────) = w₁x₁ + w₂x₂ + ... + b
1-P 1-P注意左边取的是 ln(自然对数,底数为 e),不是 log₁₀ 或 log₂。把上式反解出 P:
P
─────── = e^(w₁x₁ + ... + b)
1 - P
e^(w₁x₁+...+b) 1
→ P = ───────────────── = ──────────────────
1 + e^(w₁x₁+...+b) 1 + e^-(w₁x₁+...+b)e 是被推导出来的,不是被选出来的。
工程理由:导数形式最简洁
对比不同底数:
| 函数 | 导数 |
|---|---|
| 1/(1+e⁻ˣ) | σ(x)·(1-σ(x)) ← 一步乘法,完事 |
| 1/(1+2⁻ˣ) | σ(x)·(1-σ(x))·ln(2) |
| 1/(1+10⁻ˣ) | σ(x)·(1-σ(x))·ln(10) |
sigmoid 的导数值可以直接用函数值自身表示——正向传播时 σ(x) 已经算出来了,反向传播直接拿来乘,不需要重新算指数。
深层网络每层都要算导数,多了些常数因子虽然不影响结果正确性,但 e 的版本在计算上和数学表达上都最干净。
一句话
不是刻意选了 e,而是从 ln 的自然推导中,e 是那个「恰好」让函数和它的导数长得最像的底数。
输入 → 输出映射
| 输入 x | 输出 σ(x) |
|---|---|
| x → +∞ | 趋近于 1 |
| x = 0 | 0.5 |
| x → -∞ | 趋近于 0 |
形状是一条 S 形曲线,中间陡峭、两端逐渐平缓(饱和)。
在神经网络中的作用
一个神经元的前向传播:
加权和 = w₁x₁ + w₂x₂ + ... + b ← 任意实数,可能是 -1000 或 +500
输出 = σ(加权和) ← 压缩到 (0, 1)sigmoid 把无界的加权和映射为一个 (0,1) 之间的值,可以被解释为:
- 该神经元的「激活程度」
- 一个类似于「概率」的输出(接近 1 = 强激活,接近 0 = 抑制)
为什么 3Blue1Brown 用它来讲
- 曲线光滑连续,数学性质良好
- S 形符合人对「开关/激活」的直觉
- 导数有漂亮的形式:σ'(x) = σ(x) · (1 - σ(x)),方便手算反向传播
- 是理解神经网络逻辑的最佳入口
为什么现代深度学习不用了
两个致命缺陷:
1. 梯度消失(Vanishing Gradient)
两端饱和区导数趋近于 0:
x → +∞:σ'(x) ≈ 0
x → -∞:σ'(x) ≈ 0深层网络中,反向传播时梯度连乘,经过多层 sigmoid 后梯度指数级衰减 → 前面的层几乎学不到东西。
2. 非零中心(Not Zero-Centered)
sigmoid 输出恒为正(0~1),下一层所有输入的符号相同,导致梯度更新时产生 zigzag 震荡,收敛变慢。
现代替代方案:ReLU
ReLU(x) = max(0, x)- 正区间导数恒为 1 → 不衰减 → 深层网络也能训练
- 计算极快(就是取最大值)
- 实际效果远超 sigmoid
但 sigmoid 仍然是理解激活函数概念的最好起点。