机器学习之交叉熵

交叉熵(Cross-Entropy)是机器学习中用于衡量预测分布与真实分布之间差异的一种损失函数,特别是在分类任务中非常常见。它源于信息论,反映了两个概率分布之间的距离。


交叉熵的数学定义

对于分类任务,假设我们有:

  • 一个真实的分布 y,用独热编码表示,例如 y=[0,1,0] 表示属于第二类。
  • 一个预测的概率分布\hat{y},例如 \hat{y} = [0.1, 0.7, 0.2],表示模型预测属于各类的概率。

交叉熵的公式为:

其中:

  • yi是真实分布中第 i 类的值(独热编码下只有一个为 1,其余为 0)。
  • \hat{y}_i 是模型预测的第 i 类的概率。

由于 y 是独热编码,交叉熵可以简化为:

其中 c 是真实类别的索引。


交叉熵的直观理解

  1. 信息论解释

    • 交叉熵可以理解为用预测分布\hat{y} 去编码真实分布 y 的代价。
    • 如果预测越接近真实分布(即预测概率\hat{y}_c 越接近 1),交叉熵越小,模型表现越好。
  2. 惩罚机制

    • 如果模型的预测概率 \hat{y}_c 很低(接近 0),交叉熵会给出很大的惩罚。
    • 这促使模型更自信地预测正确类别。

交叉熵的应用场景

  1. 二分类问题: 对于二分类任务,真实标签 y∈{0,1},模型预测 \hat{y} \in [0, 1]。交叉熵损失为:

  2. 多分类问题: 对于 K 类分类任务,交叉熵损失为:

    其中 y_k 表示第 k 类的真实标签,\hat{y}_k 表示模型对第 k 类的预测概率。

  3. 目标检测和语义分割: 交叉熵通常与其他损失(如 IoU、Dice Loss)结合使用,以处理多任务学习。


交叉熵的优点

  1. 数学性质优良:损失函数连续且可微,适合梯度下降优化。
  2. 自然适用于概率分布:直接用概率度量模型的预测质量。
  3. 对错误预测的敏感性:能有效惩罚错误分类,提高模型对分类任务的优化效果。

交叉熵的缺点

  1. 对预测不平衡的敏感性

    • 如果某些类别的样本数很少,模型可能忽视这些类别。
    • 解决方法:可以结合加权交叉熵(Weighted Cross-Entropy)。
  2. 对异常值的敏感性:当预测概率非常接近 0 时,交叉熵的惩罚会非常大,可能导致数值不稳定。


交叉熵与其它损失的关系

  1. 与均方误差(MSE)

    • MSE 更适合回归任务,而交叉熵适合分类任务。
    • 对于分类任务,MSE 可能导致梯度消失,影响优化效果。
  2. 与 KL 散度:交叉熵是 KL 散度的一部分,衡量预测分布与真实分布的差异。


实现示例

二分类问题的交叉熵损失(Python + PyTorch)
复制代码
import torch
import torch.nn as nn

# 假设真实标签和预测概率
y_true = torch.tensor([1, 0, 1], dtype=torch.float32)  # 真实标签
y_pred = torch.tensor([0.8, 0.2, 0.6], dtype=torch.float32)  # 预测概率

# 定义二分类交叉熵损失
loss_fn = nn.BCELoss()
loss = loss_fn(y_pred, y_true)
print(f"Binary Cross-Entropy Loss: {loss.item():.4f}")
多分类问题的交叉熵损失
复制代码
# 假设真实标签和预测概率
y_true = torch.tensor([1, 0, 2])  # 真实标签(类别索引)
y_pred = torch.tensor([[0.3, 0.6, 0.1],
                       [0.1, 0.2, 0.7],
                       [0.8, 0.1, 0.1]])  # 预测概率

# 定义多分类交叉熵损失
loss_fn = nn.CrossEntropyLoss()
loss = loss_fn(y_pred, y_true)
print(f"Multi-class Cross-Entropy Loss: {loss.item():.4f}")

交叉熵是分类任务中的核心损失函数之一,其优异的性质和强大的优化能力使其在机器学习的各个领域得到了广泛应用。

相关推荐
普通老人18 分钟前
【人工智能】一些基本概念
人工智能
菜鸟懒懒22 分钟前
exp1_code
算法
后端小肥肠24 分钟前
Coze实战:一分钟生成10w+独居女孩Vlog动画,零基础也能日更!
人工智能·aigc·coze
Winn~29 分钟前
JVM垃圾回收器-ZGC
java·jvm·算法
Blossom.11829 分钟前
使用Python和OpenCV实现图像识别与目标检测
人工智能·python·神经网络·opencv·安全·目标检测·机器学习
未来影子31 分钟前
SpringAI(GA):SpringAI下的MCP源码解读
人工智能·架构·ai编程
ai技术玩家39 分钟前
8个AI软件介绍及其工作原理讲解
人工智能
AI.NET 极客圈1 小时前
.NET 原生驾驭 AI 新基建实战系列(四):Qdrant ── 实时高效的向量搜索利器
数据库·人工智能·.net
爱coding的橙子1 小时前
每日算法刷题Day24 6.6:leetcode二分答案2道题,用时1h(下次计时20min没写出来直接看题解,节省时间)
java·算法·leetcode
用户21411832636021 小时前
dify案例分享--告别手工录入!Dify 工作流批量识别电子发票,5分钟生成Excel表格
前端·人工智能