为什么我们需要在PyTorch中调用zero_grad()?

为什么我们需要在PyTorch中调用zero_grad()?,第1张

为什么我们需要在PyTorch中调用zero_grad()?

在中

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



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5644597.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存