Python 在优化三重态损耗时,PyTorch如何计算反向通过?

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

我正在Pytorch中实现一个三重网络,其中3个实例(子网络)共享相同的权重。由于权重是共享的,所以我将其实现为一个单实例网络,该网络被调用三次以生成锚定、正嵌入和负嵌入。通过优化模型来学习嵌入。下面是一个小片段进行说明:

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()
之前对梯度求和。但是从这个角度来看,如果梯度相加,它们将相互抵消,并产生零更新项。当然,这不是真的,因为网络最终学习到了有意义的嵌入

提前谢谢