交叉熵与对数损失
层级:A|建议先修:07-01、05-05、05-08
分类模型输出的通常不是一个类别,而是一组类别概率。交叉熵回答:如果真实数据服从分布 p,却按照模型分布 q 编码或预测,平均要付出多大代价?
1. 离散分布的交叉熵
设真实分布为 p(x),模型分布为 q(x),定义
H(p,q)=−x∑p(x)logq(x)=EX∼p[−logq(X)].
它是“用 q 给来自 p 的样本分配编码长度”时的平均长度。注意权重来自真实分布 p,对数中的概率来自模型 q。
2. 交叉熵与熵、KL 散度
加入再减去 logp(x),可得
H(p,q)=H(p)+DKL(p∥q).
对固定数据分布 p,H(p) 是常数,因此最小化交叉熵等价于最小化 DKL(p∥q)。当且仅当 q=p(除零概率点外)时达到最小值。
3. 单个样本的多分类交叉熵
设有 K 类,真实标签用 one-hot 向量 y 表示,模型输出 p^:
L=−k=1∑Kyklogp^k.
因为只有真实类别 c 对应的 yc=1,所以
L=−logp^c.
模型给真实类别的概率越接近 1,损失越接近 0;若给出极小概率,损失会非常大。
4. 二元交叉熵
对标签 y∈{0,1} 和预测正类概率 p^,
L(y,p^)=−ylogp^−(1−y)log(1−p^).
当 y=1 时只剩 −logp^;当 y=0 时只剩 −log(1−p^)。它也是 Bernoulli 模型的负对数似然。
5. 从极大似然推导
对独立同分布样本 (xi,yi),模型给出 pθ(yi∣xi)。条件似然是
L(θ)=i=1∏npθ(yi∣xi).
极大化对数似然
i=1∑nlogpθ(yi∣xi)
等价于最小化平均负对数似然
−n1i=1∑nlogpθ(yi∣xi),
这正是经验交叉熵。因此交叉熵并非任意选择,而是分类概率模型的极大似然目标。
6. 与 0-1 损失的差别
0-1 损失只关心预测类别是否正确,几乎处处不可导,也不区分“勉强正确”和“非常确信地正确”。交叉熵连续可导,并对“自信地犯错”施加巨大惩罚,因此更适合梯度优化。
例如真实类别为 1:预测概率 0.51 和 0.99 都分类正确,但损失分别约为 0.673 和 0.010;预测为 0.01 时损失约为 4.605。
7. Softmax 与交叉熵的梯度
设 logits 为 zk,
pk=∑jezjezk,L=−k∑yklogpk.
可推得一个极其重要的结果:
∂zk∂L=pk−yk.
这也是深度学习库常把 Softmax 与交叉熵融合实现的原因之一:公式简洁且数值更稳定。
8. 标签平滑与软标签
真实分布不必是 one-hot。标签平滑把真实类别概率从 1 调低,并给其他类别少量质量,例如
yk′=(1−ε)yk+Kε.
这可抑制过度自信,但也会改变概率校准和最优预测分布,需要根据任务验证。
9. 数值稳定实现
不要先计算 Softmax,再对概率取对数。应使用 log-sum-exp:
L=−zc+logj∑ezj.
令 m=maxjzj,则
logj∑ezj=m+logj∑ezj−m,
可避免指数上溢。实践中应直接调用框架提供的 cross_entropy 或 log_softmax 接口,并确认其输入是 logits 还是概率。
10. 易错点
- 把预测概率先四舍五入成类别再计算交叉熵,会丢失概率信息。
CrossEntropyLoss 往往接收 logits,手动再做 Softmax 可能重复计算。
- 交叉熵低不等于准确率必然更高;它还关心置信度和校准。
- 类别不平衡时直接平均,优化目标会更偏向多数类;可考虑加权损失或重采样。
常见问答
Q1:交叉熵可能小于熵吗?
对同一离散真实分布且 q 是合法分布时不能,因为二者之差是非负的 KL 散度。
Q2:为什么预测概率为 0 会得到无穷损失?
模型断言真实事件绝不可能发生,却被样本证伪;−log0=+∞。数值实现通过稳定公式或概率截断处理。
Q3:二分类应该用一个 sigmoid 还是两个 softmax 输出?
两者可表达等价概率模型;一个 sigmoid 参数更精简。具体还取决于框架接口和模型结构。
Q4:交叉熵能直接用于回归吗?
普通连续值回归通常使用与所设噪声分布相匹配的负对数似然,如高斯噪声对应均方误差。离散化回归或预测完整分布时可以使用交叉熵。
练习
- 真实类别为第 2 类,模型输出 (0.1,0.7,0.2),计算单样本损失。
- 二分类中 y=0、p^=0.8,计算二元交叉熵。
- 证明固定 p 时,最小化 H(p,q) 等价于最小化 DKL(p∥q)。
- 写出稳定计算 z=(1000,999,998) 的 log-sum-exp 的步骤。
答案与提示
- −log0.7≈0.357。
- −log(1−0.8)=−log0.2≈1.609。
- 使用 H(p,q)=H(p)+DKL(p∥q),其中 H(p) 与 q 无关。
- 取 m=1000,结果为 1000+log(1+e−1+e−2)。