在火炬中实现梯度累积的正确方法是什么?

时间:2020-09-09 15:57:00

标签: pytorch pytorch-lightning

通常有两种方法:

  1. 每批调用loss.backward(),但每N批仅调用optimizer.step()optimizer.zero_grad()。是否会总结 N个批次的梯度?因此,为了保持每个有效批次的学习率,我们必须学习率除以N?

  2. 累积损耗而不是梯度,并每N批调用(loss / N).backward()。这很容易理解,但是是否违反了节省内存的目的(因为同时计算了N个批次的梯度)?学习率不需要调整就可以保持每有效批次相同的学习率,但是如果要每个示例保持相同的学习率,则应乘以

哪种更好,或更常用在诸如pytorch-lightning之类的软件包中? optimizer.zero_grad()似乎是梯度累积的理想选择,因此,建议使用(1)。

0 个答案:

没有答案