在损失函数中对张量进行点积时,Pytorch梯度不存在

为了这个最小工作示例,我试图使用带有多个项的自定义损失函数来拟合线性回归。然而,当我尝试通过将权重向量与我的损失进行点积来加权损失函数中的不同项时,我遇到了奇怪的行为。简单地将损失相加可以按预期工作;然而,当对权重和损失进行点积时,反向传播似乎被破坏了,损失函数没有减少。

我尝试启用和禁用两个张量的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)),你正在从现有张量创建新的张量,破坏了计算图。

无论如何,除非你试图泛化你的损失函数,否则不应该这样做,这样的代码非常难以阅读。简单的加法要好得多

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注