机器学习数学基础 120 章

交叉熵与对数损失

层级:A|建议先修:07-01、05-05、05-08

分类模型输出的通常不是一个类别,而是一组类别概率。交叉熵回答:如果真实数据服从分布 pp,却按照模型分布 qq 编码或预测,平均要付出多大代价?

1. 离散分布的交叉熵

设真实分布为 p(x)p(x),模型分布为 q(x)q(x),定义

H(p,q)=xp(x)logq(x)=EXp[logq(X)].H(p,q)=-\sum_x p(x)\log q(x) =\mathbb E_{X\sim p}[-\log q(X)].

它是“用 qq 给来自 pp 的样本分配编码长度”时的平均长度。注意权重来自真实分布 pp,对数中的概率来自模型 qq

2. 交叉熵与熵、KL 散度

加入再减去 logp(x)\log p(x),可得

H(p,q)=H(p)+DKL(pq).H(p,q)=H(p)+D_{\mathrm{KL}}(p\|q).

对固定数据分布 ppH(p)H(p) 是常数,因此最小化交叉熵等价于最小化 DKL(pq)D_{\mathrm{KL}}(p\|q)。当且仅当 q=pq=p(除零概率点外)时达到最小值。

3. 单个样本的多分类交叉熵

设有 KK 类,真实标签用 one-hot 向量 y\mathbf y 表示,模型输出 p^\hat{\mathbf p}

L=k=1Kyklogp^k.L=-\sum_{k=1}^K y_k\log \hat p_k.

因为只有真实类别 cc 对应的 yc=1y_c=1,所以

L=logp^c.L=-\log\hat p_c.

模型给真实类别的概率越接近 1,损失越接近 0;若给出极小概率,损失会非常大。

4. 二元交叉熵

对标签 y{0,1}y\in\{0,1\} 和预测正类概率 p^\hat p

L(y,p^)=ylogp^(1y)log(1p^).L(y,\hat p)=-y\log\hat p-(1-y)\log(1-\hat p).

y=1y=1 时只剩 logp^-\log\hat p;当 y=0y=0 时只剩 log(1p^)-\log(1-\hat p)。它也是 Bernoulli 模型的负对数似然。

5. 从极大似然推导

对独立同分布样本 (xi,yi)(x_i,y_i),模型给出 pθ(yixi)p_\theta(y_i\mid x_i)。条件似然是

L(θ)=i=1npθ(yixi).L(\theta)=\prod_{i=1}^n p_\theta(y_i\mid x_i).

极大化对数似然

i=1nlogpθ(yixi)\sum_{i=1}^n\log p_\theta(y_i\mid x_i)

等价于最小化平均负对数似然

1ni=1nlogpθ(yixi),-\frac1n\sum_{i=1}^n\log p_\theta(y_i\mid x_i),

这正是经验交叉熵。因此交叉熵并非任意选择,而是分类概率模型的极大似然目标。

6. 与 0-1 损失的差别

0-1 损失只关心预测类别是否正确,几乎处处不可导,也不区分“勉强正确”和“非常确信地正确”。交叉熵连续可导,并对“自信地犯错”施加巨大惩罚,因此更适合梯度优化。

例如真实类别为 1:预测概率 0.51 和 0.99 都分类正确,但损失分别约为 0.673 和 0.010;预测为 0.01 时损失约为 4.605。

7. Softmax 与交叉熵的梯度

设 logits 为 zkz_k

pk=ezkjezj,L=kyklogpk.p_k=\frac{e^{z_k}}{\sum_j e^{z_j}},\qquad L=-\sum_k y_k\log p_k.

可推得一个极其重要的结果:

Lzk=pkyk.\frac{\partial L}{\partial z_k}=p_k-y_k.

这也是深度学习库常把 Softmax 与交叉熵融合实现的原因之一:公式简洁且数值更稳定。

8. 标签平滑与软标签

真实分布不必是 one-hot。标签平滑把真实类别概率从 1 调低,并给其他类别少量质量,例如

yk=(1ε)yk+εK.y'_k=(1-\varepsilon)y_k+\frac{\varepsilon}{K}.

这可抑制过度自信,但也会改变概率校准和最优预测分布,需要根据任务验证。

9. 数值稳定实现

不要先计算 Softmax,再对概率取对数。应使用 log-sum-exp:

L=zc+logjezj.L=-z_c+\log\sum_j e^{z_j}.

m=maxjzjm=\max_j z_j,则

logjezj=m+logjezjm,\log\sum_j e^{z_j}=m+\log\sum_j e^{z_j-m},

可避免指数上溢。实践中应直接调用框架提供的 cross_entropylog_softmax 接口,并确认其输入是 logits 还是概率。

10. 易错点

  1. 把预测概率先四舍五入成类别再计算交叉熵,会丢失概率信息。
  2. CrossEntropyLoss 往往接收 logits,手动再做 Softmax 可能重复计算。
  3. 交叉熵低不等于准确率必然更高;它还关心置信度和校准。
  4. 类别不平衡时直接平均,优化目标会更偏向多数类;可考虑加权损失或重采样。

常见问答

Q1:交叉熵可能小于熵吗?
对同一离散真实分布且 qq 是合法分布时不能,因为二者之差是非负的 KL 散度。

Q2:为什么预测概率为 0 会得到无穷损失?
模型断言真实事件绝不可能发生,却被样本证伪;log0=+-\log0=+\infty。数值实现通过稳定公式或概率截断处理。

Q3:二分类应该用一个 sigmoid 还是两个 softmax 输出?
两者可表达等价概率模型;一个 sigmoid 参数更精简。具体还取决于框架接口和模型结构。

Q4:交叉熵能直接用于回归吗?
普通连续值回归通常使用与所设噪声分布相匹配的负对数似然,如高斯噪声对应均方误差。离散化回归或预测完整分布时可以使用交叉熵。

练习

  1. 真实类别为第 2 类,模型输出 (0.1,0.7,0.2)(0.1,0.7,0.2),计算单样本损失。
  2. 二分类中 y=0y=0p^=0.8\hat p=0.8,计算二元交叉熵。
  3. 证明固定 pp 时,最小化 H(p,q)H(p,q) 等价于最小化 DKL(pq)D_{\mathrm{KL}}(p\|q)
  4. 写出稳定计算 z=(1000,999,998)z=(1000,999,998) 的 log-sum-exp 的步骤。

答案与提示

  1. log0.70.357-\log0.7\approx0.357
  2. log(10.8)=log0.21.609-\log(1-0.8)=-\log0.2\approx1.609
  3. 使用 H(p,q)=H(p)+DKL(pq)H(p,q)=H(p)+D_{\mathrm{KL}}(p\|q),其中 H(p)H(p)qq 无关。
  4. m=1000m=1000,结果为 1000+log(1+e1+e2)1000+\log(1+e^{-1}+e^{-2})