为了这个最小工作示例,我试图使用带有多个项的自定义损失函数来拟合线性回归。然而,当我尝试通过将权重向量与我的损失进行点积来加权损失函数中的不同项时,我遇到了奇怪的行为。简单地将损失相加可以按预期工作;然而,当对权重和损失进行点积时,反向传播似乎被破坏了,损失函数没有减少。
我尝试启用和禁用两个张量的requires_grad,但无法复制预期的行为。
预期结果:损失函数减少,并且线性回归被拟合(见下方输出)
Epoch [5/60], Loss: 7.9943Epoch [10/60], Loss: 7.7597Epoch [15/60], Loss: 7.6619Epoch [20/60], Loss: 7.6102Epoch [25/60], Loss: 7.4971Epoch [30/60], Loss: 7.4106Epoch [35/60], Loss: 7.3942Epoch [40/60], Loss: 7.2438Epoch [45/60], Loss: 7.2322Epoch [50/60], Loss: 7.1012Epoch [55/60], Loss: 7.0701Epoch [60/60], Loss: 6.9612
实际结果:损失函数无变化
Epoch [5/60], Loss: 73.7473Epoch [10/60], Loss: 73.7473Epoch [15/60], Loss: 73.7473Epoch [20/60], Loss: 73.7473Epoch [25/60], Loss: 73.7473Epoch [30/60], Loss: 73.7473Epoch [35/60], Loss: 73.7473Epoch [40/60], Loss: 73.7473Epoch [45/60], Loss: 73.7473Epoch [50/60], Loss: 73.7473Epoch [55/60], Loss: 73.7473Epoch [60/60], Loss: 73.7473
我对为什么这样一个简单的操作会破坏反向传播梯度感到非常困惑,如果有人能提供一些见解,解释为什么这不起作用,我将不胜感激。
回答:
使用torch.cat((loss1, loss2))
,你正在从现有张量创建新的张量,破坏了计算图。
无论如何,除非你试图泛化你的损失函数,否则不应该这样做,这样的代码非常难以阅读。简单的加法要好得多。