这两个代码有区别吗?
1
Loss.backward(retain_graph=True)
Loss.backward(retain_graph=True)
Loss.backward()
optimizer.step
2
Loss = 3 * Loss
Loss.backward()
optimizer.step
当我检查最后一次倒退()后的参数梯度时,两个代码之间没有区别。但是,训练后的测试准确率却有一点差别。
我知道这不是常见的情况,但这与我正在做的研究有关。
对我来说,它看起来非常不同。
计算三次损失不会有任何作用(第一个代码片段)。你只是保持你之前计算的梯度。检查你的叶子张力器上.grad()属性的值)。
然而,第二个代码片段只是将梯度乘以三,从而加快了梯度下降的速度。对于一个标准的梯度下降优化器来说,这就像将学习率乘以3一样。
希望能帮到你。
在方案1中,每次调用 .backward()
,计算梯度。3次调用后,当你执行 optimizer.step
梯度会被添加,然后相应地更新权重。
在选项2中,你用一个常数乘以损失,所以梯度值也将与该常数相乘。
所以,将梯度值添加3次,再将梯度值乘以3,就会得到同样的参数更新。
请注意,我假设没有浮点精度造成的损失(如评论中所述)。