我正在使用 PyTorch 中的神经网络实现使用单个观察来计算损失。我对 SGD 的一个小细节感到困惑。如果我计算 loss 并做loss.backward(),我正在累积梯度。如果我对 100 次观察执行此操作然后运行optimizer.step(),我应该平均梯度吗?
这就是我现在正在做的事情:
def compute_loss(training_data):
for data in training_data:
loss = F.mse_loss(data[0], data[1])
loss.backward()
def optimize(sample):
optimizer.zero_grad()
compute_loss(sample)
optimizer.step()
应该是:
def compute_loss(training_data):
for data in training_data:
loss = F.mse_loss(data[0], data[1])
loss.backward(torch.Tensor([1.0/len(training_data)]))