【发布时间】:2020-05-27 08:24:20
【问题描述】:
这两个代码有区别吗?
1
Loss.backward(retain_graph=True)
Loss.backward(retain_graph=True)
Loss.backward()
optimizer.step
2
Loss = 3 * Loss
Loss.backward()
optimizer.step
当我在最后一个backward()之后检查参数的梯度时,两个代码之间没有区别。但是,训练后的测试准确率会有一点差异。
我知道这并不常见,但这与我正在做的研究有关。
【问题讨论】:
-
理论上应该没有区别。由于有限的浮点精度,但是在梯度方面可能会出现微小的差异(特别是如果您的网络非常深)。因此,对于性能和数值稳定性而言,您应该更喜欢选项 2。显然,选项 1 在图表中回溯的频率是选项 2 的三倍,因此这样做需要三倍的时间。
-
测试是否是浮点精度的原因,你可以对sn-p 2(或1)运行两次推理,看看这两次运行的测试精度是否也不同。