【发布时间】:2020-12-28 02:28:14
【问题描述】:
大致有两种方式:
-
每批次调用
loss.backward(),但每N批次只调用optimizer.step()和optimizer.zero_grad()。是不是N个批次的梯度相加?因此,为了保持相同的每个有效批次的学习率,我们必须将学习率除以 N? -
累积loss而不是梯度,每N个批次调用
(loss / N).backward()。这很容易理解,但它是否违背了节省内存的目的(因为 N 个批次的梯度是一次计算的)?学习率不需要调整以保持每个有效批次相同的学习率,但如果您想保持每个示例相同的学习率,则应乘以 N。
哪个更好,或者更常用在 pytorch-lightning 等包中?看来optimizer.zero_grad() 非常适合梯度累积,因此应该推荐(1)。
【问题讨论】: