PyTorch - backward() 函数应该在 epoch 循环还是 batch 循环中?

3
在使用Pytorch训练神经网络模型时,放置backward方法的位置是否有差别?例如下面哪一个是正确的?
跨批次计算梯度:
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)

在整个 epoch(一个训练周期)中计算梯度:

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)
1个回答

3

两种方法在程序上都是正确的。

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

如果你想要使用梯度下降法,可以使用第二种方法(但当你能使用批量梯度下降法时,很少需要使用GD)。然而,在GD中,你不会在每个批次清除图形(.zero_grad只被调用一次),这可能会导致内存溢出。


所以,如果我在这里使用的优化器是SGD,那么比较就变成了SGD vs SBGD,我猜我们通常会更喜欢SBGD而不是SGD? - wwj123
我不明白你想表达什么。PyTorch拥有的SGD“算法”和SGD“优化器”是两个不同的东西。 - Umang Gupta
@whj123 我现在更好地理解了你的问题。比较的对象是SBGD和GD。如果批量大小为1,则SBGD就是SGD。 - Umang Gupta
1
右侧,SBGD和GD(因为第二个代码是基于整个数据的)。 - wwj123

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接