在中
PyTorch,我们需要在开始进行反向传播之前将梯度设置为零,因为PyTorch
会 在随后的向后传递中 累积梯度
。在训练RNN时这很方便。因此,默认 *** 作是在每次调用时累积(即求和)梯度
loss.backward()。
因此,理想情况下,当您开始训练循环时,应该
zero out thegradients正确进行参数更新。否则,梯度将指向预期方向以外的其他方向,即朝向
最小值 (或 最大化 ,如果达到最大化目标)。
这是一个简单的示例:
import torchfrom torch.autograd import Variableimport torch.optim as optimdef linear_model(x, W, b): return torch.matmul(x, W) + bdata, targets = ...W = Variable(torch.randn(4, 3), requires_grad=True)b = Variable(torch.randn(3), requires_grad=True)optimizer = optim.Adam([W, b])for sample, target in zip(data, targets): # clear out the gradients of all Variables # in this optimizer (i.e. W, b) optimizer.zero_grad() output = linear_model(sample, W, b) loss = (output - target) ** 2 loss.backward() optimizer.step()
或者,如果您要进行 香草梯度下降 ,则:
W = Variable(torch.randn(4, 3), requires_grad=True)b = Variable(torch.randn(3), requires_grad=True)for sample, target in zip(data, targets): # clear out the gradients of Variables # (i.e. W, b) W.grad.data.zero_() b.grad.data.zero_() output = linear_model(sample, W, b) loss = (output - target) ** 2 loss.backward() W -= learning_rate * W.grad.data b -= learning_rate * b.grad.data
注意
:在张量上调用时,会发生梯度的
累积 (即 求和
)。
.backward()``loss
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)