为什么PyTorch的autograd反向传播需要传入标量值?
1. 返回值tensor(125., grad_fn=AddBackward0)的含义
- 前面的
125.就是纯数值计算结果:输入x是[3,4,10],每个元素平方分别为9、16、100,求和后正好是125,这部分和普通数学计算没有任何区别。 - 后面的
grad_fn=AddBackward0是PyTorch自动附加的反向传播标记:它记录了当前y是通过加法操作得到的,后续调用.backward()时,PyTorch会直接按照加法的反向求导规则计算梯度,不需要你手动写求导公式。
2. 为什么要对三个输入值求和
这里的求和完全是示例的简化设计,目的只有一个:让最终输出y变成单个标量值。
PyTorch的Autograd默认只支持对标量输出直接求梯度,如果输出是向量/张量,调用.backward()时必须传入和输出形状一致的权重参数,也就是你提到的.backward(tensor([1.,1.,1.]))写法。示例里做求和操作,就是为了省略传参步骤,让代码更简洁,没有其他特殊数学含义。
3. 求和对求梯度的作用
你完全不用担心“不相关数字求和影响梯度结果”,我们直接拆计算逻辑就能看明白:
你的函数f(q) = sum(q²) = q₁² + q₂² + q₃²,对每个输入求偏导的结果为:
- ∂f/∂q₁ = 2*q₁
- ∂f/∂q₂ = 2*q₂
- ∂f/∂q₃ = 2q₃
代入q的数值就是23=6、24=8、210=20,运行完y.backward()后查看x.grad,得到的就是tensor([6., 8., 20.]),正好是每个输入对应的独立梯度。
求和操作本质上没有干扰每个输入的梯度计算逻辑,只是把输出转为标量适配Autograd的默认调用规则而已。
对应示例的极简计算图
输入x = [3,4,10] (requires_grad=True) ↓ 逐元素平方操作 中间结果 [9, 16, 100] (grad_fn=PowBackward0) ↓ 求和操作 输出y = 125 (grad_fn=AddBackward0)
反向传播时顺着图逆推即可:
- 从y开始,加法的反向传播规则是给每个输入的梯度乘1,因此中间结果每个元素的梯度都是1
- 平方操作的反向传播规则是给输入乘
2*原始输入值,因此每个x对应的梯度就是1*2*原始x值,和手动计算的结果完全一致。
内容的提问来源于stack exchange,提问作者Mack
相关产品推荐
相关产品推荐

