当前位置: 首页 > news >正文

机器学习之交叉熵

交叉熵(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}")

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

http://www.lryc.cn/news/506065.html

相关文章:

  • 数据结构 ——前缀树查词典的实现
  • MySQL 主从复制与高可用架构
  • 【Golang】如何读取并解析SQL文件
  • git branch -r(--remotes )显示你本地仓库知道的所有 远程分支 的列表
  • Typescript安装
  • 使用C#在目录层次结构中搜索文件以查找目标字符串
  • 基于Redis实现令牌桶算法
  • [Java] 使用 VSCode 来开发 Java
  • 奇怪的知识又增加了,ESP32下的Lisp编程:ULisp--Lisp for microcontrollers
  • STM32标准库学习之寄存器方法点亮LED灯
  • Jenkins:持续集成与持续部署的利器
  • 概率论得学习和整理30: 用EXCEL 描述泊松分布 poisson distribution
  • 汽车SoC芯片及其安全岛设计与未来发展趋势(学习笔记)
  • 【排序算法】——选择排序
  • 第十五章 Linux Shell 编程
  • 【c++笔试强训】(第三十八篇)
  • go 自己写序列化函数不转义
  • 一般行业安全管理人员考试题库分享
  • Marketo REST API 批量修改邮件内容
  • 《云原生安全攻防》-- K8s安全框架:认证、鉴权与准入控制
  • 淘宝获取sku详细信息 API
  • 基于Spring Boot的体育商品推荐系统
  • C++小细节笔记
  • go语言并发读写数据队列,不停写的同时,一次最多读取指定量数据(逐行注释)
  • 密码学——密码学概述、分类、加密技术(山东省大数据职称考试)
  • 【数据库MySQL篇二】MySQL数据库入门基础教程:一网打尽数据库和表各种操作、命令和语法
  • Android 解决“Could not resolve all artifacts for configuration ‘:classpath‘方法
  • 青少年编程与数学 02-004 Go语言Web编程 08课题、使用Gin框架
  • PostgreSQL: 事务年龄
  • C# 识别二维码