pytorch中tensor求导:y.sum().backward()为什么求导的时候要进行这个sum操作;

李沐深度学习中:对于反向传播求导的中sum()函数的解释:

y不是标量时,向量y关于向量x的导数的最自然解释是一个矩阵。 对于高阶和高维的yx,求导的结果可以是一个高阶张量。

然而,虽然这些更奇特的对象确实出现在高级机器学习中(包括深度学习中), 但当调用向量的反向计算时,我们通常会试图计算一批训练样本中每个组成部分的损失函数的导数。 这里,我们的目的不是计算微分矩阵,而是单独计算批量中每个样本的偏导数之和。

意思就是:对于y来说,不能是一个变量,必须是一个标量才能进行反向传播求导。(自己读了那段话也不是很明白)。自己打印出来代码结果就很容易明白了。

import torch
x=torch.arange(4.0,requires_grad=True)
print(x)

# x的第一个函数:
y= 2 * torch.dot(x,x) #点积和,先相乘再相加;是一个标量(一个数)
print("y1:",y) #y1: tensor(28., grad_fn=<MulBackward0>)
y.backward() #反向传播函数自动求导;
print(x.grad) #求x tensor([ 0.,  4.,  8., 12.])

x.grad== 4 * x

#第二个x 的函数
x.grad.zero_(); #梯度清零;
y=x.sum()   # y是一个标量 ,
print("y2:",y)   #y2: tensor(6., grad_fn=<SumBackward0>)
y.backward()
print(x.grad) #tensor([1., 1., 1., 1.])

# x的第三个函数:
x.grad.zero_()
y=x * x  #y是一个向量
print("y3:",y)#y3: tensor([0., 1., 4., 9.], grad_fn=<MulBackward0>)
y.sum().backward() #先求和再求导数;
print(x.grad) #tensor([0., 2., 4., 6.])

分析:

第一个函数是对x求点核和,y是一个标量28,tensor(28., grad_fn=<MulBackward0>)

第二个函数:y=x.sum() 是对x 求和,y 也是一个标量 6;tensor(6., grad_fn=<SumBackward0>)

第三个函数: y= x * x :y 是一个向量 : tensor([0., 1., 4., 9.], grad_fn=<MulBackward0>),所以说需要对y求和再反向传播求导数。

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值