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
相关产品推荐
相关产品推荐

