在 Pytorch 中将损失乘以 n 后,多次 loss.backward() 和 loss.backward() 之间



这两个代码之间有区别吗?

1

Loss.backward(retain_graph=True)
Loss.backward(retain_graph=True)
Loss.backward()
optimizer.step

阿拉伯数字

Loss = 3 * Loss
Loss.backward()
optimizer.step

当我在最后一个 back(( 之后检查参数的梯度时,两个代码之间没有区别。但是,训练后的测试准确性略有不同。

我知道这不是一个常见的案例,但它与我正在做的研究有关。

在选项 1 中,每次调用.backward()时,都会计算梯度。调用 3 次后,当您执行optimizer.step时,将添加渐变,然后相应地更新权重。

在选项 2 中,您将损失乘以一个常数,因此梯度也将乘以该常数。

因此,将梯度值添加 3 次并将梯度值乘以 3 将导致相同的参数更新。

请注意,我假设没有由于浮点精度而造成的损失(如评论中所述(。

对我来说,它看起来非常不同。

计算三次损失不会做任何事情(第一个代码片段(。你只需坚持你之前计算的梯度。(检查叶张量 .grad(( 属性的值(。

但是,第二个代码片段仅将梯度乘以 3,从而加快梯度下降速度。对于标准的梯度下降优化器,这就像将学习率增加 3。

希望这有帮助。

最新更新