常见损失函数Loss Function的选择(regression problem)

news2024/9/20 0:57:20

损失函数Loss Function的设计是机器学习模型的核心问题,一般情况下函数式子会分成两项:衡量预估值和目标间的差距L(y_i, f_{\theta}(x_i))、正则项式R(\theta )。其中正则项式子一般用于衡量模型的复杂度,可以避免模型过拟合(奥卡姆剃刀原理)。

\min\sum L(y_i, f_{\theta}(x_i)) + \lambda R(\theta )

另一部分衡量预估值和目标间差距的函数,是本文所重点介绍的,比如MSE损失函数用于预估值与目标值的均方误差,在实际情景中,这部分的损失函数可能包含从多种方面反映预估同目标差距的组合,比如存在多个目标的情况。另一种情况是包含反映某些中间结构偏离的损失,但这种中间结果偏离一般不建议直接引入损失函数中,多数学者认为损失函数应只包含预测同目标直接相关的损失,中间结果的偏离损失(从先验知识中得到的)应该通过正则项引入。

本文将主要介绍回归类问题的常见损失函数,在实际工业场景中,很难直接认为某种损失函数更好,而是结合自身模型和目标的实际,去设计合适的损失函数(不一定是如下的几种)能精确衡量预测同目标的差距,更重要的是能帮忙模型去正确学习。

1. MSE损失函数

图片来源参考文献1

MSE损失函数又被称为平方损失square loss,或者L2损失,其定义为: 

L_{MSE}(y_i,f_{\theta }(x_i))=(y_i - f_{\theta }(x_i))^2

当在mini-batch中,计算batch的损失时,一般有两种方式(mean或sum),下式中n表示mini-batch的size。

L=\left\{\begin{matrix} \frac{1}{n}\sum_i^nL_{MSE}(y_i, f_{\theta }(x_i))\\ \sum_i^nL_{MSE}(y_i, f_{\theta }(x_i)) \end{matrix}\right.

2. MAE损失函数

图片来源参考文献1

 MAE损失函数又被称为绝对损失absolute loss,或者L1损失,其定义为: 

L_{MAE}(y_i,f_{\theta }(x_i))=|y_i - f_{\theta }(x_i)|

当在mini-batch中,计算batch的总损失时,同MSE一样,也有两种方式(mean或sum)。MSE相比于MAE来说,当y_i - f_{\theta }(x_i)间差别较大时,MSE的loss远比MAE大,因此MSE相较于MAE对于离群点的损失更为敏感。

从另一方面上看,MSE更倾向于预估样本均值,而MAE更倾向于预估样本中位数,我们简单从梯度上分析下,首先对于MSE来说,当其权重梯度为0时模型将会收敛,此时如果当f_{\theta }(x_i)恰好等于y_i均值时,下式的权重梯度是为0的。

\frac{\partial L_{MSE}}{\partial \theta }=\sum_i^n-2(y_i-f_{\theta }(x_i))\frac{\partial f_{\theta }(x_i)}{\partial \theta }

而对于MAE来说,此时当f_{\theta }(x_i)恰好等于y_i中位数时,下式的权重梯度是为0的。

\frac{\partial L_{MAE}}{\partial \theta }=\sum_i^n \mathbb{I} \frac{\partial f_{\theta }(x_i)}{\partial \theta },\ \left\{\begin{matrix} \mathbb{I}=1\ \text{if}\ y_i < f_{\theta }(x_i)\\ \mathbb{I}=-1\ \text{if}\ y_i > f_{\theta }(x_i)\\ \mathbb{I}=0\ \text{if}\ y_i = f_{\theta }(x_i) \end{matrix}\right.

3. huber损失函数

图片来源参考文献1

 huber损失函数是L1损失和L2损失函数一种结合,其定义为: 

L_{huber}(y_i, f_{\theta }(x_i))=\left\{\begin{matrix} \frac{1}{2}(y_i - f_{\theta }(x_i))^2 \ \text{if } |y_i - f_{\theta }(x_i)|\leq \delta \\ \delta |y_i - f_{\theta }(x_i)|-\frac{1}{2}\delta^2 \ \text{if } |y_i - f_{\theta }(x_i)| > \delta \end{matrix}\right.

huber损失函数结合了L1损失和L2损失函数的特性,在偏差较大范围应用L1损失函数,减少了离群点的损失权重,而偏差较小范围就用L2损失函数,当\delta \leq 1时,L2的损失梯度要小于L1的损失梯度,因此对于小偏差更灵敏,更容易找到局部最优,而当\delta > 1\ \&\&\ 1<|y_i-f_{\theta }(x_i)|<\delta时,L2的损失梯度要比L1的损失梯度要更大,因此在一定范围内的离群点的损失更为敏感。在实际应用时,\delta不仅可以做为一个超参数,甚至可以作为一个学习参数。

4. Log-cosh损失函数

图片来源参考文献1

 log-cosh损失函数也是类似于huber损失函数一类变种损失函数,其定义为:

L_{logcosh}(y_i,f_{\theta }(x_i))=log(cosh(y_i-f_{\theta }(x_i))),\ cosh(x)=\frac{e^x+e^{-x}}{2}

log-cosh损失函数在偏差较小时类似于MSE,在偏差较大值类似于MAE,这个同huber损失是类似的,但log-cosh是处处存在二阶可导,在一些需要用到二阶导数的机器学习算法(XGBoost)比如中更为适合。

5. Quantile损失函数

图片来源参考文献1

 Quantile损失函数又被称为分位数损失函数,是MAE函数一类变种损失函数,其定义如下:

 L_{Quantile}(y_i,f_{\theta }(x_i))=\left\{\begin{matrix} (1-\gamma )|y_i-f_{\theta }(x_i)|\text{ if } y_i \leq f_{\theta }(x_i)\\ \gamma|y_i-f_{\theta }(x_i)|\text{ if } y_i > f_{\theta }(x_i) \end{matrix}\right.

上文指出MAE函数实际上会倾向于预估样本中位数,我们可以很容易推导出Quantile系列损失函数会倾向于预估样本分位数。因此在某些区间预估的场景,Quantile系列损失函数会非常有用。

6. 𝜖-insensitive损失函数

图片来源参考文献1

 𝜖-insensitive损失函数主要是为了避免MAE损失函数在偏差较小时太过敏感,从而导致训练振荡,其定义为:

L_{\varepsilon MAE}(y_i,f_{\theta }(x_i))=\left\{\begin{matrix} |y_i-f_{\theta }(x_i)|-\varepsilon \text{ if } |y_i-f_{\theta }(x_i)| \geq \varepsilon \\ 0 \text{ if } |y_i-f_{\theta }(x_i)| < 0 \end{matrix}\right.

7. 更为通用的回归损失函数

图片来源参考文献2

google提出了更为通用性的回归损失函数,其定义为:

上式中x表示预估和目标的偏差y_i-f_{\theta }(x_i)\alpha,\ c是可训练的超参数,其中\alpha参数可以调整损失函数的形状,当\alpha =1时,近似于平滑的L1损失函数,而当\alpha =2时,近似于L2损失函数。当\alpha越小时,对于离群点越不敏感,当\alpha=-\infty时,此时当偏差大于3c时其梯度为0,倾向于寻找局部最优点。超参数\alpha,\ c可以做为固定超参数,或者做可作为自适应调整的学习参数。

总结

上述是常用的回归问题的损失函数,其在设计上不同主要是考虑对离群点的处理(比如L1损失函数主要考虑是中位数损失,而L2损失函数考虑的整体平均损失)。但在实际中,回归类问题远比分类问题要难。

首先当数据分布上偏差,因为上述损失函数是建立在数据分布均匀的情况下,所以当某一区间值覆盖特别多情况下,直接应用上述损失函数,会使得预估值往高比例区间偏移。一种解决方法是使用加权损失函数(Focal Loss 和 Dice Loss),其中每个类别的损失函数权重与其在数据集中的比例成反比。这意味着,对于数量较少的类别,其损失函数的权重会更大,从而强制模型更加关注这些类别,从而提高模型对这些类别的预测准确率。另一种解决方法是使用数据增强技术,例如对少数类别的样本进行过采样或者对多数类别的样本进行欠采样,从而使得各个类别的样本数量更加均衡。但这两种方式虽然能加强对数量较少类别的训练,但不可避免也会给整体带来新偏差,因此可以在应用加权训练,再重新用未加权的数据进行训练,避免数据偏差的引入。

其次,数据本身值会可能会给Loss计算带来偏差,比如某些大值计算的loss会偏大,同时大值本身在计算梯度时可能会陷入不激活区域,影响整体模型的收敛。这种情况下,可以通过归一化等方向去解决,但如果进行合适的归一化需要仔细的设计。

另外,回归类问题数据稀疏性远比分类问题要大,或者说回归类问题的寻值空间很大,因此模型学习可能要花更长时间进行收敛,同时参数量和模型结构都要比分类问题复杂。所以另外一些成熟的做法是将回归类问题转换为分类问题来解决,一种常见的方法是将连续输出变量转换为离散的类别(即分桶方法),另外youtube的weightLR对时长预估是另一类非常巧妙的方法。

参考文献

[1] Wang Q , Ma Y , Zhao K , et al. A Comprehensive Survey of Loss Functions in Machine Learning[J]. Annals of Data Science.

[2] Barron J T . A General and Adaptive Robust Loss Function[J]. arXiv, 2017.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/378275.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Node.js】MySQL数据库的第三方模块(mysql)

mysql安装操作MySQL数据库的第三方模块&#xff08;mysql&#xff09;通过第三方模块&#xff08;mysql2&#xff09;连接到MySQL数据库mysql插入数据mysql插入数据的便捷方式mysql更新数据mysql更新数据的便捷方式mysql删除数据安装操作MySQL数据库的第三方模块&#xff08;my…

Direct IO

目录 一、基本介绍 二、使用方法与Demo 三、O_DIRECT 与 O_SYNC 一、基本介绍 如上图所示&#xff0c;普通的 IO 读写&#xff0c;会先将内容保存在缓冲区中&#xff0c;文件落盘需要调用 fflush 、fsync 等方法。 而 DirectIO 是无缓冲 IO&#xff0c;&#xff0c;使用无缓…

>>数据管理:DAMA简介「考试和续期」

关于DAMA,这里就不再多做描述,可以参考以前写的一些简介或官方介绍。下面就考试再做一些详细介绍。 1 区别 CDGA:数据治理工程师(Certified Data Governance Associate),“DAMA中国”组织的数据治理方面的职业认证考试。 CDGP:数据治理专家(Certified Data Governa…

数学小课堂:无穷小(用动态和极限的眼光看世界)

文章目录 引言I 极限1.1 柯西对极限的认知1.2 极限准确的定义1.3 数列极限的定义1.4 函数极限的定义1.5 无穷小(特殊的极限)1.6 定量和逆向思维1.7 认知升级的过程引言 身处于渐变世界的人类,难以理解瞬间突变。 老师的作用,就是用大白话,把数学语言所写的知识,翻译成大…

基于ANN以使用有监督和无监督的学习将其分为不同的类别或识别模式(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 人工神经网络&#xff08;ANN&#xff09;在包括技术或统计在内的每一个分支中都变得越来越有用&#xff0c;以分析一些社会或非…

【C++容器】vector、map、hash_map、unordered_map四大容器的性能分析【2023.02.28】

摘要 vector是标准容器对数组的封装&#xff0c;是一段连续的线性的内存。map底层是二叉排序树。hash_map是C11之前的无序map&#xff0c;unordered_map底层是hash表&#xff0c;涉及桶算法。现对各个容器的查询与”插入“性能做对比分析&#xff0c;方便后期选择。 测试方案…

QT-自定义滑动式日期选择

QT-自定义滑动式日期选择前言一、效果演示二、注意说明二、关键程序1.SliderDateTime.cpp2.Slider.cpp四、程序链接前言 1、使用鼠标滑动的方式选择指定的日期时间&#xff0c;并且获取当前选中的时间&#xff0c;整体样式看来十分舒服&#xff0c;更加适用触摸屏的方式。 2、…

Python进阶-----面向对象1.0(对象和类的介绍、定义)

目录 前言&#xff1a; 面向过程和面向对象 类和对象 Python中类的定义 &#xff08;1&#xff09;类的定义形式 &#xff08;2&#xff09;深层剖析类对象 前言&#xff1a; 感谢各位的一路陪伴&#xff0c;我学习Python也有一个月了&#xff0c;在这一个月里我收获满满…

理解Spring中的依赖注入和控制反转

依赖注入&#xff08;Dependency Injection&#xff09;是一种面向对象编程的设计模式&#xff0c;用于解决对象之间的依赖关系。它的基本思想是将对象的创建和管理工作交给容器来完成&#xff0c;而不是在应用程序中手动创建和管理对象&#xff0c;从而达到松耦合、易维护、易…

华为OD机试题【最差产品奖】用 C++ 编码,速通 (2023.Q1)

最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为od机试,独家整理 已参加机试人员的实战技巧文章目录 最近更新的博客使用说明最差产…

【项目精选】 javaEE采购管理系统(论文+视频+源码)

点击下载源码 本系统是一个独立的系统&#xff0c;用来解决企业采购信息的管理问题。采用JSP技术构建了一个 有效而且实用的企业采购信息管理平台&#xff0c;目的是为高效地完成对企业采购信息的管理。经过 对课题的深入分析&#xff0c;采购系统需实现以下功能模块&#xff1…

中睿天下当选信通院网络安全卓越合作伙伴

2月23日&#xff0c;2023年中国网络和数据安全产业高峰论坛—网络安全技术创新赋能产业发展分论坛在四川成都成功召开&#xff0c;分论坛以“技术创新、场景赋能、实效验证”为主题&#xff0c;由工业和信息化部网络安全管理局指导&#xff0c;中国信息通信研究院主办&#xff…

kind kubernetes 集群内如何通过 helm 部署定制化 Prometheus-Operator?

文章目录1. Prometheus 简介2. Prometheus 优势3. Prometheus 架构图4. Prometheus-Operator 简介5. Prometheus-Operator 架构图6. 环境准备7. Kind 部署 Kubernetes7.1 安装 Ingress-nginx 组件7.2 安装 Metric Server 组件8. helm 快速安装 Prometheus-Operator9. 定制 Prom…

洗地机哪个品牌最好用?家用洗地机十大名牌

这几年清洁类的小家电非常热门&#xff0c;无线吸尘器、扫地机器人、扫拖一体机、洗地机和擦窗机器人层出不穷&#xff0c;各个品牌百花齐放。这些清洁电器&#xff0c;确实为家庭卫生清洁带来了很大的便捷。但要把这些产品一次性买齐是一笔不小的开销&#xff0c;而且需要收纳…

天猫淘宝企业服务为中小微企业打造供应链智能协同网络,让采购不再将就!丨爱分析报告

编者按&#xff1a;近日天猫淘宝企业服务&爱分析联合发布《2023中小微企业电商采购白皮书》&#xff0c;为中小微企业采购数字化带来红利。 某水泵企业&#xff1a;线上客户主要是中小微企业&#xff0c;线上业绩遇到瓶颈&#xff0c;如何突破呢&#xff1f;某焊割设备企业…

助力Koordinator云原生单机混部,龙蜥混部技术提升CPU利用率达60%|龙蜥技术

文/OpenAnolis Kernel SIG01什么是 CPU 混部CPU 混部是指将不同类型的业务部署到同一台机器上运行&#xff0c;让它们共享机器上的 CPU 资源以提升 CPU 利用率&#xff0c;从而降低机器的采购和运营成本。但是&#xff0c;对于有些类型的任务来说&#xff0c;它们对延时非常的敏…

光流分析 Optical Flow Lucas-Kanade 算法 DOF Dense Optical Flow

光流跟踪算法对车位进行跟踪 概念 光流是空间运动物体在观察成像平面上的像素运动的瞬时速度&#xff0c;是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在的对应关系&#xff0c;从而计算出相邻帧之间物体的运动信息的一种方法。 一…

王道计算机网络课代表 - 考研计算机 第二章 物理层 究极精华总结笔记

本篇博客是考研期间学习王道课程 传送门 的笔记&#xff0c;以及一整年里对 计算机网络 知识点的理解的总结。希望对新一届的计算机考研人提供帮助&#xff01;&#xff01;&#xff01; 关于对 “物理层” 章节知识点总结的十分全面&#xff0c;涵括了《计算机网络》课程里的全…

ARM LDREX/STREX指令以及独占监控器详解

一、目的Linux驱动开发中有一个特别重要的知识点必须掌握&#xff0c;即并发、竞态以及同步。什么是并发&#xff1f;多个执行单元&#xff08;进程、线程、中断&#xff09;同时对一个共享资源的进行访问&#xff1b;此处的共享资源可以是外设、内存或者软件层面的全局变量静态…

Linux服务器磁盘分区、挂载、卸载及报错处理

整体操作是&#xff1a;先对磁盘进行格式化&#xff0c;格式化后挂载到需要的挂载点&#xff0c;最后添加分区启动表&#xff0c;以便下次系统启动时自动挂载。一、linux分区1、Linux来说wulun有几个分区&#xff0c;分给哪一目录使用&#xff0c;他归根结底只有一个根目录&…