为什么我们需要在PyTorch中调用zero_grad()?
deep-learning
gradient-descent
neural-network
python
14
0

在训练期间需要调用zero_grad()方法。但是文档不是很有帮助

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

为什么我们需要调用此方法?

参考资料:
Stack Overflow
收藏
评论
共 1 个回答
高赞 时间 活跃

PyTorch ,我们需要在开始进行反向传播之前将梯度设置为零,因为PyTorch 在随后的向后传递中累积梯度 。在训练RNN时这很方便。因此,默认操作是在每次loss.backward()调用中累积(即求和)梯度

因此,在开始训练循环时,理想情况下应将zero out the gradients以便正确进行参数更新。否则,梯度将指向与预期方向不同的其他方向,即朝向最小值 (或最大化 ,如果达到最大化目标)。

这是一个简单的示例:

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

注意loss张量上调用.backward()时,会发生梯度的累积 (即求和 )。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号