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

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

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

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

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

一句话总结的话:KL散度能够被用于计算代价,而在特定状况下最小化KL散度等价于最小化交叉熵。而交叉熵的运算更简单,因此用交叉熵来当作代价app

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

1. 什么是熵(Entropy)?

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

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

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

所以熵被定义为
s ( x ) = i P ( x i ) l o g b P ( x i ) s(x) = - \sum_{i}P(x_i)log_b P(x_i)
x x 指的不一样的事件好比喝茶, P ( x i ) P(x_i) 指的是某个事件发生的几率好比喝红茶的几率。对于一个必定会发生的事件,其发生几率为1, S ( x ) = l o g ( 1 ) 1 = 0 1 = 0 S(x) = - log(1)*1 = -0*1 =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):
    D K L ( A B ) = i P A ( x i ) l o g ( P A ( x i ) P B ( x i ) ) = i P A ( x i ) l o g ( P A ( x i ) ) P A ( x i ) l o g ( P B ( x i ) ) 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))

  • 对于连续事件,那么咱们只是把求和改成求积分而已(2.2)。
    D K L ( A B ) = a ( x ) l o g ( a ( x ) b ( x ) ) D_{KL}(A||B) = \int a(x) log\bigg(\frac{a(x)}{b(x)} \bigg)
    从公式中能够看出:

  • 若是 P A = P B P_A=P_B ,即两个事件分布彻底相同,那么KL散度等于0。

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

  • 若是颠倒一下顺序求 D K L ( B A ) D_{KL}(B||A) ,那么就须要使用B的熵,答案就不同了。因此KL散度来计算两个分布A与B的时候是否是对称的,有“坐标系”的问题
    D K L ( A B ) D K L ( B A ) D_{KL}(A||B)\ne D_{KL}(B||A)

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

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

若是咱们默认了用KL散度来计算两个分布间的不一样,那还要交叉熵作什么?

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

对比一下这是KL散度的公式:
D K L ( A B ) = i P A ( x i ) l o g ( P A ( x i ) P B ( x i ) ) = i P A ( x i ) l o g ( P A ( x i ) ) P A ( x i ) l o g ( P B ( x i ) ) 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))

这是熵的公式:
S ( A ) = i P A ( x i ) l o g P A ( x i ) S(A) = -\sum_{i}P_A(x_{i})logP_A(x_{i})

这是交叉熵公式:
H ( A , B ) = i P A ( x i ) l o g ( P B ( x i ) ) H(A,B)= -\sum_{i}P_{A}(x_i)log(P_{B}(x_i))

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

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

  • 和KL散度相同,交叉熵也不具有对称性: H ( A , B ) H ( B , A ) H(A,B) \ne H(B,A) ,此处再也不赘述。
  • 从名字上来看,Cross(交叉)主要是用于描述这是两个事件之间的相互关系,对本身求交叉熵等于熵。即 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):当 A A 固定不变时,那么最小化KL散度 D K L ( A B ) D_{KL}(A||B) 等价于最小化交叉熵 H ( A , B ) H(A,B)
D K L ( A B ) = H ( A , B ) D_{KL}(A||B) = H(A,B)
既然等价,那么咱们优先选择更简单的公式,所以选择交叉熵。

5. 机器如何“学习”?

机器学习的过程就是但愿在训练数据上模型学到的分布 P ( m o d e l ) P(model) 真实数据的分布 P ( r e a l ) P(real) 越接近越好,那么咱们已经介绍过了…怎么最小化两个分布之间的不一样呢?用默认的方法,使其KL散度最小

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

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

  • 最终目的是但愿学到的模型的分布和真实分布一致: P ( m o d e l ) P ( r e a l ) P(model) \simeq P(real )
  • 但真实分布是不可知的,咱们只好假设 训练数据 是从真实数据中独立同分布采样而来: P ( t r a i n i n g ) P ( r e a l ) P(training) \simeq P(real )
  • 退而求其次,咱们但愿学到的模型分布至少和训练数据的分布一致 P ( m o d e l ) P ( t r a i n i n g ) P(model) \simeq P(training) 由此很是理想化的见解是若是模型(左)可以学到训练数据(中)的分布,那么应该近似的学到了真实数据(右)的分布: P ( m o d e l ) P ( t r a i n i n g ) P ( r e a l ) P(model) \simeq P(training) \simeq P(real)

6. 为何交叉熵能够用做代价?

接着上一点说,最小化模型分布 P ( m o d e l ) P(model) 与 训练数据上的分布 P ( t r a i n i n g ) P(training) 的差别 等价于 最小化这两个分布间的KL散度,也就是最小化 K L ( P ( t r a i n i n g ) P ( m o d e l ) ) KL(P(training)||P(model))

比照第四部分的公式:

  • 此处的A就是数据的真实分布: P ( t r a i n i n g ) P(training)
  • 此处的B就是模型从训练数据上学到的分布: P ( m o d e l ) P(model)

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

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

可是,完美的学到了训练数据分布每每意味着过拟合,由于训练数据不等于真实数据,咱们只是假设它们是类似的,而通常还要假设存在一个高斯分布的偏差,是模型的泛化偏差下线。

7. 总结

所以在评价机器学习模型时,咱们每每不能只看训练数据上的误分率和交叉熵,仍是要关注测试数据上的表现。若是在测试集上的表现也不错,才能保证这不是一个过拟合或者欠拟合的模型。交叉熵比照误分率还有更多的优点,由于它能够和不少几率模型完美的结合。

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

由于等价,并且交叉熵更简单更好计算,固然用它咯 ʕ•ᴥ•ʔ


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

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