PyTorch中y.backward([0.1, 1.0, 0.0001])的含义是什么?
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.0y₂对x₂的导数是2*2=4,乘以v₂=2.0得到8.0- 最终x的梯度就是这两个加权后的结果,完全符合预期。
常见使用场景
这个参数最常用在多任务学习或者多损失加权求和的场景:比如你有三个任务的损失分别对应y₁,y₂,y₃,你想给第二个任务更高的优先级(权重1.0),第一个任务次之(0.1),第三个任务几乎不用关注(0.0001),那传入这个权重向量就相当于直接把三个损失的梯度按权重合并,再统一反向传播,非常高效。
内容的提问来源于stack exchange,提问作者jung hyemin

