• 从数学角度和编码角度解释 熵、交叉熵、KL散度


    本文从两方面进行解释:数学和编码方面。总有一个角度能让你更好理解。

    数学解释

    熵 Entropy

    熵用于计算一个离散随机变量的信息量。对于一个概率分布 X X X X X X的熵就是它的不确定性。
    用大白话来说,假设你预测一个东西,有时候结果会出乎意料,熵就表示出乎意料的程度。熵越大你越不容易预测对,事情就越容易出乎意料。

    离散型概率分布 X X X的熵定义为自信息的平均值:
    H ( X ) = E p ( x ) [ I ( x ) ] = − ∑ x p ( x ) log ⁡ p ( x ) H(X)=E_{p(x)}[I(x)]=-\sum_{x} p(x) \log p(x) H(X)=Ep(x)[I(x)]=xp(x)logp(x)

    注意:
    熵的单位可以是比特(bits)也可以是奈特(nats)。二者区别在于前者是用 log ⁡ 2 \log_2 log2计算,后者是用 log ⁡ e \log_e loge计算。我们这里是用 log ⁡ 2 \log_2 log2计算。

    举个栗子算一下熵。

    两个城市明天的天气状况如下:

    在这里插入图片描述
    现在有两个事件:

    • A市明天的天气状况
    • B市明天的天气状况

    H ( A ) = − 0.8 × log ⁡ 0.8 − 0.15 × log ⁡ 0.15 − 0.05 × log ⁡ 0.05 = 0.884 H(A)=-0.8 \times \log 0.8-0.15 \times \log 0.15-0.05 \times \log 0.05=0.884 H(A)=0.8×log0.80.15×log0.150.05×log0.05=0.884

    H ( B ) = − 0.4 × log ⁡ 0.4 − 0.3 × log ⁡ 0.3 − 0.3 × log ⁡ 0.3 = 1.571 H(B)=-0.4 \times \log 0.4-0.3 \times \log 0.3-0.3 \times \log 0.3=1.571 H(B)=0.4×log0.40.3×log0.30.3×log0.3=1.571

    可以看到B的熵比A大,因此B城市的天气具有更大的不确定性。

    交叉熵 Cross-Entropy

    交叉熵用于度量两个概率分布间的差异性信息。
    再用大白话说一下,比如你认为一件事有六成概率能成功,实际上你去做的时候你又八成概率能成功。这时候结果出乎意料的程度就是交叉熵。

    交叉熵的数学定义:

    H ( A , B ) = − Σ i P A ( x i ) log ⁡ ( P B ( x i ) ) H(A, B)=-\Sigma_{i} P_{A}\left(x_{i}\right) \log \left(P_{B}\left(x_{i}\right)\right) H(A,B)=ΣiPA(xi)log(PB(xi))

    举个栗子算一下交叉熵。

    改了一下表头。
    在这里插入图片描述
    现在还是有两个事件:

    • P P P实际A城市明天的天气状况
    • Q Q Q你以为的A城市的天气状况

    H ( P , Q ) = − 0.8 × log ⁡ 0.4 − 0.15 × log ⁡ 0.3 − 0.05 × log ⁡ 0.3 = 1.405 H(P,Q)=-0.8 \times \log0.4-0.15 \times \log0.3 - 0.05 \times \log 0.3 = 1.405 H(P,Q)=0.8×log0.40.15×log0.30.05×log0.3=1.405

    KL散度 Kullback-Leibler divergence

    KL散度又称相对熵、信息增益,相对于交叉熵来说,是从另一个角度计算两个分布的差异程度。相对于分布X,分布Y有多大的不同?这个不同的程度就是KL散度。

    注意,KL散度是不对称的,也就是说X关于Y的KL散度 不等于 Y关于X的KL散度。

    A A A B B B 为定义在同一概率空间的两个概率测度,定义 A A A 相对于 B B B 的相对熵为
    D ( A ∥ B ) = ∑ x P A ( x ) log ⁡ P A ( x ) P B ( x ) D(A \| B)=\sum_{x} P_A(x) \log \frac{P_A(x)}{P_B(x)} D(AB)=xPA(x)logPB(x)PA(x)

    举个栗子算一下KL散度。

    还是用这个例子:

    在这里插入图片描述
    现在还是有两个事件:

    • P P P实际A城市明天的天气状况
    • Q Q Q你以为的A城市的天气状况

    D ( P ∥ Q ) = 0.8 × log ⁡ ( 0.8 ÷ 0.4 ) + 0.15 × log ⁡ ( 0.15 ÷ 0.3 ) + 0.05 × log ⁡ ( 0.0.5 ÷ 0.3 ) = 0.521 D(P \|Q) = 0.8 \times \log(0.8 \div0.4) + 0.15 \times \log(0.15 \div 0.3) + 0.05 \times \log(0.0.5\div 0.3) =0.521 D(PQ)=0.8×log(0.8÷0.4)+0.15×log(0.15÷0.3)+0.05×log(0.0.5÷0.3)=0.521

    熵、KL散度和交叉熵的关系

    我们从上边三个例子中可以看到:

    • A城市明天实际天气状况的熵 H ( A ) = 0.884 H(A)=0.884 H(A)=0.884
    • A城市明天实际天气状况和你预测的天气状况的交叉熵为 H ( P , Q ) = 1.405 H(P,Q)=1.405 H(P,Q)=1.405
    • A城市明天实际天气状况和你预测的天气状况的KL散度为 D ( P ∥ Q ) = 0.521 D(P \|Q) =0.521 D(PQ)=0.521

    然后我们可以发现: 0.884 + 0.521 = 1.405 0.884+0.521=1.405 0.884+0.521=1.405

    这里可以引出一个结论
    熵 + K L 散度 = 交叉熵 熵 + KL散度 = 交叉熵 +KL散度=交叉熵

    从编码的角度解释

    注意:下边这个举的例子是能整除的情况下,不能整除的情况下是算不出来的。

    能整除的例子

    假设我们现在有一条消息皮皮卡皮,皮卡丘

    让我们对这条消息统计一下:

    数量4211
    比例 4 8 \frac{4}{8} 84 2 8 \frac{2}{8} 82 1 8 \frac{1}{8} 81 1 8 \frac{1}{8} 81

    画个哈夫曼树:

    在这里插入图片描述

    数量4211
    比例 4 8 \frac{4}{8} 84 2 8 \frac{2}{8} 82 1 8 \frac{1}{8} 81 1 8 \frac{1}{8} 81
    哈夫曼编码011100101
    编码长度1233

    最短编码平均长度:

    4 8 × 1 + 2 8 × 2 + 1 8 × 3 + 1 8 × 3 = 1.75 \frac{4}{8} \times 1+\frac{2}{8} \times 2+\frac{1}{8} \times 3+\frac{1}{8} \times 3=1.75 84×1+82×2+81×3+81×3=1.75

    上述编码的熵:

    − 4 8 × log ⁡ 4 8 − 2 8 × log ⁡ 2 8 − 1 8 × log ⁡ 1 8 − 1 8 × log ⁡ 1 8 = 1.75 -\frac{4}{8} \times \log \frac{4}{8}-\frac{2}{8} \times \log \frac{2}{8}-\frac{1}{8} \times \log \frac{1}{8}-\frac{1}{8} \times \log \frac{1}{8}=1.75 84×log8482×log8281×log8181×log81=1.75

    从编码角度看,一串编码的熵等于它的最短编码平均长度。

    数量4211
    比例 4 8 \frac{4}{8} 84 2 8 \frac{2}{8} 82 1 8 \frac{1}{8} 81 1 8 \frac{1}{8} 81
    哈夫曼编码011100101
    错误的哈夫曼编码110100101

    如果你编码时候写错了

    现在的平均编码长度是:

    4 8 × 2 + 2 8 × 1 + 1 8 × 3 + 1 8 × 3 = 2 \frac{4}{8} \times 2+\frac{2}{8} \times 1+\frac{1}{8} \times 3+\frac{1}{8} \times 3=2 84×2+82×1+81×3+81×3=2

    此时交叉熵为:

    − 4 8 × log ⁡ 2 8 − 2 8 × log ⁡ 4 8 − 1 8 × log ⁡ 1 8 − 1 8 × log ⁡ 1 8 = 2 -\frac{4}{8} \times \log \frac{2}{8}-\frac{2}{8} \times \log \frac{4}{8}-\frac{1}{8} \times \log \frac{1}{8}-\frac{1}{8} \times \log \frac{1}{8}=2 84×log8282×log8481×log8181×log81=2

    使用错误的编码时候,编码平均长度就是交叉熵。

    而KL散度呢?

    4 8 × log ⁡ ( 4 8 ÷ 2 8 ) + 2 8 × log ⁡ ( 2 8 ÷ 4 8 ) + 1 8 × log ⁡ ( 1 8 ÷ 1 8 ) + 1 8 × log ⁡ ( 1 8 ÷ 1 8 ) = 0.25 \frac{4}{8} \times \log(\frac{4}{8}\div\frac{2}{8})+\frac{2}{8} \times \log (\frac{2}{8} \div \frac{4}{8})+\frac{1}{8} \times \log (\frac{1}{8} \div \frac{1}{8})+\frac{1}{8} \times \log (\frac{1}{8} \div \frac{1}{8})=0.25 84×log(84÷82)+82×log(82÷84)+81×log(81÷81)+81×log(81÷81)=0.25

    KL散度就是错误编码平均长度和正确编码平均长度的差异。

    不能整除的例子

    注意:你看,不能整除的情况下是算不出来的。

    假设我们现在有一条消息皮卡皮卡,皮卡皮,皮卡丘

    让我们对这条消息统计一下:

    数量5412
    比例 5 12 \frac{5}{12} 125 4 12 \frac{4}{12} 124 1 12 \frac{1}{12} 121 2 12 \frac{2}{12} 122

    画个哈夫曼树:

    在这里插入图片描述

    数量5421
    比例 5 12 \frac{5}{12} 125 4 12 \frac{4}{12} 124 2 12 \frac{2}{12} 122 1 12 \frac{1}{12} 121
    哈夫曼编码011101100
    编码长度1233

    最短编码平均长度:

    5 12 × 1 + 4 12 × 2 + 2 12 × 3 + 1 12 × 3 = 1.83 \frac{5}{12} \times 1 +\frac{4}{12} \times 2+\frac{2}{12} \times 3+\frac{1}{12} \times 3 = 1.83 125×1+124×2+122×3+121×3=1.83

    上述编码的熵:

    − 5 12 × log ⁡ 5 12 − 4 12 × log ⁡ 4 12 − 2 12 × log ⁡ 2 12 − 1 12 × log ⁡ 1 12 = 1.78 -\frac{5}{12} \times \log\frac{5}{12} -\frac{4}{12} \times \log\frac{4}{12}-\frac{2}{12} \times \log\frac{2}{12}-\frac{1}{12} \times \log\frac{1}{12} = 1.78 125×log125124×log124122×log122121×log121=1.78

    后边不算了。可以看到不能整除情况下因为一些误差是不相等的。

  • 相关阅读:
    一天销量200万,国产5G手机20天才200万,挑战iPhone也就想想罢了
    猫头虎的技术笔记:Spring Boot启动报错解决方案
    Go语言函数底层实现
    抓包工具fiddler的基础知识
    Eolink是国产API接口管理的无冕之王
    【软件工程导论】1.软件过程模型
    致敬最美逆行者网页设计作品 大学生抗疫感动专题网页设计作业模板 疫情感动人物静态HTML网页模板下载
    After Effects动态图形和数据可视化
    74-94 的总结
    spring集成web环境-ContextLoaderListener监听分析
  • 原文地址:https://blog.csdn.net/qq_36667170/article/details/126089564