损失函数:Cross Entropy Loss (交叉熵损失函数)

news2024/11/25 10:51:38

损失函数:Cross Entropy Loss (交叉熵损失函数)

  • 前言
  • 相关介绍
  • Softmax函数
    • 代码实例
  • Cross Entropy Loss (交叉熵损失函数)
    • Cross Entropy Loss与BCE loss区别
    • 代码实例

前言

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入人工智能知识点专栏、Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

相关介绍

损失函数(Loss Function)在机器学习和深度学习中扮演着至关重要的角色,它是一个评估模型预测输出与真实标签之间差异程度的函数。损失函数量化了模型预测错误的程度,并在训练过程中作为优化的目标,模型通过不断地调整内部参数以最小化损失函数的值,从而实现更好的拟合数据和泛化能力。

主要特性与作用:

  1. 量化误差:损失函数将模型预测值与实际目标值之间的差异转化为数值,这样就可以通过数值大小直观地衡量模型的预测效果。

  2. 优化导向:在训练神经网络时,优化算法(如梯度下降法)会根据损失函数的梯度来更新模型参数,使损失函数朝着最小化方向移动。

  3. 种类多样:根据不同的任务和需求,有多种不同的损失函数可供选择。例如,在二分类任务中常用的有二元交叉熵损失函数(Binary Cross-Entropy Loss/BCE Loss),在多分类任务中有softmax交叉熵损失函数,在回归任务中常见的是均方误差(Mean Squared Error/MSE)和绝对误差(Mean Absolute Error/MAE)等。

常见的损失函数包括:

  • 二元交叉熵损失(Binary Cross-Entropy Loss / BCE Loss):适用于二分类问题,衡量的是sigmoid函数输出的概率与真实标签间的距离。

  • 多分类交叉熵损失(Categorical Cross-Entropy Loss):对于多分类问题,每个样本可能属于多个类别之一,使用softmax函数和交叉熵损失。

  • 均方误差(Mean Squared Error / MSE):在回归问题中常用,计算预测值与真实值之差的平方平均。

  • 均方根误差(Root Mean Squared Error / RMSE):MSE的平方根,也是回归任务中的损失函数。

  • Huber损失:一种既能兼顾均方误差又能容忍较大误差的混合损失函数,常用于回归问题中。

  • Dice系数损失(Dice Loss):在图像分割任务中广泛使用,衡量的是预测分割区域与真实分割区域的重叠程度。

  • IoU(Intersection over Union)损失:也是在图像分割领域常用的损失函数,计算的是预测区域与真实区域交集与其并集的比例。

  • Focal Loss:在目标检测中应对类别不平衡问题的损失函数,对易分类的样本给予较小的权重,强调难分类样本的训练。

每种损失函数都有其适用的情境和优缺点,选择合适的损失函数是优化模型性能的关键因素之一。

交叉熵(Cross-Entropy)之所以能够用于分类问题,是因为它能够很好地衡量模型预测的概率分布与实际标签分布之间的相似度,而且它拥有几个非常适合分类任务的重要特性:

  1. 信息论基础:交叉熵源于信息论中的概念,表示一个概率分布 (p) 与另一个概率分布 (q) 的差异。在分类问题中,我们可以把 (p) 视为真实数据的标签分布,(q)视为模型预测的概率分布。交叉熵可以衡量模型预测概率与实际类别标签之间的信息差异。

  2. 最大似然估计的自然延伸:在机器学习中,我们通常倾向于最大化模型对数据的似然性,即模型预测给定数据标签的概率。交叉熵损失函数实际上是负对数似然函数在多项式分布(对于多分类问题)或伯努利分布(对于二分类问题)下的特殊情况,通过最小化交叉熵损失,相当于最大化数据的对数似然性。

  3. 梯度稳定性:交叉熵损失函数是连续且可微的,其梯度容易计算且对于大多数情况是有意义的。这意味着在训练过程中,模型可以根据损失函数的梯度进行有效的参数更新。

  4. 稀疏性惩罚:对于多分类问题,softmax函数与交叉熵损失组合使用时,不仅鼓励模型正确预测每个样本的类别,同时也通过归一化机制惩罚了预测概率分布的不均匀性,即模型不能过于肯定任何一个错误类别。

  5. 处理多类别和二类别问题:交叉熵既可以用于处理二分类问题(通过二元交叉熵,Binary Cross-Entropy),也可以处理多分类问题(通过多类别交叉熵,Multiclass
    Cross-Entropy)。在二分类问题中,通常搭配Sigmoid函数输出概率;在多分类问题中,通常配合Softmax函数生成类别概率分布。

总的来说,交叉熵损失函数因其良好的理论基础、优化目标清晰以及在实践中的优秀表现,成为了分类问题中最常用的损失函数之一。

Softmax函数

Softmax函数是深度学习和机器学习中广泛使用的激活函数,特别是在多分类问题中。它的目的是将一个线性变换的输出(通常称为logits)映射为一个概率分布,使得所有类别的概率总和为1,每个类别的概率都在0到1之间。

Softmax函数的形式:

对于一个向量 ( z ) ,其中包含每个类别的原始得分(logits),Softmax函数的计算公式如下:

s o f t m a x ( z ) i = e z i ∑ j = 1 K e z j softmax(z)_i = \frac{e^{z_i}}{\sum_{j=1}^{K} e^{z_j}} softmax(z)i=j=1Kezjezi

其中:

  • ( K ) 表示类别总数。
  • ( z_i ) 表示第 ( i ) 个类别的得分。
  • ( softmax(z)_i ) 表示第 ( i ) 个类别的归一化概率。

整个Softmax函数的结果是一个概率分布向量,其中每个元素都是原得分经过指数函数变换后再除以所有得分指数函数值之和,因此所有元素的和为1。

Softmax函数的特性:

  1. 概率性质:Softmax函数确保输出的每个元素都是非负数,并且所有元素的和为1,满足概率分布的要求。
  2. 竞争性:Softmax函数会使得分最高的类别获得最大的概率值,其余类别的概率按比例递减,形成了一种“赢家通吃”的效应。
  3. 平滑连续:由于使用了指数函数和平滑的除法运算,Softmax函数输出是平滑且连续的,便于在训练过程中梯度的计算和传播。

应用场景

在深度学习的多分类问题中,例如图像分类、文本分类等任务,Softmax函数通常与交叉熵损失函数一起使用。模型最后一层通常会产生一个logits向量,接着通过Softmax函数得到每个类别的概率,最后计算与实际标签之间的交叉熵损失,以此指导模型参数的更新。

代码实例

在PyTorch中,你可以直接使用torch.softmax()函数来实现Softmax操作。下面是一个简单的实例:

import torch

# 假设我们有一个代表logits的张量
logits = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])

# 使用torch.softmax函数计算Softmax值
probs = torch.softmax(logits, dim=1)

print(probs)
'''
tensor([[0.0900, 0.2447, 0.6652],
        [0.0900, 0.2447, 0.6652]])
'''

上述代码中,logits是一个2x3的张量,代表两个样本的三个类别的原始得分。dim=1表示我们在每个样本的类别间计算Softmax,也就是对每一行进行操作。执行torch.softmax()后,probs张量将包含每个样本各类别的归一化概率。

注意,如果你正在训练一个多分类模型并且使用了nn.CrossEntropyLoss()损失函数,通常不需要单独调用torch.softmax(),因为该损失函数内部已经包含了对logits计算Softmax的过程。在多数情况下,你只需将模型的原始输出(logits)传递给损失函数,并配合真实类别标签即可。

Cross Entropy Loss (交叉熵损失函数)

在这里插入图片描述

nn.CrossEntropyLoss是PyTorch中用于多分类问题的一种损失函数,特别适用于输出层是softmax激活函数后的分类任务。它结合了softmax函数和交叉熵损失(Cross-Entropy Loss)的操作,简化了模型训练过程中的计算步骤和代码实现。

基本概念:

  • 交叉熵损失(Cross-Entropy Loss)源于信息论中的熵概念,用于衡量两个概率分布之间的差异。在机器学习和深度学习中,它用来量化模型预测的概率分布与真实标签分布之间的差距。

  • softmax函数:在多分类问题中,softmax函数将模型的线性输出(logits)转换为一个概率分布,确保所有类别的概率和为1。softmax函数的输出可以用作模型预测的概率分布。

nn.CrossEntropyLoss的工作方式:

  • PyTorch中的nn.CrossEntropyLoss接收两个输入:

    • input:模型的原始输出(logits),通常是未经过softmax激活的张量。
    • target:真实的一维标签张量,包含了每个样本所属类别的索引,通常采用LongTensor类型。
  • 内部处理流程

    • 对于每个样本,首先计算其对应的softmax概率分布。
    • 然后,根据真实标签计算交叉熵损失。损失是对每个样本的损失值进行平均得到的,如果没有特殊指定,损失默认会在批次(batch)层面求平均。
  • 损失函数计算公式

    • 对于单个样本,交叉熵损失是 -∑(yi * log(pi)),其中 yi 是实际标签的one-hot编码(在实际情况中,由于标签是索引形式,nn.CrossEntropyLoss内部会处理one-hot编码),pi 是模型预测的该类别概率。
    • 对于整个批次,损失则是各样本损失的平均。

Cross Entropy Loss与BCE loss区别

  • 关于BCE Loss(二元交叉熵损失函数)的相关知识,可查阅损失函数:BCE Loss(二元交叉熵损失函数)、Dice Loss(Dice相似系数损失函数)

CrossEntropyLossBCELoss 都是 PyTorch 中用于监督学习分类任务的损失函数,它们分别适用于不同的分类场景:

BCELoss (Binary Cross Entropy Loss)

  • BCELoss 是二元交叉熵损失函数,专门用于二分类问题,即输出只有两类(0或1,正面或负面,真或假等)。
  • 使用 BCELoss 时,模型的输出一般是通过 Sigmoid 函数得到的概率值,介于0和1之间。
  • 计算公式为 -y * log(p) - (1-y) * log(1-p),其中 y 是真实的标签(0或1),p 是模型预测的概率。
  • 输入要求是经过Sigmoid激活函数之后的输出张量和相应的真实标签张量,二者形状必须相同。

CrossEntropyLoss (Multinomial Cross Entropy Loss 或者 Softmax Cross Entropy Loss)

  • CrossEntropyLoss 适用于多分类问题,它可以处理任何数量的类别,不仅仅是二分类。
  • 对于多分类问题,模型的输出通常是一个 logits(未归一化的预测值),然后CrossEntropyLoss内部会先通过Softmax函数将其转换为概率分布,然后再计算交叉熵。
  • 使用 CrossEntropyLoss 时,不需要手动在输出层之前添加Sigmoid或Softmax函数,因为它已经包含了Softmax运算步骤。
  • 它结合了Softmax函数和交叉熵损失的功能,简化了多分类任务的训练流程,其计算公式基于交叉熵和类别间的互斥性(即对于每个样本,所有类别的概率之和为1)。
  • 输入要求是未经Softmax激活函数处理的logits张量和one-hot编码形式的真实标签张量。

总结来说,两者的主要区别在于:

  • BCELoss用于二分类任务,而CrossEntropyLoss适用于多分类任务。
  • BCELoss前接Sigmoid,CrossEntropyLoss前接Softmax(但这一步在使用CrossEntropyLoss时由损失函数内部自动完成)。
  • BCELoss处理的是二元概率分布,而CrossEntropyLoss处理的是多类别概率分布。

代码实例

import torch
import torch.nn as nn

# 假设模型输出和真实标签
output_logits = torch.tensor([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])  # 假设输出是两样本的三个类别的logits
targets = torch.tensor([1, 2])  # 假设第一样本是第二类,第二样本是第三类

# 创建交叉熵损失函数
criterion = nn.CrossEntropyLoss()

# 计算损失
loss = criterion(output_logits, targets)

print(loss.item())  # 输出损失值 # 0.9076058864593506

在上述代码中,nn.CrossEntropyLoss()函数内部处理了softmax激活和交叉熵损失计算,直接返回了模型预测与真实标签之间的交叉熵损失。

  • 由于本人水平有限,难免出现错漏,敬请批评改正。
  • 更多精彩内容,可点击进入人工智能知识点专栏、Python日常小操作专栏、OpenCV-Python小应用专栏、YOLO系列专栏、自然语言处理专栏或我的个人主页查看
  • 基于DETR的人脸伪装检测
  • YOLOv7训练自己的数据集(口罩检测)
  • YOLOv8训练自己的数据集(足球检测)
  • YOLOv5:TensorRT加速YOLOv5模型推理
  • YOLOv5:IoU、GIoU、DIoU、CIoU、EIoU
  • 玩转Jetson Nano(五):TensorRT加速YOLOv5目标检测
  • YOLOv5:添加SE、CBAM、CoordAtt、ECA注意力机制
  • YOLOv5:yolov5s.yaml配置文件解读、增加小目标检测层
  • Python将COCO格式实例分割数据集转换为YOLO格式实例分割数据集
  • YOLOv5:使用7.0版本训练自己的实例分割模型(车辆、行人、路标、车道线等实例分割)
  • 使用Kaggle GPU资源免费体验Stable Diffusion开源项目

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

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

相关文章

安全开发实战(2)---域名反查IP

目录 安全开发专栏 前言 域名与ip的关系 域名反查ip的作用 1.2.1 One 1.2.2 Two 1.2.3 批量监测 ​总结 安全开发专栏 安全开发实战http://t.csdnimg.cn/25N7H 这步是比较关键的一步,一般进行cdn监测后,获取到真实ip地址后,或是域名时,然后进行域名反查IP地址,进行进…

【剪映专业版】10时间线工具:主轨磁吸、自动吸附、联动、预览轴、全局缩放预览

视频课程:B站有知公开课【剪映电脑版教程】 主轨:有封面标志的轨道才是主轨。 主轨磁吸:开启后,在主轨上移动素材,自动向前磁吸,在其他轨道上移动无此效果;关闭后,不自动向前磁吸&…

python教学入门:字典和集合

字典(Dictionary): 定义: 字典是 Python 中的一种数据结构,用于存储键值对(key-value pairs)。字典使用花括号 {} 定义,键值对之间用冒号 : 分隔,每对键值对之间用逗号…

150个 HTML5 成体系的网站模版 量大慢选 持续更新中

目录 HTML5 网站模版 No.1HTML5 网站模版 No.2HTML5 网站模版 No.3HTML5 网站模版 No.4HTML5 网站模版 No.5 HTML5 网站模版 No.1 HTML5 网站模版 No.1 HTML5 网站模版 No.2 HTML5 网站模版 No.2 HTML5 网站模版 No.3 HTML5 成体系网站模版 No.3 HTML5 网站模版…

虚拟机磁盘剩余空间不足

VMware 弹出提示: 对文件“E:\Virtual Machine\CentOS 7 1810 的克隆 (2)\CentOS 7 1810-cl1.vmdk”的操作失败。 如果该文件位于远程文件系统上,请确保网络连接以及该磁盘所在的服务器正常工作。如果该文件位于可移动介质中,请重新连接该介…

C语言-内存操作函数

C语言有一类内存函数,他们可以以字节为单位进行数据的拷贝、追加,甚至可以替代部分字符串函数。于是让我们来狠狠地学习它一百万遍吧~ 1.memcpy函数的使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); 1.1mem…

单调队列(C/C++)

引言: 单调队列和单调栈都是一种数据结构,应用十分广泛,在蓝桥杯、ICPC、CCPC等著名编程赛事都是重点的算法,今天博主将自己对单调栈与单调队列的理解以及刷题的经验,用一篇博客分享给大家,希望对大家有所…

springboot中mongodb连接池配置-源码分析

yml下spring.data.mongodb 以前mysql等在spring.xxx下配置,现在springboot新版本(小编3.2.3)在spring.data.xxx下了,如下所示,mongodb的配置在spring.data.mongodb下: 连接池相关参数配置-源码分析 拼接在…

使用CCS软件查看PID曲线

在刚开始学习PID的时候,都需要借助PID的曲线来理解比例,积分,微分这三个参数的具体作用。但是这些曲线生成一般都需要借助上位机软件或者在网页上才能实现。如果是在单片机上调试程序的话,想要看曲线,一般就是通过串口…

C语言 【基础语法】

一、编程环境搭建 编译器:gcc 集成开发环境:vscode 1.1 安装vscode 1.2 设置中文包 插件 1.3 设置C/C扩展 安装 C/C Compile Run extension 和 C/C Extension Pack 扩展 二、基础语法 2.1 第一个c语言程序 2.2 数据类型 2.2.1 变量的语法(重点) …

氯氟氰虫酰胺杀灭活性好成本低 目前全球市场规模小

氯氟氰虫酰胺杀灭活性好成本低 目前全球市场规模小 氯氟氰虫酰胺,通用名为cyhalodiamide,是一种双酰胺类杀虫剂,外观为白色固体粉末状。 氯氟氰虫酰胺属于鱼尼丁受体作用剂,为邻苯二甲酰胺结构的双酰胺类杀虫剂,作用机…

Vision Transformer (ViT)浅析

Vision Transformer (ViT) 概述 为了将Transformer引入视觉任务,Google团队开发出了Vision Transformer (ViT),其中ViT模型以及变种在图像分类任务上一骑绝尘 ViT的结构 ViT首先将图像( R H W C \mathbb{R}^{H\times W\times C} RHWC)划分为多个Patc…

一周学会Django5 Python Web开发-Django5模型数据新增

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计46条视频,包括:2024版 Django5 Python we…

上位机图像处理和嵌入式模块部署(树莓派4b实现动态插件)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 和上位机一样,我们的智能硬件如果想应用到更多的场景,那么势必需要实现更多的算法。这些算法和算法之间最好是松散耦合的插…

思维导图软件Xmind for Mac 中文激活版 支持M

XMind是一款非常受欢迎的思维导图软件,它应用了Eclipse RCP软件架构,注重易用性、高效性和稳定性,致力于帮助用户提高生产率。 Xmind for Mac 中文激活版下载 XMind的程序主体由一组插件构成,包括一个核心主程序插件、一组Eclipse…

公众号开发:获取域名

公众号中的基本配置要求需要连接服务器地址,这个服务器地址必须是域名,但是域名需要进行购买,因此可以使用到一个内网穿透工具:ngrok 进行测试 国内的就可以了Sunny-Ngrok内网转发内网穿透 - 国内内网映射服务器 首先花两块钱实名…

Mybatis之SqlNodeSqlSource

SqlNode SqlNode接口 apply()是SqlNode 接口中定义的唯一方法,该方法会根据用户传入的实参, 参数解析该SqlNode所记录的动态SQL节点,并调用DynamicContext.appendSql()方法将解析后的SQL片段追加到DynamicContext.sqlBuilder中保存。当SQL节…

[Collection与数据结构] 二叉树(二):二叉树精选OJ例题(上)

1. 判断是否为相同的二叉树 OJ链接 public boolean isSameTree(Node p, Node q) {if (p null && q ! null || p ! null && q null){//结构不同return false;}if (p null && q null){//结构相同,都是空树return true;}if (p.value ! q.value){//…

机器人流量激增:恶意机器人活动升级与新型规避技术挑战企业安全防御

近日,根据Cyber News引用Thales Imperva Bad Bot发布的最新研究报告,揭示了一个令人警醒的现象:2023年,互联网总流量中的49.6%由机器人贡献,相较于上一年增长了2%,创下了自2013年监测以来的历史新高。这一显…

希亦、固特、大宇超声波清洗机值不值得买?宝藏机型测评争霸

在当代生活的快节奏中,眼镜成了我们不可或缺的伙伴,无论是助力视力的提升还是时尚造型的加分项。然而,许多人忽视了眼镜清洁的重要性,不知道不清洗眼镜会带来诸多危害,从而影响健康和生活质量。长时间累积的污垢、油脂…