CrossEntropy Loss(交叉熵损失)和 NLLLoss(负对数似然损失):数学公式 + 代码示例

损失函数与优化器:从「梯度是怎么被造出来的」到「梯度是怎么被用掉的」 本文揭示损失函数与优化器本质一体:优化器仅依赖损失产生的梯度,而损失决定梯度的方向、尺度与噪声特性。错误的损失选择(如分类用MSE)会导致梯度失衡,使优化器失效;不同损失(如Huber、Focal)通过调控梯度分布影响优化过程。实测表明,归约方式、标签结构与损失配对直接决定梯度行为,进而影响收敛性与泛化。核心观点:选对损失,才是让优化器“看得懂”的前提。 阅读详情

CrossEntropy Loss(交叉熵损失)

C:类别总数

\boldsymbol{z} = [z_1,z_2,...,z_C]:模型输出 (未经过softmax)

y \in \{0,1,...,C-1\}:真实类别索引(非one-hot)

3分类,类别 C=3,单样本损失:

\mathcal{L} = -\log\left( \frac{e^{z_y}}{\sum_{i=0}^2 e^{z_i}} \right)

对logits做Softmax归一化得到各类概率

p_i = \text{Softmax}(z_i) = \frac{e^{z_i}}{\sum_{k=1}^C e^{z_k}}

单样本交叉熵损失

\mathcal{L}(z,y) = -\log\left(p_y\right) = -\log\left( \frac{e^{z_y}}{\sum_{k=1}^C e^{z_k}} \right)

批量样本(batch size=N)

\mathcal{L}_{batch} = \frac{1}{N}\sum_{n=1}^N \mathcal{L}(z^{(n)}, y^{(n)})

数据设定

3个样本、3类 logits:

  • 样本1:z_1=[2, 1, 0],   真实标签 y_1=0

  • 样本2:z_2=[-1, 3, 0],真实标签 y_2=1

  • 样本3:z_3=[0, -2, 4],真实标签 y_3=2

分步手动计算

样本1

e^2=7.389,\ e^1=2.718,\ e^0=1,

\quad sum=11.107

p_0 = \frac{e^2}{sum} \approx 0.6652

\mathcal{L}_1 = -\log(0.6652) \approx 0.407606

样本2

e^{-1}=0.3679,\ e^3=20.0855,\ e^0=1,

\quad sum=21.4534

p_1 = \frac{e^3}{sum} \approx 0.9362

\mathcal{L}_2 = -\log(0.9362) \approx 0.065884

样本3

e^0=1,\ e^{-2}=0.1353,\ e^4=54.5982,

\quad sum=55.7335

p_2 = \frac{e^4}{sum} \approx 0.9796

\mathcal{L}_3= -\log(0.9796) \approx 0.020581

批量平均损失

\mathcal{L}_{batch} = \frac{0.407606 + 0.065884 + 0.020581}{3} \approx 0.164690

PyTorch 代码验证

import torch
import torch.nn as nn
import torch.nn.functional as F
​
# 3个样本,3分类 logits
logits = torch.tensor([
    [2.0, 1.0, 0.0],    # 样本1
    [-1.0, 3.0, 0.0],   # 样本2
    [0.0, -2.0, 4.0]    # 样本3
])
labels = torch.tensor([0, 1, 2])  # 对应真实类别索引
​
# 交叉熵损失 # 默认 reduction="mean" 输出3个样本损失平均值;
loss_fn = nn.CrossEntropyLoss()
loss = loss_fn(logits, labels)
print("批量平均损失:", loss.item())

# 输出结果:
# 批量平均损失: 0.16468988358974457
# 和手算 0.164690 完全吻合。

​


# 若想输出每个样本单独损失:reduction="none"

loss_fn_none = nn.CrossEntropyLoss(reduction="none")
loss_each = loss_fn_none(logits, labels)
print("每个样本损失:", loss_each)

# 每个样本损失: tensor([0.4076, 0.0659, 0.0206])

NLLLoss(负对数似然损失)

\boldsymbol{z_i} = [z_1,z_2,...,z_C]:模型输出(未经过softmax)

CrossEntropy = LogSoftmax + NLLLoss,一般优先用 CrossEntropy

\text{CrossEntropyLoss}(z,y) = \text{NLLLoss}(\text{LogSoftmax}(z),\; y)

 LogSoftmax =\log(\text{softmax}(z_i))

公式等价转换

\text{CE}(z,y) = -\log\left( \frac{e^{z_y}}{\sum_{k=1}^C e^{z_k}} \right) = -z_y + \log\left(\sum_{k=1}^C e^{z_k}\right)

\text{NLL}(\text{LogSoftmax}(z),y) = -\log p_y = -\log\left(\frac{e^{z_y}}{\sum e^{z_k}}\right)

二者数学完全等价,只是输入预处理不同。

概率  p_i=LogSoftmax (z_i)

损失函数

以单样本 \mathcal L = -\log p_y拆解:

p_y:模型预测真实标签类别的概率, 0 < p_y \le 1

\log p_y:对数压缩概率值域

  1. p_y=1(预测完全正确): \log 1 = 0,损失 \mathcal L=0
  2. p_y\to 0 (完全预测错误):\log p_y \to -\infty,损失 \mathcal L\to +\infty
  3. 负号 - :把最大化对数似然转为最小化损失,适配梯度下降优化

\mathcal{L}_{batch} = \frac{1}{N}\sum_{n=1}^N \mathcal{L}(p^{(i)}, y^{(i)})

import torch
import torch.nn as nn
import torch.nn.functional as F
​
# 3个样本,3分类 logits
logits = torch.tensor([
    [2.0, 1.0, 0.0],    # 样本1
    [-1.0, 3.0, 0.0],   # 样本2
    [0.0, -2.0, 4.0]    # 样本3
])
labels = torch.tensor([0, 1, 2])  # 对应真实类别索引
​
# 交叉熵损失 # 默认 reduction="mean" 输出3个样本损失平均值;
loss_fn = nn.CrossEntropyLoss()
loss = loss_fn(logits, labels)
print("批量平均损失:", loss.item())
​
# 拆分验证 LogSoftmax + NLLLoss
log_sm = F.log_softmax(logits, dim=1)
nll_loss = F.nll_loss(log_sm, labels)
print("手动拆解损失:", nll_loss.item())

# 输出结果:
# 批量平均损失: 0.16468988358974457
# 手动拆解损失: 0.16468988358974457
# 和手算 0.164690 完全吻合。

Pytorch损失函数nn.NLLLoss2d()用法说明 主要介绍了Pytorch损失函数nn.NLLLoss2d()用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧 立即下载

相关推荐

ComfyUI破限版全中文AI绘画环境搭建与工作流实战指南

节点式工作流是AI绘画领域的核心技术架构,通过将图像生成过程拆分为可配置的模块化节点,实现了对Stable Diffusion模型的精细化控制。其技术原理基于数据流编程范式,每个节点负责特定功能处理,如文本编码、采样器配置和VAE解码等。这种设计在工程实践中的核心价值在于提供了可追溯、可复用的可视化工作流,特别适合需要参数调优和批量生产的商业场景。ComfyUI作为典型的节点式AI绘画工具,在破限版中针对中文用户优化了界面支持和显卡兼容性,显著降低了技术门槛。在实际应用中,结合ControlNet和LoRA

weixin_29038155的博客 452

【PyTorch】torch.nn.NLLLoss 类:负对数似然损失

torch.nn.NLLLoss(Negative Log Likelihood Loss,负对数似然损失)是PyTorch中的一种用于分类任务的损失函数,常用于语言模型、文本分类等任务。它通常与log_softmax()结合使用,以确保输入是对数概率分布,支持weight处理类别不均衡,支持ignore_index忽略某些类别。由于NLLLoss需要log_softmax作为输入,如果处理分类任务(如图像分类、文本分类),推荐CrossEntropyLoss,因为它内部包含log_softmax(),更简

彬彬侠的博客 1703

从拆解到调试:用CS5523改造旧款车载显示屏的完整记录(MIPI转eDP方案)

本文详细记录了使用CS5523芯片将旧款车载显示屏从MIPI接口改造为eDP驱动的完整过程。通过对比LT8911等芯片,选择CS5523实现低功耗、高兼容性的显示升级,涵盖硬件改造、固件配置及调试技巧,最终成功提升显示效果200%。

web99的专栏 344

【损失函数】NLLLoss损失、CrossEntropy_Loss交叉熵损失以及Label Smoothing示例与代码

机缘巧合下,近期又详细学习了一遍各损失函数的计算,特此记录以便后续回顾。为了公式表示更加清晰,我们设yn​∈{1,2,…,K}为样本n的真实标签,v=(v1​,v2​,…vK​)为网络的输出,即样本n的预测结果,设N为一批样本的数目(即Batch size),K为分类任务的类别数目。

风巽·剑染春水的博客 2804

一、Abaqus CAE 入门操作(薄膜应力计算)

一、Abaqus CAE 入门操作(薄膜应力计算)

A20802013的博客 4371

成功解决raise Py4JError py4j.protocol.Py4JError: py4j.protocol.Py4JError: Could not find py4j jar at 

成功解决raise Py4JError("Could not find py4j jar at {0}".format(jarpath)) py4j.protocol.Py4JError: Could not find py4j jar at 目录 解决问题 解决思路 解决方法 1、第一步安装jdk 2、第二步安装或升级py4j 解决问题 raise Py4JError("Could not find py4j jar at {0...

头部AI社区如有邀博主AI主题演讲请私信—心比天高,仗剑走天涯,保持热爱,奔赴向梦想!低调,专注,谦虚,自律,反思,成长,还算比较正能量的博主,公益免费传播…内心特别想在AI界做出一些可以推进历史进程影响力的技术(兴趣使然,有点小情怀,也有点使命感呀 4627

深度学习方法——NLLloss简单概括

简单概括一下NLLloss都干了些什么,侧重于概念的总结,不对参数做过多说明。

时生的博客 1万+

10分钟搞定小红书爆款笔记爬取!Selenium模拟登录+数据解析全流程,新手也能落地

小红书爬虫实战的核心,是**“模拟真人操作+解析结构化数据”**——Selenium解决了动态页面和登录的问题,lxml解决了数据提取的问题,pandas解决了数据存储的问题。新手学爬虫不用一开始就啃复杂的反爬机制,先从这类“可见即可爬”的场景入手,掌握“模拟操作→数据解析→数据保存”的全流程,再逐步叠加异常处理、批量爬取、反爬应对等功能。需要注意的是:爬取数据仅用于个人学习和研究,不得用于商业用途,且需遵守小红书的用户协议,不要过度爬取导致服务器压力。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1730

NLL_Loss

先放上官方用法 torch.nn.functional.nll_loss(input,target,weight=None,size_average=None,ignore_index=-100,reduce=None,reduction='mean') 一般只赋值前两个张量就可以了。 转载于:https://www.cnblogs.com/KevinSmith/p/1...

avk88662的博客 2104

SerDes系列之码间干扰的概念

码间干扰出现在传输介质或者元器件的带宽小于所发送的信号带宽时,从时域角度来看,传输路径的带宽限制会使发送信号的上升沿的变化速率变慢,有可能对信号造成高频衰减,并影响到实际数字逻辑电平的转换时序。

一只豌豆象的博客 3469

Kaggle赛题总结:Enefit - Predict Energy Behavior of Prosumers

竞赛旨在解决能源不平衡的问题,即预计使用的能源与实际使用或产生的能源不符。自发自用者是既消耗又产生能源的个体,他们在造成能源不平衡方面起到了重要作用。尽管他们只占所有能源消费者的一小部分,但他们不可预测的能源使用行为给能源公司带来了物流和财务问题。如果不加以解决,可能会导致运营成本增加、电网不稳定以及能源资源的低效利用。如果这个问题得到有效解决,将显著降低不平衡成本,提高电网的可靠性,并使自发自用者更高效和可持续地融入能源系统中。

猫敷雪 742

Pytorch为什么 nn.CrossEntropyLoss = LogSoftmax + nn.NLLLoss?

PyTorch 提供两种方式,满足不同需求。

阿正的梦工坊 1837

Attention优化|2w字原理&图解: 从Online-Softmax到FlashAttention V1/V2/V3

本文通过原理分析和图解的方式,通俗易懂地FlashAttention系列算法。FlashAttention V1/V2在LLM领域的应用已经非常广泛,相关的论文也反复读了几遍。FA1和FA2论文非常经典,都推荐读一下(不过FA2论文中公式错误不少本文大约1.8w字,包括以下内容:0x07 分布式训推使用FlashAttention0x09 FlashAttention中MQA/GQA以及Causal Mask处理。

具身机器人和通用AI 5233

深度学习中的损失函数与优化算法基础知识

在深度学习训练流水线中,网络结构负责特征提取,损失函数定义优化目标,优化算法负责参数迭代更新,三者共同构成模型收敛的完整闭环。很多初学者仅停留在调用nn.CrossEntropyLoss()、optim.Adam()的层面,不清楚公式背后的梯度流向、不同损失对异常值 / 样本不均衡的敏感度差异,也不理解 SGD、Adam、RMSprop 内在动量与自适应学习率机制,最终遇到损失不下降、震荡不收敛、过拟合严重、标签不均衡准确率虚高等问题时无从排查

少生孩子多写代码 543

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

PyTorch-损失函数-NLLLoss

常用于多分类任务,NLLLoss 函数输入 input 之前,需要对 input 进行 log_softmax 处理,即将 input 转换成概率分布的形式,并且取对数,底数为 e class torch.nn.NLLLoss(weight=None, size_average=None, ignore_index=-100, reduce=None, reduction='...

花开花落,人走茶凉 3万+

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Pytorch中的NLLLoss代码解释

在分类以及语义分割任务中,CrossEntropy是十分常用的一个损失函数,pytorch也对其进行了实现用于直接使用。 但本人在阅读其源码时,发现nn,CrossEropyLoss并不是直接按照交叉熵公式:Loss(p,y)=∑i=1nyilog(pi)Loss(p, y)=\sum_{i=1}^{n}y_ilog(p_i)Loss(p,y)=∑i=1n​yi​log(pi​)计算而得,实际上其是融合了多个计算而成:softmax计算+log计算+nll_loss计算。其具体原理,推荐一篇讲解得十分详细的

小毛激励我好好学习的博客 2436

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

CrossEntropyLoss与NLLLoss的总结

nll_loss(negative log likelihood loss):最大似然 / log似然代价函数 CrossEntropyLoss: 交叉熵损失函数。交叉熵描述了两个概率分布之间的距离,当交叉熵越小说明二者之间越接近。 nn.CrossEntropyLoss() 与 NLLLoss() NLLLoss 的 输入 是一个对数概率向量和一个目标标签. 它不会为我们计算对数概率. 适合网络...

街道口扛把子的博客 2万+

pytorch中的NLLLoss和CrossEntropyLoss

NLLLoss NLLLoss就是负对数似然(negative log likelihood loss) 计算公式: nllloss=−∑n=1Nynlog⁡prob(xn) nllloss=-\sum_{n=1}^{N}y_n\log prob(x_n) nllloss=−n=1∑N​yn​logprob(xn​) 举个例子就是: x=[0.1,0.2,-0.7] y=[0,1,0] 计算过程就是:对x进行softmax转换成概率,然后对每一个值取log,再乘以标签 -log(softmax(x))*y

xhsun的博客 902

Pytorch损失函数torch.nn.NLLLoss()详解

在各种深度学习框架中,我们最常用的损失函数就是交叉熵(torch.nn.CrossEntropyLoss),熵是用来描述一个系统的混乱程度,通过交叉熵我们就能够确定预测数据与真是数据之间的相近程度。交叉熵越小,表示数据越接近真实样本。 交叉熵计算公式: 就是我们预测的概率的对数与标签的乘积,当qk->1的时候,它的损失接近零。 nn.NLLLoss 官方文档中介绍称: nn.NLLLoss...

Jeremy_lf的博客 6万+

从认识人工智能到理解机器学习:我的 AI 入门第一课

正式开始学习人工智能之前,我对 AI 的认识其实比较模糊:知道 ChatGPT、知道大模型,也知道现在很多岗位都在谈 AI,但如果有人问我“人工智能到底是什么”“机器是怎么学会识别一只猫的”,我未必能从头到尾讲清楚。上午的课程更偏向行业全景:人工智能的发展、研究方向、NLP、岗位分工、学习路线和 AI Coding 工具。下午的课程更偏向技术基础:机器学习的原理、有监督学习、深度学习、模型训练和评估方法。

chh563的博客 535

低温ECR-MOCVD生长(002)GaN:椭偏仪测厚与电学性能

本研究用ECR-MOCVD在Si(111)和蓝宝石衬底上低温生长GaN薄膜,蓝宝石1.0SCCM、2h样品呈完全(002)择优取向,椭偏仪测厚32.81nm,迁移率10.42cm²/(V·s)。文章梳理了生长温度、TMGa流量与生长时间对结晶取向、膜厚、粗糙度、光学带隙和电学性能的影响。

Flexfilm_的博客 396

小批量训练的JAX机器学习

本文介绍基于BFGS的小批量训练算法,针对全批量方法在高样本量下计算复杂度高的问题,结合JAX的自动微分与高效计算,实现快速收敛。通过optimtool库中的改进的bfgs优化器与小批量策略,支持分类与回归任务,具备早停机制与灵活监控选项,显著提升大规模机器学习训练效率。

林景的博客 133

【第84期】过拟合欠拟合与复杂度对照的实验与排查

系列:《从小白到 AI 大模型开发工程师的进阶之路》 技术点:AI-0306 过拟合与欠拟合 主人公:小蓝伞 前置:AI-0302 本期产出:学习曲线小蓝伞用越来越高次的多项式拟合一条带噪曲线,训练误差继续下降,但这不能说明他更接近真实关系。本期固定训练样本与噪声,只改变多项式次数,比较对训练点和无噪参考曲线的误差,并区分验证曲线与学习曲线。教学情境用来组织问题,下面的执行数据来自构造实验。

qq_36085846的博客 175

Hugging Face:成为机器学习界的“Github”

以下文章来源于OneFlow,作者OneFlow社区五年前,AI领域的知名研究者Andrej Karpathy发文称,传统人工编程属于“软件1.0”,“软件2

2601_96798011的博客 151

机器学习基础|监督学习、标签、回归

网约车预估等待时长依赖监督学习中的回归任务。平台利用历史订单数据,以司机实际到达耗时为标签,通过上车点、时间、运力、路况等特征训练模型。模型不断优化预测值与真实耗时的误差,最终对新订单输出连续的预估等待时间,实现精准预测。

weixin_43971465的博客 273

机器学习——混淆矩阵(待更新)

二元: true表示真实==预测,positive表示预测值=1.

m0_61175448的博客 176
上一篇: AI损失函数:数学公式 + PyTorch API + 使用场景
下一篇: 大模型Prompt提示词详细解析+实际案例
王_teacher
博客等级 码龄9年 118粉丝 51原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值