Pytorch(笔记7损失函数类型)

前言

损失函数(Loss Function):是定义在单个样本上的,是指一个样本的误差,度量模型一次预测的好坏。
代价函数(Cost Function)=成本函数=经验风险:是定义在整个训练集上的,是所有样本误差的平均,也就是所有损失函数值的平均,度量平均意义下模型预测的好坏。
目标函数(Object Function)=结构风险=经验风险+正则化项=代价函数+正则化项:是指最终需要优化的函数,一般指的是结构风险。正则化项(regularizer)=惩罚项(penalty term)。

损失函数类型

平方损失函数(Quadratic Loss Function)又称均方误差(Mean Squared Error, MSE)

一种常用的回归损失函数。它衡量的是模型预测值与真实值之差的平方的平均值。平方损失函数对于大的误差给予了更大的惩罚,这使得它成为许多回归任务中首选的损失函数之一。

平方损失函数的公式(MSE):
在这里插入图片描述

import torch# 创建一个包含从 0.0 到 4.0(包括0.0和4.0)的浮点数的一维张量 x
x = torch.arange(5.0)  # 注意这里的 5.0,它确保了 x 是浮点类型# 创建一个与 x 形状相同但所有元素都是 1.0 的浮点类型张量 Y
Y = torch.ones_like(x, dtype=torch.float32)  # 显式指定 dtype 为 torch.float32# 创建一个 MSELoss 的实例
MSE = torch.nn.MSELoss()# 计算 x 和 Y 之间的均方误差,并将结果存储在变量 a 中
a = MSE(x, Y)# 打印结果
print(a)  # 输出:tensor(3.),表示 x 和 Y 之间的均方误差
print(x)  # 输出:tensor([0., 1., 2., 3., 4.]),x 的值
print(Y)  # 输出:tensor([1., 1., 1., 1., 1.]),Y 的值

注意

  • 平方损失函数对异常值(outliers)非常敏感,因为异常值会导致误差的平方变得非常大,从而影响整个损失函数的值。
  • 在某些情况下,如果预测值与实际值的差距非常大,使用平方损失函数可能会导致梯度爆炸,从而使得模型的训练变得不稳定。对于这类问题,可能需要考虑使用其他的损失函数,如绝对误差损失(L1损失)等。

L1范数损失(L1 Loss)也被称为最小绝对偏差(LAD)、平均绝对值误差(MAE)

L1 Loss损失函数的公式(MAE):
在这里插入图片描述

优点:

  • 稳定性:L1 Loss对于任何输入值都有着稳定的梯度,即其梯度为常数(±1),这避免了梯度爆炸的问题,使得模型训练过程更加稳定。
  • 鲁棒性:L1 Loss对离群点(outliers)的惩罚是固定的,不会因离群点而产生过大的损失值,从而提高了模型对异常值的鲁棒性。
  • 稀疏性:L1 Loss在优化过程中倾向于产生稀疏解,即使得模型中的许多权重接近于0,这有助于特征选择,简化模型,并提高模型的泛化能力。

缺点:

  • 不可导性:在0点处,L1Loss的梯度未定义(或者说是不连续的),这可能导致在优化过程中遇到一些困难,尤其是在使用梯度下降等基于梯度的优化算法时。
  • 收敛性:由于L1 Loss的梯度为常数,当预测值接近真实值时,梯度仍然较大,这可能导致模型在最优解附近震荡,难以精确收敛。

使用场景

L1 Loss通常用于回归任务,尤其是在需要模型的权重具有稀疏性的场景下。然而,由于其在0点处的不可导性,L1 Loss在神经网络等复杂模型中的直接使用较少。相反,Smooth L1 Loss(平滑L1损失)作为L1 Loss和L2 Loss的结合,既保留了L1 Loss的鲁棒性,又解决了其在0点处不可导的问题,因此在目标检测等任务中得到了广泛应用。

# x = tensor([0., 1., 2., 3., 4.])  
# y = tensor([1., 1., 1., 1., 1.])  # 计算差的绝对值  
abs_diff = torch.abs(x - y)  
# 输出: tensor([1., 0., 1., 2., 3.])  # 计算L1损失(平均绝对误差)  
L1loss = torch.nn.L1Loss()  
a = L1loss(x, y)  
# 或者直接计算平均值,不使用torch.nn.L1Loss()  
# a = torch.mean(abs_diff)  # 输出L1损失  
print(a)  # 应该是 (1 + 0 + 1 + 2 + 3) / 5 = 1.4

SmoothL1Loss,平滑L1损失函数

是深度学习中常用的一种损失函数,尤其在处理回归问题时表现出色。它是L1损失和L2损失的结合体,旨在减少对异常值的敏感性,并在优化过程中提供更加稳定的梯度。

在这里插入图片描述

特性与优势

  • 结合L1和L2的优点:当误差较小时(∣x∣<β),SmoothL1Loss的计算方式类似于L2损失(平方误差),这使得它在原点附近更加平滑,有助于模型的快速收敛。当误差较大时(∣x∣≥β),SmoothL1Loss的计算方式则类似于L1损失(绝对误差),这有助于减少离群点对损失函数的影响,使模型更加鲁棒。
  • 对异常值不敏感:相比于L2损失,SmoothL1Loss在误差较大时不会过度放大损失值,从而避免了梯度爆炸的问题。这对于包含异常值或噪声的数据集尤其有用。
  • 稳定的梯度:SmoothL1Loss在误差的整个范围内都提供了相对稳定的梯度,这有助于模型的稳定训练。

应用场景

SmoothL1Loss在目标检测、物体跟踪、姿态估计等需要精确回归的任务中得到了广泛应用。特别是在目标检测的Bounding Box回归中,SmoothL1Loss能够有效地计算预测框与真实框之间的误差,并帮助模型优化预测结果。

在PyTorch的torch.nn.SmoothL1Loss类中,reduction和beta是两个重要的参数,它们分别用于控制损失值的计算和平滑转换点的设置。

reduction参数指定了应用于输出损失值的缩减方法。它有三个可选值:‘none’、‘mean’和’sum’。

  • 当reduction='mean’时,函数会计算所有元素损失的平均值作为最终的损失值。这是回归任务中常用的做法,因为它将损失值标准化为单个标量,便于比较和反向传播。
  • 如果设置为’none’,则函数将返回一个与输入形状相同的损失张量,不进行任何缩减。
  • 如果设置为’sum’,则函数会计算所有元素损失的总和作为最终的损失值。

beta参数是一个超参数,用于定义SmoothL1Loss函数中的平滑转换点。在SmoothL1Loss的公式中,当误差的绝对值小于beta时,损失函数采用L2损失(平方误差)的形式;当误差的绝对值大于或等于beta时,损失函数采用L1损失(绝对误差减去0.5*beta)的形式。

  • beta=1.0是PyTorch中SmoothL1Loss的默认值。这个值的选择是基于经验和实践的,旨在在L1损失和L2损失之间找到一个平衡点,以便在大多数情况下都能获得良好的性能。
  • 调整beta的值可以改变损失函数对误差的敏感度。较小的beta值会使损失函数在误差较小时更加接近L2损失,从而在原点附近更加平滑;较大的beta值则会使损失函数更早地过渡到L1损失的形式,从而减少对大误差的惩罚。

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

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

相关文章

集成学习(三)GBDT 梯度提升树

前面学习了&#xff1a;集成学习&#xff08;二&#xff09;Boosting-CSDN博客 梯度提升树&#xff1a;GBDT-Gradient Boosting Decision Tree 一、介绍 作为当代众多经典算法的基础&#xff0c;GBDT的求解过程可谓十分精妙&#xff0c;它不仅开创性地舍弃了使用原始标签进行…

virtualbox窗口和win10窗口的切换

1、问题&#xff1a; 从windows切换到虚拟机可以用快捷键 ALTTAB&#xff0c;但是从虚拟机到windows使用 ALTTAB 无法成功切换 2、解决方法&#xff1a; 按下图操作 按上面步骤设置之后&#xff0c;每次要从虚拟机窗口切换到windows窗口 只需要先按 CtrlAlt 跳出虚拟机窗口&…

【已解决】“import ... =“ 只能在 TypeScript 文件中使用

现象 在使用 import 语法的时候&#xff0c;代码报红&#xff0c;提示&#xff1a;“import ... “ 只能在 TypeScript 文件中使用 原因 代码被 VSCode 解析成 TypeScript 语法 解决方案&#xff1a; 关闭 JavaScript 的验证启用即可。 mac 快捷方式&#xff1a;comman s…

微机原理与单片机 知识体系梳理

单片机笔记分享 我个人感觉单片机要记的东西很多&#xff0c;也很琐碎&#xff0c;特别是一些位、寄存器以及相关作用等&#xff0c;非常难以记忆。因此复习时将知识点整理在了一起做成思维导图&#xff0c;希望对大家有所帮助。内容不是很多&#xff0c;可能有些没覆盖全&…

VMware CentOS7 Linux 网络配置

本文主要描述VMware虚拟机的网络配置。 如上所示&#xff0c;在CentOS Linux虚拟机中设置网络连接使用桥接模式&#xff0c;该模式对接主机物理网络&#xff0c;直接由主机的物理网络的DHCP服务器动态分配IP地址&#xff0c;或者在CentOS Linux的操作系统的网络配置中设置静态的…

HACCP体系认证:守护食品安全的黄金标准

在食品生产过程中&#xff0c;食品安全始终是重中之重。为了确保食品的安全性和质量&#xff0c;越来越多的企业开始采用HACCP&#xff08;危害分析关键控制点&#xff09;体系认证。这个体系不仅能帮助企业预防食品安全问题&#xff0c;还能显著提升产品质量和市场竞争力。 HA…

android新闻app(二)

新闻详细页&#xff1a; 历史浏览记录SQList&#xff1a; 分类&#xff1a; 历史浏览记录主体UI和详细&#xff1a; 侧边栏&#xff1a; 参考&#xff1a;浩宇开发

如何给gitlab其他访问者创建账号并增加权限

嗨&#xff0c;今天创建了项目之后&#xff0c;我想把项目链接发送给其他人&#xff0c;让他下载这个项目&#xff0c;结果发现对方打开显示登录的界面&#xff0c;没错&#xff0c;他要想使用这个git下载项目&#xff0c;首先他的有一个git账号 接下来我找有权限的相关人员给他…

认识并理解webSocket

今天逛牛客&#xff0c;看到有大佬分享说前端面试的时候遇到了关于webSocket的问题&#xff0c;一看自己都没见过这个知识点&#xff0c;赶紧学习一下&#xff0c;在此记录&#xff01; WebSocket 是一种网络通信协议&#xff0c;提供了全双工通信渠道&#xff0c;即客户端和服…

策略为王股票软件源代码-----如何修改为自己软件61----资讯菜单修改-----举例---------调用同花顺网页------

http://stock.sina.com.cn 将原来的新浪行情,修改为同花顺, 搜索 stock.sina.com.cn... StkUI\View\InfoView.cpp(58):char

论文阅读--Simple Baselines for Image Restoration

这篇文章是 2022 ECCV 的一篇文章&#xff0c;是旷视科技的一篇文章&#xff0c;针对图像恢复任务各种网络结构进行了梳理&#xff0c;最后总结出一种非常简单却高效的网络结构&#xff0c;这个网络结构甚至不需要非线性激活函数。 文章一开始就提到&#xff0c;虽然在图像复原…

VRPTW(MATLAB):常春藤算法(IVY)求解带时间窗的车辆路径问题VRPTW,MATLAB代码

详细介绍 VRPTW&#xff08;MATLAB&#xff09;&#xff1a;常春藤算法&#xff08;Ivy algorithm&#xff0c;IVY&#xff09;求解带时间窗的车辆路径问题VRPTW&#xff08;提供MATLAB代码&#xff09;-CSDN博客 ********************************求解结果******************…

EtherCAT转Profinet网关配置说明第一讲:配置软件安装及介绍

网关XD-ECPNS20为EtherCAT转Profinet协议网关&#xff0c;使EtherCAT协议和Profinet协议两种工业实时以太网网络之间双向传输 IO 数据。适用于具有EtherCAT协议网络与Profinet协议网络跨越网络界限进行数据交换的解决方案。 本网关通过上位机来进行配置。 首先安装上位机软件 一…

Qt使用sqlite数据库及项目实战

一.sqlite使用介绍 在Qt中使用SQLite数据库非常简单&#xff0c;SQLite是一个轻量级的嵌入式数据库&#xff0c;不需要单独的数据库服务器&#xff0c;完全使用本地文件来存储数据。 当在Qt中使用SQLite数据库时&#xff0c;需要涉及到一些SQL语句以及Qt中的相关函数&#xf…

【海贼王的数据航海】ST表——RMQ问题

目录 1 -> RMQ问题 1.1 -> 定义 1.2 -> 解决策略 2 -> ST表 2.1 -> 定义 2.2 什么是可重复贡献问题 2.3 -> 预处理ST表 2.4 -> 处理查询 2.5 -> 实际问题 1 -> RMQ问题 1.1 -> 定义 RMQ (Range Minimum/Maximum Query)即区间最值查询…

黑马点评DAY2|Redis基本操作

Redis客户端 命令行客户端 进入到redis的安装目录&#xff0c;可以看到redis-cli文件&#xff0c;这就是redis的命令行客户端&#xff0c;在安装redis时自带的。 使用方式如下 redis-cli [options] [commonds]其中常见的options有&#xff1a; -h 127.0.0.1 &#xff1a;指…

电量监测与电量计基础知识

硬件之路学习笔记 ​-----前文导读----- ①、公众号主页点击发消息 ②、点击下方菜单获取系列文章 -----本文简介----- 主要内容包括&#xff1a; ①&#xff1a;简介 ②&#xff1a;省成本方式-电阻分压 ③&#xff1a;精确方式-电量计与阻抗跟踪技术 ----- 正文 ----…

JavaWeb--jquery篇

概述 jQuery是一个快速、简洁的JavaScript框架&#xff0c;是一个优秀的JavaScript代码库&#xff08;框架&#xff09;于2006年1月由John Resig发布。它封装JavaScript常用的功能代码&#xff0c;提供一种简便的JavaScript设计模式&#xff0c;优化HTML文档操作、事件处理、动…

2229:Sumsets

网址如下&#xff1a; OpenJudge - 2229:Sumsets 这题不是我想出来的 在这里仅做记录 代码如下&#xff1a; #include<iostream> using namespace std;const int N 1000000000; int dp[1000010]; int n;int main() {cin >> n;dp[0] 1;dp[1] 1;for (int i 2…

前端面试题7(单点登录)

如何实现单点登录 单点登录&#xff08;Single Sign-On&#xff0c;简称SSO&#xff09;是一种允许用户在多个应用系统中只需登录一次&#xff0c;就可以访问所有相互信任的应用系统的认证技术。实现前端单点登录主要依赖于后端的支持和一些特定的协议&#xff0c;如OAuth、Ope…