跳到主内容

什么是交叉熵?它为什么成了常用损失

2026-10-06 发布 来源:我告诉你AI导航 阅读

拿一个三分类模型举例:训练两百轮,损失从 1.09 降到 0.02,曲线漂亮得像教科书;换到测试集,准确率还不如多数类全猜一遍。AI 训练里这条曲线量的到底是什么,值得先弄清楚。交叉熵名字里带「熵」,它衡量的并非不确定性本身,而是模...

拿一个三分类模型举例:训练两百轮,损失从 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 就以为模型很好,往往只是在看它背答案背得多熟。

速查:判断交叉熵用得对不对

  • 标签本身是否可信,噪声比例大概多少
  • 类别是否均衡,要不要配权重或换损失
  • 损失下界是多少,有没有加标签平滑
  • 训练与验证两条曲线在哪里分叉

反馈页面信息

请描述需要更正的地方,页面标题和网址会自动附上。

也可以发邮件至 [email protected]