在pytorch中,向后()函数会累积渐变,我们必须通过调用optimizer.zero_grad()在每个微型批处理中将其重置。在这种情况下,当实际动量SGD使用一些过去的迷你批次的指数平均值更新权重时,具有动量的SGD如何工作。
对于Pytorch的初学者,我感到困惑。不需要过去的渐变来执行更新。
答案 0 :(得分:1)
使用动量时,您需要为每个参数存储一个元素的历史记录,其他求解器(例如ADAM)则需要更多。优化器知道如何存储此历史数据并有序地累积新的梯度。您不必担心。
那为什么zero_grad()
可能会问自己?
很好,有时候整个小批处理都无法放入GPU内存中,并且您希望将其处理分成几个“小”小批处理,但又不减少用于计算梯度和权重更新的有效批处理大小。
在这种情况下,您只需调用zero_grad()
,对所有微型迷你批次执行forward
和backward
,然后再调用optimizer.step()
-此步骤将所有微型迷你批次的梯度平均迷你批处理,您将获得有效的更新,就像您运行了一个迷你批处理一样。有关更多详细信息,请参见this thread。