Pytorch:当优化器必须调用zero_grad()来帮助积累梯度时,带有动量的SGD如何工作?

时间:2018-12-30 21:13:57

标签: machine-learning deep-learning pytorch gradient-descent

在pytorch中,向后()函数会累积渐变,我们必须通过调用optimizer.zero_grad()在每个微型批处理中将其重置。在这种情况下,当实际动量SGD使用一些过去的迷你批次的指数平均值更新权重时,具有动量的SGD如何工作。

对于Pytorch的初学者,我感到困惑。不需要过去的渐变来执行更新。

1 个答案:

答案 0 :(得分:1)

使用动量时,您需要为每个参数存储一个元素的历史记录,其他求解器(例如ADAM)则需要更多。优化器知道如何存储此历史数据并有序地累积新的梯度。您不必担心。

那为什么zero_grad()可能会问自己?
很好,有时候整个小批处理都无法放入GPU内存中,并且您希望将其处理分成几个“小”小批处理,但又不减少用于计算梯度和权重更新的有效批处理大小。
在这种情况下,您只需调用zero_grad(),对所有微型迷你批次执行forwardbackward,然后再调用optimizer.step()-此步骤将所有微型迷你批次的梯度平均迷你批处理,您将获得有效的更新,就像您运行了一个迷你批处理一样。有关更多详细信息,请参见this thread

可以在herehere中找到有关pytorch中的梯度和优化器的更多信息。