🔹 一、Sigmoid 函数的定义
Sigmoid 函数是一种 S 型曲线函数,定义如下:
σ(x)=11+e−x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+e−x1
其中:
- x∈(−∞,+∞)x \in (-\infty, +\infty)x∈(−∞,+∞):任意实数输入
- σ(x)∈(0,1)\sigma(x) \in (0, 1)σ(x)∈(0,1):输出被"压缩"到 0 和 1 之间
🔹 二、函数图像
图像特点:
- S 型曲线(形似"滑梯")
- 左侧趋近于 0,右侧趋近于 1
- 中心对称点:(0,0.5)(0, 0.5)(0,0.5)
- 单调递增
- 平滑连续
limx→−∞σ(x)=0limx→+∞σ(x)=1σ(0)=0.5 \lim_{x \to -\infty} \sigma(x) = 0 \\ \lim_{x \to +\infty} \sigma(x) = 1 \\ \sigma(0) = 0.5 x→−∞limσ(x)=0x→+∞limσ(x)=1σ(0)=0.5
🔹 三、导数与梯度
Sigmoid 函数的导数非常优美,便于反向传播:
σ′(x)=σ(x)⋅(1−σ(x)) \sigma'(x) = \sigma(x) \cdot (1 - \sigma(x)) σ′(x)=σ(x)⋅(1−σ(x))
特点:
- 只需要输出本身就能计算导数(简洁高效)
- 导数最大值为 14=0.25\frac{1}{4} = 0.2541=0.25(当 x=0x = 0x=0)
- 当 xxx 很大或很小时,导数接近 0 → 梯度消失问题
🔹 四、为什么使用 Sigmoid?
✅ 优点:
优点 | 说明 |
---|---|
非线性 | 允许神经网络拟合复杂的函数 |
可微 | 所有点处都有导数,适合梯度下降法 |
输出范围 (0,1) | 适合做概率解释(例如二分类) |
光滑 | 输出变化连续平滑,有利于优化 |
❌ 缺点:
缺点 | 原因与后果 |
---|---|
梯度消失 | 输入很大或很小时导数趋近于 0,导致神经网络前层无法有效训练 |
非零中心 | 输出总是正数,会导致偏置更新缓慢,训练不稳定 |
饱和问题 | 当输出接近0或1时,对输入的微小变化反应很小,神经元几乎"死掉" |
计算慢 | 涉及指数函数 e−xe^{-x}e−x,相比于 ReLU 类函数更慢 |
🔹 五、在神经网络中的应用场景
场景 | 是否推荐使用 Sigmoid? |
---|---|
隐藏层 | ❌ 不推荐(容易梯度消失) |
输出层(二分类) | ✅ 强烈推荐(概率解释 + BCE Loss) |
多分类输出层 | ❌ 不推荐,推荐使用 Softmax |
早期网络结构 | ✅ 使用较多(如早期 MLP) |
🔹 六、数值实现注意(以 PyTorch 为例)
PyTorch 中常用组合:
python
import torch
import torch.nn as nn
# 单独使用 sigmoid
sigmoid = nn.Sigmoid()
out = sigmoid(x)
# 配合 BCE Loss,推荐使用 BCEWithLogitsLoss(数值更稳定)
loss_fn = nn.BCEWithLogitsLoss()
⚠️ 如果你使用了 BCEWithLogitsLoss
,不要再手动加 Sigmoid,它内部已包含。
🔹 七、Sigmoid 与 Logistic 回归的关系
Sigmoid 函数源自统计学中的 Logistic Regression:
p(y=1∣x)=11+e−(wTx+b) p(y=1|x) = \frac{1}{1 + e^{-(w^T x + b)}} p(y=1∣x)=1+e−(wTx+b)1
神经网络中的二分类本质就是将前向传播部分看作线性变换,再通过 sigmoid 输出概率。
🔚 总结:Sigmoid 函数一览表
属性 | 值 |
---|---|
数学表达式 | 11+e−x\frac{1}{1 + e^{-x}}1+e−x1 |
输出范围 | (0,1)(0, 1)(0,1) |
是否可导 | ✅ 是 |
导数 | σ(x)(1−σ(x))\sigma(x)(1 - \sigma(x))σ(x)(1−σ(x)) |
最大梯度 | 0.25 |
是否零中心 | ❌ 否 |
是否饱和 | ✅ 是(两端) |
常用场景 | 二分类输出层 |
替代推荐 | 隐藏层用 ReLU / GELU / Swish 等更好 |