当前位置: 首页 > news >正文

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损失的形式,从而减少对大误差的惩罚。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 1-5题查询 - 高频 SQL 50 题基础版
  • Floyd
  • 如何给gitlab其他访问者创建账号并增加权限
  • Java+Vue实现电商网站
  • Http中get与post的区别,99%的人都理解错了吧
  • 算法题-回文子串和最长回文子序列
  • 使用Python实现深度学习模型:模型解释与可解释人工智能
  • 最长公共子序列求长度和输出子序列C代码
  • 大数的排列组合公式C代码
  • 08_排序
  • 云原生之容器编排实践-OpenEuler23.09在线安装Kubernetes与KubeSphere
  • uni-app怎样使用组件
  • vue.js微商城后台管理系统
  • web学习笔记(八十)
  • FreeRTOS——事件标志组
  • 【划重点】MySQL技术内幕:InnoDB存储引擎
  • Angular 响应式表单之下拉框
  • AWS实战 - 利用IAM对S3做访问控制
  • ERLANG 网工修炼笔记 ---- UDP
  • Laravel核心解读--Facades
  • Linux快速配置 VIM 实现语法高亮 补全 缩进等功能
  • Promise初体验
  • SwizzleMethod 黑魔法
  • Vue学习第二天
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 原生JS动态加载JS、CSS文件及代码脚本
  • ​Python 3 新特性:类型注解
  • $GOPATH/go.mod exists but should not goland
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (NO.00004)iOS实现打砖块游戏(十二):伸缩自如,我是如意金箍棒(上)!
  • (六)Flink 窗口计算
  • (七)Knockout 创建自定义绑定
  • (学习日记)2024.02.29:UCOSIII第二节
  • .NET “底层”异步编程模式——异步编程模型(Asynchronous Programming Model,APM)...
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET Framework Client Profile - a Subset of the .NET Framework Redistribution
  • .Net IE10 _doPostBack 未定义
  • .Net OpenCVSharp生成灰度图和二值图
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .Net中wcf服务生成及调用
  • //解决validator验证插件多个name相同只验证第一的问题
  • @ModelAttribute使用详解
  • [2018/11/18] Java数据结构(2) 简单排序 冒泡排序 选择排序 插入排序
  • [Angular] 笔记 6:ngStyle
  • [Apio2012]dispatching 左偏树
  • [Contest20180313]灵大会议
  • [EFI]ASUS EX-B365M-V5 Gold G5400 CPU电脑 Hackintosh 黑苹果引导文件
  • [ERROR ImagePull]: failed to pull image k8s.gcr.io/kube-controller-manager失败
  • [Firefly-Linux] RK3568修改控制台DEBUG为普通串口UART
  • [GDMEC-无人机遥感研究小组]无人机遥感小组-000-数据集制备
  • [Google Guava] 1.1-使用和避免null
  • [HackMyVM]靶场 Wild
  • [nextjs]推荐几个很好看的模板网站
  • [python]PyPI使用国内源