• 2025年8月29日 星期五

3.8后向传播算法的应用

8 月 27, 2025

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 附近有梯度梯度消失,训练瘫痪
Avatar photo

李星海

简介: 2025-今 浙江农林大学 | 2022-今 广州白蓝碗蛋科技有限公司 | 2022-2024 广州商学院 | 2019-2022 广东工贸职业技术学院 | 服务宗旨:心始至客,行亦致远。