深度学习:常用熵概述及熵值计算


文章目录

    • @[toc]
        • 一.熵概述
        • 二.常用熵介绍
          • 2.1 信息熵
          • 2.2 交叉熵(cross entropy):
          • 2.3 相对熵(relative entropy):
          • 2.4 JS散度(Jensen-Shannon divergence)
          • 2.5 联合熵(combination entropy)
          • 2.6 条件熵(the conditional entropy)
          • 2.7 互信息(Mutual Information)
        • 三.熵值计算

一.熵概述

热力学中的熵:

  • 是表示分子状态混乱程度的物理量

信息论中的熵:

  • 用来描述信源的不确定性的大小
  • 由美国数学家香农提出,他是信息论的创始人。
  • 经常使用的熵概念有下列几种:信息熵 交叉熵 相对熵 条件熵 互信息

二.常用熵介绍

2.1 信息熵

我们知道信息被用来消除事物的随机不确定性。

那么,首先我们需要确定信源信息的不确定性该如何衡量。

信源信息的不确定性函数 f ( p ) 常满足两个条件:

  • 是概率p的单调递减函数。
  • 两个独立符号所产生的不确定性应等于各自不确定性之和,即f(p1 , p2)=f(p1)+f(p2)

对数函数同时满足这两个条件(其中的两个等号):
f ( p ) = l o g 1 p = − l o g p f(p) = log^\frac1p= -log^p f(p)=logp1=logp
香农信息熵:要考虑信源所有可能发生情况的平均不确定性。若信源符号有n种取值:U1,…,Ui,…,Un,即信源可能呈现出的状态值,对应概率为P1,…,Pi,…,Pn,且各种出现彼此独立。此时信源的平均不确定性应当为单个符号不确定性-logpi的统计平均值(E),称为信息熵。


H ( U ) = E [ − l o g p i ] = ∑ i = 1 n p i l o g ( 1 p i ) H(U) = E[-log^{p_i}] = \sum_{i=1}^{n}p_ilog(\frac{1}{p_i}) H(U)=E[logpi]=i=1npilog(pi1)

2.2 交叉熵(cross entropy):

交叉熵定义:

  • 交叉熵是信息论中一个重要的概念,用于表征两个变量概率分布P,Q(假设P表示真实分布,Q为模型预测的分布)的差异性。
  • 交叉熵越大,两个变量差异程度越大

交叉熵公式:
H ( P , Q ) = − ∑ x ∈ X p ( x ) l o g Q ( x ) = ∑ x ∈ X p ( x ) l o g 1 Q ( x ) H(P,Q)=-\sum_{x \in X}^{}p(x)log{Q(x)}=\sum_{x \in X}^{}p(x)log\frac{1}{Q(x)} H(P,Q)=xXp(x)logQ(x)=xXp(x)logQ(x)1
交叉熵在深度学习中的应用十分广泛,一般作为神经网络的损失函数,用来衡量模型预测的分布与真实分布间的差异。

2.3 相对熵(relative entropy):

也称为KL散度(Kullback-Leibler divergence,简称KLD),信息散度(information divergence),信息增益(information gain)。

相对熵的定义:

  • 是交叉熵与信息熵的差值。表示用分布Q模拟真实分布P,所需的额外信息。
  • 计算结果中数值大,则说明分布的差距较大。

计算公式为:
D K L ( P ∣ ∣ Q ) = ∑ x ∈ X p ( x ) l o g 1 Q ( x ) − ∑ x ∈ X P ( x ) l o g 1 P ( x ) = ∑ x ∈ X P ( x ) l o g P ( x ) Q ( x ) D_{KL}(P||Q)=\sum_{x \in X}^{}p(x)log\frac{1}{Q(x)}-\sum_{x \in X}^{}P(x)log\frac{1}{P(x)}=\sum_{x \in X}^{}P(x)log\frac{P(x)}{Q(x)} DKL(P∣∣Q)=xXp(x)logQ(x)1xXP(x)logP(x)1=xXP(x)logQ(x)P(x)
相对熵举例:

假设某字符发射器随机发出0和1的两种字符,且其真实发出概率分布为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?

答:

那么我们可以使用相对熵来衡量分布之间的相似(接近)
D K L ( A ∣ ∣ B ) = ∑ x ∈ X A ( x ) l o g A ( x ) B ( x ) = A ( 0 ) l o g A ( 0 ) B ( 0 ) + A ( 1 ) l o g A ( 1 ) B ( 1 ) D K L ( A ∣ ∣ C ) = ∑ x ∈ X A ( x ) l o g A ( x ) C ( x ) = A ( 0 ) l o g A ( 0 ) C ( 0 ) + A ( 1 ) l o g A ( 1 ) C ( 1 ) D_{KL}(A||B)=\sum_{x \in X}^{}A(x)log\frac{A(x)}{B(x)}=A(0)log\frac{A(0)}{B(0)}+A(1)log\frac{A(1)}{B(1)} \\ D_{KL}(A||C)=\sum_{x\in X}^{}A(x)log\frac{A(x)}{C(x)}=A(0)log\frac{A(0)}{C(0)}+A(1)log\frac{A(1)}{C(1)} DKL(A∣∣B)=xXA(x)logB(x)A(x)=A(0)logB(0)A(0)+A(1)logB(1)A(1)DKL(A∣∣C)=xXA(x)logC(x)A(x)=A(0)logC(0)A(0)+A(1)logC(1)A(1)
计算结果为:

D K L ( A ∣ ∣ B ) = 1 2 l o g 1 2 1 4 + 1 2 l o g 1 2 3 4 D K L ( A ∣ ∣ C ) = 1 2 l o g 1 2 1 8 + 1 2 l o g 1 2 7 8 D_{KL}(A||B)=\frac{1}{2}log\frac{\frac{1}{2}}{\frac{1}{4}}+\frac{1}{2}log\frac{\frac{1}{2}}{\frac{3}{4}} \\ D_{KL}(A||C)=\frac{1}{2}log\frac{\frac{1}{2}}{\frac{1}{8}}+\frac{1}{2}log\frac{\frac{1}{2}}{\frac{7}{8}} DKL(A∣∣B)=21log4121+21log4321DKL(A∣∣C)=21log8121+21log8721
得出结论:相比C而言,B更接近于A。

相对熵的性质:

  • 非对称性:

D K L ( A ∣ ∣ B ) ≠ D K L ( B ∣ ∣ A ) D_{KL}(A||B)\neq D_{KL}(B||A) DKL(A∣∣B)=DKL(B∣∣A)

  • 非负性:

D K L ( B ∣ ∣ A ) > 0 D_{KL}(B||A) > 0 DKL(B∣∣A)>0

部分人称呼相对熵(KL散度)为KL距离,但实际上它并不能真正地度量距离。

2.4 JS散度(Jensen-Shannon divergence)
  • 因为KL散度不具有对称性,因此JS散度在KL散度的基础上进行了改进,现有两个分布p1和p2,其JS散度公式为:

J S ( P 1 ∣ ∣ P 2 ) = 1 2 K L ( P 1 ∣ ∣ P 1 + P 2 2 ) + 1 2 K L ( P 2 ∣ ∣ P 1 + P 2 2 ) JS(P_1||P_2) = \frac{1}{2} KL(P_1||\frac{P_1+P_2}{2}) + \frac{1}{2} KL(P_2||\frac{P_1+P_2}{2}) JS(P1∣∣P2)=21KL(P1∣∣2P1+P2)+21KL(P2∣∣2P1+P2)

  • 同样可以度量两个分布的相似程度。
2.5 联合熵(combination entropy)
  • 联合熵也称之为复合熵(Joint Entropy):

  • 用H(X,Y)表示,两个随机变量X,Y的联合分布的熵,形成联合熵。

2.6 条件熵(the conditional entropy)

条件熵: H(X|Y)表示在已知随机变量Y的条件下随机变量x的不确定性。

H(X|Y) = H(X,Y) - H(Y),表示(X, Y)的联合熵,减去Y单独发生包含的熵。

推导过程:

  • 假设已知y = yj,则

H ( x ∣ y j ) = − ∑ i = 1 n p ( x i ∣ y i ) l o g p ( x i ∣ y j ) H(x|y_j) = - \sum_{i=1}^{n}p(x_i|y_i)logp(x_i|y_j) H(xyj)=i=1np(xiyi)logp(xiyj)

  • 对于y的各种可能值, 需要根据出现概率做加权平均。即

H ( x ∣ y ) = − ∑ i = 1 n ∑ j = 1 m p ( y j ) p ( x i ∣ y j ) l o g p ( x i ∣ y j ) H ( x ∣ y ) = − ∑ i = 1 n ∑ j = 1 m p ( x i , y j ) l o g p ( x i , y j ) p ( y j ) H ( x ∣ y ) = H ( x , y ) − H ( y ) H(x|y) = - \sum_{i=1}^{n}\sum_{j=1}^{m}p(y_j)p(x_i|y_j)logp(x_i|y_j) \\ H(x|y) = - \sum_{i=1}^{n}\sum_{j=1}^{m}p(x_i,y_j)log\frac{p(x_i,y_j)}{p(y_j)} \\ H(x|y) = H(x,y) - H(y) H(xy)=i=1nj=1mp(yj)p(xiyj)logp(xiyj)H(xy)=i=1nj=1mp(xi,yj)logp(yj)p(xi,yj)H(xy)=H(x,y)H(y)

2.7 互信息(Mutual Information)
  • 互信息可以被看成是一个随机变量中包含的关于另一个随机变量的信息量
  • 或者说是一个随机变量由于已知另一个随机变量而减少的不确定性

推导过程:

I ( X ; Y ) = H ( X ) − H ( X ∣ Y ) I ( X ; Y ) = H ( X ) + H ( Y ) − H ( X , Y ) I ( X ; Y ) = ∑ x p ( x ) l o g 1 p ( x ) + ∑ y p ( y ) l o g 1 p ( y ) − ∑ x , y p ( x , y ) l o g 1 p ( x , y ) I (X;Y) = H(X) - H(X|Y) \\ I (X;Y)=H(X)+H(Y)-H(X,Y) \\ I (X;Y)=\sum_{x}^{}p(x)log\frac {1}{p(x)} + \sum_{y}^{}p(y)log\frac{1}{p(y)} - \sum_{x,y}^{}p(x,y)log\frac{1}{p(x,y)} I(X;Y)=H(X)H(XY)I(X;Y)=H(X)+H(Y)H(X,Y)I(X;Y)=xp(x)logp(x)1+yp(y)logp(y)1x,yp(x,y)logp(x,y)1

结论:

I ( X ; Y ) = ∑ x , y p ( x , y ) l o g p ( x , y ) p ( x ) p ( y ) I (X;Y)=\sum_{x,y}^{}p(x,y)log\frac{p(x,y)}{p(x)p(y)} I(X;Y)=x,yp(x,y)logp(x)p(y)p(x,y)
即互信息I(X,Y)是联合分布p(x,y)与乘积分布p(x)p(y)的相对熵

文氏图图解:

深度学习:常用熵概述及熵值计算_第1张图片

三.熵值计算

# -*- coding: utf-8 -*-
#演示内容:香农信息熵的计算(例1和例2分别为两种不同类型的输入)以及互信息的计算(例3)。其中log默认为自然对数。

import numpy as np
from math import log

#例1: 计算香农信息熵(已知概率分布)
print("例1:") 
def calc_ent(x):   
    ent = 0.0
    for p in x:
        ent -= p * np.log(p)
    return ent

x1=np.array([0.4, 0.2, 0.2, 0.2])
x2=np.array([1])
x3=np.array([0.2, 0.2, 0.2, 0.2, 0.2])
print ("x1的信息熵:", calc_ent(x1))
print ("x2的信息熵:", calc_ent(x2))
print ("x3的信息熵:", calc_ent(x3))
print("") 

#例2: 计算香农信息熵(此时给定了信号发生情况) 
print("例2:") 
def calcShannonEnt(dataSet):  
    length,dataDict=float(len(dataSet)),{}  
    for data in dataSet:  
        try:dataDict[data]+=1  
        except:dataDict[data]=1  
    return sum([-d/length*log(d/length) for d in list(dataDict.values())])  
print("x1的信息熵:", calcShannonEnt(['A','B','C','D','A'])) 
print("x2的信息熵:",calcShannonEnt(['A','A','A','A','A'])) 
print("x3的信息熵:",calcShannonEnt(['A','B','C','D','E'])) 


#例3: 计算互信息(输入:给定的信号发生情况,其中联合分布已经手工给出)
print("") 
print("例3:") 
Ent_x4=calcShannonEnt(['3',  '4',   '5',  '5', '3',  '2',  '2', '6', '6', '1'])
Ent_x5=calcShannonEnt(['7',  '2',   '1',  '3', '2',  '8',  '9', '1', '2', '0'])
Ent_x4x5=calcShannonEnt(['37', '42', '51', '53', '32', '28', '29', '61', '62', '10', '37', '42'])
MI_x4_x5=Ent_x4+Ent_x5-Ent_x4x5
print ("x4和x5之间的互信息:",MI_x4_x5)

你可能感兴趣的:(深度学习,深度学习,机器学习,算法)