“问:为什么交叉熵损失比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) 在《通信的数学理论》中提出了信息量的概念:
- 当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)在统计力学中提出了熵的微观解释,在平衡态的孤立系统中:
后来,更广义的吉布斯熵(Gibbs Entropy)基于概率分布解释了非平衡态的广义统计系综(ensemble):
信息熵用于解释量化信息的不确定性
1948年,美国数学家 克劳德·香农(Claude Shannon) 在论文《通信的数学理论》中引入“信息熵”,用于量化信息的不确定性:
香农最初想称其为“不确定性”(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)的信息量替换后得到的新信息熵,便是交叉熵:
为了比较交叉熵与真实分布的信息熵的区别,我们用交叉熵减去原本的信息熵:
得到相对熵(Relative Entropy)
相对熵的推导由Solomon Kullback 和 Richard Leibler 在1951年的论文《On Information and Sufficiency》中首次提出,因此相对熵又叫 Kullback-Leibler Divergence(简称KL散度)。
让预测熵更近似真实熵的过程等价于降低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]
,交叉熵变为 −log0.9≈0.10−log0.9≈0.10,损失也更小。
通过最小化交叉熵,模型逐渐将预测概率集中在真实类别上。
所以交叉熵常常被用作分类任务模型的损失函数。
深度学习中的交叉熵(参考)
名称 | 框架接口函数 | 应用场景 | 特点(优劣) | 常见配合技术 | 复杂度(时间/空间) |
---|---|---|---|---|---|
标准交叉熵 | TF: CategoricalCrossentropy /SparseCategoricalCrossentropy PyTorch: CrossEntropyLoss | 多分类任务(如MNIST分类) | 简单直接,但对类别不平衡敏感,需搭配Softmax | Softmax层、全连接层 | \( O(n)/O(n) \) |
二元交叉熵 | TF: BinaryCrossentropy PyTorch: BCELoss /BCEWithLogitsLoss | 二分类任务(如垃圾邮件检测) | 专为二分类设计,需注意输出是否经过Sigmoid | Sigmoid层、二分类头 | \( O(n)/O(n) \) |
加权交叉熵 | TF: sample_weight 参数PyTorch: 自定义权重 | 类别不平衡任务(如医学图像分割) | 需手动定义类别权重,调参成本高 | Focal Loss、OHEM | \( O(n)/O(n) \) |
标签平滑交叉熵 | TF: CategoricalCrossentropy + 标签平滑预处理PyTorch: 自定义标签平滑 | 标签噪声场景(如弱监督学习) | 防止模型过度自信,提升泛化性 | Mixup、知识蒸馏 | \( O(n)/O(n) \) |
Focal Loss | TF: SigmoidFocalCrossEntropy PyTorch: 自定义实现 | 密集检测任务(如RetinaNet) | 抑制简单样本梯度,需调参alpha 和gamma | 单阶段检测器、难例挖掘 | \( 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}) \) |
总结
从信息量的量化度量,到系统不确定性的熵,再到比较分布差异的交叉熵,这条理论链条为现代机器学习奠定了重要基础。具体来说:
- 交叉熵损失函数可作为分类任务的首选指标
- 理解不同交叉熵函数的适用场景至关重要
- 交叉熵与KL散度的关系揭示了模型优化的本质
Comments NOTHING