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

PyTorch梯度函数理解求助:w.grad与x.grad结果解析

理解PyTorch中元素-wise运算的梯度计算

嘿,我来帮你理清这个梯度结果的由来,核心是要搞清楚元素-wise乘法的偏导数计算,以及PyTorch中backward()方法的作用逻辑。

首先先明确你的代码里的计算逻辑:

import numpy as np
import torch

w = np.array([[2., 2.],[2., 2.]])
x = np.array([[3., 3.],[3., 3.]])
b = np.array([[4., 4.],[4., 4.]])
w = torch.tensor(w, requires_grad=True)
x = torch.tensor(x, requires_grad=True)
b = torch.tensor(b, requires_grad=True)
y = w*x + b  # 这里是**元素-wise乘法**,不是矩阵乘法

为什么梯度结果是这样的?

PyTorch的梯度计算基于链式法则,当你调用y.backward(torch.FloatTensor([[1,1],[1,1]]))时,传入的全1张量表示每个y元素对最终损失的导数是1,所以最终参数的梯度就等于y对该参数的偏导数 × 1,也就是直接等于y对参数的偏导数本身。

我们逐个拆解分析:

  • w的梯度:对于每个位置(i,j),y[i][j] = w[i][j] × x[i][j] + b[i][j],所以y对w[i][j]的偏导数是∂y[i][j]/∂w[i][j] = x[i][j]。因此w.grad的每个位置就是对应x的取值,也就是[[3.,3.],[3.,3.]],和代码输出一致。
  • x的梯度:同理,y对x[i][j]的偏导数是∂y[i][j]/∂x[i][j] = w[i][j],所以x.grad的每个位置就是对应w的取值,也就是[[2.,2.],[2.,2.]],和代码输出一致。
  • b的梯度:y对b[i][j]的偏导数是∂y[i][j]/∂b[i][j] = 1,乘以传入的全1张量后,结果就是全1张量,符合你的预期。

你的误区在哪里?

你之前误以为w.grad和x.grad是b的值,这应该是把元素-wise乘法和矩阵乘法搞混了。如果是矩阵乘法(比如y = w @ x + b),梯度计算逻辑会完全不同,但这里的*是逐元素相乘,每个位置的y只和对应位置的w、x、b有关,所以偏导数只和对应位置的另一个参数有关。

内容的提问来源于stack exchange,提问作者user3656142

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:37:43