1、关于backward的叠加问题
import torch
x = torch.FloatTensor([[1, 2], [4, 5]])
b = torch.FloatTensor([[2, 4], [5, 3]])
x.requires_grad = True
y=torch.mm(b,x)
print(y)
loss=y[0][0]+y[0][1]+y[1][0]+y[1][1]
print(loss)
loss.backward(retain_graph=True)
g=x.grad
print(g)
loss.backward(retain_graph=True)
print(x.grad)
"""
output
tensor([[18., 24.],
[17., 25.]], grad_fn=<MmBackward>)
tensor(84., grad_fn=<AddBackward0>)
tensor([[7., 7.],
[7., 7.]])
tensor([[14., 14.],
[14., 14.]])<----------------------------
"""
import torch
x = torch.FloatTensor([[1, 2], [4, 5]])
b = torch.FloatTensor([[2,4],[5,3]])
x.requires_grad = True
y=torch.mm(b,x)
print(y)
loss=y[0][0]+y[0][1]+y[1][0]+y[1][1]
print(loss)
loss.backward(retain_graph=True)
g=x.grad
print(g)
x.grad.data.zero_()
y2 =loss
print(y2)
y2.backward()
print(x.grad)
"""
output
tensor([[18., 24.],
[17., 25.]], grad_fn=<MmBackward>)
tensor(84., grad_fn=<AddBackward0>)
tensor([[7., 7.],
[7., 7.]])
tensor(84., grad_fn=<AddBackward0>)
tensor([[7., 7.],
[7., 7.]])<-------------------------
"""
当我们进行两次backward的时候梯度是不断叠加的(或者说只有进行backward后梯度再回真正的纳入计算,并且不释放的情况下会一直叠加),这也就是我们为什么要每次进行优化的时候都要进行optimizer.zero_grad()或者针对于某个参数进行梯度归零
import torch
x = torch.FloatTensor([[1, 2], [4, 5]])
x.requires_grad = True
y=2*x.mean()
print(x.grad)
z=4*x.mean()
y.backward()
print(x.grad)
"""
None
tensor([[0.5000, 0.5000],
[0.5000, 0.5000]])
可以观察到,不论在什么位置,x后续又做了什么计算,backward值计算从y开始的那一部分
"""