pytorch-backward()函数应该处于时代循环还是批处理循环?

时间:2019-12-26 18:06:32

标签: optimization deep-learning pytorch gradient

在使用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)

1 个答案:

答案 0 :(得分:1)

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

第一个是批梯度下降,第二个是梯度下降。在大多数问题中,我们都想进行批量梯度下降,因此第一个是正确的方法。它也可能训练得更快。

如果要进行梯度下降,则可以使用第二种方法(但是,当可以批处理GD时,很少需要进行GD)。但是,由于在GD中您不会清除每个批次的图形(.zero_grad仅被调用一次),因此可能会耗尽内存。