熵、相对熵、交叉熵的信息论角度推导

在MLE和loss function设计章节,我在统计角度推导了交叉熵损失函数是如何产生的,在这一部分,我将从信息论角度出发,推导信息量、熵、相对熵、交叉熵的公式。

信息量公式的推导

熵通常被理解为系统的混乱程度和不确定性,不过在定义熵之前,我们需要先讨论什么是‘信息量’。我们先推导信息量的公式:设某个事件发生的概率为 p,我们希望定义一个函数 f(p):=信息量f(p):=\text{信息量}

在直觉上,一个事件越难发生,它一旦发生了,信息量就越大。例如,我们假定2026年阿根廷卫冕冠军这一事件,现在我们知道阿根廷已经进入了8强,假设每支球队夺冠概率相同,我们有

  • 阿根廷夺冠概率为1/8
  • 阿根廷进入决赛的概率1/4
  • 阿根廷在决赛中胜利的概率1/2

‘阿根廷夺冠’可以分为两个阶段:1.进入决赛;2.决赛中胜利,那么它的信息量也应该可以分为两个部分:f(1/8)=f(1/4)+f(1/2)f(1/8)=f(1/4)+f(1/2)

也就是说,两个独立事件同时发生的概率是相乘的,而它们的信息量应该是相加的。因此我们希望信息量函数满足性质1f(pq)=f(p)+f(q)f(pq)=f(p)+f(q)

满足这种性质的函数,自然会出现对数形式。因为:log(pq)=logp+logq\log(pq)=\log p+\log q

另有性质2:概率越小,信息量应该越大;而 logp\log p0<p<10<p<1 时是负数,并且概率越小,logp\log p 越小。所以我们加上负号,定义信息量为:f(p)=logpf(p)=-\log p

如果以 2 为底,则有:f(p)=log2pf(p)=-\log_2 p,这时信息量的单位叫做 bit。例如:f(1/8)=log2(1/8)=3f(1/8)=-\log_2(1/8)=3,阿根廷夺冠的信息量是3bit,为进入决赛和赢得决赛的信息量之和。

而从另一个角度看,如果以 2 为底,那么信息量可以理解为“需要多少次二选一的问题才能确定结果”。例如,连续抛 3 次硬币,全部正面的概率是:12×12×12=18\frac{1}{2}\times \frac{1}{2}\times \frac{1}{2}=\frac{1}{8},因此这个事件的信息量就是 3 bit。

熵:整个系统的平均不确定性

信息量衡量的是单个时间发生时带来的信息多少,但一个随机系统或分布有多个可能的结果,假设一个系统有 K 种可能结果:x1,x2,,xKx_1,x_2,\cdots,x_K

它们对应的概率分布为:P=(p1,p2,,pK)P=(p_1,p_2,\cdots,p_K),其中:i=1Kpi=1\sum_{i=1}^{K}p_i=1

每个事件 xix_i 的信息量是:log2pi-\log_2 p_i

那么整个系统的平均信息量,就是对所有可能结果的信息量做加权平均:H(P)=i=1Kpi(log2pi)H(P)=\sum_{i=1}^{K}p_i\cdot (-\log_2 p_i),也就是:H(P)=i=1Kpilog2piH(P)=-\sum_{i=1}^{K}p_i\log_2 p_i

这就是熵,我将其理解为一个概率系统在平均意义上的不确定性

如果某个结果几乎必然发生,那么系统的不确定性很低,熵也低。例如 P=(1,0,0,0)P=(1,0,0,0),这个系统没有不确定性,因为结果已经确定。但如果每个结果都差不多可能发生,例如:P=(1/4,1/4,1/4,1/4)P=(1/4,1/4,1/4,1/4),那么系统的不确定性更高,熵也更大。

相对熵:用 Q 描述 P 时,损失了多少信息?

假设有两个概率分布:P=(p1,p2,,pK)P=(p_1,p_2,\cdots,p_K)Q=(q1,q2,,qK)Q=(q_1,q_2,\cdots,q_K),其中其中,P 是真实分布,Q 是我们用来近似真实分布的模型分布。

问题便可以收束为:如果真实世界服从分布 (P),但我们用分布 (Q) 去描述它,会额外损失多少信息?

对于第 i 个事件,如果我们按照真实分布 P 来看,它的信息量是:log2pi-\log_2 p_i

但如果我们错误地用 Q 来描述它,那么它的信息量会被写成:log2qi-\log_2 q_i

两者的差值是:log2qi(log2pi)-\log_2 q_i – (-\log_2 p_i),也就是:log2piqi\log_2 \frac{p_i}{q_i}

由于真实系统中第 i 个事件出现的概率是 pip_i(以P为基准),所以我们对所有事件做加权平均:DKL(P|Q)=i=1Kpi[(log2qi)(log2pi)]D_{KL}(P|Q)=\sum_{i=1}^{K}p_i\left[(-\log_2 q_i)-(-\log_2 p_i)\right]

化简可得:DKL(P|Q)=i=1Kpilog2piqiD_{KL}(P|Q)=\sum_{i=1}^{K}p_i\log_2 \frac{p_i}{q_i}

这就是 KL 散度,也叫相对熵。我将其理解为衡量两个分布之间的差异:当真实分布是 (P),但我们使用近似分布 (Q) 来描述它时,平均多出来的信息代价

KL 散度有一个重要性质:DKL(P|Q)0D_{KL}(P|Q)\geq 0,并且只有当 P=Q 时,KL 散度等于 0。这个性质来自吉布斯不等式,在此不再证明。

不过需要注意的是,KL 散度不是严格意义上的距离,因为通常:DKL(P|Q)DKL(Q|P)D_{KL}(P|Q)\neq D_{KL}(Q|P),它是有方向的。

交叉熵:真实分布 P 下,用 Q 编码所需要的信息量

我们回看 KL 散度的展开式:DKL(P|Q)=i=1Kpi(log2qi)i=1Kpi(log2pi)D_{KL}(P|Q)=\sum_{i=1}^{K}p_i(-\log_2 q_i)-\sum_{i=1}^{K}p_i(-\log_2 p_i)

后半部分是 P 自身的熵:H(P)=i=1Kpi(log2pi)H(P)=\sum_{i=1}^{K}p_i(-\log_2 p_i)

前半部分我们称之为交叉熵:H(P,Q)=i=1Kpi(log2qi)H(P,Q)=\sum_{i=1}^{K}p_i(-\log_2 q_i)

因此:DKL(P|Q)=H(P,Q)H(P)D_{KL}(P|Q)=H(P,Q)-H(P)

也就是说:H(P,Q)=H(P)+DKL(P|Q)H(P,Q)=H(P)+D_{KL}(P|Q)

这说明交叉熵由两部分组成:

  1. 真实分布 P 自身的不确定性;
  2. 用 Q 近似 P 所带来的额外信息损失。

在机器学习中,真实分布 P 通常是固定的。我们无法改变真实世界本身的不确定性 H(P),能改变的是模型分布 Q。

所以,最小化 KL 散度minQDKL(P|Q)\min_Q D_{KL}(P|Q) 等价于最小化交叉熵minQH(P,Q)\min_Q H(P,Q)

这就是为什么分类模型中经常使用交叉熵作为损失函数。

机器学习视角下的交叉熵

在公式中,有两个关键参数,K与N,对应着类别数量和样本数量。

当我们有一个三分类问题 K=3,对应的类别可能是猫、狗、鸟\text{猫、狗、鸟},那么一个样本的交叉熵可以写作:k=1Kyklogy^k-\sum_{k=1}^{K}y_k\log \hat y_k,这里的 k 是类别编号。

当我们有一个训练集,样本量为 N:(x1,y1),(x2,y2),,(xN,yN)(x_1,y_1),(x_2,y_2),\cdots,(x_N,y_N),整个训练集上的平均交叉熵可以写作:L=1Ni=1Nk=1Kyiklogy^ikL=-\frac{1}{N}\sum_{i=1}^{N}\sum_{k=1}^{K}y_{ik}\log \hat y_{ik},这里 i 表示第 i 个样本。

机器学习中的分类任务,本质上都是在做一件事情:用模型预测出来的概率分布 (Q),去拟合真实标签背后的分布 (P)

而对一个样本,真实标签通常是 one-hot 形式。

  • 假设模型预测的概率分布是:y^=(0.1,0.7,0.2)\hat y=(0.1,0.7,0.2)
  • 那么这个样本的交叉熵损失是:k=1Kyklogy^k-\sum_{k=1}^{K}y_k\log \hat y_k
  • 由于真实标签 y 是 one-hot 向量,只有正确类别对应的位置为 1,其他位置都是 0。所以这个式子实际上会变成:log0.7-\log 0.7

在此,我发现,分类交叉熵本质上惩罚的是:模型给真实类别分配的概率不够高。如果模型给真实类别的概率越高,损失越小;如果模型给真实类别的概率越低,损失越大。例如:log0.9-\log 0.9很小,而:log0.01-\log 0.01很大。这也说明了交叉熵的一个重要特点:它会对“自信但错误”的预测给予非常大的惩罚。

二分类交叉熵

在二分类问题中,真实标签通常为:y0,1y\in{0,1}

模型输出的是样本属于类别 1 的概率:y^=P(y=1|x)\hat y=P(y=1|x)

那么样本属于类别 0 的概率就是:1y^1-\hat y

如果真实标签是 1,我们希望 y^\hat y 越接近 1 越好。如果真实标签是 0,我们希望 y^\hat y 越接近 0 越好,也就是 1y^1-\hat y 越接近 1 越好。

因此二分类交叉熵写作:L=[ylogy^+(1y)log(1y^)]L=-\left[y\log \hat y+(1-y)\log(1-\hat y)\right],我们可以分情况看:

  • 当 y=1 时,L=logy^L=-\log \hat y,此时模型越相信样本属于类别 1,损失越小。
  • 当 y=0 时,L=log(1y^)L=-\log (1-\hat y),此时模型越相信样本属于类别 0,损失越小。

设计的本质是:根据真实标签,取出模型给真实类别分配的概率,然后对它取负对数。

多分类交叉熵与 Softmax

在多分类问题中,模型通常不会直接输出概率,而是先输出一组实数分数,叫做 logits。

设模型对 K 个类别输出:z1,z2,,zKz_1,z_2,\cdots,z_K,其中 zkz_k 表示模型对第 k 类的原始打分,需要注意的是 logits 不是概率:

  • 它们可以是任意实数
  • 不一定大于 0
  • 加起来也不等于 1

因此我们需要用 Softmax 操作把 logits 转换成概率分布:y^k=softmax(zk)=ezkj=1Kezj\hat y_k=\text{softmax}(z_k)=\frac{e^{z_k}}{\sum_{j=1}^{K}e^{z_j}}

可以看出,softmax的作用是:将一个实数向量转换成概率分布,使每个元素表示属于对应类别的概率,并且所有概率之和为 1

经过 Softmax 后,有:y^1+y^2++y^K=1\hat y_1+\hat y_2+\cdots+\hat y_K=1,并且:0<y^k<10<\hat y_k<1

于是,多分类交叉熵可以写成:L=k=1Kyklogy^kL=-\sum_{k=1}^{K}y_k\log \hat y_k

把 Softmax 代入其中,就得到:L=k=1Kyklog(ezkj=1Kezj)L=-\sum_{k=1}^{K}y_k\log\left(\frac{e^{z_k}}{\sum_{j=1}^{K}e^{z_j}}\right)

小结

信息量描述的是单个事件发生后带来的信息多少:f(p)=logpf(p)=-\log p,概率越小,信息量越大。

熵描述的是整个概率系统的平均不确定性:H(P)=i=1KpilogpiH(P)=-\sum_{i=1}^{K}p_i\log p_i

KL 散度描述的是近似分布 (Q) 描述真实分布 (P) 时,多出来的信息损失:DKL(P|Q)=i=1KpilogpiqiD_{KL}(P|Q)=\sum_{i=1}^{K}p_i\log\frac{p_i}{q_i}

交叉熵描述的是:在真实分布 (P) 下,使用模型分布 (Q) 进行描述所需要的平均信息量:H(P,Q)=i=1KpilogqiH(P,Q)=-\sum_{i=1}^{K}p_i\log q_i

它们之间的关系是:H(P,Q)=H(P)+DKL(P|Q)H(P,Q)=H(P)+D_{KL}(P|Q)

由于真实分布的熵 H(P) 是固定的,所以最小化交叉熵,就等价于让模型分布 (Q) 尽可能接近真实分布 (P)。这就是交叉熵损失函数的核心思想。

在分类任务中,真实标签通常是 one-hot 分布,模型输出的是各类别的预测概率。因此交叉熵损失可以简单理解为:惩罚模型没有给真实类别足够高的概率。这也是为什么交叉熵特别适合分类问题。它不是一个孤立的公式,而是从信息量、熵、KL 散度一路自然推导出来的结果。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注