跳转至

P5-3.2 sigmoid

Section ID: P5-3.2 Version: 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 通常写成下面这个公式。

\[ \sigma(z)=\frac{1}{1+e^{-z}} \]

这里的 \(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 形。这里重要的不是形状名字,而是它在不同区间里如何反应。

sigmoid 激活函数曲线

输入区间 输出直觉 读者首先该看的点
很大的负数 接近 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=3z=1 大很多,那么输出差距也应该继续明显拉大。但 sigmoid 在高值区间会逼近 1,因此差异会被压缩。于是它偏向正侧这件事会变得很明确,但大正数之间的细微差别反而不再能强烈保留下来。

所以这个案例真正要确认的结果是:sigmoid 会把分数改写成一种介于 0 与 1 之间、比较容易解释的值;threshold 则会把这个值重新读成行动标准;而在很大正数和很大负数区间,变化又会重新变得迟钝。

练习与例题

现在假设下面这些分数会通过 sigmoid。运行策略仍然保持大于等于 0.7 就列为停机候选。

\(z\) 先猜会落在哪个输出范围 先要确认的问题
\(-4\) 非常接近 0 它会被多强地压向负侧?
\(0\) 0.5 为什么它会成为边界的参考点?
\(1\) 略高于 0.7 它是不是刚刚越过阈值?
\(4\) 非常接近 1 它是不是已经进入饱和区?
\(8\) 更接近 1 \(4\) 相比,还剩下多少差异?

阅读这张表时,必须自己把下面两个问题真正闭合。

  1. \(z=1\) 是否同时展示了它已经偏向正侧它已经真正越过行动阈值
  2. 如果把 \(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 的输出层解释里再次出现?

出处与参考资料