损失函数总结(十六):MSLELoss、RMSLELoss
- 1 引言
- 2 损失函数
- 2.1 NRMSELoss
- 2.2 RRMSELoss
- 3 总结
1 引言
在前面的文章中已经介绍了介绍了一系列损失函数 (L1Loss
、MSELoss
、BCELoss
、CrossEntropyLoss
、NLLLoss
、CTCLoss
、PoissonNLLLoss
、GaussianNLLLoss
、KLDivLoss
、BCEWithLogitsLoss
、MarginRankingLoss
、HingeEmbeddingLoss
、MultiMarginLoss
、MultiLabelMarginLoss
、SoftMarginLoss
、MultiLabelSoftMarginLoss
、TripletMarginLoss
、TripletMarginWithDistanceLoss
、Huber Loss
、SmoothL1Loss
、MBELoss
、RAELoss
、RSELoss
、MAPELoss
、RMSELoss
、LogCosh Loss
、MSLELoss
、RMSLELoss
)。在这篇文章中,会接着上文提到的众多损失函数继续进行介绍,给大家带来更多不常见的损失函数的介绍。这里放一张损失函数的机理图:
2 损失函数
2.1 NRMSELoss
Normalized Root Mean Squared Error (归一化均方根误差,NRMSE) 将RMSE的值变成(0,1)
之间, 有助于不同尺度模型之间的比较
。NRMSELoss 的数学表达式如下:
L
(
Y
,
Y
′
)
=
1
n
∑
i
=
1
n
(
y
i
−
y
i
′
)
2
y
‾
L(Y, Y') = \frac{\sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i-y_i')^2}}{\overline y}
L(Y,Y′)=yn1∑i=1n(yi−yi′)2
其中:
-
y
‾
\overline y
y: 表示观测值的
平均值
或范围
(定义为最大值减去最小值)。
代码实现(Pytorch):
import torch
import torch.nn as nn
# 创建模型的预测值和真实观测值
predicted = torch.tensor([2.0, 4.0, 6.0, 8.0, 10.0], dtype=torch.float32)
observed = torch.tensor([1.5, 4.2, 5.8, 7.9, 9.8], dtype=torch.float32)
# 自定义 NRMSE 损失函数
def nrmse_loss(predicted, observed):
# 创建 MSLE 损失函数
msle_loss = nn.MSELoss()
# 计算 MSLE Loss
rmse = torch.sqrt(msle_loss(predicted , observed ))
observed_range = torch.max(observed) - torch.min(observed)
nrmse = rmse / observed_range
return nrmse
# 计算 NRMSE
loss = nrmse_loss(predicted, observed)
# 打印 NRMSE
print("Normalized Root Mean Squared Error (NRMSE):", loss.item())
NRMSELoss 与 RMSLE一致,存在低估比高估受到更严重的惩罚的问题。因此,仅在特殊情况使用。。。。
2.2 RRMSELoss
Relative Root Mean Squared Error (相对均方根误差,RRMSE) 是没有维度
的 RMSE 变体。RRMSE 是一种均方根误差度量
,它已根据实际值
进行缩放
,然后由均方根
值归一化
。虽然原始测量的尺度限制了 RMSE
,但 RRMSE 可用于比较各种测量方法。RRMSELoss 的数学表达式如下:
L
(
Y
,
Y
′
)
=
1
n
∑
i
=
1
n
(
y
i
−
y
i
′
)
2
∑
i
=
1
n
(
y
i
′
)
2
L(Y, Y') = \sqrt\frac{{\frac{1}{n}\sum_{i=1}^{n}(y_i-y_i')^2}}{\sum_{i=1}^{n}(y_i')^2 }
L(Y,Y′)=∑i=1n(yi′)2n1∑i=1n(yi−yi′)2
代码实现(Pytorch):
import torch
import torch.nn as nn
# 创建模型的预测值和真实观测值
predicted = torch.tensor([2.0, 4.0, 6.0, 8.0, 10.0], dtype=torch.float32)
observed = torch.tensor([1.5, 4.2, 5.8, 7.9, 9.8], dtype=torch.float32)
# 自定义 RRMSE损失函数
def rrmse_loss(predicted, observed):
# 创建 MSLE 损失函数
msle_loss = nn.MSELoss()
# 计算 MSLE Loss
mse = msle_loss(predicted , observed )
robs_sum = torch.sum(torch.square(observed))
rrmse = mse / robs_sum
return rrmse
# 计算 RRMSE
loss = rrmse_loss(predicted, observed)
# 打印 RRMSE
print("Relative Root Mean Squared Error (RRMSE):", loss.item())
RRMSE更多的是作为一种评价指标来使用。损失函数的话更多的还是使用MSELoss。。。。
3 总结
到此,使用 损失函数总结(十六) 已经介绍完毕了!!! 如果有什么疑问欢迎在评论区提出,对于共性问题可能会后续添加到文章介绍中。如果存在没有提及的损失函数
也可以在评论区提出,后续会对其进行添加!!!!
如果觉得这篇文章对你有用,记得点赞、收藏并分享给你的小伙伴们哦😄。