7-损失函数篇:交叉熵

发布于 2025-04-02  108 次阅读


“问:为什么交叉熵损失比MSE更适合分类?“

“答:当你妈说你“大概有70%概率找到对象”时,MSE会淡定点头,交叉熵会怒吼:‘另外30%是哪来的野分布?!’ “

认识交叉熵

信息量(Amount of Information)

要认识交叉熵,还需从信息量(Amount of Information)开始。

概率事件中蕴含了信息

想象在和朋友A远程聊天时,朋友A向你分享了三个事件:

  • “我这边太阳从东边升起来了,而不是南边。” ——事件1
  • “我抛了一枚没有厚度的硬币,结果反面朝上。” ——事件2
  • “我买彩票中了一等奖。” ——事件3

一般情况下,我们可能出现如下反应:

  • 事件1 :完全不惊讶,你不说我也知道。
  • 事件2 :不怎么惊讶,虽然你说了我才知道,但我觉得很正常。
  • 事件3 :非常惊讶。

对于朋友A描述的概率事件,我们表现出了不同程度的“惊讶”程度。

信息量量化了概率事件蕴含的信息

数学上,我们用概率 P(x) 表示事件 x 发生的概率。是否也能用某种方法,比较合理和准确地描述不同概率事件隐含的“惊讶”差异呢?

1948年,克劳德·香农(Claude Shannon) 在《通信的数学理论》中提出了信息量的概念:

$$ \begin{aligned} I(x) &= -\log(p(x)) \\ \text{where } & p(x) \text{ 是事件 } x \text{ 发生的概率}, \quad 0 < p(x) \leq 1 \end{aligned} $$

  • 当P(x)→1时(必然事件),信息量趋近于0
  • 当P(x)→0时(小概率事件),信息量趋近于+∞
  • 对数底数决定单位(bit用2,nat用e)

概率 P(x) 越小(越靠近0)时,表示信息量越大;反之,则越小。可以通俗的理解:发生了越小概率的事件时,我们越觉得惊讶。这个简单的公式很好地捕捉了人类对信息的直觉认知。

例如,在朋友A描述的事件中,取对数底数为2时:

  • 事件1 :太阳从东边升起概率几乎可以认为1。则信息量(事件1) = 0
  • 事件2 :抛没有厚度的硬币,反面朝上概率为 1/2。则信息量 (事件2) = 1
  • 事件3 :中彩票一等奖概率很低,不妨设为 1/100000。则信息量(事件3) ≈ 19.93

在相对较复杂的概率系统(由多个概率事件共同决定输出)中,为描述该概率系统蕴含的信息量(“惊讶”程度),则引出了另一个概念——

熵(Entropy)

想象在和朋友B远程聊天,朋友B向你分享:

  • “我这边下雨了!” ——事件4

对于事件4,应该感到惊讶吗?

这可以取决于诸多因素,例如朋友B当前的所处地点:

  • 如果朋友B此时在某个热带气候地区,那么事件4通常不会令人感到多惊讶。
  • 如果朋友B此时在太阳系的金星,那么事件4的惊讶程度可能将高出不少。

对于较复杂的概率系统发生的现象,其背后蕴含的惊讶程度,可能由多个概率事件及其信息量共同决定,我们可以将其理解为不确定性。即:

  • 简单概率事件:出现的事件,蕴含的信息量越大,越令人惊讶。
  • 复杂概率系统:出现的现象,携带的不确定性越大,越令人惊讶。

“熵”便用于度量概率系统的不确定性。

熵起源于热力学

熵(Entropy)的概念最初由德国物理学家 鲁道夫·克劳修斯(Rudolf Clausius) 于1865年提出,用于描述热力学系统的无序程度

  • 热力学第二定律:熵增原理指出,孤立系统的熵永不减少(ΔS ≥ 0),即系统自发趋向无序。
  • 物理意义:熵衡量能量分布的“分散程度”。例如,热量从高温物体流向低温物体时,系统熵增加。

奥地利物理学家 路德维希·玻尔兹曼(Ludwig Boltzmann)在统计力学中提出了熵的微观解释,在平衡态的孤立系统中:

$$ \begin{aligned} S &= k_B \ln \Omega \\ \text{where } & \begin{aligned} \Omega &: \text{系统的微观状态数} \\ k_B &: \text{玻尔兹曼常数} \ (\approx 1.38 \times 10^{-23} \, \text{J/K}) \end{aligned} \end{aligned} $$

后来,更广义的吉布斯熵(Gibbs Entropy)基于概率分布解释了非平衡态的广义统计系综(ensemble):

$$ \begin{aligned} S &= -k_B \sum_{i} p_i \ln p_i \\ \text{where } & \begin{aligned} p_i &: \text{系统处于第 } i \text{ 个微观状态的概率} \\ \sum_{i} p_i &= 1 \quad (\text{概率归一化条件}) \end{aligned} \end{aligned} $$

信息熵用于解释量化信息的不确定性

1948年,美国数学家 克劳德·香农(Claude Shannon) 在论文《通信的数学理论》中引入“信息熵”,用于量化信息的不确定性

$$ \begin{aligned} H(X) &= -\sum_{i=1}^{n} p(x_i) \log p(x_i) \\ \text{where } & X = \{x_1, x_2, \ldots, x_n\}, \quad \sum_{i=1}^{n} p(x_i) = 1 \end{aligned} $$

香农最初想称其为“不确定性”(Uncertainty),但数学家 约翰·冯·诺依曼(John von Neumann) 建议使用“熵”,因为:

“熵在热力学中已有数学形式,且没人真正理解它是什么,这样在争论中你总能占上风。”
(原文:“Call it entropy. No one knows what entropy really is, so in a debate you will always have the advantage.”

热力学熵 vs 信息熵

维度热力学熵信息熵
起源领域热力学与统计力学信息论与通信理论
物理意义能量分散程度、系统无序性信息的不确定性或信息量
数学形式\( S=k_B \ln \Omega \)\( H(X)=-\sum_{i=1}^{n} p(x_i) \log p(x_i) \)
单位焦耳/开尔文(J/K)比特(bit)或纳特(nat)
方向性熵增不可逆(时间箭头)无方向性,仅描述当前状态
应用场景热机效率、化学反应、宇宙演化数据压缩、密码学、机器学习

在机器学习中,我们常提到的 “交叉熵损失函数” 中的 “熵” ,通常指的都是 “信息熵” 。(本文章以下内容中,没有特殊说明的情况下,提到的熵,也都默认是信息熵)

信息熵几乎是信息量在概率系统中的期望

从信息量和信息熵的定义不难看出,(移除二者公式的负数符号)形式上:

信息熵 = 概率1*信息量1 + 概率2*信息量2 + ... + 概率n*信息量n = 信息量的期望

当所有事件等概率时,系统的不确定性达到最大值。

当我们引入了第二个分布Q,想知道用Q来近似真实分布P的效果如何时(例如,我们训练了一个做分类任务神经网络模型,想知道该模型对训练数据集的"看法",跟真实分布的“看法”相比,差距如何), 便引出了我们的主角——交叉熵。

交叉熵(Cross-Entropy)

预测熵 - 真实熵 = 信息增益

已知对于训练数据集的信息熵,即衡量自身的不确定性,是固定的。

假设模型预测的概率分布是q(x),为了让预测分布q(x)的信息熵与真实分布p(x)的信息熵实现的效更接近,考虑将真实信息熵中的信息量用q(x)的信息量替换。这样就会产生一个带有误差的新的信息熵,当我们通过修改q(x),能降低新信息熵的误差,也意味着,修改后的q(x)实现的效果,也愈加近似真实分布p(x)。

上述用q(x)的信息量替换后得到的新信息熵,便是交叉熵:

$$ \begin{aligned} H(p, q) &= -\sum_{x \in \mathcal{X}} p(x) \log q(x) \\ \text{where } & \begin{aligned} p(x) &: \text{真实分布的概率} \\ q(x) &: \text{模型预测分布的概率} \\ \mathcal{X} &: \text{样本空间} \end{aligned} \end{aligned} $$

为了比较交叉熵与真实分布的信息熵的区别,我们用交叉熵减去原本的信息熵:

$$ \begin{aligned} \text{信息熵:} \quad H(p) &= -\sum_{x} p(x) \log p(x) \\ \\ \text{交叉熵:} \quad H(p, q) &= -\sum_{x} p(x) \log q(x) \\ \\ \text{关系推导:} \quad H(p, q) - H(p) &= (-\sum_{x} p(x) \log q(x)) - (-\sum_{x} p(x) \log p(x)) \\ \\ &= \sum_{x} p(x) \log \frac{p(x)}{q(x)} \\ \\ \end{aligned} $$

得到相对熵(Relative Entropy)

$$ \begin{aligned} \text{相对熵:} \quad H(p, q) - H(p) &= \sum_{x} p(x) \log \frac{p(x)}{q(x)} \\ \end{aligned} $$

相对熵的推导由Solomon Kullback 和 Richard Leibler 在1951年的论文《On Information and Sufficiency》中首次提出,因此相对熵又叫 Kullback-Leibler Divergence(简称KL散度)。

$$ \begin{aligned} \text{KL散度:} \quad D_{\text{KL}}(p \parallel q) &= \sum_{x} p(x) \log \frac{p(x)}{q(x)} \\ \end{aligned} $$

让预测熵更近似真实熵的过程等价于降低KL散度

根据吉布斯不等式可知:KL散度 ≥ 0,当且仅当p(x) = q(x) 对于所有 x 均成立时,等号成立。

所以让预测熵的分布更接近真实分布的过程,即让模型预测效果更接近训练数据集标记效果的过程,底层原理就是不断降低交叉熵的KL散度的过程。

比如,在图像分类任务中:

  • 真实分布 p:一张猫的图片,标签为 [猫:1.0, 狗:0.0, 鸟:0.0]
  • 预测分布 q:模型预测为 [猫:0.7, 狗:0.2, 鸟:0.1]

交叉熵:\( H(p, q)=-(1.0 ⋅ \log 0.7+ 0.0 ⋅ \log 0.2+ 0.0 ⋅ \log 0.1)=- \log 0.7 ≈ 0.36 \)

如果模型下一次预测为 [猫:0.9, 狗:0.1, 鸟:0.0],交叉熵变为 −log⁡0.9≈0.10−log0.9≈0.10,损失也更小。

通过最小化交叉熵,模型逐渐将预测概率集中在真实类别上。

所以交叉熵常常被用作分类任务模型损失函数

深度学习中的交叉熵(参考)

名称框架接口函数应用场景特点(优劣)常见配合技术复杂度(时间/空间)
标准交叉熵TF: CategoricalCrossentropy/SparseCategoricalCrossentropy
PyTorch: CrossEntropyLoss
多分类任务(如MNIST分类)简单直接,但对类别不平衡敏感,需搭配SoftmaxSoftmax层、全连接层\( O(n)/O(n) \)
二元交叉熵TF: BinaryCrossentropy
PyTorch: BCELoss/BCEWithLogitsLoss
二分类任务(如垃圾邮件检测)专为二分类设计,需注意输出是否经过SigmoidSigmoid层、二分类头
\( O(n)/O(n) \)
加权交叉熵TF: sample_weight参数
PyTorch: 自定义权重
类别不平衡任务(如医学图像分割)需手动定义类别权重,调参成本高Focal Loss、OHEM
\( O(n)/O(n) \)
标签平滑交叉熵TF: CategoricalCrossentropy + 标签平滑预处理
PyTorch: 自定义标签平滑
标签噪声场景(如弱监督学习)防止模型过度自信,提升泛化性Mixup、知识蒸馏
\( O(n)/O(n) \)
Focal LossTF: SigmoidFocalCrossEntropy
PyTorch: 自定义实现
密集检测任务(如RetinaNet)抑制简单样本梯度,需调参alphagamma单阶段检测器、难例挖掘
\( O(n)/O(n) \)
KL散度损失TF: KLDivergence
PyTorch: KLDivLoss(需输入log概率)
生成模型(如VAE、GAN)非对称性,需注意输入分布形式(log空间或概率空间)变分推断、对抗训练
\( O(n)/O(n) \)
温度缩放交叉熵TF: 自定义(Softmax(logits/T) + 标准交叉熵)
PyTorch: 自定义
知识蒸馏(如模型压缩)需联合优化教师模型温度和学生模型知识蒸馏框架(如DistilBERT)
\( O(n)/O(n) \)
对比交叉熵TF: SparseCategoricalCrossentropy + 自定义相似度矩阵
PyTorch: CrossEntropyLoss + 自定义对比目标
对比学习(如SimCLR、CLIP)依赖大量负样本,计算成本高数据增强、记忆库(MoCo)
\( O(n^{2})/O(n) \)
结构化交叉熵TF: 第三方CRF库(如tensorflow-addons
PyTorch: torchcrf.CRF + 自定义损失
结构化预测(如序列标注)需联合建模标签依赖关系(如CRF),实现复杂CRF层、Transformer解码器\( O(n^{2})/O(n^{2}) \)

总结

从信息量的量化度量,到系统不确定性的熵,再到比较分布差异的交叉熵,这条理论链条为现代机器学习奠定了重要基础。具体来说:

  1. 交叉熵损失函数可作为分类任务的首选指标
  2. 理解不同交叉熵函数的适用场景至关重要
  3. 交叉熵与KL散度的关系揭示了模型优化的本质