什么是信息
让我们从信息开始,它是信息理论的“心脏”。具有特定顺序的一种或多种编码格式的一切都可以编码信息。假设我们给自己设定了一个任务,试图定义信息的概念。从哪里开始比较好呢?
思考以下练习:
一副扑克牌属于我们的一位朋友。他们将发几张牌,洗牌后对这些牌做出一些概括性陈述。我们将努力评估每个陈述的信息价值。
他们首先翻开一张卡片,对我们说:“我看到一张卡片。”这给不了我们任何信息。因为我们已经知道这种情况,所以我们预计信息为零。
下一步是翻开一张牌并宣布:“这是黑桃3。”这提供了更多细节。有52种同样可信的结果,我们的朋友能够说出是哪一种。这里应该有很多信息。
让我们把逻辑应用到它的逻辑结论上。想象一下,他们最终把牌堆中的所有牌翻过来,并读出洗牌堆的顺序。由于这副牌有52种可能的排列顺序,每种排列顺序都同样合理,我们需要大量的细节来确定是哪一种。
这种直觉指引我们建立有关信息的概念。接下来,我们将分别学习如何计算这些事件具有0位、2位、5.7位和225.6位的信息。
如果我们仔细阅读这些思考实验,我们可以看到一个自然的观点。我们可以从一个概念开始,即信息传递了事件的惊喜程度或可能性,而不必过多考虑知识本身。例如,描述一个异常事件需要很多细节,而对于一个典型事件,我们可能并不需要太多的信息。
克劳德·E·香农在1948年出版的《通信的数学理论》中引入了信息的概念。在他的文章中,香农首次引入了信息熵的概念。
自我信息
由于数据展示了某个场合的理论可能性,那么我们如何计划比特的概率呢?香农引入了比特作为数据的单位,这个概念最初由约翰·图基提出。那么什么是“比特”,为什么我们要用它来量化数据呢?实际上,一个古老的发射器可以发送或接收两种类型的码:0和1。无疑地,二进制编码仍然常用于所有现代的数字计算机上。任何数据都可以用一系列的0和1进行编码。因此,长度为n的二进制数字序列包含n个比特的信息。
现在,假设对于任何一系列的编码,每个0或1发生的概率都为1/2。因此,一个长度为n的编码序列表示的事件X发生的概率为(1/2)^n。同时,正如我们之前提到的,这个序列包含了n个比特的信息。那么,我们是否可以总结出一个可以将概率p转化为比特数量的数学函数呢?香农通过定义自我信息给出了答案。
请注意,在本文中我们将始终使用以2为底的对数。为了简单起见,本文的其余部分将省略对数表示法中的下标2,即log(.)总是指log2(.)。例如,代码“0010”有一个自我信息
自我信息的计算方法如下图所示。
import random
from mxnet import np
from mxnet.metric import NegativeLogLikelihood
from mxnet.ndarray import nansum
def self_information(p):
return -np.log2(p)
self_information(1 / 64)
#OUTPUT
6.0
熵
由于自我信息只捕获单个离散事件的信息,因此我们需要对任何具有离散或连续分布的随机变量进行更通用的度量。
激发熵
为了更清楚地知道我们想要什么,让我们尝试一下。香农熵的公理将在下面正式说明。事实证明,以下一组理性断言迫使我们以一种特定的方式定义信息。这些公理和许多其他公理在cisszar(2008)中以正式形式呈现。
1. 我们通过观察随机变量获得的信息并不依赖于我们所说的元素,也不依赖于概率为零的附加元素的存在。
2. 我们通过观察两个随机变量获得的信息不超过我们分别观察它们获得的信息的总和。如果它们是独立的,那么它就是和。
3. 当观察某些事件所获得的信息(几乎)为零。
重要的是要理解,尽管证明这个事实超出了我们文本的范围,但这独立地定义了熵所必须采取的形式。它们只允许存在一个模糊的领域,即基本单元的选择,通常通过选择我们之前讨论的选项进行归范化,根据这个选项,由一个公平硬币投掷提供的信息量为1位。
定义
我们通过熵来评估每个随机变量X的预期信息量,该随机变量X遵循概率分布P,具有概率密度函数(pdf)或概率质量函数(pmf) p(x)(或香农熵)。
我们如何得到上面的公式?
首先,为什么要用对数函数?假设方程p(x)=f1(x)f2(x)…中的每个分量函数fi(x), fn(x)是相互独立的。这表明每个fi(x)对从p(x)收集的总体信息做出了独立的贡献。正如前面提到的,我们希望熵公式在独立随机变量之间是可加的,对数可以自然地将概率分布乘积转换为各个部分的总和。
其次,为什么要用负对数?因为我们经常从一个罕见的例子中学到的东西比从一个普通的例子中学到的东西多,所以更有规律的事件应该比不那么规律的事件包含更少的信息是有道理的。然而,对于[0,1]范围内的所有值,对数实际上都是负的,并且随着概率单调增加。事件的可能性和它们的熵必须以单调递减的关系来构建,理想情况下,这种关系总是正的。因此,我们在对数函数前加上一个负号。
最后,期望函数从何而来?考虑随机变量X。自我信息(log(p))可以理解为当我们观察到一个给定事件时所经历的惊喜程度。确实,当概率接近零时,惊喜程度会无限增长。同样,从观察X时的平均惊喜程度可以被解释为熵。考虑一个老虎机系统,例如,以概率p1,...,pk随机生成符号s1,...,sk。因此,该系统的熵等于通过监控每个输出所获得的平均自我信息。
熵的类型
那么对于一对随机变量(X, Y)来说,它们的熵是多少呢?我们之前为单个随机变量X定义了熵。这些方法可以被视为试图回答以下问题:“X和Y的整体信息与X和Y各自相比较包含了什么信息?是否存在重复信息,或者一切都是原始的?”
在下面的讨论中,我们总是将(X, Y)称为一对随机变量,它们遵循具有pdf.或pmf的联合概率分布P, pX,Y(X,Y),而X和Y分别遵循概率分布pX(X)和pY(Y)。
联合熵
我们定义一对随机变量(X, Y)的联合熵H(X, Y)为:
准确地说,一方面,如果(X, Y)是一对离散的随机变量,那么:
另一方面,如果(X, Y)是一对连续随机变量,则我们定义微分联合熵为:
如果两个随机变量X和Y相同,那么这对随机变量中的信息与其中一个的信息完全相同,我们得到H(X, Y)=H(X)=H(Y)作为一对极值。另一方面,如果X和Y是独立的,H(X, Y)=H(X)+H(Y)。事实上,我们总是知道包含在一对随机变量中的信息既不大于也不小于它们各自熵的总和。
执行
def joint_entropy(p_xy):joint_entropy(p_xy):
joint_ent = -p_xy * np.log2(p_xy)
# Operator `nansum` will sum up the non-nan number
out = nansum(joint_ent.as_nd_ndarray())
return out
joint_entropy(np.array([[0.1, 0.5], [0.1, 0.3]]))
# OUTPUT
[1.6854753]
条件熵
包含在两个随机变量中的信息量被称为联合熵,这是之前定义的。假设X是表示图片中像素值的随机变量(或随机变量向量),Y是表示类标签的随机变量。X中的信息应该是广泛的,因为自然图像是一个复杂的物体。但是,在显示图像之后,Y中的信息量应该是最小的。事实上,除非该数字难以辨认,否则有关该数字的信息应该已经存在于该数字的图像中。
因此,为了继续扩大我们的信息论词汇,我们需要能够推理一个随机变量的信息内容,这个随机变量以另一个随机变量为条件。
我们学习了如何在概率论的背景下定义条件概率,它用于评估变量之间的关系。现在我们想用类似的方式定义条件熵H(Y|X)。可以写成
在这里
是条件概率。具体地说,如果(X, Y)是一对离散随机变量,则
条件熵H(YX)如何与熵H(X)和联合熵H(X, Y)联系起来的问题现在是合乎逻辑的。根据上面给出的定义,我们可以简洁地表述如下:
根据这种直观的解释,给定X (H(Y|X))、Y中的信息等于X和Y中的信息之和(H(X, Y))减去X中已经存在的信息。这为我们提供了Y中没有在X中表示的数据。
让我们用python实现它:
def conditional_entropy(p_xy, p_x):conditional_entropy(p_xy, p_x):
p_y_given_x = p_xy/p_x
cond_ent = -p_xy * np.log2(p_y_given_x)
# Operator `nansum` will sum up the non-nan number
out = nansum(cond_ent.as_nd_ndarray())
return out
conditional_entropy(np.array([[0.1, 0.5], [0.2, 0.3]]), np.array([0.2, 0.8]))
# OUTPUT
[0.8635472]
互信息
您可能会想:“既然我们知道Y中包含了多少信息,而X中不包含,那么我们是否可以询问X和Y之间交换了多少信息?”,则(X, Y)的互信息,简称为I(X, Y),即为解。
让我们通过尝试基于我们之前定义的概念来推导互信息的表达式,来进一步发展我们的直觉,而不是直接进行正式定义。我们正在寻找两个随机变量共享的信息。从X和Y两者共同拥有的全部数据开始,然后去除不共享的部分,这是我们可以尝试的一种方法。H(X, Y)代表X和Y共同拥有的信息。应从中减去不在Y中的X的信息,以及不在X中的Y的信息。
这分别由H(XY)和H(YX)提供,因此,我们有互反信息应该
事实上,这是互信息的合理定义。一点代数知识就能证明这和我们把这些术语的定义结合起来并加以扩展是一样的。
我们可以在图像中总结所有这些关系
让我们用python实现它:
def mutual_information(p_xy, p_x, p_y):
p = p_xy / (p_x * p_y)
mutual = p_xy * np.log2(p)
# Operator `nansum` will sum up the non-nan number
out = nansum(mutual.as_nd_ndarray())
return outreturn out
mutual_information(np.array([[0.1, 0.5], [0.1, 0.3]]),np.array([0.2, 0.8]), np.array([[0.75, 0.25]]))
# OUTPUT
0.7194
互信息的性质
您需要了解互信息的以下显著特征:
1. I(X, Y)=I(Y, X)表示互信息是对称的。
2. 互信息是非负的,即I(X,Y)≥0
3. 如果X和Y是独立的,那么且仅当它们是I(X, Y)=0。例如,当X和Y彼此独立时,知道Y并不会透露任何关于X的信息,反之亦然,因此它们的互信息为零。
4. 相反,如果X是Y的可逆函数,则Y和X共享所有的知识并且
互信息的应用
从最纯粹的意义上讲,互信息可能看起来有点抽象,那么它与机器学习有什么关系呢?在自然语言处理中,词义被上下文模糊或被歧义是自然语言处理中最棘手的问题之一。例如,最近的一个新闻标题是“亚马逊着火了”。你可能会搞不清是亚马逊雨林着火了,还是亚马逊大楼着火了。
我们首先识别一组短语,如电子商务、技术和互联网,它们与亚马逊公司有很多相似的信息。“雨”、“森林”和“热带”是与亚马逊雨林有很多共同之处的第二组单词。如果必须澄清“Amazon”,我们可以比较在该上下文中使用该词时哪个组出现得更频繁。在这种情况下,文章将继续描述森林并确定情况。
库尔贝克-莱布勒散度
范数可以用来计算空间中任意两点之间的距离。如果概率分布可以用于类似的任务,那将会很有帮助。还有其他方法可以采用,但信息理论提供了最好的方法之一。我们现在研究Kullback-Leibler (KL)散度,它提供了一种确定两个分布是否彼此接近的方法。
我们通过另一个概率分布Q与pd或pmf.来估计P,给定一个随机变量x,它遵循概率分布P与pdf.或pmf.。然后,在P和Q之间,Kullback-Leibler (KL)散度(或相对熵)是
我们可以再次包括对数项的解释,就像我们对点互信息所做的那样:
如果我们在P下观察到x的频率远远超出了我们在Q下预期的频率,那么KL散度将会很大且为正值。如果我们观察到的结果的频率远低于预期,KL散度将会很大且为负值。这使我们能够将KL散度解释为相对于参考分布的惊讶程度,与我们根据参考分布所期望的惊讶程度进行比较。
让我们从头开始应用KL散度。
def kl_divergence(p, q):p, q):
kl = p * np.log2(p / q)
out = nansum(kl.as_nd_ndarray())
return out.abs().asscalar()
结论:
在香农的文章中,我们了解了信息理论,熵,几个有趣的想法,以及大爆炸时代如何在其他领域使用熵原理。熵中更有趣的概念包括互信息、KL散度和Jensen-Shannon距离。
参考:
1. 维基百科“信息论”,可访问:https://en.wikipedia.org/wiki/Information_theory。
2. 维基百科“思想法则”,可访问:https://en.wikipedia.org/wiki/The_Laws_of_Thought。
3.维基百科“布尔函数”,可访问:https://en.wikipedia.org/wiki/Boolean_function。
来源:https://medium.com/@tejpal.abhyuday/information-theory-explained-for-machine-learning-a1bd8e7cd242