Sigmoid 函数是什么?把任意数压到 0 到 1 之间的 S 形曲线
Sigmoid 函数,也叫逻辑函数或对数几率函数,是一种把任意实数平滑地“压缩”到 0 到 1 之间的函数。它的计算公式是:1 除以(1 加上 e 的负 x 次方)。它的图像是一条平滑的 S 形曲线,“Sigmoid”这个名字的意思就是“S 形的”。它是机器学习中最经典、最常用的函数之一。
它的形状和性质
当输入为零时,Sigmoid 函数的输出恰好是 0.5;当输入是很大的正数时,输出越来越接近 1,但永远不会达到 1;当输入是很小的负数时,输出越来越接近 0,但永远不会达到 0。在零附近,曲线比较陡峭,输出随输入变化较快;离零越远,曲线越平坦。它是单调递增的、处处光滑可导的,而且关于点(0,0.5)中心对称。它有一个非常方便的导数性质:Sigmoid 函数的导数,等于它自身乘以“1 减去它自身”。这让它在神经网络的反向传播中计算起来非常简单。这个函数最早由比利时数学家皮埃尔·韦吕勒在 19 世纪 30 至 40 年代研究人口增长时提出,用来描述人口在资源有限的情况下先快速增长、后逐渐趋于饱和的过程,这就是“逻辑斯蒂增长模型”。
用途一:把分数变成概率
由于 Sigmoid 函数的输出在 0 到 1 之间,它非常适合把一个任意的分数转换为一个概率。逻辑回归就是这样做的:先把各个特征乘以权重再加起来,得到一个分数,再通过 Sigmoid 函数转换为样本属于正类的概率。逻辑回归的名字也来源于此。可以证明,Sigmoid 函数的输入正好是“对数几率”,也就是正类概率与反类概率之比的对数,这就是它也被称为“对数几率函数”的原因。在神经网络中,做二分类时,输出层通常也只有一个神经元,后面接一个 Sigmoid 函数输出概率,并使用二元交叉熵作为损失函数。在多标签分类中,每一个类别都可以独立地使用一个 Sigmoid 函数,判断样本是否属于这一类。周志华《机器学习》还指出,Sigmoid 函数可以看作单位阶跃函数的一种光滑、可导的“替代函数”。
用途二:作为“门”
在长短期记忆网络和门控循环单元中,Sigmoid 函数被用来实现各种“门”:它输出一个 0 到 1 之间的数,表示让多少信息通过,0 表示完全关闭,1 表示完全打开。比如遗忘门用它来决定细胞状态中的旧信息保留多少,输入门用它来决定新信息写入多少。在注意力机制的一些变体、SwiGLU 等门控激活函数以及很多需要“软开关”的地方,也都能看到 Sigmoid 函数的身影。
用途三:曾经的主流激活函数
在早期的神经网络中,Sigmoid 函数是最常用的激活函数之一,因为它平滑、可导,并且模仿了生物神经元“从静息到饱和”的特性。但它在深层网络的隐藏层中逐渐被淘汰了,主要有两个原因。梯度消失:当输入很大或很小时,Sigmoid 函数进入“饱和区”,曲线几乎是平的,导数接近于零;即使在最陡的零点处,导数也只有 0.25。在反向传播中,梯度要逐层地乘以每一层激活函数的导数,经过很多层之后,梯度会变得极其微小,靠近输入的层几乎无法得到训练。输出不以零为中心:Sigmoid 函数的输出总是正的,这会让后一层权重的梯度总是同号,导致梯度下降时走“之”字形的路线,收敛变慢。此外,它需要计算指数,速度也较慢。因此,在现代的深度神经网络中,隐藏层通常改用 ReLU、GELU 等激活函数,而 Sigmoid 函数主要保留在输出层和门控结构中。