虽然已经多次遇到KL散度,并通过查资料进行理解,但过一段时间又忘了,最后发现写下来才是记忆的最好方式。
个人认为,对一个概念进行学习,最终的目标就是要搞懂这个概念可以用来干什么。就比如KL,KL的值代表了什么,可以用来对什么东西进行度量。自己在网上也找到了两种不同的解释,个人认为都可取,所以将分别作介绍。在进行正式介绍KL之前,将对一些基本的概念做一些介绍进行铺垫。
信息量和信息熵
在信息论中,认为小概率事件所蕴含的信息量是更大的。举一个经典的例子,上午有一场国际的足球比赛,对阵双方分别是中国和巴西。然后下午,别人告诉了你巴西赢了,你可能会觉得这个人说了等于没说,因为巴西赢了这件事是一个大概率的事件。然而,如果被人告诉你赢的是中国队,你可能会觉得这个信息量有点大。
基于此,信息量的定义应该与一个事件发生的概率大小成反比关系。在信息论中,信息量,或者被称为自信息量,被定义为:
针对一个系统,发生的事件可能有多种,针对上面的例子就有三种,分别是中国队赢、巴西队赢和两队打平。虽然中国队赢信息量很大,但这个事件发生的可能性也很小,所以这个信息量对于整个系统的描述并没有什么作用。通常,会计算一个系统中所有事件的信息量期望值,即信息熵:
信息熵代表了一个系统的不确定度。
信息熵和编码
假设上面所提到的中国和巴西队的足球比赛,巴西队赢球的概率是1/2,中国队赢球和打平的概率都是1/4,比赛需要连续比100天(场景纯属虚构)。如果一个记者需要将比赛的结果以二进制码的形式发布出去,且希望在100天中所用的二进制码个数最少,这就是一个对这三个结果如何编码的问题了。由于一共有三种结果,一个二进制位肯定无法完全将三种结果完全表示,在这里我们可以用1、01、00这三种方式表示三种结果。我们直觉上会觉得,1这个编码应该代表巴西队赢球这个信息,因为这个事件的概率比较大,有1/2,也就是说这个记者有50天只需要发一个一位的1就可以了。按这种编码方式,记者每天平均需要发送 $1/2 1 + 2 1/4 * 2 = 1.5$ 个二进制编码。
其实我们还有其他的编码方式,比如用11、01、00也可以进行编码,但很明显,这样在100天中将需要发送更长的编码。而信息熵的结果就是所有编码方式中的平均编码长度的下限(这种下限不一定是能达到的)。
交叉熵
通过对比上一段中第一种方式的平均编码计算方式 $1/2 1 + 2 1/4 2 = 1.5$ 和信息熵的计算公式$H(X)=\sum_{k=1}^N-p_klog_2p_k$ 发现,以某个事件结果的*信息量的大小作为编码长度将会是最优的编码方式(平均编码长度最短)。
假如一个事件有四种结果,发生的概率分别是1/2、1/4、1/8、1/8.那么对这个事件结果最佳的编码长度便是1、2、3、3。最短的平均编码长度也就是这个事件所有结果的熵:
但是如果有个人对这四个结果出现的概率并不是很清楚,他便假定这四个结果发生的概率都是一样的,即都是1/4,那么他对每个结果使用的编码长度都会是 $-log_21/4 = 2$ 。那么这个时候的平均编码长度就变为了:
也就是说,这个人基于了一个非真实分布的概率去制定了一个编码的策略,这个策略最终会导致平均编码长度变长。其实,这也就是交叉熵的定义,假设真实的分布是p,非真实分布是q,那么用这个非真实分布的概率去制定编码长度,所用平均编码长度便是:
上面的式子就是交叉熵的定义。
KL散度(相对熵)
使用真实概率去制定编码准则是最优策略(平均编码长度是信息熵),使用非真实分布去制定编码策略是次优策略(平均编码长度是交叉熵)。为了度量这两种策略之间的差异,便提出了相对熵(KL散度)。
这个结果表示的也就是如果 $p_k$ 对应了每个事件结果发生的概率,若用 $q_k$编码时,平均编码长度增加的比特数。
KL散度的另一种用法
在博客中,将KL散度作为了一种用更简单的概率分布去代表原始分布的时候信息的损失量。个人感觉也算是一个make sense的解释。