尝试理解PyTorch的SmoothL1Loss实现

我一直在尝试逐个研究PyTorch中的所有损失函数,并从头开始构建它们,以更好地理解它们。但我遇到了一个问题,不知道是我的重建有问题,还是PyTorch的实现有问题。

根据PyTorch的SmoothL1Loss文档,它简单地说明,如果预测值与真实值的绝对差值小于beta,我们使用上面的方程。否则,我们使用下面的方程。请查看文档以了解方程的详细信息。

以下是我以最小测试形式实现的代码:

import torchimport torch.nn as nnimport numpy as nppredictions = torch.randn(3, 5, requires_grad=True)target = torch.randn(3, 5)def l1_loss_smooth(predictions, targets, beta = 1.0):        loss = 0    for x, y in zip(predictions, targets):        if abs(x-y).mean() < beta:            loss += (0.5*(x-y)**2 / beta).mean()        else:            loss += (abs(x-y) - 0.5 * beta).mean()    loss = loss/predictions.shape[0]output = l1_loss_smooth(predictions, target)print(output)Gives an output of:tensor(0.7475, grad_fn=<DivBackward0>)

现在是PyTorch的实现:

loss = nn.SmoothL1Loss(beta=1.0)output = loss(predictions, target)Gives an output of:tensor(0.7603, grad_fn=<SmoothL1LossBackward>)

我无法找出实现中的错误所在。

在深入研究_C模块中的smooth_l1_loss函数(文件:smooth_c_loss_op.cc)后,我注意到文档字符串提到这是一种Huber Loss的变体,但SmoothL1Loss的文档说它是Huber Loss。

总的来说,我对它的实现方式感到困惑,不知道它是SmoothL1Loss和Huber Loss的组合,仅仅是Huber Loss,还是其他什么东西。


回答:

文档中的描述是正确的。您的实现错误地在数据的平均值上应用了情况选择。应该是对每个元素进行选择(如果您考虑到普通L1损失的实现,以及平滑L1损失的动机)。

以下代码给出了一个一致的结果:

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中创建了一个多类分类项目。该项目可以对…

发表回复

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