很多的文字看着头疼, 我们来看看下面代码,一看就懂
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 ,要满足两个条件⭐
- 只有声明了“ requires_grad=True ” 的元素,才可以调用 .grad!打印出数据。 其他的,不管你是不是 x 的复合函数,都不能打印 grad
- 要想打印出 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的认识,谢谢阅读。