pytorch Lightning 中loss.backward()如何计算

问题描述 投票:0回答:1

我明白了当

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 文件,以了解如果我发送字典而不是张量,自动优化是如何发生的,但它并没有带来太多结果。

任何帮助/提示表示赞赏。谢谢!

pytorch loss-function pytorch-lightning
1个回答
0
投票

当您调用

loss.backward()
时,它将向后遍历所有参数的图表,计算每个可训练参数的梯度并将其累积在
parameter.grad
中(但不会更改参数本身。这是通过
optimizer.step()
完成的)。因此,除非您调用
metric.backward()
,否则
metric
不会影响渐变。事实上,您可以通过这种方式计算任意数量的指标,而不会影响梯度。这个答案可能也有帮助:https://discuss.pytorch.org/t/what-does-the-backward-function-do/9944/2

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.