训练与优化 / 训练目标与正则化 原理笔记入门 4 分钟阅读 查看源文件 ↗

交叉熵:把分类概率变成训练目标#

TL;DR#

本页内容7 个部分

1. 背景与问题#

分类模型输出一组 logits,但“预测类别对不对”只取决于最大值的位置,不能给每个 logit 连续的学习信号。交叉熵把标签转成目标分布,再按模型分配给目标的概率计算损失;错误且自信的预测会受到更大惩罚。

2. 目标与定义#

设有 CC 个类别,logits 为 z∈RCz\in\mathbb R^C。Softmax 将它们转成预测分布 qi=ezi/∑jezjq_i=e^{z_i}/\sum_j e^{z_j}。用 pip_i 表示固定目标分布,单样本目标为:

H(p,q)=−∑i=1Cpilog⁡qi.H(p,q)=-\sum_{i=1}^C p_i\log q_i.

本文用自然对数,单位为 nat。硬标签 yy 对应 pi=1{i=y}p_i=\mathbf1\{i=y\},损失变成 −log⁡qy-\log q_y;软标签允许不止一个类别提供监督。batch 损失还需按有效样本数或有效 token 数聚合。[1]

3. 方法与推导#

3.1 从似然得到负对数损失#

独立样本的标签似然为 ∏nqyn(xn)\prod_n q_{y_n}(x_n)。最大化该乘积,等价于最大化其 log,再等价于最小化 −∑nlog⁡qyn(xn)-\sum_n\log q_{y_n}(x_n)。因此交叉熵把标签概率连接到了可加的训练目标。

利用 log⁡qi=zi−log⁡∑jezj\log q_i=z_i-\log\sum_j e^{z_j} 和 ∑ipi=1\sum_i p_i=1:

H(p,q)=−∑ipizi+log⁡∑jezj,∂H∂zk=qk−pk.H(p,q)=-\sum_i p_iz_i+\log\sum_j e^{z_j},\qquad\frac{\partial H}{\partial z_k}=q_k-p_k.

目标概率高于预测概率时,梯度下降提高该 logit;反之降低。对 logits 的梯度有界,不能把 −log⁡qy-\log q_y 对概率的巨大导数直接当作 logit 梯度。

3.2 与 KL 和标签平滑的关系#

把 KL 展开,得到 DKL(p∥q)=H(p,q)−H(p)D_{\mathrm{KL}}(p\|q)=H(p,q)-H(p)。目标 pp 固定时,其熵不随模型变化,最小化交叉熵等价于最小化这个方向的 KL。需要 pi>0p_i>0 的位置上 qi>0q_i>0;KL 一般不是对称距离。

标签平滑以系数 ε∈[0,1]\varepsilon\in[0,1] 混入均匀分布 ui=1/Cu_i=1/C:pi=(1−ε)1{i=y}+ε/Cp_i=(1-\varepsilon)\mathbf1\{i=y\}+\varepsilon/C。由交叉熵对目标的线性性:

H(p,q)=(1−ε)(−log⁡qy)+εDKL(u∥q)+εlog⁡C.H(p,q)=(1-\varepsilon)(-\log q_y)+\varepsilon D_{\mathrm{KL}}(u\|q)+\varepsilon\log C.

这增加了从均匀分布到预测分布的 KL 项。教师软标签则可包含各错误类不同的概率,二者的监督信息不同。[2]

3.3 为什么要直接计算 log-softmax#

有限 logits 下,令 M=max⁡jzjM=\max_j z_j,则 log⁡∑jezj=M+log⁡∑jezj−M\log\sum_j e^{z_j}=M+\log\sum_j e^{z_j-M}。指数的输入不再大于零,可避免直接计算巨大指数。实现应使用稳定的交叉熵或 log-softmax;先 softmax 再取 log 可能把已下溢的零变成负无穷。

4. 计算过程#

给定三个类别的 logits 为 (log⁡2,0,0)(\log2,0,0),预测分布为 (0.5,0.25,0.25)(0.5,0.25,0.25),真实类别为第一类:

目标 损失 对三个 logits 的梯度
硬标签 (1,0,0)(1,0,0) −log⁡0.5≈0.693147-\log0.5\approx0.693147 (−0.5,0.25,0.25)(-0.5,0.25,0.25)
平滑 ε=0.3\varepsilon=0.3,目标 (0.8,0.1,0.1)(0.8,0.1,0.1) −0.8log⁡0.5−0.2log⁡0.25≈0.831777-0.8\log0.5-0.2\log0.25\approx0.831777 (−0.3,0.15,0.15)(-0.3,0.15,0.15)

取 logit 空间的一步示意,学习率为 0.1:硬标签把第一类 logit 提高 0.05,另两类各降低 0.025;平滑目标把这个变化减为 0.03 与 −0.015。真实网络还要通过 logit 对参数的 Jacobian 传播。

再核对大数计算:z=(1000,1001,999)z=(1000,1001,999),最大值为 1001,得到 log⁡∑jezj≈1001.407606\log\sum_j e^{z_j}\approx1001.407606。若正确类 logit 为 1000,损失约为 1.407606,而无需计算 e1000e^{1000}。

5. 比较与边界#

交叉熵优化目标分布的概率,不直接等于准确率、校准或下游任务表现。可分且无正则时,硬标签 loss 的下确界可能只在 margin 不断增大时接近;有限模型与实际训练的结果仍依赖数据和优化约束。

标签平滑完全拟合时的最低 loss 为目标的正熵,不是零。C=1000,ε=0.1C=1000,\varepsilon=0.1 时正确类目标为 0.9001、各错误类为 0.0001;这是混入全 CC 类均匀分布的约定。标签平滑研究观察到的校准和蒸馏变化有其模型与实验范围。

参考资料#

  1. CrossEntropyLoss(PyTorch 2.9). 文档:硬标签、软标签与平均分母。
  2. When Does Label Smoothing Help?(NeurIPS 2019). 原文:平滑监督、表征与蒸馏的实验结果。

相关阅读路线

完成一次训练更新 ↗