例如,我想使用一些辅助损失来提升我的模型性能。
哪种类型的代码可以在pytorch中实现?
#one
loss1.backward()
loss2.backward()
loss3.backward()
optimizer.step()
#two
loss1.backward()
optimizer.step()
loss2.backward()
optimizer.step()
loss3.backward()
optimizer.step()
#three
loss = loss1+loss2+loss3
loss.backward()
optimizer.step()
感谢您的回答!
原文由 heiheihei 发布,翻译遵循 CC BY-SA 4.0 许可协议
第一次和第三次尝试完全相同且正确,而第二种方法是完全错误的。
在 Pytorch 中,低层梯度 不会 被后续的
backward()
调用“覆盖”,而是被累积或求和。这使得第一种和第三种方法相同,但如果你有低内存 GPU/RAM,第一种方法可能更可取(批量大小为 1024,一个backward() + step()
调用与具有 8 个大小为 128 和 8 的批次相同backward()
电话,最后有一个step()
电话)。为了说明这个想法,这里有一个简单的例子。我们想让我们的张量
x
接近40,50 and 60
同时:现在第一种方法:(我们使用
tensor.grad
为我们的张量获取当前梯度x
)此输出:
tensor([-294.])
(编辑:将retain_graph=True
放在前两个backward
调用更复杂的计算图)第三种方法:
再次输出:
tensor([-294.])
opt.zero_grad
方法不同,因为我们在调用step()
方法后不调用 --- 。这意味着在所有 3step
调用中使用第一个backward
--- 调用的梯度。例如,如果 3 次损失提供梯度5,1,4
相同的权重,而不是 10 (=5+1+4),现在你的权重将有5*3+1*2+4*1=21
作为梯度。进一步阅读: 链接 1 、 链接 2