信息熵 交叉熵 KL散度

2022/2/15 6:13:53

本文主要是介绍信息熵 交叉熵 KL散度,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

信息量

事件A发生的信息量:

\[I(A) = -\log_2(P(A)) \]

这样定义有以下好处:

  • 概率越小的事件发生,带来的信息量就越大

  • 相互独立的事件A,B同时发生,信息量为A、B单独发生时信息量的和:

\[\begin{align} I(AB) =&& -\log_2(P(AB)) \\ =&& -\log_2(P(A)P(B)) \\ =&& -\log_2 P(A) -\log_2 P(B) \\ =&&I(A) + I(B) \end{align} \]

信息熵

信息熵就是信息量的期望。

设离散型随机变量X,则X的信息熵为:

\[H(X) = -E_X[log_2 p_i] = - \sum_i p_i \log_2 p_i \]

其中, \(p_i\) 是 \(X=x_i\)的概率。

可见,如果X的各种取值概率相近,则信息熵大,系统较为混乱。如果X基本只会取某一个值,则信息熵小,系统较为稳定。

交叉熵

假设有离散随机变量\(X \in \{x_1, x_2 ,\cdots, x_n\}\)。\(X\)满足分布\(p\)。

假设要对\(X\)的各种取值进行2进制编码。如可以这样编码:\(x_1 \rightarrow 0\), \(x_2 \rightarrow 10\), \(x_3 \rightarrow 11\) , 也可以这样编码 \(x_1 \rightarrow 11\), \(x_2 \rightarrow 00\), \(x_3 \rightarrow 01\) (但不允许编码重复或有歧义,例如,\(x_1 \rightarrow 0\), \(x_2 \rightarrow 1\), \(x_3 \rightarrow 01\) 是不允许的,因为不能区分 \(x_3\) 和 \(x_1 x_2\)),

交叉熵就是某一编码需要的平均比特数。

\[H(p, q) = \sum_i p_i l_i \]

其中,\(l_i\)是取值\(x_i\)的编码长度(比特数)(例如,编码\(x_1 \rightarrow 0\), \(x_2 \rightarrow 10\), \(x_3 \rightarrow 11\) 对应 \(l_1 = 1, l_2 = 2, l_3 = 2\))。

其实,每个编码都对应一个最优分布\(q\),分布\(q\)使用该编码是最省比特的。可以证明,这个分布是:

\[q(x_i) = (1/2)^{l_i} \]

例如,编码\(x_1 \rightarrow 0\), \(x_2 \rightarrow 10\), \(x_3 \rightarrow 11\)对应的最优分布是:

\[p_1=1/2 \\ p_2=1/4 \\ p_3=1/4 \]

这样算出来的交叉熵:

\[H_1 = 1/2 + 1/4 * 2 + 1/4 * 2 = 1.5 \]

和信息熵:

\[H_2 = - \frac{1}{2} \log_2 \frac{1}{2} - \frac{1}{4} \log_2 \frac{1}{4} - \frac{1}{4} \log_2 \frac{1}{4} = 1.5 \]

恰好相等。事实上,信息熵是交叉熵的下界。不论用什么编码方法(作弊除外),永远无法将平均编码长度降低到信息熵以下,最优情况就是相等。而交叉熵超过信息熵的部分,称为KL散度

由于每个编码都对应一个分布q,我们也可以将交叉熵定义为真实分布\(p\)和编码分布\(q\)之间的关系:

\[\begin{align} H(p, q) =&& \sum_i p_i l_i \\ =&& \sum_i p_i \log_{\frac{1}{2}} q_i \\ =&& - \sum_i p_i \log_{2} q_i \end{align} \]

表示用q分布对应的编码编码p分布时所需的平均比特数。

KL散度

如前所述,KL散度等于交叉熵减信息熵:

\[\begin{align} D_{KL} (p || q) =&& - \sum_i p_i \log_{2} q_i -(- \sum_i p_i \log_2 p_i) \\ =&& \sum_i p_i \log_{2} \frac{p_i} {q_i} \end{align} \]

也就是实际编码相对于理论最优编码多用的比特数。也可以用来衡量p分布和q分布的相似程度。注意KL散度是不满足交换律的。



这篇关于信息熵 交叉熵 KL散度的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程