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

为什么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的数值就是2
    3=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)

反向传播时顺着图逆推即可:

  1. 从y开始,加法的反向传播规则是给每个输入的梯度乘1,因此中间结果每个元素的梯度都是1
  2. 平方操作的反向传播规则是给输入乘2*原始输入值,因此每个x对应的梯度就是1*2*原始x值,和手动计算的结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.10 15:30:05