深度学习中常见的损失函数(L1Loss、L2loss)

损失函数定义

损失函数:衡量模型输出与真实标签的差异。

L1_loss  

        平均绝对误差(L1 Loss):平均绝对误差(Mean Absolute Error,MAE)是指模型预测值f(x)和真实值y之间距离的平均值,公式如下:

  • 优点:无论对于什么样的输入值,都有着稳定的梯度,不会导致梯度爆炸问题,具有较为稳健性的解
  • 缺点:在中心点是折点,不能求导,梯度下降时要是恰好学习到w=0就没法接着进行了

 L2_loss

         均方误差MSE(L2 LOSS):均方误差(Mean Square Error,MSE)是模型预测值f(x)和样本真实值y之间差值平方的平均值,公式如下:

  • 优点:各点都连续光滑,方便求导,具有较为稳定的解
  • 缺点:不是特别的稳健,因为当函数的输入值距离真实值较远的时候,对应loss值很大在两侧,则使用梯度下降法求解的时候梯度很大,可能导致梯度爆炸

L1_loss 和L2_loss的区别

            L1_loss在零点不平滑,用的较少。一般来说,L1正则会制造稀疏的特征,大部分无用的特征的权重会被置为0。(适合回归任务,简单的模型,由于神经网络通常解决复杂问题,很少使用。)

        L2 loss:对离群点比较敏感,如果feature是unbounded的话,需要好好调整学习率,防止出现梯度爆炸的情况。l2正则会让特征的权重不过大,使得特征的权重比较平均。

(适合回归任务,数值特征不大,问题维度不高)

         L1 Loss和L2 Loss都有缺点,那么如何解决这一问题呢?所以大神们就提出了 Smooth L1 Loss。

 Smooth L1 Loss

平滑版本的L1 LOSS

        从公式中我们可以看出,当预测值f(xi)和真实值yi差别较小的时候(绝对值差小于1),其实使用的是L2 loss;差别大的时候,使用的是L1 loss的平移。因此,Smooth L1 loss其实是L1 loss 和L2 loss的结合,同时拥有两者的部分优点: 

  1. 真实值和预测值差别较小时(绝对值差小于1),梯度也会比较小(损失函数比普通L1 loss在此处更圆滑),可以收敛得更快。
  2. 真实值和预测值差别较大时,梯度值足够小(普通L2 loss在这种位置梯度值就很大,容易梯度爆炸)

三者区别 

(1)L1 loss在零点不平滑,此处不可导,所以在w=0时没法接着梯度下降了,用的少
(2)L2 loss对离群点比较敏感,离群点处的梯度很大,容易梯度爆炸
(3)smooth L1 loss结合了L1和L2的优点,修改了零点不平滑问题,且比L2 loss对异常值的鲁棒性更强

<think>好的,我现在需要回答用户关于L1Loss函数的定义、用法和实现的问题,特别是PyTorch和TensorFlow中的实现。首先,我需要回顾一下相关的知识,并参考用户提供的引用内容,确保回答准确。 首先,L1Loss的定义。根据引用[5],L1Loss是平均绝对误差(MAE),计算预测值和真实值之间绝对差的平均值。数学表达式应该是$L = \frac{1}{n}\sum_{i=1}^n |y_i - \hat{y}_i|$。用户提供的引用中有PyTorch的例子,比如inputs和targets的差值绝对值取平均,如引用[1]中的例子得到0.6667,即(0+0+2)/3。 接下来是用法部分。在PyTorch中,引用[1]和[3]提到使用torch.nn.L1Loss,可以设置reduction参数为'mean'(默认,求平均)或'sum'(求和)。例如,当reduction='sum'时,结果是绝对值之和。在TensorFlow中,可能需要用tf.keras.losses.MeanAbsoluteError或者手动计算。引用[4]提到了Actor-Critic的实现,但这里可能不太相关,不过需要确认TensorFlow的实现方式。 实现部分,用户提供的引用中有PyTorch的代码示例,如引用[2]中的自定义L1Loss函数,以及官方nn.L1Loss的使用。对于TensorFlow,虽然没有直接示例,但可以类比,使用tf.reduce_mean(tf.abs(y_true - y_pred))。 需要确保回答结构清晰,分定义、PyTorch用法、TensorFlow用法、手动实现,以及注意事项。同时,生成相关问题,如应用场景、与L2的区别、处理异常值等。 检查是否有遗漏点,比如L1Loss的优缺点,如对异常值的鲁棒性,梯度问题。引用[5]提到这些点,应该包含进去。 最后,按照用户的要求,使用正确的LaTeX格式,行内公式用$...$,独立公式用$$...$$,并确保引用标识正确添加。比如在PyTorch代码示例后的解释部分,引用[1]和[3]。 现在组织内容,确保每个部分有引用支持,并且覆盖定义、用法、实现、注意事项,以及相关问题。</think>### L1Loss函数详解 #### 一、定义与数学公式 L1Loss(平均绝对误差,MAE)用于衡量预测值与真实值之间的绝对差异。其数学定义为: $$ L = \frac{1}{n}\sum_{i=1}^n |y_i - \hat{y}_i| $$ 其中,$y_i$为真实值,$\hat{y}_i$为预测值,$n$为样本数量。L1Loss对异常值不敏感,适用于需要鲁棒性的回归任务[^5]。 --- #### 二、PyTorch实现 **1. 官方API** PyTorch通过`torch.nn.L1Loss`实现,支持以下参数: - `reduction`: 控制输出形式,可选`'mean'`(默认,求平均)、`'sum'`(求和)或`'none'`(保留原始差值)[^3]。 **示例代码**: ```python import torch from torch.nn import L1Loss # 数据准备 inputs = torch.tensor([1, 2, 3], dtype=torch.float32) targets = torch.tensor([1, 2, 5], dtype=torch.float32) loss_fn = L1Loss() # 计算损失 result = loss_fn(inputs, targets) print(result) # 输出:tensor(0.6667) 计算过程:(0+0+2)/3 ``` **2. 手动实现** 可自定义L1Loss函数: ```python def L1Loss(y_pred, y_true): return torch.mean(torch.abs(y_pred - y_true)) ``` --- #### 三、TensorFlow实现 **1. 官方API** TensorFlow使用`tf.keras.losses.MeanAbsoluteError`: ```python import tensorflow as tf # 定义损失函数 loss_fn = tf.keras.losses.MeanAbsoluteError() # 计算损失 y_true = tf.constant([1.0, 2.0, 5.0]) y_pred = tf.constant([1.0, 2.0, 3.0]) loss = loss_fn(y_true, y_pred) print(loss.numpy()) # 输出:0.6666667 ``` **2. 手动实现** 直接通过Tensor运算: ```python def l1_loss(y_true, y_pred): return tf.reduce_mean(tf.abs(y_true - y_pred)) ``` --- #### 四、关键特性与注意事项 1. **鲁棒性**:L1Loss对异常值的敏感度低于L2Loss(均方误差),因为绝对值函数对较大误差的惩罚增长较慢[^5]。 2. **梯度特性**:在零点处不可导,优化时可能导致震荡,需调整学习率[^5]。 3. **适用场景**:回归任务、数据含异常值、需要稀疏解的情况。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值