KL 散度是一种衡量两个概率分布之间差异的度量。它描述了一个概率分布相对于另一个概率分布的 信息损失。在信息论中,KL散度也被称为相对熵。
假设:\( P(x) \)、\( Q(x) \) 为随机变量 \( x \) 的两个概率分布,在离散和连续随机变量的情形下,KL 散度计算公式:

我们可以把 P(x) 当做随机变量 x 在理论上的分布,把 Q(x) 当做在实际场景中得到的分布,通过 KL 散度可以量化出实际场景中得到的分布距离理论上的分布有多远,该值越小,距离越近,该值越大,距离越远。当且仅当 P=Q 时,KL 值等于 0。
假如一个字符发射器,随机发出 0 和 1 两种字符,由于我们只知道变量只有 0 和 1 两个值,其理论上的概率分布为 A(0:0.5, 1:0.5),但在实际进行实验时并不知道 A 的具体分布。
接下来,通过实验两组实验得到概率分布 B 与 C,各个分布的具体情况如下:
- A(0) = 1/2,A(1) = 1/2
- B(0) = 1/4,B(1) = 3/4
- C(0) = 1/8,C(1) = 7/8
接下来,套用上面的公式计算下在真实、具体场景中、实验得到的 B、C 分布距离理论上的分布(A分布)有多远,即:计算 B、C 两个分布相对于理论上的 A 分布损耗,KL 散度。
import numpy as np if __name__ == '__main__': A0, A1 = 1/2, 1/2 B0, B1 = 1/4, 3/4 C0, C1 = 1/8, 7/8 KL_A_B = A0*np.log(A0/B0) + A1*np.log(A1/B1) print(KL_A_B) KL_A_C = A0 * np.log(A0 / C0) + A1 * np.log(A1 / C1) print(KL_A_C)
程序输出结果:
0.14384103622589042 0.4133392865922339
从计算结果可以看到,KL(A||B) 小于 KL(A||C) ,说明实验得到的 B 分布相对于理论分布损耗更少,更加接近于理论分布。