在Pytorch中,将损失乘以n后,多次损失.backward()和损失.backward()有区别吗?

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

这两个代码有区别吗?

1

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

2

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

当我检查最后一次倒退()后的参数梯度时,两个代码之间没有区别。但是,训练后的测试准确率却有一点差别。

我知道这不是常见的情况,但这与我正在做的研究有关。

python pytorch loss
2个回答
0
投票

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

计算三次损失不会有任何作用(第一个代码片段)。你只是保持你之前计算的梯度。检查你的叶子张力器上.grad()属性的值)。

然而,第二个代码片段只是将梯度乘以三,从而加快了梯度下降的速度。对于一个标准的梯度下降优化器来说,这就像将学习率乘以3一样。

希望能帮到你。


0
投票

在方案1中,每次调用 .backward(),计算梯度。3次调用后,当你执行 optimizer.step梯度会被添加,然后相应地更新权重。

在选项2中,你用一个常数乘以损失,所以梯度值也将与该常数相乘。

所以,将梯度值添加3次,再将梯度值乘以3,就会得到同样的参数更新。

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

© www.soinside.com 2019 - 2024. All rights reserved.