损失函数之-----L1 loss和L2 loss和smooth L1 loss -----用于回归任务

1. L1 loss:

公式和求导公式:

(带绝对值求导时,先去掉绝对值符号,再分情况求导)

                                                            

一个batch的形式:

L1 loss 图形和求导图形如下:

图的底部是预测值和label的差值。 我们可以看到L1 loss的底部是尖的。底部是不存在导数的。而在其他地方,导数大小都是一样的。

优缺点:

优点:

1. L1 loss的鲁棒性(抗干扰性)比L2 loss强。概括起来就是L1对异常点不太敏感,而L2则会对异常点存在放大效果。因为L2将误差平方化,当误差大于1时,误会会放大很多,所以使用L2 loss的模型的误差会比使用L1 loss的模型对异常点更敏感。如果这个样本是一个异常值,模型就需要调整以适应单个的异常值,这会牺牲许多其它正常的样本,因为这些正常样本的误差比这单个的异常值的误差小。如果异常值对研究很重要,最小均方误差则是更好的选择。

缺点:

1. L1 loss 对 x(损失值)的导数为常数,在训练后期,x较小时,若学习率不变,损失函数会在稳定值附近波动,很难收敛到更高的精度。

2. L2 loss的稳定性比L1 loss好。概括起来就是对于新数据的调整,L1的变动很大,而L2的则整体变动不大。

 

2. L2 loss:

公式和求导公式:

一个batch的形式:

L2 loss图形和求导图像如下:

缺点:

从L2 loss的图像可以看到,图像(上图左边红线)的每一点的导数都不一样的,离最低点越远,梯度越大,使用梯度下降法求解的时候梯度很大,可能导致梯度爆炸

L1 loss一般用于简单的模型,但由于神经网络一般是解决复杂的问题,所以很少用L1 loss,例如对于CNN网络,一般使用的是L2-loss,因为L2-loss的收敛速度比L1-loss要快。如下图:

 

3. Smooth L1 loss

计算公式与求导公式:

一个batch(n个)数据时:

smooth L1 loss的图如下:

仔细观察可以看到,当预测值和ground truth差别较小的时候(绝对值差小于1),其实使用的是L2 Loss,当绝对值差小于1时,由于L2会对误差进行平方,因此会得到更小的损失,有利于模型收敛。而当差别大的时候,是L1 Loss的平移,因此相比于L2损失函数,其对离群点(指的是距离中心较远的点)、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞。。SooothL1Loss其实是L2Loss和L1Loss的结合,它同时拥有L2 Loss和L1 Loss的部分优点。

<think>嗯,用户想了解Smooth L1 Loss的参数用法,我需要先回忆一下相关的知识。记得Smooth L1 Loss是结合了L1L2损失的优点,在目标检测中常用,比如Faster R-CNN。参数方面,PyTorch里的SmoothL1Loss有几个参数,比如size_average、reduce、beta等。用户可能需要知道每个参数的作用,以及如何调整它们。 首先,我应该检查引用资料里的信息。引用[3]提到了Smooth L1 Loss的函数定义应用示例,里面可能涉及参数设置。引用[4]讨论了L1L2的优缺点,以及Smooth L1如何结合两者,这可能帮助解释应用场景。 用户的问题包括参数详解应用场景,所以需要分两部分回答。参数部分需要解释每个参数的作用,比如beta控制过渡区间的大小,reducesize_average影响损失计算的方式。应用场景方面,目标检测是主要的,特别是处理离群点的情况,还有需要平衡梯度稳定收敛的情况。 要注意使用正确的LaTeX格式,比如数学表达式用$...$。例如,Smooth L1的公式需要正确展示,分段函数用cases环境。还要确保参数说明清晰,可能用列表或编号的方式。 另外,用户提供的引用中有示例代码,可以引用到参数用法的部分,比如beta的设置如何影响损失函数形状。还要注意引用标识的正确添加,比如在提到梯度稳定时引用[2][4]。 现在需要组织信息:先介绍Smooth L1 Loss的定义公式,然后参数详解,每个参数的作用默认值,接着应用场景,最后示例代码。可能还需要生成相关问题,比如与其他损失函数的比较,参数调整的影响等。 需要确认PyTorch中SmoothL1Loss的参数是否有变化,比如是否beta是后来加入的,或者是否有默认值。根据引用[3]的代码示例,可能函数定义时没有显式设置beta,但实际现在PyTorch的文档中可能有beta参数,默认1.0。需要核对正确性。 最后,确保回答结构清晰,分点说明,符合用户要求的格式,同时自然引用文献。</think>### Smooth L1 Loss 参数详解及应用场景 #### 一、Smooth L1 Loss 定义 Smooth L1 Loss 结合了 L1 Loss L2 Loss 的优点,其数学定义为: $$ \text{Smooth L1}(x) = \begin{cases} 0.5x^2 / \beta & \text{if } |x| < \beta \\ |x| - 0.5\beta & \text{otherwise} \end{cases} $$ 其中 $x$ 是预测值与真实值的差值,$\beta$ 是控制平滑区间范围的参数[^2][^4]。 --- #### 二、参数详解(以 PyTorch 为例) 在 PyTorch 中,`torch.nn.SmoothL1Loss` 的主要参数如下: 1. **`beta`**(默认值:1.0) - **作用**:控制损失函数从二次函数(L2)过渡到线性函数(L1)的阈值。 - **调整效果**:$\beta$ 越大,平滑区间范围越宽;$\beta \to 0$ 时趋近于 L1 Loss2. **`reduction`**(默认值:`'mean'`) - 可选值:`'none'`(不降维)、`'mean'`(取均值)、`'sum'`(求)。 - **示例**:若输入为 $N$ 个样本,`reduction='mean'` 会计算所有样本损失的平均值。 3. **`size_average` `reduce`** - 旧版本兼容参数,建议优先使用 `reduction` 参数[^3]。 --- #### 三、应用场景 1. **目标检测**(如 Faster R-CNN) - **原因**:对边界框回归任务Smooth L1 Loss 能抑制离群点(outliers)的梯度爆炸问题,同时保持对小误差的敏感性[^4]。 2. **需平衡梯度稳定性的场景** - 当数据中存在噪声或离群点时,Smooth L1 Loss 比 L2 Loss 更鲁棒;相比 L1 Loss,它在小误差区域提供更平滑的梯度。 3. **动态学习任务** - 例如:在训练初期使用较大 $\beta$ 加速收敛,后期调小 $\beta$ 以提高精度。 --- #### 四、代码示例(PyTorch) ```python import torch import torch.nn as nn # 定义参数 beta = 0.5 # 调整平滑区间 loss_fn = nn.SmoothL1Loss(beta=beta, reduction='mean') # 生成数据 y_hat = torch.randn(10, requires_grad=True) # 预测值 y = torch.randn(10) # 真实值 # 计算损失 loss = loss_fn(y_hat, y) print(loss) ``` 此代码展示了如何通过调整 $\beta$ 控制损失函数的形状。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值