?目录
一、绝对误差损失(L1 Loss、Mean Absolute Error,MAE)
二、均方误差损失(L2 Loss、Mean Squared Error,MSE)
先放一张三种损失函数全家福:
? ? ? ? 1、定义
????????L1 损失 是预测值和真实值之差的绝对值的总和。
其中,是样本数量,?是第 ?个样本的真实值,?是第??个样本的预测值。
? ? ? ? 2、Pytorch 代码
import torch
import torch.nn as nn
y_true = torch.tensor([3.0, 4.0, 5.0])
y_pred = torch.tensor([2.5, 3.5, 5.0])
l1_loss_function = nn.L1Loss()
l1_loss = l1_loss_function(y_pred, y_true)
print("L1 Loss:", l1_loss.item())
? ? ? ? 3、图像
? ? ? ? 4、特点
????????因为它不会对大误差赋予过大的惩罚,对异常值(离群点)包容度较高。
????????产生的损失函数不是处处可导的,这可能会在优化过程中带来挑战。
????????促使模型更加稳健(robust),即不受异常值的影响。
? ? ? ? 1、定义
????????L2 损失?是预测值和真实值之差的平方的总和。
其中,是样本数量,?是第 ?个样本的真实值,?是第??个样本的预测值。
? ? ? ? 2、Pytorch 代码?
import torch
import torch.nn as nn
y_true = torch.tensor([3.0, 4.0, 5.0])
y_pred = torch.tensor([2.5, 3.5, 5.0])
l2_loss_function = nn.MSELoss() # 均方误差损失 (MSE) 是 L2 损失的另一种称呼
l2_loss = l2_loss_function(y_pred, y_true)
print("L2 Loss:", l2_loss.item())
?? ? ? ?3、图像
? ? ? ? 4、特点
? ? ? ? 因为对于较大的误差赋予了更高的惩罚,使得模型倾向于减少较大的误差,但这也可能导致模型对异常值过于敏感。
????????产生的损失函数是平滑且处处可导的,这使得优化算法(如梯度下降)更容易找到最小值。
????????倾向于没有很大波动的解,通常导致在模型预测中的较小差异。?
? ? ? ? 1、定义
????????Huber Loss?是一种用于回归任务的损失函数,它在预测值与目标值之间引入了平滑,相比于均方误差(MSE)对异常值更具鲁棒性。?
?其中,??是第 ?个样本的真实值,?是第??个样本的预测值,是控制平滑范围的阈值。
????????2、Pytorch 代码??
import torch
import torch.nn as nn
class HuberLoss(nn.Module):
def __init__(self, delta=1.0):
super(HuberLoss, self).__init__()
self.delta = delta
def forward(self, y_true, y_pred):
diff = torch.abs(y_true - y_pred)
loss = torch.where(diff < self.delta, 0.5 * diff ** 2, self.delta * (diff - 0.5 * self.delta))
return torch.mean(loss)
# 示例
delta_value = 1.0
criterion = HuberLoss(delta=delta_value)
# 创建一些示例数据
y_true = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
y_pred = torch.tensor([0.9, 2.5, 3.5], requires_grad=True)
# 计算损失
loss = criterion(y_true, y_pred)
# 打印结果
print("Huber Loss:", loss.item())
????????3、图像?
????????Huber Loss 在 x 的小值(在此示例中,阈值?delta
?设置为 1.0)时表现为一个抛物线(类似于 L2 损失),而在大值时变成线性(类似于 L1 损失)。?
????????4、特点
????????结合了 L1 和 L2 损失特点的设计,使得 Huber Loss 对于异常值不那么敏感。
????????引入了一个可调参数?,可以更灵活地适应不同数据集的特性。
????????在预测值与目标值接近时表现得像均方误差,具有较强的平滑性。而在较远的情况下表现得像绝对误差,保持了一定的敏感性,有助于防止过拟合。
? ? ? ? 1、对比 L1 损失和 L2 损失
????????对异常值的敏感性: L1 损失对异常值更敏感。它试图减少预测值和真实值之间差异的绝对值,使得模型对异常值更加敏感。而 L2 损失通过平方差减少异常值的影响。
????????优化难度: L1 损失可能导致优化问题,在损失函数的绝对值点上不可导。而 L2 损失因为处处可导,通常在数学上更易于处理。
????????结果特性: L1 损失通常导致更稀疏的结果,这在某些情况下是有益的,比如特征选择。L2 损失则倾向于更平滑的解决方案。
????????总结来说,选择 L1 损失还是 L2 损失取决于具体的应用场景和对异常值的敏感度。在某些情况下,将两者结合使用(如 Elastic Net 回归)可能会产生更好的结果。
? ? ? ? 2、为何使用Huber损失函数?
????????使用MAE用于训练神经网络的一个大问题就是,如下图左半部分所示,它的梯度始终很大,这会导致使用梯度下降训练模型时,在结束时遗漏最小值。对于MSE,如下图右半部分所示,梯度会随着损失值接近其最小值逐渐减少,从而使其更准确。
????????在这些情况下,Huber损失函数真的会非常有帮助,因为它围绕的最小值会减小梯度。而且相比MSE,它对异常值更具鲁棒性。因此,它同时具备MSE和MAE这两种损失函数的优点。不过,Huber损失函数也存在一个问题,我们可能需要训练超参数δ,而且这个过程需要不断迭代。?
? ? ? ? 3、L1损失 L2损失 Huber损失成立的先验假设?
????????这三个 loss 是回归任务中最直观也是最常见的 loss,前两者都假设了误差服从某种特定分布,然后通过最大似然估计(MLE)确定最终的 loss 形式,huber 则是前两种 loss 的混合版本。
????????MSE 其假设是预估值和真实值的误差服从标准高斯分布,然后写出误差的似然 (likelihood) 函数,并通过最大似然估计推导出来最终的 loss 的形式。
? ? ? ? MAE 的推导跟 MSE 很类似,只是假设误差服从拉普拉斯分布。?
? ? ? ? 这部分内容想深入探讨请移步传送门:回归任务里的损失函数 - 知乎 (zhihu.com)?(初学者不建议,内容复杂)
更多内容请查阅我另一篇博客:
文章链接:
回归损失函数:Huber Loss_huber函数-CSDN博客
高斯分布:
高斯分布(也称为正态分布)的概率密度函数(PDF)是用来描述正态分布的特性的重要公式。
?
其中,?是随机变量??的期望,?是方差,而??是标准差??。