机器学习算法与自然语言处理出品
@公众号原创专栏作者 思婕的便携席梦思
单位 | 哈工大SCIR实验室
KL散度 = 交叉熵 - 熵
1. 熵(Entropy)
抽象解释:熵用于计算一个随机变量的信息量。对于一个随机变量X,X的熵就是它的信息量,也就是它的不确定性。
形象例子:有两个随机变量X和Y,或者说两个事件,X表示“投一枚硬币,落地时,哪一面朝上”;Y表示“太阳从哪个方向升起”。对于随机变量X,“正面朝上”和“反面朝上”的概率各为0.5;对于随机变量Y,“太阳从东边升起”的概率为1,从另外三个方向升起的概率为0。由此可以看出,事件X的不确定性大于事件Y,因此事件X的熵也就大于事件Y。
那么具体该如何计算熵呢?
熵的数学定义为:
举个例子,依旧是投硬币的那个事件:
我们令
那么它的熵为:
从编码的角度理解熵
对于任意一个离散型随机变量,我们都可以对其进行编码。例如我们可以把字符看出一个离散型随机变量。
根据shannon的信息论,给定一个字符集的概率分布,我们可以设计一种编码,使得表示该字符集组成的字符串平均需要的比特数最少。假设这个字符集是X,对x∈X,其出现概率为P(x),那么其最优编码(哈夫曼编码)平均需要的比特数等于这个字符集的熵。
1. KL散度(Kullback-Leibler divergence)
抽象解释:KL散度用于计算两个随机变量的差异程度。相对于随机变量X,随机变量Y有多大的不同?这个不同的程度就是KL散度。KL散度又称为信息增益,相对熵。需要注意的是KL散度是不对称的,就是说:X关于Y的KL散度 不等于 Y关于X的KL散度。
形象例子:
X表示“不透明的袋子里有2红2白五个球,随机抓一个球,球的颜色”事件,
Y表示“不透明的袋子里有3红2白五个球,随机抓一个球,球的颜色”事件,
Z表示“不透明的袋子里有1红1白两个球,随机抓一个球,球的颜色”事件。
由于在事件X和Z中,都是P(红)=0.5 P(白)=0.5;而在事件Y中P(红)=0.6 P(白)=0.4,所以我们认为:相对于事件X,事件Y的差异程度小于事件Z。
那么该如何具体计算KL散度呢?
KL散度的数学定义为:
对于离散型随机变量,我们定义A和B的KL散度为:
对于离散型随机变量,我们定义A和B的KL散度为:
从编码的角度理解KL散度
在同样的字符集上,假设存在另一个概率分布Q(X)。如果用概率分布P(X)的最优编码(即字符x的编码长度等于log[1/P(x)]),来为符合分布Q(X)的字符编码,那么表示这些字符就会比理想情况多用一些比特数。KL-divergence就是用来衡量这种情况下平均每个字符多用的比特数,因此可以用来衡量两个分布的距离。
1. 交叉熵(Cross-Entropy)
抽象解释:我所理解的交叉熵的含义,与KL散度是类似的,都是用于度量两个分布或者说两个随机变量、两个事件不同的程度。
具体例子:与KL散度类似
交叉熵的数学定义:
比较熵、KL散度和交叉熵的数学定义会发现:
KL散度 = 交叉熵 - 熵
从编码的角度理解交叉熵熵的意义是:对一个随机变量A编码所需要的最小字节数,也就是使用哈夫曼编码根据A的概率分布对A进行编码所需要的字节数;KL散度的意义是:使用随机变量B的最优编码方式对随机变量A编码所需要的额外字节数,具体来说就是使用哈夫曼编码却根据B的概率分布对A进行编码,所需要的编码数比A编码所需要的最小字节数多的数量;交叉熵的意义是:使用随机变量B的最优编码方式对随机变量A编码所需要的字节数,具体来说就是使用哈夫曼编码却根据B的概率分布对A进行编码,所需要的编码数。
推荐阅读:
【长文详解】从Transformer到BERT模型
赛尔译文 | 从头开始了解Transformer
百闻不如一码!手把手教你用Python搭一个Transformer