损失函数总结(十一):Huber Loss、SmoothL1Loss

2023-11-01 11:20

本文主要是介绍损失函数总结(十一):Huber Loss、SmoothL1Loss,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

损失函数总结(十一):Huber Loss、SmoothL1Loss

  • 1 引言
  • 2 损失函数
    • 2.1 Huber Loss
    • 2.2 SmoothL1Loss
  • 3 总结

1 引言

在前面的文章中已经介绍了介绍了一系列损失函数 (L1LossMSELossBCELossCrossEntropyLossNLLLossCTCLossPoissonNLLLossGaussianNLLLossKLDivLossBCEWithLogitsLossMarginRankingLossHingeEmbeddingLossMultiMarginLossMultiLabelMarginLossSoftMarginLossMultiLabelSoftMarginLossTripletMarginLossTripletMarginWithDistanceLoss)。在这篇文章中,会接着上文提到的众多损失函数继续进行介绍,给大家带来更多不常见的损失函数的介绍。这里放一张损失函数的机理图:
在这里插入图片描述

2 损失函数

2.1 Huber Loss

MSE 损失收敛快但容易受 outlier 影响,MAE 对 outlier 更加健壮但是收敛慢Huber Loss 则是一种将 MSE 与 MAE 结合起来,取两者优点的损失函数,也被称作 Smooth Mean Absolute Error Loss 。其原理很简单,就是在误差接近 0 时使用 MSE,误差较大时使用 MAE。Huber Loss的数学表达式如下:
l ( x , y ) = L = { l 1 , . . . , l N } T l(x, y) = L = \{l_1, ..., l_N\}^T l(x,y)=L={l1,...,lN}T

其中,
l n = { 0.5 ( x n − y n ) 2 , i f ∣ x n − y n ∣ < d e l t a d e l t a ∗ ( ∣ x n − y n ∣ − 0.5 ∗ d e l t a ) , o t h e r w i s e l_n = \left\{\begin{matrix} 0.5(x_n-y_n)^2, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if \ |x_n-y_n|<delta \\ delta*(|x_n-y_n| - 0.5*delta), \ \ \ \ \ \ \ \ \ \ \ otherwise \end{matrix}\right. ln={0.5(xnyn)2,                         if xnyn<deltadelta(xnyn0.5delta),           otherwise

注意:当 d e l t a = 1 delta=1 delta=1 时,该损失函数等价于SmoothL1Loss。

代码实现(Pytorch):

import numpy as np
# 观测值
y = np.array([2.5, 3.7, 5.1, 4.2, 6.8])
# 模型预测值
f_x = np.array([2.2, 3.8, 4.9, 4.5, 7.2])
# 设置Huber损失的超参数
delta = 1.0
# 计算Huber损失
def huber_loss(y, f_x, delta):loss = np.where(np.abs(y - f_x) <= delta, 0.5 * (y - f_x) ** 2, delta * np.abs(y - f_x) - 0.5 * delta ** 2)
return loss
loss = huber_loss(y, f_x, delta)
print("Huber Loss for each data point:", loss)
print("Mean Huber Loss:", np.mean(loss))

由于存在一个需要迭代的超参数 d e l t a delta delta, 因此在深度学习领域还是MSE等简单损失函数占据独特优势。

2.2 SmoothL1Loss

论文链接:Fast R-CNN

SmoothL1Loss 是一种常用于回归任务的损失函数,是 L1Loss 的平滑版本。相比于L1Loss(MAELoss),SmoothL1Loss 可以收敛得更快;相比于L2Loss(MSELoss),SmoothL1Loss 对离群点、异常值不敏感,梯度变化相对更小,训练时不容易跑飞。SmoothL1Loss 的数学表达式如下:
l n = { 0.5 ( x n − y n ) 2 / b e t a , i f ∣ x n − y n ∣ < b e t a ∣ x n − y n ∣ − 0.5 ∗ b e t a , o t h e r w i s e l_n = \left\{\begin{matrix} 0.5(x_n-y_n)^2/beta, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ if \ |x_n-y_n|<beta\\ |x_n-y_n| - 0.5*beta, \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ \ otherwise \end{matrix}\right. ln={0.5(xnyn)2/beta,                         if xnyn<betaxnyn0.5beta,                                    otherwise

  • beta:指定该损失在 L 1 ∼ L 2之间变化的阈值,默认为1.0。

代码实现(Pytorch):

import torch.nn as nn
import torchloss1 = nn.SmoothL1Loss(reduction='none')
loss2 = nn.SmoothL1Loss(reduction='mean')y = torch.randn(3)
y_pred = torch.randn(3)
loss_value1 = loss1(y, y_pred)
loss_value2 = loss2(y, y_pred)print(y)   # tensor([ 1.6938, -0.3617, -1.2738])
print(y_pred)   # tensor([ 0.3932,  0.8715, -0.2410])
print(loss_value1)   # tensor([0.8007, 0.7332, 0.5328])
print(loss_value2)   # tensor(0.6889)

超参数会限制损失函数的训练速度,整体而言可能还是 MSELoss 更好用。。。。

3 总结

到此,使用 损失函数总结(十一) 已经介绍完毕了!!! 如果有什么疑问欢迎在评论区提出,对于共性问题可能会后续添加到文章介绍中。如果存在没有提及的损失函数也可以在评论区提出,后续会对其进行添加!!!!

如果觉得这篇文章对你有用,记得点赞、收藏并分享给你的小伙伴们哦😄。

这篇关于损失函数总结(十一):Huber Loss、SmoothL1Loss的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/322589

相关文章

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Python实现图片分割的多种方法总结

《Python实现图片分割的多种方法总结》图片分割是图像处理中的一个重要任务,它的目标是将图像划分为多个区域或者对象,本文为大家整理了一些常用的分割方法,大家可以根据需求自行选择... 目录1. 基于传统图像处理的分割方法(1) 使用固定阈值分割图片(2) 自适应阈值分割(3) 使用图像边缘检测分割(4)

Windows Docker端口占用错误及解决方案总结

《WindowsDocker端口占用错误及解决方案总结》在Windows环境下使用Docker容器时,端口占用错误是开发和运维中常见且棘手的问题,本文将深入剖析该问题的成因,介绍如何通过查看端口分配... 目录引言Windows docker 端口占用错误及解决方案汇总端口冲突形成原因解析诊断当前端口情况解

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

MySQL高级查询之JOIN、子查询、窗口函数实际案例

《MySQL高级查询之JOIN、子查询、窗口函数实际案例》:本文主要介绍MySQL高级查询之JOIN、子查询、窗口函数实际案例的相关资料,JOIN用于多表关联查询,子查询用于数据筛选和过滤,窗口函... 目录前言1. JOIN(连接查询)1.1 内连接(INNER JOIN)1.2 左连接(LEFT JOI

MySQL中FIND_IN_SET函数与INSTR函数用法解析

《MySQL中FIND_IN_SET函数与INSTR函数用法解析》:本文主要介绍MySQL中FIND_IN_SET函数与INSTR函数用法解析,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一... 目录一、功能定义与语法1、FIND_IN_SET函数2、INSTR函数二、本质区别对比三、实际场景案例分

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

C语言函数递归实际应用举例详解

《C语言函数递归实际应用举例详解》程序调用自身的编程技巧称为递归,递归做为一种算法在程序设计语言中广泛应用,:本文主要介绍C语言函数递归实际应用举例的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录前言一、递归的概念与思想二、递归的限制条件 三、递归的实际应用举例(一)求 n 的阶乘(二)顺序打印