我正在尝试训练一个使用多个损失的模型。我注意到在某些实现中,单个损失函数被声明为 loss_fct = nn.LossFunction()
并多次使用来计算单独的损失,这些损失被求和并反向传播。例如:
loss_fct = nn.LossFunction()
loss1 = loss_fct(pred1, labels1)
loss2 = loss_fct(pred2, labels2)
total_loss = loss1 + loss2
total_loss.backward()
optimizer.step()
这样可以吗,还是应该为每个损失声明单独的损失函数对象?如果这没问题,为什么没问题?这对我来说似乎违反直觉,因为它们是我们为不同目的优化的单独损失。求和和反向传播一次有点道理,但我无法使用单个损失对象。
答案 0 :(得分:2)
您必须创建某些损失函数的实例的原因是,某些损失函数具有影响它们计算方式的可选参数。
例如 MSELoss
支持不同的缩减模式。
如果您在每个输出上计算相同的损失函数(损失函数本身具有相同的参数化),则无需实例化损失函数的多个实例。