目录
平均绝对误差(Mean Absolute Error, MAE)
均方对数误差(Mean Squared Logarithmic Error, MSLE)
Huber Loss(MSE和 MAE结合,又称 Smooth L1 损失)
均方对数误差损失(Mean Squared Logarithmic Error, MSLE)
负对数似然损失(Negative Log-Likelihood, NLL Loss)
二元交叉熵损失(Binary Cross Entropy Loss, BCE)
带 Logits 的二元交叉熵损失(Binary Cross Entropy with Logits, BCEWithLogits)
损失函数是衡量模型预测值与真实值之间差异的函数,指导模型在训练过程中不断优化。根据任务类型和数据分布不同,常用的损失函数分为回归损失函数(如线性回归模型用到的)和分类损失函数两大类。
1、回归任务常用的损失函数
-
均方误差(Mean Squared Error, MSE)
-
定义:
适用场景:用于回归问题,尤其在预测目标值为连续变量时。 优点:对大误差敏感,能够惩罚较大的偏差,有助于收敛。 缺点:对异常值过于敏感,容易造成过拟合。PyTorch 实现:import torch.nn as nn criterion = nn.MSELoss()#定义 loss = criterion(predicted_outputs, true_outputs)#使用前面定义的损失函数来计predicted_outputs(预测输出)和true_outputs(真实输出)之间的损失值
-
平均绝对误差(Mean Absolute Error, MAE)
-
定义:
适用场景:用于回归问题,尤其是存在异常值的情况下。 优点:对异常值不敏感,较为稳健。 缺点:对较小误差不够敏感,不容易收敛到全局最优。PyTorch 实现:import torch.nn as nn criterion = nn.L1Loss() loss = criterion(predicted_outputs, true_outputs)
-
均方对数误差(Mean Squared Logarithmic Error, MSLE)
-
定义:
适用场景:适用于预测值呈指数增长的数据(如用户增长、销量增长等)。 优点:能够降低预测值较小的数据误差,关注相对误差。 缺点:对负值不适用,对数据平滑性要求高。PyTorch 实现:import torch.nn as nn criterion = nn.MSELoss() loss = criterion(predicted_outputs, true_outputs)
-
Huber Loss(MSE和 MAE结合,又称 Smooth L1 损失)
定义:当误差小于阈值 δ 时,使用 MSE,否则使用 MAE。
适用场景:适用于对异常值较为敏感的回归问题。 优点:综合了 MSE 和 MAE 的优点,对小误差使用平方惩罚,对大误差使用线性惩罚。 缺点:需选择合适的阈值 δ。PyTorch 实现:
import torch.nn as nn
criterion = nn.SmoothL1Loss()
loss = criterion(predicted_outputs, true_outputs)
-
均方对数误差损失(Mean Squared Logarithmic Error, MSLE)
定 义: 适用场景:主要用于回归任务,尤其是预测值和真实值都为正且数据尺度差距较大的场景。优点:对异常值的惩罚较小,更关注小于 1 的误差,适合衡量增长率或指数变化的预测。缺点:要求预测值和真实值都为非负值。PyTorch 没有内置的 MSLE,但可以通过自定义公式来实现。PyTorch 实现:
def msle_loss(pred, true):
return torch.mean((torch.log(1 + pred) - torch.log(1 + true)) ** 2)
loss = msle_loss(predicted_outputs, true_outputs)
2. 分类任务常用的损失函数
-
交叉熵损失(Cross-Entropy Loss)
-
定义:
适用场景:适用于二分类和多分类任务,常与 Softmax 一起使用。 优点:对概率分布差异敏感,能够有效提高分类准确率。 缺点:对预测概率非常小的数据较为敏感。PyTorch 实现:import torch.nn as nn criterion = nn.CrossEntropyLoss() loss = criterion(predicted_outputs, true_labels)
-
负对数似然损失(Negative Log-Likelihood, NLL Loss)
-
定义:
适用场景:用于多分类任务,特别是在概率分布已知或 Softmax 输出时。 优点:能够直接计算概率分布,提高模型的概率表达能力。 缺点:通常需要配合 Softmax 函数使用。PyTorch 实现:import torch.nn as nn criterion = nn.NLLLoss() log_probs = nn.LogSoftmax(dim=1)(predicted_outputs)#需要先将输出经过 nn.LogSoftmax loss = criterion(log_probs, true_labels)
-
Hinge Loss(合页损失)
-
定义:
适用场景:常用于支持向量机(SVM)等二分类任务。 优点:对分类边界敏感,能够强化边界分类效果。 缺点:仅适用于二分类,且可能导致不可微的问题。PyTorch 没有直接的 Hinge Loss,但可以通过以下公式自定义。PyTorch 实现:def hinge_loss(pred, true): return torch.mean(torch.clamp(1 - pred * true, min=0)) loss = hinge_loss(predicted_outputs, true_labels)
-
二元交叉熵损失(Binary Cross Entropy Loss, BCE)
-
定义:
适用场景:用于二分类任务,尤其适合 Sigmoid 输出的概率值。优点:标准的二分类损失函数,易于理解和实现。缺点:对偏斜数据敏感(类别不均衡时效果不佳),通常需要通过采样或调整权重来应对不平衡问题。PyTorch 实现:
import torch.nn as nn criterion = nn.BCELoss() loss = criterion(sigmoid_outputs, true_labels) # 假设 sigmoid_outputs 已经经过 Sigmoid
-
带 Logits 的二元交叉熵损失(Binary Cross Entropy with Logits, BCEWithLogits)
-
定义:在 BCE 的基础上直接对模型输出进行 Sigmoid 操作,适合未经 Sigmoid 的原始输出(logits)。
适用场景:二分类任务,适合直接使用模型的输出值(未经过 Sigmoid 激活的 logits)。优点:将 Sigmoid 和 BCE 结合在一个函数中,计算更稳定,避免了数值精度问题。缺点:仅适用于二分类任务。PyTorch 实现:
import torch.nn as nn criterion = nn.BCEWithLogitsLoss() loss = criterion(predicted_outputs, true_labels) # predicted_outputs 为 logits
3. 使用方法
- 根据任务类型选择适合的损失函数。回归任务通常使用 MSE 或 MAE,分类任务则多使用交叉熵损失。对于一些复杂任务,可以通过组合多个损失函数来平衡模型效果。
- 在 PyTorch 中,定义损失函数后,只需将模型的预测输出和真实值输入损失函数即可计算损失。
涉及到过拟合、正则化请看这篇文章:
别忘了给这篇文章点个赞哦,非常感谢。我也正处于学习的过程,可能会有错,如果有问题,欢迎在评论区留言讨论,一起学习!