Pytorch - backward() 函数应该在 epoch 或 batch 的循环中吗?

Pytorch - Should backward() function be in the loop of epoch or batch?

当使用 Pytorch 训练 nn 个模型时,我们放置后向方法的位置是否存在差异?例如,以下哪一项是正确的?

计算整个批次的梯度:

for e in range(epochs):
    for i in batches_list:
        out = nn_model(i)
        loss = loss_function(out, actual)
        loss_sum += loss.item()
        lstm.zero_grad()
        loss.backward()
        optimizer.step()
loss_list.append(loss_sum / num_train_obs)

计算整个时期的梯度:

for e in range(epochs):
    for i in batches_list:
        out = nn_model(i)
        loss = loss_function(out, actual)
        loss_sum += loss.item()
    lstm.zero_grad()
    loss_sum.backward()
    optimizer.step()     
loss_list.append(loss_sum / num_train_obs)

两者在编程上都是正确的。

第一个是batch gradient descent,第二个是gradient descent。在大多数问题中我们想做批量梯度下降,所以第一个是正确的方法。它也可能训练得更快。

如果你想做Gradient descent,你可以使用第二种方法(但是当你可以做batch GD时,很少想做GD)。但是,由于在 GD 中您不会每批都清除图形(.zero_grad 仅调用一次),您可能 运行 内存不足。