AI 术语通俗词典:交叉熵损失
交叉熵损失是机器学习、深度学习、分类模型和人工智能中非常常见的一个术语。它用来描述模型预测的概率分布与真实标签之间有多不一致。 换句话说交叉熵损失是在回答模型有没有把足够高的概率分配给真正正确的类别。如果说 Softmax 函数负责把多个类别得分转换成概率那么交叉熵损失负责衡量这些概率是否合理。模型越相信正确类别交叉熵损失越小模型越不相信正确类别交叉熵损失越大。因此交叉熵损失常用于二分类、多分类、神经网络输出层、逻辑回归、Softmax 分类器、大语言模型训练和概率分类任务是理解分类模型训练的核心概念之一。一、基本概念什么是交叉熵损失交叉熵损失Cross-Entropy Loss是一种常用于分类任务的损失函数。它衡量的是真实标签分布与模型预测概率分布之间的差异。在分类任务中模型通常不会只输出一个类别而是输出每个类别的概率。例如一个图像分类模型判断一张图片属于“猫、狗、鸟”三类之一输出可能是猫0.80狗0.15鸟0.05如果真实类别是“猫”那么这个预测比较好因为模型把较高概率给了正确类别。如果模型输出是猫0.05狗0.80鸟0.15那么预测很差因为模型把很低概率给了真实类别“猫”。交叉熵损失的核心思想就是只要真实类别得到的预测概率越高损失越小真实类别得到的预测概率越低损失越大。对于一个真实类别为 c 的样本交叉熵损失可以写为其中• L 表示交叉熵损失• p_c 表示模型分配给真实类别 c 的预测概率• log 表示对数函数从通俗角度看交叉熵损失就是在惩罚模型没有把概率分给正确答案。如果模型给真实类别的概率接近 1损失接近 0如果模型给真实类别的概率接近 0损失会非常大。二、为什么需要交叉熵损失交叉熵损失之所以重要是因为分类任务通常需要模型输出“概率判断”。例如• 这封邮件是垃圾邮件的概率是多少• 这张图片是猫的概率是多少• 这个病人属于高风险类别的概率是多少• 下一个词是某个 token 的概率是多少只判断“对”或“错”是不够的。我们还希望模型知道它对正确答案有多确定。例如两个模型都预测正确类别是“猫”模型 A猫 0.55狗 0.40鸟 0.05模型 B猫 0.98狗 0.01鸟 0.01二者都预测为“猫”准确率上都算正确。但模型 B 明显更有把握也更符合训练目标。交叉熵损失可以区分这两种情况• 正确类别概率越高损失越小• 正确类别概率越低损失越大从通俗角度看准确率只看最后选对没有交叉熵还看模型有没有真正相信正确答案。这使交叉熵非常适合训练概率分类模型。在神经网络中模型训练的目标通常是最小化损失函数。使用交叉熵损失就等价于鼓励模型• 把更高概率分配给真实类别• 把更低概率分配给错误类别因此交叉熵损失是分类模型训练中最常用的损失函数之一。三、交叉熵的核心公式对于多分类任务假设一共有 K 个类别。真实标签通常可以写成 one-hot 向量模型预测概率为其中• y_k 表示第 k 个类别的真实标签值• p_k 表示模型预测样本属于第 k 类的概率• K 表示类别总数在 one-hot 编码中真实类别对应位置为 1其余位置为 0。交叉熵损失定义为因为只有真实类别 c 的 y_c 1其余 y_k 0所以这个公式会化简为其中• c 表示真实类别• p_c 表示模型预测为真实类别的概率例如真实类别是“猫”模型输出猫0.80狗0.15鸟0.05则损失为如果模型只给猫 0.05 的概率损失会大得多。从通俗角度看交叉熵不会平均惩罚所有类别而是重点看模型给真实类别的概率有多高。四、如何直观理解交叉熵损失交叉熵损失最核心的直觉是真实答案应该得到高概率。可以看几个简单情况。如果真实类别概率为那么这表示模型完全相信正确类别损失最小。如果真实类别概率为那么损失大于 0说明模型还不够确定。如果真实类别概率为那么损失会很大表示模型严重不相信正确答案。因此交叉熵损失具有一个重要特点模型越自信地犯错惩罚越大。例如真实类别是“猫”模型 A猫 0.40狗 0.35鸟 0.25模型 B猫 0.01狗 0.98鸟 0.01模型 B 不只是错了而且非常自信地错了所以交叉熵损失会更大。从通俗角度看交叉熵损失不只惩罚错误还惩罚错误时的过度自信。这使它非常适合训练概率输出模型。五、二分类交叉熵损失在二分类任务中真实标签通常为模型输出正类概率其中• y 1 表示正类• y 0 表示负类• p̂ 表示模型预测为正类的概率二分类交叉熵损失为这个公式可以分两种情况理解。1、当真实标签 y 1公式变为此时模型应该让 p̂ 尽量接近 1。如果 p̂ 越大损失越小如果 p̂ 越小损失越大。2、当真实标签 y 0公式变为此时模型应该让 p̂ 尽量接近 0。如果 p̂ 越小1 − p̂ 越大损失越小如果 p̂ 越大说明模型错误地认为样本属于正类损失越大。从通俗角度看• 真实是 1希望模型输出接近 1• 真实是 0希望模型输出接近 0二分类中模型通常先计算一个线性分数再通过 Sigmoid 函数得到概率最后用二分类交叉熵损失训练模型。因此逻辑回归和二分类神经网络都与二分类交叉熵密切相关。六、多分类交叉熵损失在多分类任务中一个样本属于 K 个类别中的一个。模型通常先输出 K 个 logits然后通过 Softmax 函数转换成概率其中• z_k 表示第 k 类的原始分数• p_k 表示第 k 类的预测概率• 所有 p_k 之和为 1如果真实类别是 c则多分类交叉熵为也可以写成 one-hot 形式从通俗角度看Softmax 负责把多个类别分数变成概率交叉熵负责检查真实类别分到了多少概率。例如真实类别是第 2 类类别 10.10类别 20.75类别 30.15损失为如果模型输出类别 10.80类别 20.05类别 30.15损失为明显更大。这说明多分类交叉熵的训练目标是让真实类别的 Softmax 概率尽可能高。七、交叉熵损失与负对数似然交叉熵损失和负对数似然Negative Log-LikelihoodNLL关系非常密切。在概率分类模型中模型会为真实类别分配一个概率最大似然估计希望最大化训练数据中真实标签出现的概率。对于一个样本似然可以看作如果希望最大化这个概率就等价于最小化它的负对数这正是交叉熵损失的形式。因此在分类任务中最小化交叉熵损失 ≈ 最大化真实类别的似然。从通俗角度看交叉熵损失是在惩罚模型没有给真实结果足够高的概率最大似然估计是在鼓励模型让真实结果更可能出现。二者只是表达角度不同。在多分类任务中如果真实类别是 c那么负对数似然就是也就是多分类交叉熵。因此交叉熵损失不仅是一个工程常用损失函数也有明确的概率统计含义。八、交叉熵损失与均方误差的区别交叉熵损失常与均方误差MSE进行比较。1、均方误差更常用于回归均方误差通常写为它衡量预测数值和真实数值之间的平方差。因此MSE 更适合• 房价预测• 温度预测• 销量预测• 连续数值回归2、交叉熵更适合分类分类任务中模型输出的是类别概率。交叉熵直接衡量模型给真实类别的概率是否足够高。因此它更适合• 二分类• 多分类• 文本分类• 图像分类• 语言模型 token 预测3、为什么分类中常用交叉熵如果在分类任务中使用均方误差也可以训练模型但通常不如交叉熵自然。原因是• 交叉熵直接对应概率最大化• 对错误且自信的预测惩罚更强• 与 Sigmoid / Softmax 输出配合更自然• 梯度性质通常更适合分类模型训练从通俗角度看• MSE预测数值差多少• 交叉熵真实类别被分到了多少概率因此回归任务常用 MSE分类任务常用交叉熵。九、交叉熵损失的优势、局限与使用注意事项1、交叉熵损失的主要优势交叉熵损失最大的优势是非常适合概率分类任务。它直接鼓励模型把高概率分配给真实类别并且对自信错误给出较大惩罚。其次交叉熵与最大似然估计有自然联系。这使它具有明确的概率解释。再次交叉熵与 Sigmoid、Softmax 配合良好是现代分类神经网络的标准选择。从通俗角度看交叉熵的优势在于它不只关心模型有没有选对还关心模型有没有把正确答案当成最可信的答案。2、交叉熵损失的主要局限交叉熵损失也有局限。首先它可能鼓励模型过度自信。训练好的神经网络有时会给错误预测也分配很高概率因此概率输出不一定完全等同于真实置信度。其次交叉熵对标签质量较敏感。如果训练标签本身有错误模型会被强迫相信错误标签可能影响泛化。再次在类别严重不平衡时普通交叉熵可能偏向多数类。这时可以考虑类别权重、重采样或 Focal Loss 等方法。此外交叉熵通常假设标签是明确的。但在一些任务中类别边界本身可能模糊硬标签未必能表达全部不确定性。3、使用交叉熵损失时需要注意的问题使用交叉熵损失时需要注意• 二分类常用 Sigmoid 二分类交叉熵• 多分类常用 Softmax 多分类交叉熵• 多标签分类通常不是 Softmax而是每个标签独立 Sigmoid• 在 PyTorch 中CrossEntropyLoss 接收 logits不需要手动 Softmax• 类别不平衡时应关注加权损失或采样策略• 概率输出较高不一定代表模型校准良好• 标签噪声较大时交叉熵可能导致模型过度拟合错误标签从实践角度看交叉熵损失是分类任务的默认选择之一但仍应结合任务类型、标签质量、类别分布和评价指标综合使用。十、Python 示例下面给出几个简单示例用来帮助理解交叉熵损失的计算和使用。示例 1手动计算多分类交叉熵import numpy as np # 模型预测的类别概率分布总和为1[猫, 狗, 鸟]probabilities np.array([0.80, 0.15, 0.05]) # 真实类别索引0表示猫true_class 0 # 交叉熵损失 -log(模型对真实类别的预测概率)loss -np.log(probabilities[true_class]) print(真实类别概率, probabilities[true_class]) # 输出0.80print(交叉熵损失, loss) # 输出 -log(0.80) ≈ 0.2231这个例子对应公式其中 p_c 是真实类别对应的预测概率。示例 2真实类别概率越低损失越大import numpy as np # 不同水平的模型预测概率对真实类别的置信度true_probs [0.99, 0.80, 0.50, 0.10, 0.01] # 交叉熵损失 -log(真实类别的概率)for p in true_probs: loss -np.log(p) # 概率越低损失越大 print(f真实类别概率{p:.2f}, 交叉熵损失{loss:.4f})这个例子可以看到• 真实类别概率越接近 1损失越小• 真实类别概率越接近 0损失越大这体现了交叉熵损失对错误自信预测的强烈惩罚。示例 3二分类交叉熵import numpy as np # 数值计算库 def binary_cross_entropy(y, p): 计算二元交叉熵损失真实标签 y ∈ {0,1}预测概率 p ∈ (0,1) return -(y * np.log(p) (1 - y) * np.log(1 - p)) # 真实标签为正类(1)模型预测正类概率为0.9正确且置信度高loss1 binary_cross_entropy(1, 0.9) # 真实标签为正类(1)模型预测正类概率为0.1错误且置信度高loss2 binary_cross_entropy(1, 0.1) print(预测正确且较自信时的损失, loss1) # 损失较小print(预测错误且较自信时的损失, loss2) # 损失很大这个例子对应二分类交叉熵公式示例 4PyTorch 中的 CrossEntropyLossimport torch # PyTorch框架import torch.nn as nn # 神经网络模块 # logits一个样本对应3个类别的原始分数未归一化logits torch.tensor([[2.0, 1.0, 0.1]]) # 真实类别索引0表示第一类target torch.tensor([0]) # 交叉熵损失函数内部自动计算log-softmax和负对数似然直接接收logitsloss_fn nn.CrossEntropyLoss()loss loss_fn(logits, target) print(交叉熵损失, loss.item()) # 输出损失值 # 如需查看模型预测的概率分布可手动应用Softmaxprobabilities torch.softmax(logits, dim1) # dim1表示对类别维度print(Softmax 概率, probabilities)需要注意nn.CrossEntropyLoss() 内部已经包含了稳定的 LogSoftmax 和负对数似然计算。因此使用它时通常不要先对 logits 手动做 Softmax。示例 5Scikit-learn 中查看对数损失from sklearn.metrics import log_loss # 真实标签多分类三个样本分别属于类0、1、2y_true [0, 1, 2] # 模型预测概率每个样本对三个类别的预测概率每行和为1y_pred_proba [ [0.80, 0.15, 0.05], [0.10, 0.70, 0.20], [0.05, 0.20, 0.75]] # 计算多分类交叉熵损失对数损失取所有样本的平均值loss log_loss(y_true, y_pred_proba) print(平均交叉熵损失 / 对数损失, loss)在 Scikit-learn 中log_loss 通常就是分类任务中的对数损失与交叉熵损失密切相关。它计算的是多个样本上的平均损失。 小结交叉熵损失是一种常用于分类任务的损失函数用来衡量模型预测概率分布与真实标签之间的差异。它的核心思想是真实类别得到的概率越高损失越小真实类别得到的概率越低损失越大。二分类中常用 Sigmoid 加二分类交叉熵多分类中常用 Softmax 加交叉熵。对初学者而言可以把交叉熵损失理解为模型是否把足够多的概率分给了真正正确的类别。“点赞有美意赞赏是鼓励”