理解pytorch的 backward(), 究竟干了什么

很多的文字看着头疼, 我们来看看下面代码,一看就懂

x=th.ones(1,requires_grad=True)
z=x+1
y=z**3
t=y+2
m=t*6


print(m.grad)
print(t.grad)
print(y.grad)
print(z.grad)
print(x.grad)

结果是:

None
None
None
None
None

第二段

x=th.ones(1,requires_grad=True)
z=x+1
y=z**3
t=y+2
m=t*6

m.backward()
print(m.grad)
print(t.grad)
print(y.grad)
print(z.grad)
print(x.grad)

结果是

None
None
None
None
tensor([72.])

为啥呢? 为啥第一次,导数都是None?

为啥第二次,只有最后一个x 打印出来数据了呢?

很简单: 如果你想打印出来grad ,要满足两个条件⭐

  1. 只有声明了“ requires_grad=True ” 的元素,才可以调用 .grad!打印出数据。 其他的,不管你是不是 x 的复合函数,都不能打印 grad
  2. 要想打印出 grad ,必须先运行 backward , 这是一个求导的动作,没有这个backward ,倒数就是None

现在就很清楚了,由于 m ,t , y, z ,都没有声明自己的 require_grad是 True。 所以第一个程序中,既因为前面没有backward,又因为自己没有require,所以导数永远就是0

对于x ,第一个程序没有 backward ,所以导数是None; 第二个程序,满足了上面两个条件,就能成功打印了!

再看一个例子

x=th.ones(1,requires_grad=True)
z=x+1
y=z**3
t=y+2
m=t*6

t.backward()
print(m.grad)
print(t.grad)
print(y.grad)
print(z.grad)
print(x.grad)

结果是:

None
None
None
None
tensor([12.])

这里,注意, 我们把 从m 的backward 换成了 从t 的backward,

也就意味着, 反向求导的位置不同。 我们口算一下 ,发现 t对x 的导数就是 12, m对x的导数就是72

你明白了吧 , 从不同位置进行 backward ,结果也是不同的。

这就是简单的对于 backward的认识,谢谢阅读。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值