损失函数总结(十六):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 Lossrmse = torch.sqrt(msle_loss(predicted , observed ))observed_range = torch.max(observed) - torch.min(observed)nrmse = rmse / observed_rangereturn 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 Lossmse = 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 总结
到此,使用 损失函数总结(十六) 已经介绍完毕了!!! 如果有什么疑问欢迎在评论区提出,对于共性问题可能会后续添加到文章介绍中。如果存在没有提及的损失函数也可以在评论区提出,后续会对其进行添加!!!!
如果觉得这篇文章对你有用,记得点赞、收藏并分享给你的小伙伴们哦😄。