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

PyTorch中y.backward([0.1, 1.0, 0.0001])的含义是什么?

关于PyTorch中y.backward([0.1, 1.0, 0.0001])参数的详解

嘿,这个问题问得特别关键!很多刚摸PyTorch自动微分的同学都会在这个点上卡壳,我给你把这个逻辑捋得明明白白:

首先铺垫下基础:当y是标量的时候,y.backward()会直接计算所有依赖y的张量的梯度——本质就是求标量y对各个参数的导数,这个很好理解。

但如果y是一个向量/多维张量(比如你例子里形状为(3,)的向量),直接调用无参数的y.backward()会报错!为啥?因为向量对张量的导数是一个雅可比矩阵(每行对应一个y分量对所有参数的导数),直接计算整个矩阵太耗内存,PyTorch也不知道你到底要这个矩阵里的啥信息。

这时候传入的[0.1, 1.0, 0.0001]就派上用场了:这个和y形状完全一致的向量,我们叫它梯度权重向量,它的作用是帮我们计算雅可比向量积——说白了就是把每个y分量的梯度按权重加权求和,把多维度的梯度计算转化成标量的梯度计算,既省内存又灵活。

具体计算逻辑

假设y = [y₁, y₂, y₃],传入的权重向量v = [v₁, v₂, v₃],那么y.backward(v)实际在计算的是:

对所有依赖y的参数x,求sum(vᵢ * dyᵢ/dx)的梯度

换句话说,就是把每个yᵢ对x的梯度,乘以对应的vᵢ,再把所有结果加起来,最后反向传播这个加权后的总梯度。

举个代码例子更直观

import torch

# 定义需要求导的输入张量
x = torch.tensor([1.0, 2.0], requires_grad=True)
# 生成向量输出y = x²,即[1,4]
y = x ** 2
# 定义权重向量v
v = torch.tensor([0.5, 2.0])
# 带权重的反向传播
y.backward(v)

# 打印x的梯度
print(x.grad)  # 输出: tensor([1.0, 8.0])

解释下这个结果:

  • y₁对x₁的导数是2*1=2,乘以v₁=0.5得到1.0
  • y₂对x₂的导数是2*2=4,乘以v₂=2.0得到8.0
  • 最终x的梯度就是这两个加权后的结果,完全符合预期。

常见使用场景

这个参数最常用在多任务学习或者多损失加权求和的场景:比如你有三个任务的损失分别对应y₁,y₂,y₃,你想给第二个任务更高的优先级(权重1.0),第一个任务次之(0.1),第三个任务几乎不用关注(0.0001),那传入这个权重向量就相当于直接把三个损失的梯度按权重合并,再统一反向传播,非常高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:42:34