You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

多隐藏层神经网络反向传播公式正确性咨询(Sigmoid+Softmax)

多层Sigmoid+Softmax网络反向传播验证与收敛问题分析

首先明确结论:你的反向传播公式从数学推导角度来看是正确的,但多隐藏层模型无法收敛的问题,根源在于多层Sigmoid网络的固有缺陷——梯度消失,而非反向传播的公式错误。下面逐部分验证你的反向传播实现,并给出收敛问题的解决方案:

1. 输出层(Softmax+对数损失)反向传播验证

对于Softmax输出层配合对数损失,输出层的dZ_L推导结果就是Y_hat - Y,你的代码实现:

grads['dZ' + str(L)] = forward_calculated["A" + str(L)] - Y

这一步完全正确。

后续输出层的权重和偏置梯度计算:

grads['dW' + str(L)] = (1./m) * np.dot(grads['dZ' + str(L)], forward_calculated["A" + str(L-1)].T)
grads['db' + str(L)] = (1./m) * np.sum(grads['dZ' + str(L)], axis=1, keepdims=True)

也符合线性层的梯度公式,没有问题。

2. 隐藏层(Sigmoid)反向传播验证

Sigmoid激活函数的导数公式为σ'(z) = σ(z)*(1-σ(z)),对应你代码中的:

grads['dZ' + str(l)] = grads['dA' + str(l)] * sigmoid(forward_calculated["Z" + str(l)]) * (1 - sigmoid(forward_calculated["Z" + str(l)]))

这部分公式是正确的,不过可以优化效率:因为前向传播中已经存储了A_l = sigmoid(Z_l),所以可以直接用已有的A_l代替重复计算的sigmoid(Z_l),修改为:

grads['dZ' + str(l)] = grads['dA' + str(l)] * forward_calculated["A" + str(l)] * (1 - forward_calculated["A" + str(l)])

而隐藏层的dA_l计算:

grads['dA' + str(l)] = np.dot(parameters["W" + str(l+1)].T, grads['dZ' + str(l+1)])

以及隐藏层的dW_l、db_l计算,都完全符合反向传播的推导公式,没有错误。

3. 多隐藏层不收敛的核心原因:梯度消失

你的反向传播实现没问题,但多层Sigmoid网络极易出现梯度消失问题:

  • Sigmoid函数的导数在输入绝对值较大时会趋近于0,当网络层数增加,梯度从输出层往输入层传播时,会被反复乘以接近0的导数,导致靠近输入层的权重几乎无法得到更新。
  • 底层权重无法更新时,模型的特征提取能力完全失效,最终只能输出偏向某一类的结果,也就是你遇到的“所有样本预测为同一类别”的情况。

针对性解决建议

  • 替换激活函数:把Sigmoid换成ReLU(或Leaky ReLU、GELU等变体),这类激活函数的导数在正区间为1,能有效避免梯度消失问题,是当前深度学习中隐藏层的主流选择。
  • 优化参数初始化:如果你的initialize_parameters_deep是简单的小随机数初始化,建议改用Xavier初始化(针对Sigmoid/Tanh)或He初始化(针对ReLU),让每层的初始激活值方差保持稳定,避免一开始就进入Sigmoid的饱和区。
  • 调整优化策略:改用自适应学习率优化器(如Adam、RMSprop)代替普通梯度下降,这类优化器能自动调整学习率,更适合多层网络的训练;也可以适当调大学习率(注意避免过大导致震荡)。
  • 检查数据预处理:确保输入数据已经完成标准化/归一化(比如将特征缩放到0-1或均值为0、方差为1的范围),特征尺度差异过大会加剧多层网络的梯度更新不稳定。

内容的提问来源于stack exchange,提问作者Preetom Saha Arko

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:58:09