这两个代码之间有区别吗?
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。
希望这有帮助。