P5-3.2 sigmoid¶
Section ID:
P5-3.2Version:v2026.07.20
在 P5-3.1 里,我们已经看到:激活函数(activation function)会把加权和分数 \(z\) 改写成传给下一层的值 \(a\)。现在开始按代表性函数逐个来看,确认为什么同样的分数,会变成完全不同类型的信号。
sigmoid 是一种把输入分数 \(z\) 压到 0 与 1 之间的激活函数。很大的负数会被压到接近 0,很大的正数会被压到接近 1,而在 0 附近,它的变化会相对更快。
如果后面又需要重新固定代表性激活函数的基线,可以回到英文概念词汇表里的 activation function 条目。
sigmoid 如何压缩数值的问题¶
- sigmoid 的公式与输出范围是什么?
- 为什么它会被读成一种介于 0 与 1 之间的值?
- 在什么样的场景里,sigmoid 具有比较直观的用途?
- 当把 sigmoid 读成“像概率一样的值”时,需要小心什么?
这一节不会长篇比较 sigmoid 与其他代表性函数的公式。tanh 会在 P5-3.3 单独处理,ReLU 会在 P5-3.4 单独处理,而三者的公式比较则会在 P5-3.5 里统一整理。至于 sigmoid 在输出层里应该怎样解释,会在 P5-3.6 与 P5-4.2 重新连接。
S 形曲线与饱和的判断标准¶
- 能把 sigmoid 解释成
把值压缩到 0 与 1 之间的函数。 - 能直觉地解释:为什么输入 \(z\) 越大,输出就越接近 1。
- 能解释饱和(saturation):在大正数与大负数区间里,变化为什么会变得迟钝。
- 能把 sigmoid 输出与实际运行策略阈值(threshold)区分开来。
sigmoid 的公式¶
sigmoid 通常写成下面这个公式。
这里的 \(e^{-z}\) 会随着输入 \(z\) 的符号与大小,让分母变大或变小。
- 如果 \(z\) 是很大的正数,\(e^{-z}\) 会接近 0,因此输出就会接近 1。
- 如果 \(z=0\),那么 \(e^0=1\),所以输出是 \(1/(1+1)=0.5\)。
- 如果 \(z\) 是很大的负数,\(e^{-z}\) 会非常大,因此输出就会接近 0。
也就是说,sigmoid 会把任何输入都压到 0 与 1 之间。
该怎样读这条曲线¶
sigmoid 的曲线是一个 S 形。这里重要的不是形状名字,而是它在不同区间里如何反应。
| 输入区间 | 输出直觉 | 读者首先该看的点 |
|---|---|---|
| 很大的负数 | 接近 0 | 它会被压成强烈偏向负侧的信号。 |
| 0 附近 | 接近 0.5 | 小的分数差别仍然能比较清楚地显出来。 |
| 很大的正数 | 接近 1 | 它已经强烈偏向正侧,但再继续变大时,变化会变得迟钝。 |
正因为有这个性质,sigmoid 常常出现在二元分类(binary classification)的输出里。因为它的值位于 0 到 1 之间,所以很容易被读成到底有多偏向正类一侧。
不过,sigmoid 的输出并不会自动保证它就是一个校准良好的概率(calibrated probability)。如果要把这个输出值真正用于运行决策,还必须一起看阈值、数据分布,以及评估标准。
案例与例子¶
假设某个设备报警模型,对某一帧形成了一个偏向立即停机的分数 \(z\)。运行策略规定:sigmoid 输出大于等于 0.7 时,就把它列入停机候选。
| 场景 | \(z\) | sigmoid 输出的直觉 | 按 0.7 阈值做判断 |
|---|---|---|---|
| 稳定恢复的场景 | \(-2\) | 它会被压到接近 0,因此停机侧信号会变得很弱。 | 不列入停机候选。 |
| 模糊边界的场景 | \(0\) | 它会停在 0.5 附近,不会明显偏向任何一侧。 | 还不会列入停机候选。 |
| 需要注意的场景 | \(1\) | 它会变成略高于 0.7 的值,开始偏向正侧。 | 会被列入停机候选。 |
| 强警报场景 | \(3\) | 它会逼近 1,因此停机侧信号看起来很强。 | 会被列入停机候选。 |
在这张表里首先必须看清的一点是:sigmoid 输出与运行判断不是同一个东西。比如 \(z=1\) 与 \(z=3\) 都已经偏向正侧,但一个是刚刚越过阈值的场景,另一个则是已经逼近 1 的场景。sigmoid 负责把分数变成 0 到 1 之间的信号,而 threshold 则是另一条标准:它决定从哪里开始把这个信号转成行动。
另外一个必须注意的点是饱和(saturation)。人很容易直觉地觉得:既然 z=3 比 z=1 大很多,那么输出差距也应该继续明显拉大。但 sigmoid 在高值区间会逼近 1,因此差异会被压缩。于是它偏向正侧这件事会变得很明确,但大正数之间的细微差别反而不再能强烈保留下来。
所以这个案例真正要确认的结果是:sigmoid 会把分数改写成一种介于 0 与 1 之间、比较容易解释的值;threshold 则会把这个值重新读成行动标准;而在很大正数和很大负数区间,变化又会重新变得迟钝。
练习与例题¶
现在假设下面这些分数会通过 sigmoid。运行策略仍然保持大于等于 0.7 就列为停机候选。
| \(z\) | 先猜会落在哪个输出范围 | 先要确认的问题 |
|---|---|---|
| \(-4\) | 非常接近 0 | 它会被多强地压向负侧? |
| \(0\) | 0.5 | 为什么它会成为边界的参考点? |
| \(1\) | 略高于 0.7 | 它是不是刚刚越过阈值? |
| \(4\) | 非常接近 1 | 它是不是已经进入饱和区? |
| \(8\) | 更接近 1 | 与 \(4\) 相比,还剩下多少差异? |
阅读这张表时,必须自己把下面两个问题真正闭合。
- \(z=1\) 是否同时展示了
它已经偏向正侧和它已经真正越过行动阈值? - 如果把 \(z=4\) 提高到 \(z=8\),输出虽然仍会继续增加,但为什么差距不会像 \(z=0\) 到 \(z=1\) 那样继续明显拉开?
答案方向是明确的。sigmoid 在 \(z=1\) 附近仍然变化得足够明显,因此直接会影响 threshold 判断;但像 \(z=4\) 与 \(z=8\) 这样的大正数区间,两者都已经很接近 1,所以差异会被强烈压缩。因此,在阅读 sigmoid 时,必须把下面三件事分开来看:输出到底偏向哪一侧、有没有越过阈值、是不是已经进入饱和区间。
检查清单¶
- 能否读懂 sigmoid 公式 \(\sigma(z)=1/(1+e^{-z})\)?
- 能否解释为什么当 \(z=0\) 时输出会变成 0.5?
- 能否说明大负数会靠近 0、大正数会靠近 1?
- 能否区分 sigmoid 输出与真正的运行阈值?
- 是否理解 sigmoid 会在 P5-3.5 的公式比较与 P5-3.6 的输出层解释里再次出现?
出处与参考资料¶
- Ian Goodfellow, Yoshua Bengio, Aaron Courville,
Deep Learning, MIT Press, 2016, 确认日期:2026-06-29. https://www.deeplearningbook.org/ - Christopher M. Bishop,
Pattern Recognition and Machine Learning, Springer, 2006, 确认日期: 2026-07-19. https://link.springer.com/book/9780387310732