通常有两种方法:
每批调用loss.backward()
,但每N批仅调用optimizer.step()
和optimizer.zero_grad()
。是否会总结 N个批次的梯度?因此,为了保持每个有效批次的学习率,我们必须将学习率除以N?
累积损耗而不是梯度,并每N批调用(loss / N).backward()
。这很容易理解,但是是否违反了节省内存的目的(因为同时计算了N个批次的梯度)?学习率不需要调整就可以保持每有效批次相同的学习率,但是如果要每个示例保持相同的学习率,则应乘以。
哪种更好,或更常用在诸如pytorch-lightning之类的软件包中? optimizer.zero_grad()
似乎是梯度累积的理想选择,因此,建议使用(1)。