为什么我们需要显式调用 zero_grad()? [英] Why do we need to explicitly call zero_grad()?

查看:28
本文介绍了为什么我们需要显式调用 zero_grad()?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么我们需要在 PyTorch 中明确地将梯度归零?为什么在调用 loss.backward() 时不能将梯度归零?通过将梯度保留在图形上并要求用户将梯度显式归零,可以在什么情况下使用?

Why do we need to explicitly zero the gradients in PyTorch? Why can't gradients be zeroed when loss.backward() is called? What scenario is served by keeping the gradients on the graph and asking the user to explicitly zero the gradients?

推荐答案

我们明确需要调用 zero_grad() 因为,在 loss.backward() 之后(当渐变计算),我们需要使用 optimizer.step() 进行梯度下降.更具体地说,梯度不会自动归零,因为这两个操作 loss.backward()optimizer.step() 是分开的,而 optimizer.step() 需要刚刚计算的梯度.

We explicitly need to call zero_grad() because, after loss.backward() (when gradients are computed), we need to use optimizer.step() to proceed gradient descent. More specifically, the gradients are not automatically zeroed because these two operations, loss.backward() and optimizer.step(), are separated, and optimizer.step() requires the just computed gradients.

另外,有时候我们需要在一些batch之间积累梯度;为此,我们可以简单地多次调用 backward 并优化一次.

In addition, sometimes, we need to accumulate gradient among some batches; to do that, we can simply call backward multiple times and optimize once.

这篇关于为什么我们需要显式调用 zero_grad()?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆