gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:21:33 26 4
gpt4 key购买 nike

为什么 zero_grad()需要在训练期间调用吗?

|  zero_grad(self)
| Sets gradients of all model parameters to zero.

最佳答案

PyTorch ,对于训练阶段的每个小批量,我们通常希望在开始进行反向传播之前将梯度显式设置为零(即,更新 W8 biases),因为 PyTorch 在随后的反向传递中累积梯度。这种累积行为在训练 RNN 或当我们想要计算多个 mini-batches 的总损失梯度时很方便。因此,默认操作已设置为 accumulate (i.e. sum) the gradients在每个 loss.backward() 调用中。

因此,当您开始训练循环时,理想情况下您应该 zero out the gradients以便您正确执行参数更新。否则,梯度将是您已用于更新模型参数的旧梯度和新计算的梯度的组合。因此,它会指向其他方向,而不是指向 minimum(或 maximum,在最大化目标的情况下)的预期方向。

这是一个简单的例子:

import torch
from torch.autograd import Variable
import torch.optim as optim

def linear_model(x, W, b):
return torch.matmul(x, W) + b

data, 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

注意:

关于python - 为什么我们需要在 PyTorch 中调用 zero_grad()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48001598/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com