交叉熵与概率分类
交叉熵惩罚模型给真实类别分配过低概率,尤其惩罚自信但错误的预测。
学习前需要掌握
背景与问题
两个分类器可能给出相同的最终类别,却对正确类别分配完全不同的概率。只看是否分对,无法区分谨慎判断与非常自信的错误,交叉熵则利用整个概率输出评价。
它既是常见训练目标,也可用于独立概率评价;但用交叉熵训练,不会自动使所有样本或群体的概率都校准。
概念定义
对一个标签确定的多分类样本,交叉熵等于真实类别预测概率的负对数。对多个样本再取平均;二分类可以写成正负两类概率的对应形式。
数学公式常把标签写成 one-hot,但具体库接口可能要求整数类别、概率向量或 logits。阅读接口时应区分这些输入,而不是只根据公式中的符号猜测。
直观理解
给正确答案越低的概率,负对数代价越大。把真实类别概率从 0.9 降到 0.1,损失不是简单增加 0.8,而是从约 0.105 增至 2.303;极度自信地错判会受到更强惩罚。
预测类别一样,交叉熵可以不同
真实类别为 1 时,两组二分类概率 [0.49,0.51] 与 [0.01,0.99] 都预测类别 1,准确与否相同;对应损失约为 0.673 与 0.010。若给真实类别的概率只有 0.01,则损失约为 4.605。
下面代码再核对两条三分类样本:真实类别是 0 和 2,对应正确类别概率为 0.9 与 0.7,平均交叉熵为 -[ln(0.9)+ln(0.7)]/2≈0.2310。两组小例子都只是固定概率的计算。
核心原理
类别列的顺序必须与标签编码一致。概率矩阵每行表示哪些类别,应明确保留;列顺序弄反时,即使每行仍然和为 1,损失也在评价错误的对应关系。
合法概率非负、各类总和为 1。理论上给真实类别零概率会产生无穷损失;实际实现会采用稳定的 log-softmax 或数值裁剪,不应把这些技术处理解释成允许随意填写无效概率。
PyTorch CrossEntropyLoss 一般直接接收 logits,sklearn log_loss 则接收概率。重复或遗漏 Softmax 会改变计算和梯度,应核对具体函数契约。
交叉熵利用置信程度,但并不是所有业务错误成本的直接替代。还要检查类别不平衡、校准、阈值及错误类型,不能仅凭一个平均损失决定上线。
数学表达
核心表达
概率必须有效且类别顺序一致;低交叉熵不自动证明概率完全校准。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1获得类别概率
- 2定位真实类别概率
- 3取负对数
- 4批次平均
代码对应位置
示例 1按正确类别概率核对平均交叉熵:显式指定三类概率列的顺序,复现 0.2310。
计算与实现步骤
- 获得类别概率
- 定位真实类别概率
- 取负对数
- 批次平均
- 与准确率和校准共同评价
代码实现
示例 1
按正确类别概率核对平均交叉熵
example_01.py用途:显式指定三类概率列的顺序,复现 0.2310。
from sklearn.metrics import log_loss
y_true = [0, 2]
y_prob = [[0.9, 0.08, 0.02], [0.1, 0.2, 0.7]]
loss = log_loss(y_true, y_prob, labels=[0, 1, 2])
print(f"cross_entropy={loss:.4f}")代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
显式指定三类概率列的顺序,复现 0.2310。
loss- 当前预测与目标之间的损失值。
Step 1 · 1–5 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
from sklearn.metrics import log_loss
y_true = [0, 2]
y_prob = [[0.9, 0.08, 0.02], [0.1, 0.2, 0.7]]
loss = log_loss(y_true, y_prob, labels=[0, 1, 2])
print(f"cross_entropy={loss:.4f}")代码与数学原理
平方误差代码对应均方损失。
预期输出或运行结果
cross_entropy=0.2310
常见错误 · 2 条
- 把 logits 当概率传入 sklearn log_loss
- 类别列顺序错位
实际应用
- 逻辑回归训练
- 概率模型评价
常见错误
- 把 logits 当概率传入 sklearn log_loss
- 类别列顺序错位
推荐学习资料
参考库不会生成虚假资源或无效外部链接。