熵是用来度量信息量的,也是用来度量不确定性程度的,在信息论中,其实信息量的多少等价于随机事件的不确定性程度,事件不确定性程度越高,则该事件蕴含的信息量也就越多。比如当我们知道明天下雨的可能性是 99%,那么当这件事情发生的时候,我们获取不到很多的信息;而如果明天下雨的可能性是 1%,而恰巧明天却又下雨了,那是不是就说明下雨这件事情发生之后,蕴含了很丰富的信息量。
Entropy 熵
信息熵,也就是最简单的熵,度量某一概率分布的不确定性(信息量)。
假定有一概率分布 ,
代表在该概率分布中第
的随机事件发生的概率,则有熵:
当 中
的底数为
2时,信息量的单位是 bit。
当概率分布越均匀的时候,熵的值也就越大,代表事件的不确定性程度越高,那么事件发生所蕴含的信息量越大。 设想两个个二元分布 以及
,肯定是概率分布
所蕴含的事件不确定性更高。而熵这个函数就有这个性质,概率分布越均匀,熵的值也就越大。这一点也可以通过求该函数的极大值来确认。
同时, 也可以看作编码这个概率分布所需要使用的信息量,例如
,那么这件事情需要 0 bit 就可以进行编码,即完全不需要编码;而
,即对于
中两个发生概率相同的事件,我们需要用 1 bit ( 0-1 ) 来完成编码。
进一步将 进行变形,得到
即 是
的期望,而这个玩意也有一个名字,叫做自信息。
还是那个观念,一个事件发生的概率越小,那么它蕴含的信息量就越大,当然,这就不包含不确定性这个事情了,因为不确定性是相对于一堆事件,也就是一个概率分布而言的。
所以熵就是自信息的期望,也就是平均自信息,是一堆自信息的平均值,也就可以度量一个概率分布的平均不确定性了。
Cross Entropy 交叉熵
机器学习和深度学习中的交叉熵损失函数(CE Loss),有非常多优良的函数性质以便进行优化,同时交叉熵也是信息论中比较重要的概念。
假设现在有观察分布(标记样本分布) 和近似分布(预测分布)
,则交叉熵为:
因为在信息论中,熵 被认为是理论上的平均最小编码长度(上式交叉熵中的概率项由观察分布
提供;自信息项由概率分布
提供),所以交叉熵可以看作是,用
分布的最佳编码方式来编码
分布的消息的平均编码长度。因为
已经就是最佳编码使用的信息量了,所以有一个性质(两式相减大于等于 0 可以验证):
即近似分布 来编码观察分布
的消息所使用的信息量,一定大于等于用
的最佳编码方式进行编码所使用的信息量。
在把交叉熵作为机器学习中的分类损失函数时,其实就是使用了这样的性质,交叉熵越小,则说明模型输出的概率分布越接近标记(label)的分布。同时在机器学习的优化中 分布相当于是一个常量,交叉熵
对于
都是一个凸函数,所以使用交叉熵作为损失函数对整体模型函数的凸性是一件好事。
KL Divergence KL 散度
KL 散度,全称 Kullback-Leibler Divengence,用来度量两个概率分布之间的差异。它的记法有很多,下面使用最常用的两种:
前一种记号是一般的记法,而后一种则是信息论中常用的“熵”的记法。KL 散度可以使用交叉熵减去信息熵来计算。
正如上面写交叉熵所讨论的,,如果我们用交叉熵和信息熵做一个差,不就可以度量使用
分布来编码
分布所使用的信息量了么,同时我们也可以知道
是大于等于 0 的。这样 KL 散度,其实就可以用来度量两个分布之间的差异了。当然你可以认为这是一种两个分布之间的“距离”,但它并不是严格意义上的距离,因为它不满足距离的三个要求。
一个函数 是一个范数(某种距离的度量),当且仅当它满足一下三个性质:
—— 非负性
—— 非负齐次性
—— 三角不等式(两边之和大于第三边)
那么问题来了,为什么机器学习中,使用交叉熵作为损失函数,而不是使用 KL 散度作作为损失函数呢,KL 散度看起来更直观一点,毕竟是度量两个概率分布的差异大小。这是因为在机器学习的优化过程中, 可以看作是一个常数。
