Concepts
seed

二元交叉熵

衡量二分类概率预测与真实标签有多不一致的损失函数,会显著惩罚自信但错误的预测。

deep-learningmachine-learningclassificationloss-function

当前理解

二元交叉熵(Binary Cross-Entropy,BCE)是二分类任务中常见的损失函数。它比较两个东西:真实标签 y{0,1}y\in\{0,1\},以及模型预测类别 11 的概率 p(0,1)p\in(0,1)

L=[ylogp+(1y)log(1p)]L = -\left[y\log p + (1-y)\log(1-p)\right]

这个公式可以分成两种情况理解:

  • 当真实标签 y=1y=1 时,损失是 logp-\log p
  • 当真实标签 y=0y=0 时,损失是 log(1p)-\log(1-p)

也就是说,它只关心模型分给“正确类别”的概率。这个概率越接近 11,损失越接近 00;越接近 00,损失就越大。

真实标签 yy类别 1 概率 pp正确类别概率损失直觉
110.90.90.90.90.105自信地答对
110.10.10.10.12.303自信地答错
000.10.10.90.90.105自信地答对
000.90.90.10.12.303自信地答错

为什么我关心

只统计“分类对了多少次”不足以指导模型学习。预测 0.510.51 和预测 0.990.99 在阈值为 0.50.5 时都算答对,但它们表达的确信程度明显不同;同样,预测 0.490.49 与预测 0.010.01 虽然都答错,错误程度也不一样。

二元交叉熵保留了这种差别,并且是连续、可导的,因此优化算法可以根据损失的变化方向更新参数。

观察角度

  • 作为评分规则:检查模型给正确答案分配了多少概率。
  • 作为训练目标:把每条样本的预测质量变成一个可以最小化的数。
  • 作为置信度约束:正确且自信时损失小,错误且自信时损失大。
  • 作为似然:最小化二元交叉熵,等价于最大化伯努利模型对观测标签给出的似然。

连接

二元交叉熵经常与 Sigmoid 配合:Sigmoid 把任意分数转换成类别 11 的概率,二元交叉熵再用真实标签评价这个概率。

线性分数 z → Sigmoid → 概率 p → 二元交叉熵 → 损失 L

两者组合后,对线性分数 zz 的梯度会简化为:

Lz=py\frac{\partial L}{\partial z}=p-y

这正是逻辑回归以及使用 Sigmoid 输出的单个神经元中常见的误差信号。

实际框架通常提供“直接接收 logits”的实现,例如把 Sigmoid 与二元交叉熵合并计算。这样可以避免先得到非常接近 0011 的概率后再取对数,数值上更加稳定。

张力与取舍

二元交叉熵适合互斥的二分类,也可以用于每个标签独立成立的多标签分类,但不应直接套用到所有预测任务。多类别单选任务通常使用分类交叉熵,回归问题则需要其他损失函数。

当类别极度不平衡时,整体 BCE 下降也不一定意味着少数类表现良好。此时还需要观察精确率、召回率等指标,或根据任务使用类别权重、重采样等方法。

未解问题

  • 为什么对数能把多个样本概率的乘积变成损失之和?
  • 交叉熵与最大似然估计之间具体怎样对应?
  • BCEWithLogitsLoss 为什么比手动计算 Sigmoid 再取对数更稳定?
  • 类别不平衡时,应该怎样调整损失或采样策略?

演化

  • 2026-08-21: 初始 seed,在学习单个神经元与逻辑回归时建立。