Python 在优化三重态损耗时,PyTorch如何计算反向通过?
我正在Pytorch中实现一个三重网络,其中3个实例(子网络)共享相同的权重。由于权重是共享的,所以我将其实现为一个单实例网络,该网络被调用三次以生成锚定、正嵌入和负嵌入。通过优化模型来学习嵌入。下面是一个小片段进行说明:Python 在优化三重态损耗时,PyTorch如何计算反向通过?,python,pytorch,Python,Pytorch,我正在Pytorch中实现一个三重网络,其中3个实例(子网络)共享相同的权重。由于权重是共享的,所以我将其实现为一个单实例网络,该网络被调用三次以生成锚定、正嵌入和负嵌入。通过优化模型来学习嵌入。下面是一个小片段进行说明: from dependencies import * model = SingleSubNet() # represents each instance in the triplet net for epoch in epochs: for anch, po
from dependencies import *
model = SingleSubNet() # represents each instance in the triplet net
for epoch in epochs:
for anch, pos, neg in enumerate(train_loader):
optimizer.zero_grad()
fa, fp, fn = model(anch), model(pos), model(neg)
loss = triplet_loss(fa, fp, fn)
loss.backward()
optimizer.step()
# Do more stuff ...
我的完整代码按预期工作。但是,我不明白在这种情况下,loss.backward()
如何计算梯度。我很困惑,因为在每个学习步骤中有3个损失梯度(梯度公式)。我假设在执行optimizer.step()
之前对梯度求和。但是从这个角度来看,如果梯度相加,它们将相互抵消,并产生零更新项。当然,这不是真的,因为网络最终学习到了有意义的嵌入
提前谢谢