相对熵(Relative Entropy)),又被称为KL散度(Kullback-Leibler Divergence)或信息散度(Information Divergence),是两个概率分布间差异的非对称性度量 。在信息理论中,相对熵等价于两个概率分布的​​信息熵​​的差值 。

相对熵也是一些优化算法,例如最大期望算法的损失函数 。此时参与计算的一个概率分布为真实分布,另一个为非真实(拟合)分布,相对熵表示使用非真实分布拟合真实分布时产生的信息损耗 。设 p ( x ) p(x) p(x)、 q ( x ) q(x) q(x)是随机变量 x x x上的两个概率分布,则在离散和连续随机变量的情形下,相对熵的定义分别为:

离散值:KL ( p ∣ ∣ q ) = ∑ x p ( x ) log ⁡ p ( x ) q ( x ) 连续值:KL ( p ∣ ∣ q ) = ∫ x p ( x ) log ⁡ p ( x ) q ( x ) d x \begin{aligned} &\text{离散值:KL}(p||q)=\sum_xp(x)\log{\frac{p(x)}{q(x)}}\\ &\text{连续值:KL}(p||q)=\int_xp(x)\log{\frac{p(x)}{q(x)}}\text{d}x \end{aligned} ​离散值:KL(p∣∣q)=x∑​p(x)logq(x)p(x)​连续值:KL(p∣∣q)=∫x​p(x)logq(x)p(x)​dx​

在信息理论中,相对熵是用来度量使用基于 q q q的编码来编码来自 p p p的样本平均所需的额外的比特个数。典型情况下, p p p表示数据的真实分布, q q q表示数据的理论分布\模型分布或 p p p的近似分布。给定一个字符集的概率分布,我们可以设计一种编码,使得表示该字符集组成的字符串平均需要的比特数最少。假设这个字符集是 X X X,对 x ∈ X x\in X x∈X ,其出现概率为 p ( x ) p(x) p(x),那么其最优编码平均需要的比特数等于这个字符集的信息熵:

H ( x ) = − ∑ x p ( x ) log ⁡ p ( x ) H(x)=-\sum_xp_(x)\log{p_(x)} H(x)=−x∑​p(​x)logp(​x)

在同样的字符集上,假设存在另一个概率分布 q ( x ) q_(x) q(​x),如果用概率分布 p ( x ) p_(x) p(​x)的最优编码(即字符 x x x的编码长度等于 − log ⁡ p ( x ) -\log{p_(x)} −logp(​x)),来为符合分布 p ( x ) p_(x) p(​x)的字符编码,那么表示这些字符就会比理想情况多用一些比特数。相对熵就是用来衡量这种情况下平均每个字符多用的比特数,因此可以用来衡量两个分布的距离,即:

KL ( p ∣ ∣ q ) = ∑ x p ( x ) log ⁡ p ( x ) q ( x ) = ∑ x p ( x ) log ⁡ p ( x ) − ∑ x p ( x ) log ⁡ q ( x ) \text{KL}(p||q)=\sum_xp(x)\log{\frac{p(x)}{q(x)}}=\sum_xp(x)\log{p(x)}-\sum_xp(x)\log{q(x)} KL(p∣∣q)=x∑​p(x)logq(x)p(x)​=x∑​p(x)logp(x)−x∑​p(x)logq(x)

下面我们来看一下相对熵的Python实现:

def RelativeEntropy(p, q):
import numpy as np
p = np.array(p)
q = np.array(q)
return np.sum(p * np.log(p/q))