【问题标题】:What is the correct way to implement gradient accumulation in pytorch?在pytorch中实现梯度累积的正确方法是什么?
【发布时间】:2020-12-28 02:28:14
【问题描述】:

大致有两种方式:

  1. 每批次调用loss.backward(),但每N批次只调用optimizer.step()optimizer.zero_grad()。是不是N个批次的梯度相加?因此,为了保持相同的每个有效批次的学习率,我们必须将学习率除以 N?

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

哪个更好,或者更常用在 pytorch-lightning 等包中?看来optimizer.zero_grad() 非常适合梯度累积,因此应该推荐(1)。

【问题讨论】:

    标签: pytorch pytorch-lightning


    【解决方案1】:

    您可以使用 PytorchLightning 并获得该框的此功能,请参阅 Trainer 参数 accumulate_grad_batches,您也可以将其与 gradient_clip_val 配对,更多信息请参见 docs

    【讨论】:

      猜你喜欢
      • 2020-09-15
      • 2020-02-10
      • 2021-09-08
      • 2021-09-26
      • 1970-01-01
      • 2019-04-19
      • 1970-01-01
      • 2021-03-24
      • 1970-01-01
      相关资源
      最近更新 更多