如何解决在火炬中实现梯度累积的正确方法是什么?
通常有两种方法:
-
每批调用
loss.backward()
,但每N批仅调用optimizer.step()
和optimizer.zero_grad()
。是否会总结 N个批次的梯度?因此,为了保持每个有效批次的学习率,我们必须将学习率除以N? -
累积损耗而不是梯度,并每N批调用
(loss / N).backward()
。这很容易理解,但是是否违反了节省内存的目的(因为同时计算了N个批次的梯度)?学习率不需要调整就可以保持每有效批次相同的学习率,但是如果要每个示例保持相同的学习率,则应乘以。
哪种更好,或更常用在诸如pytorch-lightning之类的软件包中? optimizer.zero_grad()
似乎是梯度累积的理想选择,因此,建议使用(1)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。