为什么我们需要在PyTorch中明确归零渐变?loss.backward()
调用时为什么渐变不能归零?通过在图表上保持渐变并要求用户明确归零渐变来实现什么样的场景?
我们明确需要调用zero_grad()
因为,在loss.backward()
(计算渐变之后)之后,我们需要使用optimizer.step()
梯度下降.更具体地说,梯度不会自动归零,因为这两个操作,loss.backward()
以及optimizer.step()
被分离,并optimizer.step()
要求只计算梯度.
另外,有时候,我们需要在一些批次之间积累梯度; 要做到这一点,我们可以简单地backward
多次调用并优化一次.
我有一个PyTorch当前设置的用例.
如果正在使用在每个步骤进行预测的递归神经网络(RNN),人们可能希望有一个超参数,允许人们及时积累渐变.不是每次都将梯度归零,步骤允许人们以有趣和新颖的方式使用反向传播时间(BPTT).
如果您想了解有关BPTT或RNN的更多信息,请参阅文章" 回归神经网络教程",第3部分 - 通过时间和消失梯度的反向传播或回归神经网络的不合理有效性.