大致上有两种方式:
loss.backward(),但每N批只调用optimizer.step()和optimizer.zero_grad()。N个批次的梯度是求和的情况吗?因此,为了保持每批有效的学习速率相同,我们必须将的学习速率除以N?(loss / N).backward()。这是很容易理解的,但它是否违背了节省内存的目的(因为N批的梯度是一次计算的)?学习速率不需要调整以保持每个有效批的相同学习速率,但是如果要保持每个示例相同的学习速率,则应该将乘以乘以N。哪一种更好,还是更常用在火把-闪电之类的包装中?optimizer.zero_grad()似乎是一个适合梯度积累的地方,因此建议(1)。
发布于 2022-01-11 22:08:58
您可以使用PytorchLightning并获得这个框的特性,请参阅培训器参数accumulate_grad_batches,您也可以将它与gradient_clip_val配对,在文档中有更多信息。
https://stackoverflow.com/questions/63815311
复制相似问题