熵、信息熵、交叉熵、相对熵、条件熵、互信息、条件熵的贝叶斯规则

2024-05-03 09:32

本文主要是介绍熵、信息熵、交叉熵、相对熵、条件熵、互信息、条件熵的贝叶斯规则,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

每条消息都含有信息。“信息熵”是“熵”的别名,用来衡量消息的不确定程度。

宽泛来讲,即消息所传达的信息的模糊程度,消息越模糊,其熵越高。
形象的说,熵是从 根据模糊消息—>得到精确信息 所需要花费的最小代价。

熵=信息量(的期望)=不确定性的多少。熵值是信息量的一个度量。

某种意义上说,熵就是最优策略。

《数学之美》中这样描述:

变量的不确定性越高,熵也就越大,要把它搞清楚,所需要的信息量也就越高。

维基百科中对“熵”的定义:

在信息论中,熵是接收的每条消息中包含的信息的平均量,又被称为信息熵、信源熵、平均自信息量。这里,“消息”代表来自分布或数据流中的事件、样本或特征。(熵最好理解为不确定性的量度而不是确定性的量度,因为越随机的信源的熵越大。)来自信源的另一个特征是样本的概率分布。这里的想法是,比较不可能发生的事情,当它发生了,会提供更多的信息。由于一些其他的原因,把信息(熵)定义为概率分布的对数的相反数是有道理的。事件的概率分布和每个事件的信息量构成了一个随机变量,这个随机变量的均值(即期望)就是这个分布产生的信息量的平均值(即熵)。熵的单位通常为比特,但也用Sh、nat、Hart计量,取决于定义用到对数的底。

给定一个样本集 X ,得到两个概率分布P(x) Q(x) 。其中 P(x) 是该样本集的真实概率分布, Q(x) 是我猜测的概率分布。利用真实分布 P 来衡量识别一个样本所需要的平均编码长度,亦即X 的熵为:

H(p)=H(X)=xP(x)1log2P(x)=xP(x)log2P(x)

这里对数 log 的底为2,是因为计算样本的平均编码长度中,编码为2进制;这也是为什么信息论中用“比特bit”来度量熵值(0000 0111这样一个字节是 8 bits)。

比如,在 “总决赛后,猜测32支实力相当的球队谁是冠军” 问题中,采用2分法,只需要问5次就可得知冠军是谁,即 log232=5 ,知底数为2,信息量(熵)与对数函数 log 有关。

但如果32支球队实力有强有弱,则第一次猜测时可不用将32支球队等分成2组,可将实力强劲的几支队伍分到一组,如此一来也许猜测3~4次就可得知冠军是谁。因此,当夺冠概率不等时,“谁是冠军”的信息量(熵)小于5。事实上,准确信息量应为:

H=p11log2p1+p21log2p2+...+p321log2p32

其中 p1 p2 p32 是32支球队夺冠的概率。

交叉熵

如果用猜测的概率分布 Q 来衡量识别来自实际的概率分布P的每个样本所需要的平均编码长度,则应该是:

H(p,q)=xP(x)1log2Q(x)=xP(x)log2Q(x)

这里 H(p,q) 即为“交叉熵”。因为样本来自 P ,所以H(p,q)的概率为 P(x) ,猜测的概率分布为 Q(x) ,最终得上式。“交叉熵”即指用错误的概率分布 Q 去估计样本的真实分布P后得到的值。

例如,给定一个集合(A, B, C, D) ,真实的概率分别是(0.5, 0.5, 0, 0),其熵为:

H=(12log212+12log212+0+0)=1

即用1位编码即可表示这个集合 (例如编码为0表示A,编码为1表示B;C和D出现概率为0,不为其赋予编码)。
对集合(A, B, C, D) 出现的概率,如果猜测的概率分布为(0.25, 0.25, 0.25, 0.25), 则交叉熵为:
H=(14log214+14log214+14log214+14log214)=2

即用两位编码才可表示这个集合(例如编码为00表示A,编码为01表示B,编码为10表示C,编码为11表示D)。
可以证明, H(p)H(p,q) ,当且仅当p==q时等号成立。

交叉熵可在神经网络(机器学习)中作为损失函数, P 表示真实的概率分布,Q为训练后模型的预测概率分布,交叉熵损失函数可以衡量 P Q的相似性。

交叉熵代价函数

简单来说,“交叉熵代价函数”是替代“均方误差代价函数”的存在。“均方误差代价函数”的缺点是在某些情况下(下文会介绍什么情况下),学习速率很慢。为了搞清问题的来源,我们来考虑一下神经元的学习方式:通过计算代价函数的偏导 Cw Cb 来改变权重和偏置。那么我们说「学习速度很慢」其实上是在说偏导很小。那么问题就转换为理解为何偏导很小。为了解释这个问题,我们先来计算一下偏导。均方代价函数的形式如下:

C=(ya)22

这里 y 是期待的输出,a是神经元的输出。应知,这里 a=σ(z)=σ(wx+b) 。则 Cwb 的偏导分别是:
Cw=(ay)σ(z)x

Cb=(ay)σ(z)

注意到 Cwb 的偏导均和 σ(z) 相关。神经网络的激活函数sigmoid 函数 σ(z)=11+ex 的曲线如下:
这里写图片描述

当神经元输出(右端)接近1时,曲线变得非常平缓, σ(z) 变得非常小。这就是学习速率变慢的根源。事实上,当神经网络使用sigmoid激活函数的前提下使用均方代价函数时都会有这个问题。
如何来避免这种减速呢?可以用不同的代价函数比如交叉熵(cross-entropy)代价函数来替代平方代价函数。为了理解交叉熵,我们假设要训练一个拥有多个输入变量的神经元:输入 x1,x2,w1,w2,b :

这里写图片描述

神经元的输出为 a=σ(z)z=jwjxj+by01 。我们定义这个神经元的交叉熵代价函数为:

C=1nx[ylna+(1y)ln(1a)]

这里 ylna 就是一个交叉熵。计算交叉熵代价函数对权重和偏置的倒数,最终可得:
Cwj=1nx(σ(z)y)xj

Cb=1nx(σ(z)y)

它告诉我们权重的学习速率可以被 σ(z)y 控制,也就是被输出结果的误差所控制。误差越大我们的神经元学习速率越大。这正是我们直觉上所期待的那样。另外它能避免学习减速,这是 σ(z) 一项导致的。当我们使用交叉熵时, σ(z) 这一项会被抵消掉,因此我们不必担心它会变小。 详细过程在此。

相对熵

英文名为Relative Entropy, 或Kullback-Leibler Divergence(KL散度)。目的是为了衡量两个函数或者概率分布的差异性。其公式为:

KL(f(x)||g(x))=xf(x)logf(x)g(x)

也许上面的公式不好理解,那相对熵的另一种写法是:相对熵=交叉熵-熵:
KL(f(x)||g(x))=H(p,q)H(p)
=xP(x)1logQ(x)xP(x)1logP(x)
=xP(x)logP(x)xP(x)logQ(x)
=xP(x)logP(x)Q(x)

相对熵一定大于等于0。可以这样理解相对熵:一个估计的概率分布与实际的概率分布的差距。当相对熵正趋向于0时,可以认为估计的概率分布就是实际的概率分布。

《数学之美》给出了相对熵的三个结论:

  1. 对于两个完全相同的函数,它们的相对熵等于零。
  2. 相对熵越大,两个函数差异越大;反之,相对熵越小,两个函数差异越小。
  3. 对于概率分布或者概率密度函数,如果取值均大于零,相对熵可以度量两个随机分布的差异性。

条件熵

维基百科:

条件熵描述了在已知第二个随机变量 X 的值的前提下,随机变量 Y的信息熵还有多少。同其它的信息熵一样,条件熵也用Sh、nat、Hart等信息单位表示。基于 X 条件的Y的信息熵,用 H(Y|X) 表示。

对于两个随机变量 XY , 假定已知Y的随机分布P(Y),则就知道了Y的熵:

H(Y)=yP(y)logP(y)

即Y的不确定性就这么大。若我们还知道X和Y一起出现的联合概率分布 P(x,y)
和条件概率分布 P(y|x) ,则可定义在 XY 的条件熵为:
H(Y|X)=x,yP(x,y)logP(y|x)

根据下一节介绍的非负互信息 I(X;Y)=H(X)H(Y|X) , 知 H(X)H(Y|X) 。即多了 X 的信息之后,关于Y的不确定性变小了。在统计语言模型中,如果把X看成Y前一个字,在数学上可以证明二元模型的不确定性小于一元模型。

互信息

两个随机事件 XY , 它们的互信息定义如下:

I(X;Y)=x,yP(x,y)logP(x,y)P(x)P(y)

互信息与条件熵和熵之间有这样的关系:
I(X;Y)=H(X)H(X|Y)

证明如下图,来自维基百科:
这里写图片描述

互信息就是两个事件X和Y相关性的量化度量。就是了解其中一个 Y 前提下,对消除另一个X的不确定性提供的信息量。互信息取值为 [0,min(H(X),H(Y)] 。当X和Y完全相关时, H(X)=H(Y) ,完全无关时,互信息等于0。

条件熵的贝叶斯规则

H(Y|X)=H(X|Y)H(X)+H(Y)

证明. H(Y|X)=H(X,Y)H(X) H(X|Y)=H(Y,X)H(Y) 。对称性意味着 H(X,Y)=H(Y,X) 。将两式相减即为贝叶斯规则。

参考文章:
《数学之美》第六章
https://hit-scir.gitbooks.io/neural-networks-and-deep-learning-zh_cn/content/chap3/c3s1.html
https://zh.wikipedia.org/wiki/%E6%9D%A1%E4%BB%B6%E7%86%B5
https://www.zhihu.com/question/41252833

这篇关于熵、信息熵、交叉熵、相对熵、条件熵、互信息、条件熵的贝叶斯规则的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/956416

相关文章

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者

Adblock Plus官方规则Easylist China说明与反馈贴(2015.12.15)

-------------------------------特别说明--------------------------------------- 视频广告问题:因Adblock Plus的局限,存在以下现象,优酷、搜狐、17173黑屏并倒数;乐视、爱奇艺播放广告。因为这些视频网站的Flash播放器被植入了检测代码,而Adblock Plus无法修改播放器。 如需同时使用ads

封装MySQL操作时Where条件语句的组织

在对数据库进行封装的过程中,条件语句应该是相对难以处理的,毕竟条件语句太过于多样性。 条件语句大致分为以下几种: 1、单一条件,比如:where id = 1; 2、多个条件,相互间关系统一。比如:where id > 10 and age > 20 and score < 60; 3、多个条件,相互间关系不统一。比如:where (id > 10 OR age > 20) AND sco

Java了解相对较多!

我是对Java了解相对较多,而对C#则是因工作需要才去看了一下,C#跟Java在语法上非常相似,而最初让我比较困惑的就是委托、事件部分,相信大多数初学者也有类似的困惑。经过跟Java的对比学习,发现这其实跟Java的监听、事件是等同的,只是表述上不同罢了。   委托+事件是观察者模式的一个典型例子,所谓的委托其实就是观察者,它会关心某种事件,一旦这种事件被触发,这个观察者就会行动。   下

使用条件变量实现线程同步:C++实战指南

使用条件变量实现线程同步:C++实战指南 在多线程编程中,线程同步是确保程序正确性和稳定性的关键。条件变量(condition variable)是一种强大的同步原语,用于在线程之间进行协调,避免数据竞争和死锁。本文将详细介绍如何在C++中使用条件变量实现线程同步,并提供完整的代码示例和详细的解释。 什么是条件变量? 条件变量是一种同步机制,允许线程在某个条件满足之前进入等待状态,并在条件满

一些数学经验总结——关于将原一元二次函数增加一些限制条件后最优结果的对比(主要针对公平关切相关的建模)

1.没有分段的情况 原函数为一元二次凹函数(开口向下),如下: 因为要使得其存在正解,必须满足,那么。 上述函数的最优结果为:,。 对应的mathematica代码如下: Clear["Global`*"]f0[x_, a_, b_, c_, d_] := (a*x - b)*(d - c*x);(*(b c+a d)/(2 a c)*)Maximize[{f0[x, a, b,

notepad++ 正则表达式多条件查找替换

基础语法参考: https://www.cnblogs.com/winstonet/p/10635043.html https://www.linuxidc.com/Linux/2019-05/158701.htm   通常情况下我们查找的内容和要被替换掉的内容是一样的,我们只需要使用正则表达式精确框定查找内容,替换直接输入要替换的内容即可。 但有时会比较复杂,查找的内容,只需要替换其中

FPGA开发:条件语句 × 循环语句

条件语句 if_else语句 if_else语句,用来判断是否满足所给定的条件,根据判断的结果(真或假)决定执行给出的两种操作之一。 if(表达式)语句; 例如: if(a>b) out1=int1; if(表达式)         语句1; else         语句2; 例如: if(a>b)out1=int1;elseout1=int2; if(表达式1) 语句1; els

Kernel 中MakeFile 使用if条件编译

有时需要通过if  else来选择编译哪个驱动,单纯的obj-$(CONFIG_)就不是很方便,下面提供两种参考案例: 案例一: 来源:drivers/char/tpm/Makefileifdef CONFIG_ACPItpm-y += tpm_eventlog.o tpm_acpi.oelseifdef CONFIG_TCG_IBMVTPMtpm-y += tpm_eventlog.o

shell循环sleep while例子 条件判断

i=1# 小于5等于时候才执行while [ ${i} -le 5 ]doecho ${i}i=`expr ${i} + 1`# 休眠3秒sleep 3doneecho done 参考 http://c.biancheng.net/cpp/view/2736.html