KL散度与交叉熵区别与联系

通用的说,熵(Entropy)被用于描述一个系统中的不确定性(the uncertainty of a system)。在不同领域熵有不同的解释,比如热力学的定义和信息论也不大相同。

要想明白交叉熵(Cross Entropy)的意义,可以从熵(Entropy) -> KL散度(Kullback-Leibler Divergence) -> 交叉熵这个顺序入手。 当然,也有多种解释方法[1]。

先给出一个“接地气但不严谨”的概念表述:

  • 熵:可以表示一个事件A的自信息量,也就是A包含多少信息。
  • KL散度:可以用来表示从事件A的角度来看,事件B有多大不同。
  • 交叉熵:可以用来表示从事件A的角度来看,如何描述事件B。

一句话总结的话:KL散度可以被用于计算代价,而在特定情况下最小化KL散度等价于最小化交叉熵。而交叉熵的运算更简单,所以用交叉熵来当做代价

我知道你现在看着有点晕,但请保持耐心继续往下看。
为了通俗易懂,我没有严格按照数学规范来命名概念,比如文中的“事件”指的是“消息”,望各位严谨的读者理解。

1. 什么是熵(Entropy)?

放在信息论的语境里面来说,就是一个事件所包含的信息量。我们常常听到“这句话信息量好大”,比如“昨天花了10万,终于在西二环买了套四合院”。

这句话为什么信息量大?因为它的内容出乎意料,违反常理。由此引出:

  • 越不可能发生的事件信息量越大, 比如“我不会死”这句话信息量就很大。而确定事件的信息量就很低,比如“我是我妈生的”,信息量就很低甚至为0
  • 独立事件的信息量可叠加。比如“a. 张三今天喝了阿萨姆红茶,b. 李四前天喝了英式早茶”的信息量就应该恰好等于a+b的信息量,如果张三李四喝什么茶是两个独立事件。

因此熵被定义为
s(x)=−∑iP(xi)logbP(xi) s(x) = - \sum_{i}P(x_i)log_b P(x_i) s(x)=iP(xi)logbP(xi)
xxx指的不同的事件比如喝茶, P(xi)P(x_i)P(xi)指的是某个事件发生的概率比如喝红茶的概率。对于一个一定会发生的事件,其发生概率为1,S(x)=−log(1)∗1=−0∗1=0S(x) = - log(1)*1 = -0*1 =0S(x)=log(1)1=01=0,信息量为0。

2. 如何衡量两个事件/分布之间的不同(一):KL散度

我们上面说的是对于一个随机变量x的事件A的自信息量,如果我们有另一个独立的随机变量x相关的事件B,该怎么计算它们之间的区别?

此处我们介绍默认的计算方法:KL散度,有时候也叫KL距离,一般被用于计算两个分布之间的不同。看名字似乎跟计算两个点之间的距离也很像,但实则不然,因为KL散度不具备有对称性。在距离上的对称性指的是A到B的距离等于B到A的距离。

举个不恰当的例子,事件A:张三今天买了2个土鸡蛋,事件B:李四今天买了6个土鸡蛋。我们定义随机变量x:买土鸡蛋,那么事件A和B的区别是什么?有人可能说,那就是李四多买了4个土鸡蛋?这个答案只能得50分,因为忘记了"坐标系"的问题。换句话说,对于张三来说,李四多买了4个土鸡蛋。对于李四来说,张三少买了4个土鸡蛋。选取的参照物不同,那么得到的结果也不同。更严谨的说,应该是说我们对于张三和李四买土鸡蛋的期望不同,可能张三天天买2个土鸡蛋,而李四可能因为孩子满月昨天才买了6个土鸡蛋,而平时从来不买。

KL散度的数学定义:

  • 对于离散事件我们可以定义事件A和B的差别为(2.1):
    DKL(A∣∣B)=∑iPA(xi)log(PA(xi)PB(xi))=∑iPA(xi)log(PA(xi))−PA(xi)log(PB(xi)) D_{KL}(A||B) = \sum_{i}P_{A}(x_i) log\bigg(\frac{P_{A}(x_i)}{P_{B}(x_i)} \bigg) = \sum_{i}P_{A}(x_i)log(P_{A}(x_i ))- P_{A}(x_i)log(P_{B}(x_i)) DKL(AB)=iPA(xi)log(PB(xi)PA(xi))=iPA(xi)log(PA(xi))PA(xi)log(PB(xi))

  • 对于连续事件,那么我们只是把求和改为求积分而已(2.2)。
    DKL(A∣∣B)=∫a(x)log(a(x)b(x)) D_{KL}(A||B) = \int a(x) log\bigg(\frac{a(x)}{b(x)} \bigg) DKL(AB)=a(x)log(b(x)a(x))
    从公式中可以看出:

  • 如果PA=PBP_A=P_BPA=PB ,即两个事件分布完全相同,那么KL散度等于0。

观察公式2.1,可以发现减号左边的就是事件A的熵,请记住这个发现

  • 如果颠倒一下顺序求 DKL(B∣∣A)D_{KL}(B||A)DKL(BA) ,那么就需要使用B的熵,答案就不一样了。所以KL散度来计算两个分布A与B的时候是不是对称的,有“坐标系”的问题
    DKL(A∣∣B)≠DKL(B∣∣A) D_{KL}(A||B)\ne D_{KL}(B||A) DKL(AB)̸=DKL(BA)

换句话说,KL散度由A自己的熵与B在A上的期望共同决定。当使用KL散度来衡量两个事件(连续或离散),上面的公式意义就是求 A与B之间的对数差 在 A上的期望值。

3. KL散度 = 交叉熵 - 熵?

如果我们默认了用KL散度来计算两个分布间的不同,那还要交叉熵做什么?

事实上交叉熵和KL散度的公式非常相近,其实就是KL散度的后半部分(公式2.1):A和B的交叉熵 = A与B的KL散度 - A的熵。
DKL(A∣∣B)=−S(A)+H(A,B) D_{KL}(A||B) = -S(A)+H(A,B) DKL(AB)=S(A)+H(A,B)

对比一下这是KL散度的公式:
DKL(A∣∣B)=∑iPA(xi)log(PA(xi)PB(xi))=∑iPA(xi)log(PA(xi))−PA(xi)log(PB(xi)) D_{KL}(A||B) = \sum_{i}P_{A}(x_i) log\bigg(\frac{P_{A}(x_i)}{P_{B}(x_i)} \bigg) = \sum_{i}P_{A}(x_i)log(P_{A}(x_i ))- P_{A}(x_i)log(P_{B}(x_i)) DKL(AB)=iPA(xi)log(PB(xi)PA(xi))=iPA(xi)log(PA(xi))PA(xi)log(PB(xi))

这是熵的公式:
S(A)=−∑iPA(xi)logPA(xi) S(A) = -\sum_{i}P_A(x_{i})logP_A(x_{i}) S(A)=iPA(xi)logPA(xi)

这是交叉熵公式:
H(A,B)=−∑iPA(xi)log(PB(xi)) H(A,B)= -\sum_{i}P_{A}(x_i)log(P_{B}(x_i)) H(A,B)=iPA(xi)log(PB(xi))

此处最重要的观察是,如果S(A)S(A)S(A)是一个常量,那么DKL(A∣∣B)=H(A,B)D_{KL}(A||B) = H(A,B)DKL(AB)=H(A,B)也就是说KL散度和交叉熵在特定条件下等价。这个发现是这篇回答的重点。

同时补充交叉熵的一些性质:

  • 和KL散度相同,交叉熵也不具备对称性:H(A,B)≠H(B,A)H(A,B) \ne H(B,A)H(A,B)̸=H(B,A) ,此处不再赘述。
  • 从名字上来看,Cross(交叉)主要是用于描述这是两个事件之间的相互关系,对自己求交叉熵等于熵。即 H(A,A)=S(A)H(A,A) = S(A)H(A,A)=S(A),注意只是非负而不一定等于0。

*4. 另一种理解KL散度、交叉熵、熵的角度(选读)- 可跳过

那么问题来了,为什么有KL散度和交叉熵两种算法?为什么他们可以用来求分布的不同?什么时候可以等价使用?

一种信息论的解释是

  • 熵的意义是对A事件中的随机变量进行编码所需的最小字节数。
  • KL散度的意义是“额外所需的编码长度”如果我们用B的编码来表示A。
  • 交叉熵指的是当你用B作为密码本来表示A时所需要的“平均的编码长度”。

对于大部分读者,我觉得可以不用深入理解。感谢评论区@王瑞欣的指正,不知道为什么@不到他。

一些对比与观察:

  • KL散度和交叉熵的不同处:交叉熵中不包括“熵”的部分
  • KL散度和交叉熵的相同处:a. 都不具备对称性 b. 都是非负的

等价条件(章节3):当AAA 固定不变时,那么最小化KL散度DKL(A∣∣B)D_{KL}(A||B)DKL(AB) 等价于最小化交叉熵H(A,B)H(A,B)H(A,B)
DKL(A∣∣B)=H(A,B) D_{KL}(A||B) = H(A,B) DKL(AB)=H(A,B)
既然等价,那么我们优先选择更简单的公式,因此选择交叉熵。

5. 机器如何“学习”?

机器学习的过程就是希望在训练数据上模型学到的分布 P(model)P(model)P(model)真实数据的分布P(real)P(real)P(real) 越接近越好,那么我们已经介绍过了…怎么最小化两个分布之间的不同呢?用默认的方法,使其KL散度最小

但我们没有真实数据的分布,那么只能退而求其次,希望模型学到的分布和训练数据的分布 $P(training)$ 尽量相同,也就是把训练数据当做模型和真实数据之间的代理人

假设训练数据是从总体中独立同步分布采样(Independent and identically distributed sampled)而来,那么我们可以利用最小化训练数据的经验误差来降低模型的泛化误差。简单说:

  • 最终目的是希望学到的模型的分布和真实分布一致:P(model)≃P(real)P(model) \simeq P(real )P(model)P(real)
  • 但真实分布是不可知的,我们只好假设 训练数据 是从真实数据中独立同分布采样而来: P(training)≃P(real)P(training) \simeq P(real )P(training)P(real)
  • 退而求其次,我们希望学到的模型分布至少和训练数据的分布一致P(model)≃P(training)P(model) \simeq P(training)P(model)P(training) 由此非常理想化的看法是如果模型(左)能够学到训练数据(中)的分布,那么应该近似的学到了真实数据(右)的分布:P(model)≃P(training)≃P(real)P(model) \simeq P(training) \simeq P(real)P(model)P(training)P(real)

6. 为什么交叉熵可以用作代价?

接着上一点说,最小化模型分布 P(model)P(model)P(model) 与 训练数据上的分布 P(training)P(training)P(training) 的差异 等价于 最小化这两个分布间的KL散度,也就是最小化 KL(P(training)∣∣P(model))KL(P(training)||P(model))KL(P(training)P(model))

比照第四部分的公式:

  • 此处的A就是数据的真实分布: P(training)P(training)P(training)
  • 此处的B就是模型从训练数据上学到的分布:P(model)P(model)P(model)

巧的是,训练数据的分布A是给定的。那么根据我们在第四部分说的,因为A固定不变,那么求 DKL(A∣∣B)D_{KL}(A||B)DKL(AB) 等价于求 H(A,B)H(A,B)H(A,B) ,也就是A与B的交叉熵

得证,交叉熵可以用于计算“学习模型的分布”与“训练数据分布”之间的不同。当交叉熵最低时(等于训练数据分布的熵),我们学到了“最好的模型”。

但是,完美的学到了训练数据分布往往意味着过拟合,因为训练数据不等于真实数据,我们只是假设它们是相似的,而一般还要假设存在一个高斯分布的误差,是模型的泛化误差下线。

7. 总结

因此在评价机器学习模型时,我们往往不能只看训练数据上的误分率和交叉熵,还是要关注测试数据上的表现。如果在测试集上的表现也不错,才能保证这不是一个过拟合或者欠拟合的模型。交叉熵比照误分率还有更多的优势,因为它可以和很多概率模型完美的结合。

所以逻辑思路是,为了让学到的模型分布更贴近真实数据分布,我们最小化 模型数据分布 与 训练数据之间的KL散度,而因为训练数据的分布是固定的,因此最小化KL散度等价于最小化交叉熵。

因为等价,而且交叉熵更简单更好计算,当然用它咯 ʕ•ᴥ•ʔ


[1] 不同的领域都有不同解释,更传统的机器学习说法是似然函数的最大化就是交叉熵。正所谓横看成岭侧成峰,大家没必要非说哪种思路是对的,有道理就好

原文转载自https://www.zhihu.com/question/65288314,感谢作者“微调”分享!

### KL交叉熵损失的区别 #### 定义 在信息论机器学习领域,熵是衡量不确定性的核心概念。对于离型随机变量 \(X\) ,其概率质量函数为 \(P(x)\),熵定义如下[^2]: \[ H(X) = -\sum_{x \in X} P(x) \log P(x). \] 当涉及到两个概率分布\(P\) \(Q\)时,KL(Kullback-Leibler divergence),也称为相对熵,用于测量这两个分布之间的差异性: \[ D_{KL}(P||Q)=\sum_x{P(x)}\log{\frac{{P(x)}}{{Q(x)}}}. \] 该公式表明了从真实分布 \(P\) 到近似分布 \(Q\) 所需的信息增益。 另一方面,交叉熵则是指使用错误的概率分布来进行编码所需的平均比特数,具体表达式为: \[ H(P,Q)=-\sum_x {P(x)\log Q(x)}. \] 值得注意的是,在某些情况下,交叉熵可视为熵加上KL的结果[^3]. #### 应用场景 在实际的机器学习任务中,这两种量方式有着各自的应用范围: - **交叉熵** 主要应用于监督学习中的分类问题,特别是多类别分类问题。作为一种常用的损失函数,交叉熵能够有效地指导神经网络调整权重参数,从而让预测输出更贴近真实的标签分布。通过最小化交叉熵损失,模型试图使自身的预测分布尽可能逼近数据的真实分布[^1]. - **KL** 更多地出现在无监督学习或者半监督学习框架里,尤其是在变分自编码器(VAEs),生成对抗网络(GANs)以及贝叶斯推理等领域中有广泛运用。它主要用于评估并控制潜在空间内的样本分布特性,确保生成的数据具有良好的统计性质;同时也可用于比较不同模型间的性能优劣,提供了一种定量化的评价标准. 综上所述,尽管两者都基于相同的基础——香农熵的概念展开讨论,但在具体的实现形式及其适用场合方面存在着显著差别。 ```python import numpy as np def kl_divergence(p, q): """Calculate Kullback-Leibler divergence between two distributions.""" p = np.asarray(p) q = np.asarray(q) return np.sum(np.where(p != 0, p * np.log(p / q), 0)) def cross_entropy_loss(y_true, y_pred): """Compute the Cross Entropy Loss given true and predicted probability distribution""" epsilon = 1e-12 y_pred_clipped = np.clip(y_pred, epsilon, 1. - epsilon) ce_loss = -np.sum(y_true * np.log(y_pred_clipped)) return ce_loss ```
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值