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

PyTorch nn.Sigmoid()梯度与手动计算结果不一致问题咨询

PyTorch Sigmoid梯度计算差异问题解答

PyTorch的Sigmoid梯度实现不存在公式错误,数值不匹配来自两个核心认知误区:

  • 你记忆里的σ(x)·(1−σ(x))是Sigmoid输出对自身输入x的局部梯度,而PyTorch自动微分返回的.grad是反向传播过程中,从损失端经过链式法则逐层乘积累计后的总梯度,不是单Sigmoid层的局部梯度。
  • 数值校验:用你给出的Sigmoid输出0.8762计算,局部梯度确实是0.8762*(1-0.8762)≈0.1084,和你手动算的结果一致。你拿到的-0.1238,是这个局部梯度乘以上游回传梯度后的结果,反推上游梯度值约为-1.142,完全符合链式法则计算逻辑。

手动对齐计算结果的注意事项:

  • 如果要单独验证Sigmoid层的局部梯度正确性,不要直接用完整LSTM训练流程的回传梯度对比,需要构造最简测试用例:仅保留单个Sigmoid层,设置损失为Sigmoid输出的和(此时上游梯度值全为1),此时回传到输入的梯度才会等于σ(x)·(1−σ(x))。
  • 用Excel手动推导LSTM反向传播时,必须逐层记录上游累计梯度,每一步都要完成「当前层局部梯度 × 上游累计梯度」的计算,再把结果传给下一层,不能把单层局部梯度直接当成最终回传梯度和代码输出比对,否则全流程的数值都会出现偏差。

问题对应的代码输出参考:

tensor([[0.8762]], grad_fn=<SigmoidBackward>)
tensor([-0.1238])
epoch:   0 loss: 0.13214068

内容的提问来源于stack exchange,提问作者M. AASYA ALDIN ISLAMY

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 20:18:15