CrossEntropyLoss 详解:分类任务为什么常用它

CrossEntropyLoss 常用于分类任务,它关注的不只是模型有没有猜对,还关注模型对正确类别有多自信。

学习路线:AI 入门与 PyTorch 基础(1~20) · 第 13 课
第 13 课神经网络笔记旁边的屏幕显示柱状图和曲线,用来表示分类概率和误差。
Learning Path

AI 入门与 PyTorch 基础(1~20)

从 AI 基本概念、机器学习任务、深度学习直觉、PyTorch 入门到中文文本分类项目全貌。

学完本阶段你能做到:能说清 AI、机器学习、深度学习、PyTorch 训练流程和一个中文文本分类项目的大致链路。

推荐读法:零基础建议顺序阅读;已有基础的读者可以把它当作路线地图和查漏补缺清单。

查看完整阶段 · 20 篇
Lesson Guide

这一课怎么学

先看目标,再带着问题读正文。读完后用练习确认自己真的理解了。

本节你会学到

  • 说清楚「CrossEntropyLoss 详解:分类任务为什么常用它」解决的核心问题
  • 知道它在「AI 入门与 PyTorch 基础(1~20)」中的位置
  • 把 CrossEntropyLoss、损失函数、分类与回归 这些关键词联系起来

前置知识

  • 建议先读完上一篇:梯度下降算法是什么?参数到底怎么一步步更新
  • 能区分输入、输出、数据和模型目标。

概念回顾

  • 【CrossEntropyLoss】它不仅看模型有没有猜对,还看模型对正确答案有多自信。 前面或后面会反复用到它。
  • 【损失函数】损失函数就是模型的扣分规则,分数越低,说明预测越接近真实答案。 前面或后面会反复用到它。
  • 【分类与回归】判断邮件是不是垃圾邮件是分类,预测房价是多少是回归。 前面或后面会反复用到它。
  • 【机器学习】机器学习的重点不是手写所有规则,而是准备数据、定义目标,让模型自己找到可复用的模式。 前面或后面会反复用到它。

核心概念

常见误区

  • 不要只记定义,要追问它解决了什么问题。
  • 不要把概念孤立背下来,要放回数据到结果的完整链路里。

课后练习

  • 用 3 句话向一个零基础朋友解释「CrossEntropyLoss 详解:分类任务为什么常用它」。
  • 打开概念库里的「CrossEntropyLoss」,补一遍它和本文的关系。
  • 读下一课「前向传播与反向传播到底在做什么?」前,先写下你认为它会解决的问题。

自检练习与参考答案

1. 用一句话说清「CrossEntropyLoss 详解:分类任务为什么常用它」解决了什么问题。

合格答案不是复述标题,而是说清它在“数据进入模型、模型学习、结果评估或项目落地”中的作用。

2. 这篇文章和上一课或下一课是什么关系?

它应该为下一课「前向传播与反向传播到底在做什么?」铺路:读完后要知道下一课为什么自然出现。

下一步建议读「前向传播与反向传播到底在做什么?」。

做分类任务时,经常会遇到 CrossEntropyLoss

分类的完整概率直觉会在后面的逻辑回归里继续讲透。这里先建立一个关键感觉:损失函数不是在“判对错”,而是在衡量模型离正确答案还有多远,不要求第一次就看懂所有公式推导。

比如图片分类、文本分类、情感分析,只要模型要从多个类别里选一个答案,它就很可能会出现。

它为什么这么常用?

因为分类任务里,我们关心的不只是“猜没猜对”,还关心模型对正确答案有多自信。

第 14 课视频 · CrossEntropyLoss 详解(约 1 分 37 秒)

分类模型输出的是什么

假设我们有一个三分类任务:猫、狗、鸟。

模型最后可能会输出三个分数:

猫:2.1
狗:0.3
鸟:-1.2

这些分数还不是概率,它们通常叫 logits。

我们可以用 Softmax 把它们转换成概率:

猫:0.82
狗:0.15
鸟:0.03

如果真实答案是猫,那么这个预测就比较好,因为模型给猫的概率最高。

CrossEntropyLoss 关注什么

CrossEntropyLoss 会重点看正确类别的概率。

如果正确类别的概率很高,loss 就小;如果正确类别的概率很低,loss 就大。

比如真实答案是猫:

  • 模型给猫 0.9,loss 很小
  • 模型给猫 0.5,loss 变大
  • 模型给猫 0.1,loss 会很大

这很符合直觉。

模型不仅要选对,还要对正确答案有足够信心。

为什么不能只看准确率

假设两个模型都预测对了。

模型 A 给正确类别的概率是 0.51

模型 B 给正确类别的概率是 0.95

从准确率看,它们都对了;但从训练角度看,模型 B 显然更好。

CrossEntropyLoss 就能区分这种差别。

它会鼓励模型把更多概率分给正确类别,而不是只要勉强猜对就行。

PyTorch 里怎么用

在 PyTorch 里,CrossEntropyLoss 通常这样用:

import torch
from torch import nn

loss_fn = nn.CrossEntropyLoss()

logits = torch.tensor([[2.1, 0.3, -1.2]])
target = torch.tensor([0])

loss = loss_fn(logits, target)

这里有一个很重要的点:

CrossEntropyLoss 接收的是 logits,不需要你提前手动做 Softmax。

因为 PyTorch 的 CrossEntropyLoss 内部已经包含了 LogSoftmax 和负对数似然损失。

如果你先手动 Softmax,再传进去,反而可能造成数值问题。

标签应该长什么样

对于多分类任务,target 通常是类别索引。

比如:

0 表示猫
1 表示狗
2 表示鸟

如果一批数据有 4 个样本,标签可能是:

target = torch.tensor([0, 2, 1, 0])

这表示第 1 个和第 4 个样本是猫,第 2 个是鸟,第 3 个是狗。

小结

CrossEntropyLoss 很适合分类任务,因为它能衡量模型对正确类别的信心。

记住三个关键点:

  1. 它常用于分类任务。
  2. PyTorch 里通常直接传 logits。
  3. target 通常是类别索引,而不是 one-hot。

理解了这些,再看分类模型训练代码,就不会被 loss 那一行卡住。

Discussion

留言讨论