我明白了当
training_step()
返回loss时,自动优化的代码
(link) 负责loss.backward()
有人可以告诉我,对于training_step()的以下两种场景,loss.backward()自动优化有什么不同:
场景一:
def training_step(self, batch: list,epochidx):
x,y = batch
output = model(x)
loss = self.loss_func(output,y)
return loss
场景2:
def training_step(self, batch: list,epochidx):
x,y = batch
output = model(x)
loss = self.loss_func(output,y)
metric = self.metric(output,y)
train_log = {"loss":loss,"metric":metric}
return train_log
我担心的是,第二个场景中的 loss.backward() 对损失和度量都进行向后操作,而不仅仅是损失。
我在 conda 环境中打开了 pytorch-lightning 文件,以了解如果我发送字典而不是张量,自动优化是如何发生的,但它并没有带来太多结果。
任何帮助/提示表示赞赏。谢谢!
当您调用
loss.backward()
时,它将向后遍历所有参数的图表,计算每个可训练参数的梯度并将其累积在 parameter.grad
中(但不会更改参数本身。这是通过 optimizer.step()
完成的)。因此,除非您调用 metric.backward()
,否则 metric
不会影响渐变。事实上,您可以通过这种方式计算任意数量的指标,而不会影响梯度。这个答案可能也有帮助:https://discuss.pytorch.org/t/what-does-the-backward-function-do/9944/2