PyTorch交叉熵理解

PyTorch 中的交叉熵损失

CrossEntropyLoss

PyTorch 中使用CrossEntropyLoss 计算交叉熵损失,常用于分类任务。交叉熵损失衡量了模型输出的概率分布与实际标签分布之间的差异,目标是最小化该损失以优化模型。

我们通过一个具体的案例来详细说明 CrossEntropyLoss 的计算过程。

假设我们有一个简单的分类任务,共有 3 个类别。我们有 2 个样本的预测和实际标签。

输入

  • 模型的预测(logits,未经过 softmax 激活)

  • 实际标签

python 复制代码
import torch
import torch.nn as nn

# 模型的预测(logits)
logits = torch.tensor([[2.0, 1.0, 0.1],
                       [0.5, 2.0, 0.3]])

# 实际标签
labels = torch.tensor([0, 2])

计算步骤

  • 步骤 1: Softmax 激活

首先,将 logits 通过 softmax 激活函数转换为概率分布。

python 复制代码
softmax = nn.Softmax(dim=1)
probabilities = softmax(logits)
print(probabilities)

输出

python 复制代码
tensor([[0.6590, 0.2424, 0.0986],
        [0.1587, 0.7113, 0.1299]])
  • 步骤 2: 计算交叉熵

交叉熵损失的计算公式为:

C r o s s E n t r o p y L o s s = − ∑ i = 1 N log ⁡ ( p i , y i ) CrossEntropyLoss=-\sum_{i=1}^{N}{\log{(}}{{p}{i,{{y}{i}}}}) CrossEntropyLoss=−∑i=1Nlog(pi,yi)

其中 N 是样本数量, p i , y i p_{i,y_i} pi,yi是第 i个样本在实际标签 y i y_i yi 位置上的预测概率。

我们手动计算每个样本的交叉熵损失:

  • 对于第一个样本,实际标签为 0,预测概率为 0.6590

l o s s 1 = − log ⁡ ( 0.6590 ) ≈ 0.4171 {{loss}_{1}}=-\log{(}0.6590)\approx 0.4171 loss1=−log(0.6590)≈0.4171

  • 对于第二个样本,实际标签为 2,预测概率为 0.1299

l o s s 2 = − log ⁡ ( 0.1299 ) ≈ 2.0406 {{loss}_{2}}=-\log{(}0.1299)\approx 2.0406 loss2=−log(0.1299)≈2.0406

平均损失为:

m e a n = 0.4171 + 2.0406 2 ≈ 1.2288 mean=\frac{0.4171+2.0406}{2}\approx 1.2288 mean=20.4171+2.0406≈1.2288

  • 步骤 3: 使用 PyTorch 的 CrossEntropyLoss 计算

我们使用 PyTorch 的 CrossEntropyLoss 函数来验证计算结果:

python 复制代码
criterion = nn.CrossEntropyLoss()
loss = criterion(logits, labels)
print(loss.item())

输出

shell 复制代码
1.2288230657577515
  • 步骤4:依据公式使用 PyTorch 计算

依据前面的公式使用 PyTorch 计算来验算结果

python 复制代码
neg_log_p = -torch.log(probabilities)
loss_cal = neg_log_p[torch.arange(neg_log_p.shape[0]), labels].mean()
print(loss_cal.item())

输出

shell 复制代码
1.228823184967041

结果基本一致。

总结

  1. CrossEntropyLoss 接受未经过 softmax 的 logits 作为输入。

  2. 内部首先对 logits 应用 softmax,将其转换为概率分布。

  3. 然后根据实际标签计算交叉熵损失。

相关推荐
逢生博客17 分钟前
使用 Python 项目管理工具 uv 快速创建 MCP 服务(Cherry Studio、Trae 添加 MCP 服务)
python·sqlite·uv·deepseek·trae·cherry studio·mcp服务
堕落似梦24 分钟前
Pydantic增强SQLALchemy序列化(FastAPI直接输出SQLALchemy查询集)
python
白熊18827 分钟前
【计算机视觉】CV实战项目 - 基于YOLOv5的人脸检测与关键点定位系统深度解析
人工智能·yolo·计算机视觉
nenchoumi311929 分钟前
VLA 论文精读(十六)FP3: A 3D Foundation Policy for Robotic Manipulation
论文阅读·人工智能·笔记·学习·vln
后端小肥肠39 分钟前
文案号搞钱潜规则:日入四位数的Coze工作流我跑通了
人工智能·coze
LCHub低代码社区41 分钟前
钧瓷产业原始创新的许昌共识:技术破壁·产业再造·生态重构(一)
大数据·人工智能·维格云·ai智能体·ai自动化·大禹智库·钧瓷码
-曾牛41 分钟前
Spring AI 快速入门:从环境搭建到核心组件集成
java·人工智能·spring·ai·大模型·spring ai·开发环境搭建
阿川20151 小时前
云智融合普惠大模型AI,政务服务重构数智化路径
人工智能·华为云·政务·deepseek
自由鬼1 小时前
开源AI开发工具:OpenAI Codex CLI
人工智能·ai·开源·软件构建·开源软件·个人开发
生信碱移1 小时前
大语言模型时代,单细胞注释也需要集思广益(mLLMCelltype)
人工智能·经验分享·深度学习·语言模型·自然语言处理·数据挖掘·数据可视化