我有两种不同的损失来训练模型。
L1
损失计算如下:
recon_loss += F.l1_loss(pred_values, masked_patches) / total_num_masked
以及我的模型的另一个自定义损失函数,用于计算两个 3D 数据立方体的损失,
new_criterion = MyLoss(...)
。这两个损失加上重量:
# apply pixel-level loss
l1_weight = 0.1
errG = recon_loss * l1_w
new_loss = new_criterion(recon_cube, orig_cube).to(device)
errF_weight = 1.0
errF = new_loss * errF_weight
loss_total = errG + errGF
二元损失函数的输出如下:
(Pdb) errF
tensor(0.8987, grad_fn=<MulBackward0>)
(Pdb) errG
tensor(2.4668e-05, grad_fn=<MulBackward0>)
看起来两个损失值之间的差异相当大,给
F.L1
(recon_loss)赋予较低的权重,它会变得更小。
这个值的差异(即较小的值(2.4668e-05)与较大的值(0.8987),然后将它们相加得到
loss_total
)是否会影响训练?如果是,我们如何解决这个问题并确保模型训练得很好,从两种损失中受益?
通常如何将两个不同的损失加在一起来训练模型?
我使用的一些架构同时使用多个损失,他们根据每个损失函数的重要性和规模调整权重。
您可以查看示例 fastpitch 模型
loss = (mel_loss
+ dur_pred_loss * self.dur_predictor_loss_scale
+ pitch_loss * self.pitch_predictor_loss_scale
+ energy_loss * self.energy_predictor_loss_scale
+ attn_loss * self.attn_loss_scale)