损失函数的选择

损失函数:

输入输出如下:用神经网络回归,检验损失函数性能。

sample = 3000
X1 = np.zeros((sample, 1))
X1[:, 0] = np.random.normal(1, 1, sample)
X2 = np.zeros((sample, 1))
X2[:, 0] = np.random.normal(2, 1, sample)
X3 = np.zeros((sample, 1))
X3[:, 0] = np.random.normal(3, 1, sample)
Y1 = X1 * X2 - X3 * X1 + X3 * X2

输出:
在这里插入图片描述

均方误差损失函数(MSE)

左图
左图为损失值随迭代次数变化情况

右图横坐标为实际值,纵坐标为预测值,绘制散点图,越靠近y=x曲线说明回归算法越好

  1. 对异常值敏感:MSE损失函数的计算涉及到误差的平方,因此它对异常值(outliers)非常敏感。即使只有少数几个异常数据点,也可能导致整体损失显著增加,从而影响模型的学习。

  2. 误差的非线性:MSE损失函数是误差的二次函数,这意味着它对误差的大小有不同的敏感度。例如,当误差从0.1变为0.2时,损失的增加量与误差从0.9变为1.0时的增加量是不同的。这种非线性可能导致模型在误差较小或较大时的学习不均衡。

  3. 优化困难:在某些情况下,MSE损失函数可能不是处处可微的,特别是在误差为零时。这可能导致基于梯度的优化算法(如梯度下降)难以找到全局最小值,有时可能会陷入局部最小值。

  4. 不满足某些误差分布:在某些情况下,数据的误差可能不满足正态分布或具有等方差性。在这些情况下,使用MSE作为损失函数可能不是最佳选择,因为它假设误差是独立同分布的。

  5. 过拟合风险:由于MSE倾向于减少所有误差,包括异常值,这可能导致模型过度拟合到训练数据中的噪声,从而降低模型在新数据上的泛化能力。

对异常值不那么敏感的损失函数通常是指那些在计算误差时不会过分惩罚远离真实值的点的函数。在机器学习中,这样的损失函数包括:

平均绝对误差(Mean Absolute Error, MAE)。

MAE计算预测值与真实值之间差的绝对值的平均,它对异常值具有较好的鲁棒性,因为即使误差较大,其影响也是有限的,不会导致损失值急剧增加。

def mae_loss(output, target):
    return torch.mean(torch.abs(output - target))

# 使用自定义的MAE损失函数
loss = mae_loss(y_pred, y_true)

在这里插入图片描述

Smooth L1 Loss(平滑L1损失)。

这是一种结合了L1和L2损失函数优点的损失函数,它在误差较小的时候表现得像L2损失(平方误差),而在误差较大时则表现得像L1损失(绝对误差)。这种特性使得Smooth L1 Loss在处理异常值时比纯粹的L2损失更加鲁棒。

criterion = nn.SmoothL1Loss()
loss = criterion(y_pred, y_true)

在这里插入图片描述
似乎和上面差不多,好像效果比上面还差一些。。

Huber损失函数。

Huber 损失是 L1 损失和 L2 损失的结合体,对于较小的误差,它表现得像 L2 损失(均方误差),而对于较大的误差,它表现得像 L1 损失(绝对值误差)。

criterion = nn.HuberLoss(delta=1.0)  # delta 参数控制平滑程度
loss = criterion(y_pred, y_true)

在这里插入图片描述
这个效果不错

delta如何设置?

在 nn.HuberLoss 中,delta 参数(通常表示为 δ 或 d)是用于控制损失函数从 L1 损失到 L2 损失转换的阈值。具体来说,当误差(预测值与真实值之间的差异)小于 delta 时,Huber 损失函数表现得像 L2 损失;当误差大于 delta 时,它表现得像 L1 损失。例如,如果在初始化 Huber 损失函数时设置了 delta=1.0,这意味着当误差小于 1.0 时,损失函数将主要关注预测的精确度;当误差大于 1.0 时,损失函数将更加稳健,减少异常值的影响。

delta 的选择取决于具体的应用场景和数据集。如果数据中包含较多的异常值或噪声,可以选择一个较大的 delta 值,使得损失对异常值不那么敏感。相反,如果数据较为干净,可以选择一个较小的 delta 值,以便更关注预测的精确度。

在实际应用中,delta 的常见取值范围从 0.1 到 2.0 不等,但并没有固定的标准,需要根据具体情况进行调整。可以通过交叉验证、实验或基于经验的方法来确定最佳的 delta 值。

总结

这些损失函数的选择取决于具体的应用场景和数据特性。例如,如果数据中包含较多的异常值或者噪声,那么使用MAE或Smooth L1 Loss可能更为合适。如果需要在误差较小的情况下保持较高的精度,同时在误差较大时减少对模型训练的影响,那么Huber损失函数可能是一个好的选择。

[注]:Huber和Smooth L1 Loss区别

听起来Huber似乎和Smooth L1 Loss差不多

Smooth L1 Loss和Huber Loss都是用于回归问题的损失函数,它们旨在提供比传统的均方误差(MSE)损失函数更好的鲁棒性,特别是在存在异常值的情况下。尽管它们的目标相似,但两者在数学形式和特性上有所不同。

Huber Loss
Huber Loss是为了减少异常值对损失的影响而设计的。它结合了L1 Loss(绝对值损失)和L2 Loss(平方损失)的特点。Huber Loss的定义如下:

L δ ( y , y ^ ) = { 1 2 ( y − y ^ ) 2 for  ∣ y − y ^ ∣ ≤ δ , δ ( ∣ y − y ^ ∣ − 1 2 δ ) otherwise. L_{\delta}(y, \hat{y}) = \begin{cases} \frac{1}{2}(y - \hat{y})^2 & \text{for } |y - \hat{y}| \le \delta, \\ \delta(|y - \hat{y}| - \frac{1}{2}\delta) & \text{otherwise.} \end{cases} Lδ(y,y^)={21(yy^)2δ(yy^21δ)for yy^δ,otherwise.

其中, y y y是真实值, y ^ \hat{y} y^是预测值, δ \delta δ是一个预先设定的阈值,用于控制损失函数从L2 Loss过渡到L1 Loss的点。当误差小于 δ \delta δ时,Huber Loss表现得像L2 Loss,当误差大于 δ \delta δ时,它表现得像L1 Loss。

Smooth L1 Loss
Smooth L1 Loss是Huber Loss的一个变体,它在整个定义域内都是可微的,因此更适合于基于梯度的优化算法。Smooth L1 Loss的定义如下:

L δ ( y , y ^ ) = { 0.5 ⋅ ( y − y ^ ) 2 for  ∣ y − y ^ ∣ < 1 , ∣ y − y ^ ∣ − 0.5 otherwise. L_{\delta}(y, \hat{y}) = \begin{cases} 0.5 \cdot (y - \hat{y})^2 & \text{for } |y - \hat{y}| < 1, \\ |y - \hat{y}| - 0.5 & \text{otherwise.} \end{cases} Lδ(y,y^)={0.5(yy^)2yy^0.5for yy^<1,otherwise.

Smooth L1 Loss在误差小于1时使用L2 Loss,当误差大于1时,损失函数的梯度变为一个常数,这意味着它在误差较大时表现得像L1 Loss。这种设计使得Smooth L1 Loss在处理异常值时更加鲁棒,并且在整个定义域内都保持可微性,简化了优化过程。

区别

  1. 可微性:Smooth L1 Loss在整个定义域内都是可微的,而Huber Loss在误差等于( \delta )时不可微。
  2. 阈值:Huber Loss使用( \delta )作为误差的阈值,而Smooth L1 Loss使用1作为阈值。
  3. 平滑性:Smooth L1 Loss在误差从0到1的过渡中更加平滑,而Huber Loss在这个区间内有一个明显的“肘点”。
  4. 实现:由于Smooth L1 Loss在所有情况下都是可微的,它在实现和优化时可能更简单,因为它避免了处理不可微点的问题。

在实际应用中,选择哪种损失函数取决于具体的问题和数据特性。两者都提供了对异常值的鲁棒性,但在某些情况下,Smooth L1 Loss可能因其可微性和平滑性而更受青睐。

  • 23
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值