拿一个三分类模型举例:训练两百轮,损失从 1.09 降到 0.02,曲线漂亮得像教科书;换到测试集,准确率还不如多数类全猜一遍。AI 训练里这条曲线量的到底是什么,值得先弄清楚。交叉熵名字里带「熵」,它衡量的并非不确定性本身,而是模型给出的分布与真实答案之间还差多远。下面把它替代了什么、怎么算、代价在哪、什么情况下会失灵依次说清。
它替代的是「猜对没猜对」这种粗糙记分
最直白的记分方式是数对了几个。这个数字有个致命缺陷:不可导。对了记 1,错了记 0,中间没有坡度,模型不知道该往哪个方向挪一步,梯度下降也就无从下手。
交叉熵把「对错」换成了「给正确答案留了多少概率」。答对了只给 0.51,和答对了给 0.99,得分不同;答错了但给正确答案留了 0.4,和只留 0.01,惩罚也差得很远。这个连续的刻度可以求导,也能区分「差一点」和「差很远」。
它的定义用到两个分布:真实分布(标准答案)和预测分布。含义可以理解为,用模型给出的分布去编码真实发生的事情,平均要付多少信息量。三分类里答案是猫,一个模型给猫 0.9,另一个只给 0.4,前者的值明显更低,因为它把概率更集中地放在了正确的位置上。
四种记分方式,代价各不相同
同样是衡量「错得多离谱」,四种做法的取舍点完全不同:
| 做法 | 适合什么任务 | 代价 | 什么时候失效 |
|---|---|---|---|
| 交叉熵(配 softmax) | 单标签多分类、语言模型的下一个词 | 对错误标签极敏感,概率接近 0 时损失涨得很快 | 标签本身有错,或类别极度不均衡 |
| 均方误差(配 sigmoid) | 回归、连续值预测 | 分类任务里梯度会被 sigmoid 压扁,学得慢 | 模型很自信却答错时,几乎不再更新 |
| KL 散度 | 蒸馏、分布对齐、变分推断 | 要求两边都是概率分布,单项估计可能为负 | 真实分布未知,只能靠样本估 |
| 焦点损失 | 检测、极端不均衡 | 多两个超参要调,简单任务上没必要 | 类别本来就均衡,收益接近零 |
四行的差别不在谁更准,在「错的时候罚多重」。交叉熵的罚随置信度上升得很快,这既是它好用的原因,也是它在噪声标签上出事的原因。
为什么梯度恰好长得这么合适
softmax 加交叉熵,求导之后形式极简:预测概率减真实标签。答对给 0.9,梯度是 -0.1;答错给 0.1,梯度是 0.9。错得越离谱,改得越快,而且梯度有上界,不会因为一次离谱的预测把参数冲飞。
换成均方误差配 sigmoid,梯度里会多出一个 p(1-p) 因子。模型信心满满地答错时,这个因子接近 0,梯度也接近 0——最该被纠正的时刻,反而几乎不动。这也是早期分类网络训练卡住的常见原因,交叉熵后来成为默认选项正源于此。
数值上有一处要留意:直接算 log(0) 会得到负无穷。实际实现都用 log-sum-exp 把两项合并,框架里的接口已经处理过,自己手写时才需要防这一手。想看这一步的细节,可以顺着Softmax那篇读下去。
和最大似然是同一件事的两种写法
换个角度推:假设每个样本的标签是从模型分布里采样出来的,整批数据的似然就是各样本预测概率的连乘。连乘容易下溢,取对数变成求和,再取负号变成最小化,写出来正好是交叉熵。
所以最小化交叉熵,等于最大化「真实标签出现的概率」。理解这一层,很多工程细节就顺了:加 label smoothing 之所以有用,是因为它把真实分布从 one-hot 摊平,避免模型把概率一路推到 1;温度参数之所以能软化输出,是因为它改的是 softmax 里分布的陡峭程度。
它和KL 散度的关系也只差一项:KL 等于交叉熵减去真实分布的熵。训练时真实分布固定,那项是常数,两者在优化上等价。要看清这一项到底在做什么,可以对照信息熵那一篇。
它算的是分布,不是你真正在意的代价
交叉熵默认你给的标签是对的。标签错了,它不会怀疑,只会把错的那个类往 0.99 推。标注噪声到一定比例,模型会先学会记住噪声,训练损失降得很低,测试表现反而变差,该做的是回头查标签。
类别极度不均衡时它也偏。九千条负例、一百条正例,模型只要全判负例就能把损失压得很低,因为交叉熵对每条样本一视同仁地求和,多数类天然占了大头。这种场景通常要配类别权重、重采样或焦点损失,单靠它不够。
还有一处容易被误读:它衡量分布拟合,不衡量业务代价。把一笔欺诈交易判成正常,和把一笔正常交易判成欺诈,在它眼里一样重。上线前阈值要按误判代价单独定,这一步和损失函数无关。
损失降到很低,该警觉什么
下界是真实分布的熵。one-hot 标签下这个熵是 0,理论上可以无限接近;加了平滑之后,下界变成一个大于 0 的常数。「降到 0」不是目标,降到你设定的下界附近就该停手。
训练损失还在稳步下降、验证损失开始抬头,这是典型的过拟合信号。判断方法和损失函数那篇里讲的一致:两条曲线分叉的位置,才是该停的地方。看到 0.001 就以为模型很好,往往只是在看它背答案背得多熟。
速查:判断交叉熵用得对不对
- 标签本身是否可信,噪声比例大概多少
- 类别是否均衡,要不要配权重或换损失
- 损失下界是多少,有没有加标签平滑
- 训练与验证两条曲线在哪里分叉


