autograd 自动求导

情况1 out是y的平均值,是一个标量,可以直接得出其对x的梯度(对 x i x_i xi的梯度之和)

import torch
x=torch.tensor([[12,6],[31,0.9]],requires_grad=True)
y=x*x
out=y.mean()
out.backward()  #等效于torch.autograd.backward(out)
print(x.grad)

输出:

tensor([[ 6.0000,  3.0000],
        [15.5000,  0.4500]])

情况2 y和x都是矢量,不能直接输出y对x的梯度,可以给y赋予

import torch
x=torch.tensor([[12,6],[31,0.9]],requires_grad=True)
y=x*x
v=torch.tensor([[1,1],[1,1]])
y.backward(v) #可以这样更实用 y.backward(torch.ones_like(y))
              #v即grad_tensors参数
print(x.grad)

输出:

tensor([[24.0000, 12.0000],
        [62.0000,  1.8000]])

思路图解
在这里插入图片描述

总结:必须要对标量进行求导,要是矢量的话需要转化为标量或者给一个一样大小的权重

扩展知识
在这里插入图片描述
x和y都是向量的话,y对x的梯度相当于一个雅可比矩阵
在这里插入图片描述
在这里插入图片描述
为什么v可以写成这样??????????链接
在这里插入图片描述

optimizer.zero_grad()是把梯度归零,而optimizer.step()是更新参数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值