在MLE和loss function设计章节,我在统计角度推导了交叉熵损失函数是如何产生的,在这一部分,我将从信息论角度出发,推导信息量、熵、相对熵、交叉熵的公式。
信息量公式的推导
熵通常被理解为系统的混乱程度和不确定性,不过在定义熵之前,我们需要先讨论什么是‘信息量’。我们先推导信息量的公式:设某个事件发生的概率为 p,我们希望定义一个函数
在直觉上,一个事件越难发生,它一旦发生了,信息量就越大。例如,我们假定2026年阿根廷卫冕冠军这一事件,现在我们知道阿根廷已经进入了8强,假设每支球队夺冠概率相同,我们有
- 阿根廷夺冠概率为1/8
- 阿根廷进入决赛的概率1/4
- 阿根廷在决赛中胜利的概率1/2
‘阿根廷夺冠’可以分为两个阶段:1.进入决赛;2.决赛中胜利,那么它的信息量也应该可以分为两个部分:
也就是说,两个独立事件同时发生的概率是相乘的,而它们的信息量应该是相加的。因此我们希望信息量函数满足性质1:
满足这种性质的函数,自然会出现对数形式。因为:
另有性质2:概率越小,信息量应该越大;而 在 时是负数,并且概率越小, 越小。所以我们加上负号,定义信息量为:
如果以 2 为底,则有:,这时信息量的单位叫做 bit。例如:,阿根廷夺冠的信息量是3bit,为进入决赛和赢得决赛的信息量之和。
而从另一个角度看,如果以 2 为底,那么信息量可以理解为“需要多少次二选一的问题才能确定结果”。例如,连续抛 3 次硬币,全部正面的概率是:,因此这个事件的信息量就是 3 bit。
熵:整个系统的平均不确定性
信息量衡量的是单个时间发生时带来的信息多少,但一个随机系统或分布有多个可能的结果,假设一个系统有 K 种可能结果:
它们对应的概率分布为:,其中:
每个事件 的信息量是:
那么整个系统的平均信息量,就是对所有可能结果的信息量做加权平均:,也就是:
这就是熵,我将其理解为一个概率系统在平均意义上的不确定性
如果某个结果几乎必然发生,那么系统的不确定性很低,熵也低。例如 ,这个系统没有不确定性,因为结果已经确定。但如果每个结果都差不多可能发生,例如:,那么系统的不确定性更高,熵也更大。
相对熵:用 Q 描述 P 时,损失了多少信息?
假设有两个概率分布:,,其中其中,P 是真实分布,Q 是我们用来近似真实分布的模型分布。
问题便可以收束为:如果真实世界服从分布 (P),但我们用分布 (Q) 去描述它,会额外损失多少信息?
对于第 i 个事件,如果我们按照真实分布 P 来看,它的信息量是:
但如果我们错误地用 Q 来描述它,那么它的信息量会被写成:
两者的差值是:,也就是:
由于真实系统中第 i 个事件出现的概率是 (以P为基准),所以我们对所有事件做加权平均:
化简可得:
这就是 KL 散度,也叫相对熵。我将其理解为衡量两个分布之间的差异:当真实分布是 (P),但我们使用近似分布 (Q) 来描述它时,平均多出来的信息代价。
KL 散度有一个重要性质:,并且只有当 P=Q 时,KL 散度等于 0。这个性质来自吉布斯不等式,在此不再证明。
不过需要注意的是,KL 散度不是严格意义上的距离,因为通常:,它是有方向的。
交叉熵:真实分布 P 下,用 Q 编码所需要的信息量
我们回看 KL 散度的展开式:
后半部分是 P 自身的熵:
前半部分我们称之为交叉熵:
因此:
也就是说:
这说明交叉熵由两部分组成:
- 真实分布 P 自身的不确定性;
- 用 Q 近似 P 所带来的额外信息损失。
在机器学习中,真实分布 P 通常是固定的。我们无法改变真实世界本身的不确定性 H(P),能改变的是模型分布 Q。
所以,最小化 KL 散度: 等价于最小化交叉熵:
这就是为什么分类模型中经常使用交叉熵作为损失函数。
机器学习视角下的交叉熵
在公式中,有两个关键参数,K与N,对应着类别数量和样本数量。
当我们有一个三分类问题 K=3,对应的类别可能是,那么一个样本的交叉熵可以写作:,这里的 k 是类别编号。
当我们有一个训练集,样本量为 N:,整个训练集上的平均交叉熵可以写作:,这里 i 表示第 i 个样本。
机器学习中的分类任务,本质上都是在做一件事情:用模型预测出来的概率分布 (Q),去拟合真实标签背后的分布 (P)。
而对一个样本,真实标签通常是 one-hot 形式。
- 假设模型预测的概率分布是:
- 那么这个样本的交叉熵损失是:
- 由于真实标签 y 是 one-hot 向量,只有正确类别对应的位置为 1,其他位置都是 0。所以这个式子实际上会变成:
在此,我发现,分类交叉熵本质上惩罚的是:模型给真实类别分配的概率不够高。如果模型给真实类别的概率越高,损失越小;如果模型给真实类别的概率越低,损失越大。例如:很小,而:很大。这也说明了交叉熵的一个重要特点:它会对“自信但错误”的预测给予非常大的惩罚。
二分类交叉熵
在二分类问题中,真实标签通常为:
模型输出的是样本属于类别 1 的概率:
那么样本属于类别 0 的概率就是:
如果真实标签是 1,我们希望 越接近 1 越好。如果真实标签是 0,我们希望 越接近 0 越好,也就是 越接近 1 越好。
因此二分类交叉熵写作:,我们可以分情况看:
- 当 y=1 时,,此时模型越相信样本属于类别 1,损失越小。
- 当 y=0 时,,此时模型越相信样本属于类别 0,损失越小。
设计的本质是:根据真实标签,取出模型给真实类别分配的概率,然后对它取负对数。
多分类交叉熵与 Softmax
在多分类问题中,模型通常不会直接输出概率,而是先输出一组实数分数,叫做 logits。
设模型对 K 个类别输出:,其中 表示模型对第 k 类的原始打分,需要注意的是 logits 不是概率:
- 它们可以是任意实数
- 不一定大于 0
- 加起来也不等于 1
因此我们需要用 Softmax 操作把 logits 转换成概率分布:
可以看出,softmax的作用是:将一个实数向量转换成概率分布,使每个元素表示属于对应类别的概率,并且所有概率之和为 1。
经过 Softmax 后,有:,并且:
于是,多分类交叉熵可以写成:
把 Softmax 代入其中,就得到:
小结
信息量描述的是单个事件发生后带来的信息多少:,概率越小,信息量越大。
熵描述的是整个概率系统的平均不确定性:
KL 散度描述的是近似分布 (Q) 描述真实分布 (P) 时,多出来的信息损失:
交叉熵描述的是:在真实分布 (P) 下,使用模型分布 (Q) 进行描述所需要的平均信息量:
它们之间的关系是:
由于真实分布的熵 H(P) 是固定的,所以最小化交叉熵,就等价于让模型分布 (Q) 尽可能接近真实分布 (P)。这就是交叉熵损失函数的核心思想。
在分类任务中,真实标签通常是 one-hot 分布,模型输出的是各类别的预测概率。因此交叉熵损失可以简单理解为:惩罚模型没有给真实类别足够高的概率。这也是为什么交叉熵特别适合分类问题。它不是一个孤立的公式,而是从信息量、熵、KL 散度一路自然推导出来的结果。