【学习】L1 loss 和 L2 loss

转载自:https://zhuanlan.zhihu.com/p/48426076?utm_source=com.tencent.tim&utm_medium=social&utm_oi=1050165363714682880

对于大多数CNN网络,我们一般是使用L2-loss而不是L1-loss,因为L2-loss的收敛速度要比L1-loss要快得多。

对于边框预测回归问题,通常也可以选择平方损失函数(L2损失),但L2范数的缺点是当存在离群点(outliers)的时候,这些点会占loss的主要组成部分。比如说真实值为1,预测10次,有一次预测值为1000,其余次的预测值为1左右,显然loss值主要由1000主宰。所以FastRCNN采用稍微缓和一点绝对损失函数(smooth L1损失),它是随着误差线性增长,而不是平方增长。

注意:smooth L1和L1-loss函数的区别在于,L1-loss在0点处导数不唯一,可能影响收敛。smooth L1的解决办法是在0点附近使用平方函数使得它更加平滑。

公式比较

L2 loss

\begin{equation} \begin{array}{lc}  L_2=\left| f(x)-Y \right|^2 \\ L_2^{'}= 2f^{'} (x)(f(x)-Y) \end{array} \end{equation}   ……………………………………………… (1)

 

L1 loss

\begin{equation} \begin{array}{lc}  L_1=\left| f(x)-Y \right| \\ L_1^{'}= \pm f^{'}(x) \end{array} \end{equation}   ……………………………………………… (2)

Smooth L1 loss

\begin{equation} \begin{array}{lc}  Smooth\quad L_1=  \begin{array}{lc}  0.5 x^2, \quad\left| x \right|<1 \\ \left| x \right|-0.5, \quad x<-1 \, or \, x>1 \end{array} \\ \\ Smooth\quad L_1^{'}= \begin{array}{lc}   x, \quad \left| x \right|<1 \\ -1, \quad x<-1 \\ 1, \quad x>1 \end{array}  \end{array} \end{equation} ………………………… (3)

 

Smooth L1 vs L2


根据fast rcnn的说法,"...... L1 loss that is less sensitive to outliers than the L2 loss used in R-CNN and SPPnet." 也就是smooth L1 loss让loss对于离群点更加鲁棒,即:相比于L2损失函数,其对离群点、异常值(outlier)不敏感,梯度变化相对更小,训练时不容易跑飞。

### 定义 #### L1 Loss (绝对误差损失) L1 Loss 表示预测值与实际值之间差异的绝对值总。对于单个样本而言,其计算方式如下: \[ \text{L1 Loss} = |y_{\text{pred}} - y_{\text{true}}| \] 其中 \( y_{\text{pred}} \) 是模型给出的预测结果,\( y_{\text{true}} \) 则代表真实的标签值。 在多维情况下,则是对所有维度上的差取绝对值得到向量后再求[^1]。 ```python import torch.nn as nn criterion_l1 = nn.L1Loss() output = criterion_l1(torch.tensor([0.8]), torch.tensor([1.0])) print(output.item()) ``` #### L2 Loss (均方误差损失) L2 Loss 计算的是预测值与目标值之间的平方差平均数,在数学上也被称为欧几里得距离或欧式距离。具体表达式为: \[ \text{L2 Loss} = (y_{\text{pred}} - y_{\text{true}})^2 \] 同样地,在处理多个特征时会先逐元素相减并平方之后再累加起来除以样本数量得到最终的结果[^2]。 ```python import torch.nn.functional as F def mse_loss(input, target): return F.mse_loss(input, target) output = mse_loss(torch.tensor(0.9), torch.tensor(1.0)) print(output.item()) ``` ### 区别 - **对离群点敏感程度不同**: L2 Loss 对于较大的残差更加敏感,因为它是基于二次幂运算;而 L1 Loss 只考虑绝对偏差大小,因此相对更稳健一些,不易受到极端数据的影响[^3]。 - **导数特性有异**: 当接近最优解附近时,由于 L2 Loss 函数曲线较为平坦,所以能够提供较小但持续存在的梯度来帮助优化过程收敛;相反,L1 Loss 在零处不可微分,这可能导致某些算法难以有效工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值