Python代码:
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
import platform
system = platform.system()
if system == "Windows":
matplotlib.rcParams['font.family'] = 'Microsoft YaHei'
elif system == "Darwin":
matplotlib.rcParams['font.family'] = 'Arial Unicode MS'
else:
matplotlib.rcParams['font.family'] = 'SimHei'
matplotlib.rcParams['axes.unicode_minus'] = False
# 定义不同 β 值下的 sigmoid 函数
def sigmoid_beta(x, beta):
return 1 / (1 + np.exp(-beta * x))
def sigmoid_derivative(x, beta):
s = sigmoid_beta(x, beta)
return beta * s * (1 - s)
# 设置 β 值列表
betas = [0.5, 1, 5, 10, 50]
x = np.linspace(-6, 6, 500)
# 作图:Sigmoid 曲线
plt.figure(figsize=(10, 6))
for beta in betas:
y = sigmoid_beta(x, beta)
plt.plot(x, y, label=f"β = {beta}")
plt.title("不同 β 值下的 Sigmoid 函数")
plt.xlabel("x")
plt.ylabel("sigmoid(x)")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
# 作图:Sigmoid 导数曲线
plt.figure(figsize=(10, 6))
for beta in betas:
dy = sigmoid_derivative(x, beta)
plt.plot(x, dy, label=f"β = {beta}")
plt.title("不同 β 值下的 Sigmoid 函数导数")
plt.xlabel("x")
plt.ylabel("sigmoid'(x)")
plt.legend()
plt.grid(True)
plt.tight_layout()
plt.show()
效果:


上面是两个图,展示了不同 β 值下的 sigmoid 函数及其导数:
📈 图一:Sigmoid 函数随 β 的变化
- 当 β 越大,sigmoid 趋近于阶跃函数;
- β = 50 时,函数几乎只在 x=0 附近发生剧烈跳跃,其它区域几乎为 0 或 1;
- 这就造成了多数输入下的输出“扁平”或“饱和”,无法有效区分样本。
📉 图二:Sigmoid 导数随 β 的变化
- β 越大,导数峰值越高,但只集中在 x=0 附近一小段范围内;
- 其余区域导数几乎为 0 → 反向传播无梯度 → 训练停滞;
- 所以虽然理论上“变陡更像阶跃”,但实际上变得“不可学习”。
🔧 小结:
β 值 | Sigmoid 形状 | 导数行为 | 实际后果 |
---|---|---|---|
小(如 0.5) | 非线性弱、近似线性 | 导数小但平滑 | 可学习,但表达力不足 |
中(如 1) | 适中 | 导数适中、分布广 | 常用于输出层概率 |
大(如 10, 50) | 近似阶跃 | 仅在 x=0 附近有梯度 | 梯度消失,训练瘫痪 |